ActionBarAdapter.java revision 15ccbb4d22fd65165cacb7970cbe61de1aa9aac4
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; 2015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport com.android.contacts.list.ContactListFilterController; 2108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.list.ContactsRequest; 2215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport com.android.contacts.widget.NotifyingSpinner; 2308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 241a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.app.ActionBar; 2508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.content.Context; 2608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.os.Bundle; 2715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport android.text.TextUtils; 2815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport android.view.LayoutInflater; 2908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.view.View; 301a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.widget.SearchView; 311a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.widget.SearchView.OnCloseListener; 321a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.widget.SearchView.OnQueryChangeListener; 3315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport android.widget.TextView; 3492a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov 3508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov/** 36fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Adapter for the action bar at the top of the Contacts activity. 3708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov */ 3815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovpublic class ActionBarAdapter implements OnQueryChangeListener, OnCloseListener { 3908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 4008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov public interface Listener { 41fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov void onAction(); 4208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 4308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 4415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private static final String EXTRA_KEY_SEARCH_MODE = "navBar.searchMode"; 4508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov private static final String EXTRA_KEY_QUERY = "navBar.query"; 4608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 4715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private static final String KEY_MODE_DEFAULT = "mode_default"; 4892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov private static final String KEY_MODE_SEARCH = "mode_search"; 4992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov 5015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private boolean mSearchMode; 5108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov private String mQueryString; 5215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private Bundle mSavedStateForSearchMode; 5315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private Bundle mSavedStateForDefaultMode; 5415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov 5515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private View mNavigationBar; 5615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private TextView mSearchLabel; 5715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private SearchView mSearchView; 5892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov 5908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov private final Context mContext; 6008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 6108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov private Listener mListener; 6215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov private NotifyingSpinner mFilterSpinner; 6308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 64fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov public ActionBarAdapter(Context context) { 6508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov mContext = context; 6608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 6708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 681a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov public void onCreate(Bundle savedState, ContactsRequest request, ActionBar actionBar) { 6908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov mQueryString = null; 7008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov if (savedState != null) { 7115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE); 7208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov mQueryString = savedState.getString(EXTRA_KEY_QUERY); 7315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSavedStateForDefaultMode = savedState.getParcelable(KEY_MODE_DEFAULT); 7415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSavedStateForSearchMode = savedState.getParcelable(KEY_MODE_SEARCH); 7515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov } else { 7615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchMode = request.isSearchMode(); 7708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov mQueryString = request.getQueryString(); 7808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 7908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 8015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mNavigationBar = LayoutInflater.from(mContext).inflate(R.layout.navigation_bar, null); 8115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov actionBar.setCustomNavigationMode(mNavigationBar); 821a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov 8315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mFilterSpinner = (NotifyingSpinner) mNavigationBar.findViewById(R.id.filter_spinner); 8415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchLabel = (TextView) mNavigationBar.findViewById(R.id.search_label); 8515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchView = (SearchView) mNavigationBar.findViewById(R.id.search_view); 8615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchView.setIconifiedByDefault(false); 8715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchView.setEnabled(false); 8815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchView.setOnQueryChangeListener(this); 8915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchView.setOnCloseListener(this); 9015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchView.setQuery(mQueryString, false); 911a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov 9215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov updateVisibility(); 931a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov } 9408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 951a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov public void setListener(Listener listener) { 961a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov mListener = listener; 9708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 9808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 9915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov public void setContactListFilterController(ContactListFilterController controller) { 10015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov controller.setFilterSpinner(mFilterSpinner); 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; 11015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov updateVisibility(); 1111a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov if (mListener != null) { 1121a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov mListener.onAction(); 1131a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov } 11408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 11508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 11608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 11708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov public String getQueryString() { 11808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov return mQueryString; 11908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 12008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 12108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov public void setQueryString(String query) { 12208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov mQueryString = query; 1231a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov mSearchView.setQuery(query, false); 12408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 12508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 12615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov public void updateVisibility() { 12715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov if (mSearchMode) { 12815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchLabel.setVisibility(View.VISIBLE); 12915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mFilterSpinner.setVisibility(View.GONE); 13015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov } else { 13115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchLabel.setVisibility(View.GONE); 13215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mFilterSpinner.setVisibility(View.VISIBLE); 13308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 13408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 13508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 13608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov @Override 1371a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov public boolean onQueryTextChanged(String queryString) { 13808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov mQueryString = queryString; 13915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSearchMode = !TextUtils.isEmpty(queryString); 14015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov updateVisibility(); 14108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov if (mListener != null) { 142fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov mListener.onAction(); 14308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 1441a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov return true; 1451a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov } 1461a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov 1471a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov @Override 1481a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov public boolean onSubmitQuery(String query) { 1491a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov return true; 15008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 15108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 15208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov @Override 1531a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov public boolean onClose() { 15415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov setSearchMode(false); 15515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov return false; 15608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 15708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov 15815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov public Bundle getSavedStateForSearchMode() { 15915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov return mSavedStateForSearchMode; 16092a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov } 16192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov 16215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov public void setSavedStateForSearchMode(Bundle state) { 16315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSavedStateForSearchMode = state; 1642eb26aacc35a624607187418d61c78258eee8b2cDmitri Plotnikov } 1652eb26aacc35a624607187418d61c78258eee8b2cDmitri Plotnikov 16615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov public Bundle getSavedStateForDefaultMode() { 16715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov return mSavedStateForDefaultMode; 16892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov } 16992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov 17015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov public void setSavedStateForDefaultMode(Bundle state) { 17115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov mSavedStateForDefaultMode = state; 17292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov } 17392a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov 17415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov public void onSaveInstanceState(Bundle outState) { 17515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov outState.putBoolean(EXTRA_KEY_SEARCH_MODE, mSearchMode); 17615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov outState.putString(EXTRA_KEY_QUERY, mQueryString); 17715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov if (mSavedStateForDefaultMode != null) { 17815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov outState.putParcelable(KEY_MODE_DEFAULT, mSavedStateForDefaultMode); 17992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov } 18015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov if (mSavedStateForSearchMode != null) { 18115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov outState.putParcelable(KEY_MODE_SEARCH, mSavedStateForSearchMode); 18292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov } 18308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov } 18408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov} 185