diff options
author | Dmitri Plotnikov <dplotnikov@google.com> | 2010-07-02 17:57:51 -0700 |
---|---|---|
committer | Dmitri Plotnikov <dplotnikov@google.com> | 2010-07-02 17:57:51 -0700 |
commit | 08e1c4e49947daee26cfc435d01605febb7ae6fa (patch) | |
tree | f5be6a30c7359f083f45f0a975174f64b0e751cd | |
parent | 9e83c84a7603eb6fca1b42631d894731d61f7a34 (diff) | |
download | packages_apps_Contacts-08e1c4e49947daee26cfc435d01605febb7ae6fa.tar.gz packages_apps_Contacts-08e1c4e49947daee26cfc435d01605febb7ae6fa.tar.bz2 packages_apps_Contacts-08e1c4e49947daee26cfc435d01605febb7ae6fa.zip |
Add modes to the navigation bar
Change-Id: I3754aa391513641d920fb89690ac4ca328c2942c
-rw-r--r-- | res/drawable/btn_nav_bar.xml | 21 | ||||
-rw-r--r-- | res/layout/navigation_bar.xml | 55 | ||||
-rw-r--r-- | res/layout/two_pane_activity.xml | 11 | ||||
-rw-r--r-- | res/menu/actions.xml | 5 | ||||
-rw-r--r-- | src/com/android/contacts/activities/ContactListActivity.java | 229 | ||||
-rw-r--r-- | src/com/android/contacts/activities/NavigationBar.java | 214 |
6 files changed, 422 insertions, 113 deletions
diff --git a/res/drawable/btn_nav_bar.xml b/res/drawable/btn_nav_bar.xml new file mode 100644 index 000000000..e597db485 --- /dev/null +++ b/res/drawable/btn_nav_bar.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<!-- THIS FILE IS TEMPORARY - REMOVE WHEN FRAMEWORK RESOURCE IS AVAILABLE --> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_checked="false" android:drawable="@*android:drawable/btn_toggle_off" /> + <item android:state_checked="true" android:drawable="@*android:drawable/btn_toggle_on" /> +</selector> diff --git a/res/layout/navigation_bar.xml b/res/layout/navigation_bar.xml index b93d11431..5c76b44e2 100644 --- a/res/layout/navigation_bar.xml +++ b/res/layout/navigation_bar.xml @@ -16,11 +16,49 @@ <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/search_bar" + android:id="@+id/navigation_bar" android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="horizontal"> + android:layout_height="match_parent"> + <ToggleButton + android:id="@+id/nav_contacts" + android:layout_height="match_parent" + android:layout_width="wrap_content" + android:textOn="@string/contactsList" + android:textOff="@string/contactsList" + android:layout_alignParentLeft="true" + android:layout_alignParentTop="true" + android:layout_alignParentBottom="true" + android:background="@drawable/btn_nav_bar" + android:paddingLeft="15dip" + android:paddingRight="15dip" + /> + <ToggleButton + android:id="@+id/nav_favorites" + android:layout_height="match_parent" + android:layout_width="wrap_content" + android:textOn="@string/strequentList" + android:textOff="@string/strequentList" + android:layout_toRightOf="@id/nav_contacts" + android:layout_alignParentTop="true" + android:layout_alignParentBottom="true" + android:background="@drawable/btn_nav_bar" + android:paddingLeft="15dip" + android:paddingRight="15dip" + /> + <ToggleButton + android:id="@+id/nav_search" + android:layout_height="match_parent" + android:layout_width="wrap_content" + android:textOff="@string/menu_search" + android:textOn="@string/menu_search" + android:layout_toRightOf="@id/nav_favorites" + android:layout_alignParentTop="true" + android:layout_alignParentBottom="true" + android:background="@drawable/btn_nav_bar" + android:paddingLeft="15dip" + android:paddingRight="15dip" + /> <view class="com.android.contacts.widget.SearchEditText" android:id="@+id/search_src_text" @@ -28,7 +66,7 @@ android:layout_width="320dip" android:layout_marginLeft="4dip" android:layout_marginBottom="0dip" - android:layout_alignParentRight="true" + android:layout_toRightOf="@id/nav_favorites" android:singleLine="true" android:ellipsize="end" android:inputType="textNoSuggestions" @@ -38,4 +76,13 @@ android:freezesText="true" android:visibility="gone" /> + <ImageView + android:id="@+id/nav_cancel_search" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:src="@android:drawable/ic_menu_close_clear_cancel" + android:layout_toRightOf="@id/search_src_text" + android:layout_centerVertical="true" + android:visibility="gone"/> + </RelativeLayout> diff --git a/res/layout/two_pane_activity.xml b/res/layout/two_pane_activity.xml index 9ee01198e..f992ec863 100644 --- a/res/layout/two_pane_activity.xml +++ b/res/layout/two_pane_activity.xml @@ -19,16 +19,15 @@ android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> - <fragment android:name="com.android.contacts.list.DefaultContactBrowseListFragment" - android:id="@+id/two_pane_list" - android:layout_width="0px" - android:layout_height="match_parent" - android:layout_weight="1" /> + <FrameLayout + android:id="@+id/two_pane_list" + android:layout_width="0px" + android:layout_height="match_parent" + android:layout_weight="1" /> <!-- Holder for detail- or editor-fragment. --> <FrameLayout android:id="@+id/two_pane_right_view" - android:orientation="horizontal" android:layout_width="0px" android:layout_height="match_parent" android:layout_weight="1" /> diff --git a/res/menu/actions.xml b/res/menu/actions.xml index a2bf924de..c3cf53bab 100644 --- a/res/menu/actions.xml +++ b/res/menu/actions.xml @@ -14,11 +14,6 @@ limitations under the License. --> <menu xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:id="@+id/action_search" - android:icon="@android:drawable/ic_menu_search" - android:title="@string/menu_search" - android:showAsAction="ifRoom" - android:onClick="onToggleSearch" /> <item android:id="@+id/action_share" android:icon="@android:drawable/ic_menu_share" android:showAsAction="ifRoom" /> diff --git a/src/com/android/contacts/activities/ContactListActivity.java b/src/com/android/contacts/activities/ContactListActivity.java index 092e5bb84..2cd6f2bff 100644 --- a/src/com/android/contacts/activities/ContactListActivity.java +++ b/src/com/android/contacts/activities/ContactListActivity.java @@ -21,6 +21,7 @@ import com.android.contacts.interactions.ContactDeletionInteraction; import com.android.contacts.interactions.ImportExportInteraction; import com.android.contacts.interactions.PhoneNumberInteraction; import com.android.contacts.list.ContactBrowseListContextMenuAdapter; +import com.android.contacts.list.ContactBrowseListFragment; import com.android.contacts.list.ContactEntryListFragment; import com.android.contacts.list.ContactsIntentResolver; import com.android.contacts.list.ContactsRequest; @@ -39,7 +40,6 @@ import android.app.Activity; import android.app.Dialog; import android.app.FragmentTransaction; import android.content.ContentValues; -import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.net.Uri; @@ -54,13 +54,13 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.Window; -import android.view.inputmethod.InputMethodManager; import android.widget.Toast; /** * Displays a list of contacts. */ -public class ContactListActivity extends Activity implements View.OnCreateContextMenuListener { +public class ContactListActivity extends Activity + implements View.OnCreateContextMenuListener, NavigationBar.Listener { private static final String TAG = "ContactListActivity"; @@ -70,10 +70,10 @@ public class ContactListActivity extends Activity implements View.OnCreateContex private static final int SUBACTIVITY_SEARCH = 4; private ContactsIntentResolver mIntentResolver; - protected ContactEntryListFragment<?> mListFragment; + private ContactBrowseListFragment mListFragment; - protected PhoneNumberInteraction mPhoneNumberCallInteraction; - protected PhoneNumberInteraction mSendTextMessageInteraction; + private PhoneNumberInteraction mPhoneNumberCallInteraction; + private PhoneNumberInteraction mSendTextMessageInteraction; private ContactDeletionInteraction mContactDeletionInteraction; private ImportExportInteraction mImportExportInteraction; @@ -83,24 +83,22 @@ public class ContactListActivity extends Activity implements View.OnCreateContex private ContactEditorFragment mEditorFragment; private EditorFragmentListener mEditorFragmentListener = new EditorFragmentListener(); - private int mActionCode; - private boolean mSearchInitiated; private ContactsRequest mRequest; private SearchEditText mSearchEditText; private boolean mTwoPaneLayout; - - private View mNavigationBar; + private NavigationBar mNavigationBar; + private int mMode = -1; public ContactListActivity() { mIntentResolver = new ContactsIntentResolver(this); } @Override - protected void onCreate(Bundle icicle) { - super.onCreate(icicle); + protected void onCreate(Bundle savedState) { + super.onCreate(savedState); // Extract relevant information from the intent mRequest = mIntentResolver.resolveIntent(getIntent()); @@ -123,68 +121,16 @@ public class ContactListActivity extends Activity implements View.OnCreateContex int screenLayoutSize = config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK; mTwoPaneLayout = (screenLayoutSize == Configuration.SCREENLAYOUT_SIZE_XLARGE); if (mTwoPaneLayout) { - configureTwoPaneLayout(); + configureTwoPaneLayout(savedState); } else { configureSinglePaneLayout(); } } - private void configureTwoPaneLayout() { - // TODO: set the theme conditionally in AndroidManifest, once that feature is available - setTheme(android.R.style.Theme_WithActionBar); - requestWindowFeature(Window.FEATURE_ACTION_BAR); - - setContentView(R.layout.two_pane_activity); - - DefaultContactBrowseListFragment fragment = - (DefaultContactBrowseListFragment)findFragmentById(R.id.two_pane_list); - fragment.setOnContactListActionListener(new ContactBrowserActionListener()); - - mListFragment = fragment; - - setupContactDetailFragment(); - - mNavigationBar = getLayoutInflater().inflate(R.layout.navigation_bar, null); - mSearchEditText = (SearchEditText)mNavigationBar.findViewById(R.id.search_src_text); - mSearchEditText.setMaginfyingGlassEnabled(false); - mSearchEditText.setText(mRequest.getQueryString()); - mSearchEditText.setOnFilterTextListener(new OnFilterTextListener() { - public void onFilterChange(String queryString) { - mListFragment.setSearchMode(!TextUtils.isEmpty(queryString)); - mListFragment.setQueryString(queryString); - } - - public void onCancelSearch() { - onToggleSearch(null); - } - }); - - ActionBar actionBar = getActionBar(); - actionBar.setCustomNavigationMode(mNavigationBar); - } - - /** - * Toggles search mode. - */ - public void onToggleSearch(MenuItem item) { - if (mSearchEditText.getVisibility() == View.VISIBLE) { - mSearchEditText.setVisibility(View.GONE); - mListFragment.setSearchMode(false); - } else { - mSearchEditText.setVisibility(View.VISIBLE); - mSearchEditText.requestFocus(); - InputMethodManager inputMethodManager = - (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); - inputMethodManager.showSoftInput(mSearchEditText, 0); - } - - invalidateOptionsMenu(); - } - private void configureSinglePaneLayout() { setTitle(mRequest.getActivityTitle()); - onCreateFragment(); + mListFragment = createListFragment(mRequest.getActionCode()); int listFragmentContainerId; if (mRequest.isSearchMode()) { @@ -210,6 +156,77 @@ public class ContactListActivity extends Activity implements View.OnCreateContex transaction.commit(); } + private void configureTwoPaneLayout(Bundle savedState) { + + // TODO: set the theme conditionally in AndroidManifest, once that feature is available + setTheme(android.R.style.Theme_WithActionBar); + requestWindowFeature(Window.FEATURE_ACTION_BAR); + + setContentView(R.layout.two_pane_activity); + + mNavigationBar = new NavigationBar(this); + mNavigationBar.onCreate(savedState, mRequest); + + ActionBar actionBar = getActionBar(); + View navBarView = mNavigationBar.onCreateView(getLayoutInflater()); + actionBar.setCustomNavigationMode(navBarView); + + configureListFragment(); + + setupContactDetailFragment(); + + mNavigationBar.setListener(this); + } + + @Override + public void onNavigationBarChange() { + configureListFragment(); + } + + private void configureListFragment() { + int mode = mNavigationBar.getMode(); + if (mode == NavigationBar.MODE_SEARCH + && TextUtils.isEmpty(mNavigationBar.getQueryString())) { + mode = mNavigationBar.getDefaultMode(); + } + + if (mode == mMode) { + if (mode == NavigationBar.MODE_SEARCH) { + mListFragment.setQueryString(mNavigationBar.getQueryString()); + } + return; + } + + if (mListFragment != null) { + mListFragment.setOnContactListActionListener(null); + } + + mMode = mode; + switch (mMode) { + case NavigationBar.MODE_CONTACTS: { + mListFragment = createListFragment(ContactsRequest.ACTION_DEFAULT); + break; + } + case NavigationBar.MODE_FAVORITES: { + int favoritesAction = mRequest.getActionCode(); + if (favoritesAction == ContactsRequest.ACTION_DEFAULT) { + favoritesAction = ContactsRequest.ACTION_STREQUENT; + } + mListFragment = createListFragment(favoritesAction); + break; + } + case NavigationBar.MODE_SEARCH: { + mListFragment = createContactSearchFragment(); + mListFragment.setQueryString(mNavigationBar.getQueryString()); + break; + } + } + + openFragmentTransaction() + .replace(R.id.two_pane_list, mListFragment) + .commit(); + } + private void setupContactDetailFragment() { // No editor here if (mEditorFragment != null) { @@ -227,7 +244,6 @@ public class ContactListActivity extends Activity implements View.OnCreateContex openFragmentTransaction() .replace(R.id.two_pane_right_view, mDetailFragment) .commit(); - } private void setupContactEditorFragment() { @@ -247,7 +263,6 @@ public class ContactListActivity extends Activity implements View.OnCreateContex openFragmentTransaction() .replace(R.id.two_pane_right_view, mEditorFragment) .commit(); - } @Override @@ -259,13 +274,13 @@ public class ContactListActivity extends Activity implements View.OnCreateContex } /** - * Creates the fragment based on the current request. + * Creates the list fragment for the specified mode. */ - private void onCreateFragment() { - mActionCode = mRequest.getActionCode(); - switch (mActionCode) { + private ContactBrowseListFragment createListFragment(int actionCode) { + switch (actionCode) { case ContactsRequest.ACTION_DEFAULT: { DefaultContactBrowseListFragment fragment = new DefaultContactBrowseListFragment(); + fragment.setContactsRequest(mRequest); fragment.setOnContactListActionListener(new ContactBrowserActionListener()); fragment.setDisplayWithPhonesOnlyOption(mRequest.getDisplayWithPhonesOnlyOption()); fragment.setVisibleContactsRestrictionEnabled(mRequest.getDisplayOnlyVisible()); @@ -273,8 +288,8 @@ public class ContactListActivity extends Activity implements View.OnCreateContex fragment.setSearchMode(mRequest.isSearchMode()); fragment.setQueryString(mRequest.getQueryString()); fragment.setDirectorySearchEnabled(mRequest.isDirectorySearchEnabled()); - mListFragment = fragment; - break; + fragment.setAizyEnabled(!mRequest.isSearchMode()); + return fragment; } case ContactsRequest.ACTION_GROUP: { @@ -286,8 +301,7 @@ public class ContactListActivity extends Activity implements View.OnCreateContex fragment.setOnContactListActionListener(new ContactBrowserActionListener()); fragment.setFrequentlyContactedContactsIncluded(false); fragment.setStarredContactsIncluded(true); - mListFragment = fragment; - break; + return fragment; } case ContactsRequest.ACTION_FREQUENT: { @@ -295,8 +309,7 @@ public class ContactListActivity extends Activity implements View.OnCreateContex fragment.setOnContactListActionListener(new ContactBrowserActionListener()); fragment.setFrequentlyContactedContactsIncluded(true); fragment.setStarredContactsIncluded(false); - mListFragment = fragment; - break; + return fragment; } case ContactsRequest.ACTION_STREQUENT: { @@ -304,14 +317,24 @@ public class ContactListActivity extends Activity implements View.OnCreateContex fragment.setOnContactListActionListener(new ContactBrowserActionListener()); fragment.setFrequentlyContactedContactsIncluded(true); fragment.setStarredContactsIncluded(true); - mListFragment = fragment; - break; + return fragment; } default: - throw new IllegalStateException("Invalid action code: " + mActionCode); + throw new IllegalStateException("Invalid action code: " + actionCode); } - mListFragment.setContactsRequest(mRequest); + } + + private ContactBrowseListFragment createContactSearchFragment() { + DefaultContactBrowseListFragment fragment = new DefaultContactBrowseListFragment(); + fragment.setOnContactListActionListener(new ContactBrowserActionListener()); + fragment.setDisplayWithPhonesOnlyOption(ContactsRequest.DISPLAY_ONLY_WITH_PHONES_DISABLED); + fragment.setVisibleContactsRestrictionEnabled(true); + fragment.setContextMenuAdapter(new ContactBrowseListContextMenuAdapter(fragment)); + fragment.setSearchMode(true); + fragment.setDirectorySearchEnabled(true); + fragment.setAizyEnabled(false); + return fragment; } private final class ContactBrowserActionListener implements OnContactBrowserActionListener { @@ -450,8 +473,8 @@ public class ContactListActivity extends Activity implements View.OnCreateContex if (mTwoPaneLayout) { inflater.inflate(R.menu.actions, menu); return true; - } else if (mActionCode == ContactsRequest.ACTION_DEFAULT || - mActionCode == ContactsRequest.ACTION_STREQUENT) { + } else if (mRequest.getActionCode() == ContactsRequest.ACTION_DEFAULT || + mRequest.getActionCode() == ContactsRequest.ACTION_STREQUENT) { inflater.inflate(R.menu.list, menu); return true; } else if (!mListFragment.isSearchMode()) { @@ -467,14 +490,7 @@ public class ContactListActivity extends Activity implements View.OnCreateContex MenuItem displayGroups = menu.findItem(R.id.menu_display_groups); if (displayGroups != null) { displayGroups.setVisible( - mActionCode == ContactsRequest.ACTION_DEFAULT); - } - - MenuItem search = menu.findItem(R.id.action_search); - if (search != null) { - search.setIcon(mSearchEditText.getVisibility() == View.GONE - ? android.R.drawable.ic_menu_search - : android.R.drawable.ic_menu_close_clear_cancel); + mRequest.getActionCode() == ContactsRequest.ACTION_DEFAULT); } return true; } @@ -622,12 +638,21 @@ public class ContactListActivity extends Activity implements View.OnCreateContex */ @Override public boolean dispatchKeyEvent(KeyEvent event) { - if (!mSearchInitiated && !mRequest.isSearchMode()) { - int unicodeChar = event.getUnicodeChar(); - if (unicodeChar != 0) { - mSearchInitiated = true; - startSearch(new String(new int[]{unicodeChar}, 0, 1), false, null, false); - return true; + int unicodeChar = event.getUnicodeChar(); + if (unicodeChar != 0) { + String query = new String(new int[]{unicodeChar}, 0, 1); + if (mTwoPaneLayout) { + if (mNavigationBar.getMode() != NavigationBar.MODE_SEARCH) { + mNavigationBar.setQueryString(query); + mNavigationBar.setMode(NavigationBar.MODE_SEARCH); + return true; + } + } else if (!mRequest.isSearchMode()) { + if (!mSearchInitiated) { + mSearchInitiated = true; + startSearch(query, false, null, false); + return true; + } } } return super.dispatchKeyEvent(event); @@ -670,6 +695,14 @@ public class ContactListActivity extends Activity implements View.OnCreateContex return false; } + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (mNavigationBar != null) { + mNavigationBar.onSaveInstanceState(outState); + } + } + private PhoneNumberInteraction getPhoneNumberCallInteraction() { if (mPhoneNumberCallInteraction == null) { mPhoneNumberCallInteraction = new PhoneNumberInteraction(this, false, null); diff --git a/src/com/android/contacts/activities/NavigationBar.java b/src/com/android/contacts/activities/NavigationBar.java new file mode 100644 index 000000000..58b2d35b2 --- /dev/null +++ b/src/com/android/contacts/activities/NavigationBar.java @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.contacts.activities; + +import com.android.contacts.R; +import com.android.contacts.list.ContactsRequest; +import com.android.contacts.widget.SearchEditText; +import com.android.contacts.widget.SearchEditText.OnFilterTextListener; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.inputmethod.InputMethodManager; +import android.widget.ImageView; +import android.widget.ToggleButton; + +/** + * Navigation bar at the top of the Contacts activity. + */ +public class NavigationBar implements OnFilterTextListener, OnClickListener { + + public interface Listener { + void onNavigationBarChange(); + } + + private static final String EXTRA_KEY_DEFAULT_MODE = "navBar.defaultMode"; + private static final String EXTRA_KEY_MODE = "navBar.mode"; + private static final String EXTRA_KEY_QUERY = "navBar.query"; + + public static final int MODE_CONTACTS = 0; + public static final int MODE_FAVORITES = 1; + public static final int MODE_SEARCH = 2; + + private int mMode = MODE_CONTACTS; + private int mDefaultMode = MODE_CONTACTS; + private String mQueryString; + private SearchEditText mSearchEditText; + private View mNavigationBar; + + private final Context mContext; + + private Listener mListener; + + private ToggleButton mContactsButton; + private ToggleButton mFavoritesButton; + private ToggleButton mSearchButton; + private ImageView mCancelSearchButton; + + public NavigationBar(Context context) { + mContext = context; + } + + public void onCreate(Bundle savedState, ContactsRequest request) { + mDefaultMode = -1; + mMode = -1; + mQueryString = null; + if (savedState != null) { + mDefaultMode = savedState.getInt(EXTRA_KEY_DEFAULT_MODE, -1); + mMode = savedState.getInt(EXTRA_KEY_MODE, -1); + mQueryString = savedState.getString(EXTRA_KEY_QUERY); + } + + int actionCode = request.getActionCode(); + if (mDefaultMode == -1) { + mDefaultMode = actionCode == ContactsRequest.ACTION_DEFAULT + ? NavigationBar.MODE_CONTACTS + : NavigationBar.MODE_FAVORITES; + } + if (mMode == -1) { + mMode = request.isSearchMode() ? NavigationBar.MODE_SEARCH : mDefaultMode; + } + if (mQueryString == null) { + mQueryString = request.getQueryString(); + } + } + + public void setListener(Listener listener) { + mListener = listener; + } + + public View onCreateView(LayoutInflater inflater) { + mNavigationBar = inflater.inflate(R.layout.navigation_bar, null); + mSearchEditText = (SearchEditText)mNavigationBar.findViewById(R.id.search_src_text); + mSearchEditText.setMaginfyingGlassEnabled(false); + mSearchEditText.setOnFilterTextListener(this); + mSearchEditText.setText(mQueryString); + mContactsButton = (ToggleButton)mNavigationBar.findViewById(R.id.nav_contacts); + mContactsButton.setOnClickListener(this); + mFavoritesButton = (ToggleButton)mNavigationBar.findViewById(R.id.nav_favorites); + mFavoritesButton.setOnClickListener(this); + mSearchButton = (ToggleButton)mNavigationBar.findViewById(R.id.nav_search); + mSearchButton.setOnClickListener(this); + mCancelSearchButton = (ImageView)mNavigationBar.findViewById(R.id.nav_cancel_search); + mCancelSearchButton.setOnClickListener(this); + update(); + + return mNavigationBar; + } + + public int getMode() { + return mMode; + } + + public void setMode(int mode) { + mMode = mode; + update(); + if (mListener != null) { + mListener.onNavigationBarChange(); + } + } + + public int getDefaultMode() { + return mDefaultMode; + } + + public void setDefaultMode(int defaultMode) { + mDefaultMode = defaultMode; + } + + public String getQueryString() { + return mQueryString; + } + + public void setQueryString(String query) { + mQueryString = query; + mSearchEditText.setText(query); + } + + public void update() { + switch(mMode) { + case MODE_CONTACTS: + mContactsButton.setChecked(true); + mFavoritesButton.setChecked(false); + mSearchButton.setChecked(false); + mSearchButton.setVisibility(View.VISIBLE); + mSearchEditText.setVisibility(View.GONE); + mCancelSearchButton.setVisibility(View.GONE); + break; + case MODE_FAVORITES: + mContactsButton.setChecked(false); + mFavoritesButton.setChecked(true); + mSearchButton.setChecked(false); + mSearchButton.setVisibility(View.VISIBLE); + mSearchEditText.setVisibility(View.GONE); + mCancelSearchButton.setVisibility(View.GONE); + break; + case MODE_SEARCH: + mContactsButton.setChecked(false); + mFavoritesButton.setChecked(false); + mSearchButton.setVisibility(View.GONE); + mSearchEditText.setVisibility(View.VISIBLE); + mSearchEditText.requestFocus(); + InputMethodManager inputMethodManager = + (InputMethodManager)mContext.getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.showSoftInput(mSearchEditText, 0); + mCancelSearchButton.setVisibility(View.VISIBLE); + break; + } + } + + public void toggleSearchMode() { + setMode(mMode == MODE_SEARCH ? mDefaultMode : MODE_SEARCH); + } + + @Override + public void onClick(View view) { + if (view == mSearchButton) { + setMode(MODE_SEARCH); + } else if (view == mContactsButton) { + setMode(MODE_CONTACTS); + setDefaultMode(MODE_CONTACTS); + } else if (view == mFavoritesButton) { + setMode(MODE_FAVORITES); + setDefaultMode(MODE_FAVORITES); + } else { // mCancelSearchButton + setMode(mDefaultMode); + } + } + + @Override + public void onFilterChange(String queryString) { + mQueryString = queryString; + if (mListener != null) { + mListener.onNavigationBarChange(); + } + } + + @Override + public void onCancelSearch() { + setMode(mDefaultMode); + } + + public void onSaveInstanceState(Bundle outState) { + outState.putInt(EXTRA_KEY_DEFAULT_MODE, mDefaultMode); + outState.putInt(EXTRA_KEY_MODE, mMode); + outState.putString(EXTRA_KEY_QUERY, mQueryString); + } +} |