summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Attwell <brianattwell@google.com>2014-05-30 16:44:51 -0700
committerBrian Attwell <brianattwell@google.com>2014-06-11 14:34:47 -0700
commit6adbf1e7870e9de4ad203d334c8786ffca7d123d (patch)
tree66893f593a96a7cf9d1d24830546d767d3b27323
parenta05431fe824f39e60a8b25a244a1fea39805a61b (diff)
downloadpackages_apps_Contacts-6adbf1e7870e9de4ad203d334c8786ffca7d123d.tar.gz
packages_apps_Contacts-6adbf1e7870e9de4ad203d334c8786ffca7d123d.tar.bz2
packages_apps_Contacts-6adbf1e7870e9de4ad203d334c8786ffca7d123d.zip
Unified search bar style, and new animation
Change-Id: I87516ceae4a5d64edb1febd50bd96b4f7471af67
-rw-r--r--src/com/android/contacts/activities/ActionBarAdapter.java196
-rw-r--r--src/com/android/contacts/activities/PeopleActivity.java5
2 files changed, 117 insertions, 84 deletions
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index 1efbb9e72..ea05b73e0 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -17,20 +17,21 @@
package com.android.contacts.activities;
import android.app.ActionBar;
-import android.app.ActionBar.LayoutParams;
import android.app.ActionBar.Tab;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
+import android.text.Editable;
import android.text.TextUtils;
-import android.view.LayoutInflater;
+import android.text.TextWatcher;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.SearchView;
import android.widget.SearchView.OnCloseListener;
-import android.widget.SearchView.OnQueryTextListener;
+import android.view.View.OnClickListener;
+import android.widget.EditText;
import com.android.contacts.R;
import com.android.contacts.activities.ActionBarAdapter.Listener.Action;
@@ -39,7 +40,7 @@ import com.android.contacts.list.ContactsRequest;
/**
* Adapter for the action bar at the top of the Contacts activity.
*/
-public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
+public class ActionBarAdapter implements OnCloseListener {
public interface Listener {
public abstract class Action {
@@ -55,6 +56,8 @@ public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
* {@link #getCurrentTab}.
*/
void onSelectedTabChanged();
+
+ void onUpButtonPressed();
}
private static final String EXTRA_KEY_SEARCH_MODE = "navBar.searchMode";
@@ -66,7 +69,8 @@ public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
private boolean mSearchMode;
private String mQueryString;
- private SearchView mSearchView;
+ private EditText mSearchView;
+ private View mSearchContainer;
private final Context mContext;
private final SharedPreferences mPrefs;
@@ -100,28 +104,7 @@ public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
mActionBarNavigationMode = ActionBar.NAVIGATION_MODE_TABS;
mTabListener = new MyTabListener();
- // Set up search view.
- View customSearchView = LayoutInflater.from(mActionBar.getThemedContext()).inflate(
- R.layout.custom_action_bar, null);
- int searchViewWidth = mContext.getResources().getDimensionPixelSize(
- R.dimen.search_view_width);
- if (searchViewWidth == 0) {
- searchViewWidth = LayoutParams.MATCH_PARENT;
- }
- LayoutParams layoutParams = new LayoutParams(searchViewWidth, LayoutParams.WRAP_CONTENT);
- mSearchView = (SearchView) customSearchView.findViewById(R.id.search_view);
- // Since the {@link SearchView} in this app is "click-to-expand", set the below mode on the
- // {@link SearchView} so that the magnifying glass icon appears inside the editable text
- // field. (In the "click-to-expand" search pattern, the user must explicitly expand the
- // search field and already knows a search is being conducted, so the icon is redundant
- // and can go away once the user starts typing.)
- mSearchView.setIconifiedByDefault(true);
- mSearchView.setQueryHint(mContext.getString(R.string.hint_findContacts));
- mSearchView.setOnQueryTextListener(this);
- mSearchView.setOnCloseListener(this);
- mSearchView.setQuery(mQueryString, false);
- mActionBar.setCustomView(customSearchView, layoutParams);
-
+ setupSearchView();
setupTabs();
}
@@ -130,6 +113,33 @@ public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
addTab(TabState.ALL, R.string.all_contacts_tab_label);
}
+ private void setupSearchView() {
+ mActionBar.setCustomView(R.layout.search_bar_expanded);
+ mSearchContainer = mActionBar.getCustomView();
+ mSearchContainer.setBackgroundColor(mContext.getResources().getColor(
+ R.color.searchbox_background_color));
+ mSearchView = (EditText) mSearchContainer.findViewById(R.id.search_view);
+ mSearchView.setHint(mContext.getString(R.string.hint_findContacts));
+ mSearchView.addTextChangedListener(new SearchTextWatcher());
+ mSearchContainer.findViewById(R.id.search_close_button).setOnClickListener(
+ new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mSearchView.setText(null);
+ }
+ });
+ mSearchContainer.findViewById(R.id.search_back_button).setOnClickListener(
+ new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mListener != null) {
+ mListener.onUpButtonPressed();
+ }
+ }
+ });
+ mActionBar.setCustomView(mSearchContainer);
+ }
+
public void initialize(Bundle savedState, ContactsRequest request) {
if (savedState == null) {
mSearchMode = request.isSearchMode();
@@ -148,7 +158,7 @@ public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
}
// Show tabs or the expanded {@link SearchView}, depending on whether or not we are in
// search mode.
- update();
+ update(true /* skipAnimation */);
// Expanding the {@link SearchView} clears the query, so set the query from the
// {@link ContactsRequest} after it has been expanded, if applicable.
if (mSearchMode && !TextUtils.isEmpty(mQueryString)) {
@@ -188,6 +198,30 @@ public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
}
}
+ private class SearchTextWatcher implements TextWatcher {
+
+ @Override
+ public void onTextChanged(CharSequence queryString, int start, int before, int count) {
+ if (queryString.equals(mQueryString)) {
+ return;
+ }
+ mQueryString = queryString.toString();
+ if (!mSearchMode) {
+ if (!TextUtils.isEmpty(queryString)) {
+ setSearchMode(true);
+ }
+ } else if (mListener != null) {
+ mListener.onAction(Action.CHANGE_SEARCH_QUERY);
+ }
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {}
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
+ }
+
/**
* Change the current tab, and notify the listener.
*/
@@ -230,14 +264,14 @@ public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
public void setSearchMode(boolean flag) {
if (mSearchMode != flag) {
mSearchMode = flag;
- update();
+ update(false /* skipAnimation */);
if (mSearchView == null) {
return;
}
if (mSearchMode) {
setFocusOnSearchView();
} else {
- mSearchView.setQuery(null, false);
+ mSearchView.setText(null);
}
} else if (flag) {
// Everything is already set up. Still make sure the keyboard is up
@@ -252,7 +286,7 @@ public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
public void setQueryString(String query) {
mQueryString = query;
if (mSearchView != null) {
- mSearchView.setQuery(query, false);
+ mSearchView.setText(query);
}
}
@@ -271,18 +305,14 @@ public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
// Build the new flags...
int newFlags = 0;
- newFlags |= ActionBar.DISPLAY_SHOW_TITLE;
- if (mShowHomeIcon) {
+ if (mShowHomeIcon && !mSearchMode) {
newFlags |= ActionBar.DISPLAY_SHOW_HOME;
}
if (mSearchMode) {
- newFlags |= ActionBar.DISPLAY_SHOW_HOME;
- newFlags |= ActionBar.DISPLAY_HOME_AS_UP;
newFlags |= ActionBar.DISPLAY_SHOW_CUSTOM;
+ } else {
+ newFlags |= ActionBar.DISPLAY_SHOW_TITLE;
}
- mActionBar.setHomeButtonEnabled(mSearchMode);
-
-
if (current != newFlags) {
// Pass the mask here to preserve other flags that we're not interested here.
@@ -290,18 +320,48 @@ public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
}
}
- private void update() {
- boolean isIconifiedChanging = mSearchView.isIconified() == mSearchMode;
+ private void update(boolean skipAnimation) {
+ final boolean isIconifiedChanging
+ = (mSearchContainer.getVisibility() == View.VISIBLE) != mSearchMode;
+ if (isIconifiedChanging && !skipAnimation) {
+ if (mSearchMode) {
+ mSearchContainer.setVisibility(View.VISIBLE);
+ mSearchContainer.setAlpha(0);
+ mSearchContainer.animate().alpha(1);
+ updateDisplayOptionsAndNavigationMode(isIconifiedChanging);
+ } else {
+ mSearchContainer.setAlpha(1);
+ mSearchContainer.animate().alpha(0).withEndAction(new Runnable() {
+ @Override
+ public void run() {
+ updateDisplayOptions();
+ mSearchContainer.setVisibility(View.GONE);
+ updateDisplayOptionsAndNavigationMode(isIconifiedChanging);
+ }
+ });
+ }
+ return;
+ }
+ if (isIconifiedChanging && skipAnimation) {
+ if (mSearchMode) {
+ mSearchContainer.setVisibility(View.VISIBLE);
+ } else {
+ mSearchContainer.setVisibility(View.GONE);
+ }
+ }
+ updateDisplayOptionsAndNavigationMode(isIconifiedChanging);
+ }
+
+ private void updateDisplayOptionsAndNavigationMode(boolean isIconifiedChanging) {
if (mSearchMode) {
setFocusOnSearchView();
// Since we have the {@link SearchView} in a custom action bar, we must manually handle
// expanding the {@link SearchView} when a search is initiated. Note that a side effect
// of this method is that the {@link SearchView} query text is set to empty string.
if (isIconifiedChanging) {
- final CharSequence queryText = mSearchView.getQuery();
- mSearchView.onActionViewExpanded();
+ final CharSequence queryText = mSearchView.getText();
if (!TextUtils.isEmpty(queryText)) {
- mSearchView.setQuery(queryText, false);
+ mSearchView.setText(queryText);
}
}
if (mActionBar.getNavigationMode() != ActionBar.NAVIGATION_MODE_STANDARD) {
@@ -327,11 +387,6 @@ public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
mActionBar.setSelectedNavigationItem(mCurrentTab);
mTabListener.mIgnoreTabSelected = false;
}
- // Since we have the {@link SearchView} in a custom action bar, we must manually handle
- // collapsing the {@link SearchView} when search mode is exited.
- if (isIconifiedChanging) {
- mSearchView.onActionViewCollapsed();
- }
if (mListener != null) {
mListener.onAction(Action.STOP_SEARCH_MODE);
mListener.onSelectedTabChanged();
@@ -341,41 +396,6 @@ public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
}
@Override
- public boolean onQueryTextChange(String queryString) {
- // TODO: Clean up SearchView code because it keeps setting the SearchView query,
- // invoking onQueryChanged, setting up the fragment again, invalidating the options menu,
- // storing the SearchView again, and etc... unless we add in the early return statements.
- if (queryString.equals(mQueryString)) {
- return false;
- }
- mQueryString = queryString;
- if (!mSearchMode) {
- if (!TextUtils.isEmpty(queryString)) {
- setSearchMode(true);
- }
- } else if (mListener != null) {
- mListener.onAction(Action.CHANGE_SEARCH_QUERY);
- }
-
- return true;
- }
-
- @Override
- public boolean onQueryTextSubmit(String query) {
- // When the search is "committed" by the user, then hide the keyboard so the user can
- // more easily browse the list of results.
- if (mSearchView != null) {
- InputMethodManager imm = (InputMethodManager) mContext.getSystemService(
- Context.INPUT_METHOD_SERVICE);
- if (imm != null) {
- imm.hideSoftInputFromWindow(mSearchView.getWindowToken(), 0);
- }
- mSearchView.clearFocus();
- }
- return true;
- }
-
- @Override
public boolean onClose() {
setSearchMode(false);
return false;
@@ -401,7 +421,15 @@ public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
public void setFocusOnSearchView() {
mSearchView.requestFocus();
- mSearchView.setIconified(false); // Workaround for the "IME not popping up" issue.
+ showInputMethod(mSearchView); // Workaround for the "IME not popping up" issue.
+ }
+
+ private void showInputMethod(View view) {
+ final InputMethodManager imm = (InputMethodManager) mContext.getSystemService(
+ Context.INPUT_METHOD_SERVICE);
+ if (imm != null) {
+ imm.showSoftInput(view, 0);
+ }
}
private void saveLastTabPreference(int tab) {
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 1fac9fbcf..38e4d28c9 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -632,6 +632,11 @@ public class PeopleActivity extends ContactsActivity implements
updateFragmentsVisibility();
}
+ @Override
+ public void onUpButtonPressed() {
+ onBackPressed();
+ }
+
private void updateDebugOptionsVisibility(boolean visible) {
if (mEnableDebugMenuOptions != visible) {
mEnableDebugMenuOptions = visible;