ActionBarAdapter.java revision b5760b94bbf56ce348876ec36f4669d20a1530f5
108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov/* 2fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project 308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * 408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * you may not use this file except in compliance with the License. 608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * You may obtain a copy of the License at 708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * 808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * 1008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 1108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 1208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * See the License for the specific language governing permissions and 1408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * limitations under the License. 1508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov */ 1608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 1708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovpackage com.android.contacts.activities; 1808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 1908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.R; 20b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.activities.ActionBarAdapter.Listener.Action; 2115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport com.android.contacts.list.ContactListFilterController; 22bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikovimport com.android.contacts.list.ContactListFilterController.ContactListFilterListener; 2308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.list.ContactsRequest; 2408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 251a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.app.ActionBar; 2608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.content.Context; 2708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.os.Bundle; 2815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport android.text.TextUtils; 291a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.widget.SearchView; 301a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.widget.SearchView.OnCloseListener; 31c5792ae6760291d435e91e0fdd28ece6b3311439Adam Powellimport android.widget.SearchView.OnQueryTextListener; 3292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov 3308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov/** 34fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Adapter for the action bar at the top of the Contacts activity. 3508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov */ 36eb5c3228af1e86db5552bc8baf6bf62c77612f3eDmitri Plotnikovpublic class ActionBarAdapter 37eb5c3228af1e86db5552bc8baf6bf62c77612f3eDmitri Plotnikov implements OnQueryTextListener, OnCloseListener, ContactListFilterListener { 3808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 3908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov public interface Listener { 40b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan public enum Action { 41b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan CHANGE_SEARCH_QUERY, START_SEARCH_MODE, STOP_SEARCH_MODE 42b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 43b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan 44b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan void onAction(Action action); 4508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 4608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 4715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private static final String EXTRA_KEY_SEARCH_MODE = "navBar.searchMode"; 4808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov private static final String EXTRA_KEY_QUERY = "navBar.query"; 4908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 5015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private boolean mSearchMode; 5108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov private String mQueryString; 5215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov 53b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan private String mSearchLabelText; 5415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private SearchView mSearchView; 5592a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov 5608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov private final Context mContext; 5708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 5808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov private Listener mListener; 59bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov private ContactListFilterController mFilterController; 6008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 61b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan private ActionBar mActionBar; 628b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 63fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov public ActionBarAdapter(Context context) { 6408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov mContext = context; 65b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mSearchLabelText = mContext.getString(R.string.search_label); 6608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 6708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 681a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov public void onCreate(Bundle savedState, ContactsRequest request, ActionBar actionBar) { 69b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mActionBar = actionBar; 7008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov mQueryString = null; 71b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan 7208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov if (savedState != null) { 7315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE); 7408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov mQueryString = savedState.getString(EXTRA_KEY_QUERY); 7515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov } else { 7615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchMode = request.isSearchMode(); 7708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov mQueryString = request.getQueryString(); 7808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 7908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 80b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan if (mSearchView != null) { 81b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mSearchView.setQuery(mQueryString, false); 821173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov } 831a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov 84b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan update(); 85b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 86bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov 87b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan public void setSearchView(SearchView searchView) { 88b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mSearchView = searchView; 89c5792ae6760291d435e91e0fdd28ece6b3311439Adam Powell mSearchView.setOnQueryTextListener(this); 9015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchView.setOnCloseListener(this); 9115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchView.setQuery(mQueryString, false); 928b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov } 938b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov 941a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov public void setListener(Listener listener) { 951a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov mListener = listener; 9608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 9708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 9815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov public void setContactListFilterController(ContactListFilterController controller) { 99bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov mFilterController = controller; 100bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov mFilterController.addListener(this); 10115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov } 10215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov 10315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov public boolean isSearchMode() { 10415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov return mSearchMode; 10508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 10608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 10715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov public void setSearchMode(boolean flag) { 10815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov if (mSearchMode != flag) { 10915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchMode = flag; 110bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov update(); 1110b51a8d4539cc516dc2c02948335347d1df8769bDmitri Plotnikov if (mSearchMode) { 1120b51a8d4539cc516dc2c02948335347d1df8769bDmitri Plotnikov mSearchView.requestFocus(); 113ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov } else { 114ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov mSearchView.setQuery(null, false); 1150b51a8d4539cc516dc2c02948335347d1df8769bDmitri Plotnikov } 11608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 11708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 11808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 11908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov public String getQueryString() { 12008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov return mQueryString; 12108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 12208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 12308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov public void setQueryString(String query) { 12408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov mQueryString = query; 1251a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov mSearchView.setQuery(query, false); 12608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 12708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 128bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov public void update() { 129b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan if (mSearchMode) { 130b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 131b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mActionBar.setTitle(mSearchLabelText); 132b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan if (mListener != null) { 133b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mListener.onAction(Action.START_SEARCH_MODE); 134c9916d303cc48b4a4ff94ef9c56d7ca5da72c4deDmitri Plotnikov } 13515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov } else { 136b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 137b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mActionBar.setTitle(null); 138b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan if (mListener != null) { 139b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mListener.onAction(Action.STOP_SEARCH_MODE); 140bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov } 14108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 14208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 14308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 14408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov @Override 145c5792ae6760291d435e91e0fdd28ece6b3311439Adam Powell public boolean onQueryTextChange(String queryString) { 146b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan // TODO: Clean up SearchView code because it keeps setting the SearchView query, 147b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan // invoking onQueryChanged, setting up the fragment again, invalidating the options menu, 148b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan // storing the SearchView again, and etc... unless we add in the early return statements. 149b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan if (queryString.equals(mQueryString)) { 150b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan return false; 151b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan } 15208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov mQueryString = queryString; 153ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov if (!mSearchMode) { 154ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov if (!TextUtils.isEmpty(queryString)) { 155ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov setSearchMode(true); 1569806ed099226a19e92c29d9efa791cd187fd2a53Dmitri Plotnikov } 157ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov } else if (mListener != null) { 158b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan mListener.onAction(Action.CHANGE_SEARCH_QUERY); 1599806ed099226a19e92c29d9efa791cd187fd2a53Dmitri Plotnikov } 160ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov 1611a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov return true; 1621a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov } 1631a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov 1641a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov @Override 165c5792ae6760291d435e91e0fdd28ece6b3311439Adam Powell public boolean onQueryTextSubmit(String query) { 1661a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov return true; 16708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 16808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 16908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov @Override 1701a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov public boolean onClose() { 17115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov setSearchMode(false); 17215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov return false; 17308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 17408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 17515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov public void onSaveInstanceState(Bundle outState) { 17615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov outState.putBoolean(EXTRA_KEY_SEARCH_MODE, mSearchMode); 17715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov outState.putString(EXTRA_KEY_QUERY, mQueryString); 17808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 179bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov 180fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov public void onRestoreInstanceState(Bundle savedState) { 181fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE); 182fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov mQueryString = savedState.getString(EXTRA_KEY_QUERY); 183fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov } 184fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov 185bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov @Override 186bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov public void onContactListFiltersLoaded() { 187bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov update(); 188bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov } 189bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov 190bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov @Override 191bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov public void onContactListFilterChanged() { 192bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov update(); 193bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov } 194bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov 195bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov @Override 196bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov public void onContactListFilterCustomizationRequest() { 197bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov } 19808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov} 199