summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitri Plotnikov <dplotnikov@google.com>2010-07-02 17:57:51 -0700
committerDmitri Plotnikov <dplotnikov@google.com>2010-07-02 17:57:51 -0700
commit08e1c4e49947daee26cfc435d01605febb7ae6fa (patch)
treef5be6a30c7359f083f45f0a975174f64b0e751cd
parent9e83c84a7603eb6fca1b42631d894731d61f7a34 (diff)
downloadpackages_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.xml21
-rw-r--r--res/layout/navigation_bar.xml55
-rw-r--r--res/layout/two_pane_activity.xml11
-rw-r--r--res/menu/actions.xml5
-rw-r--r--src/com/android/contacts/activities/ContactListActivity.java229
-rw-r--r--src/com/android/contacts/activities/NavigationBar.java214
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);
+ }
+}