blob: 680c8bdb270e76e83037d86859861d12932b3b52 [file] [log] [blame]
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -07001/*
Dmitri Plotnikovfcfdffb2010-07-15 18:00:55 -07002 * Copyright (C) 2010 The Android Open Source Project
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.contacts.activities;
18
19import com.android.contacts.R;
Katherine Kuanb5760b92011-06-01 16:19:40 -070020import com.android.contacts.activities.ActionBarAdapter.Listener.Action;
Dmitri Plotnikov15ccbb42010-10-05 17:29:07 -070021import com.android.contacts.list.ContactListFilterController;
Dmitri Plotnikovbee8d3b2010-10-12 20:57:46 -070022import com.android.contacts.list.ContactListFilterController.ContactListFilterListener;
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070023import com.android.contacts.list.ContactsRequest;
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070024
Dmitri Plotnikov1a59cff2010-09-18 12:50:45 -070025import android.app.ActionBar;
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070026import android.content.Context;
27import android.os.Bundle;
Dmitri Plotnikov15ccbb42010-10-05 17:29:07 -070028import android.text.TextUtils;
Dmitri Plotnikov1a59cff2010-09-18 12:50:45 -070029import android.widget.SearchView;
30import android.widget.SearchView.OnCloseListener;
Adam Powellc5792ae2011-01-20 18:35:48 -080031import android.widget.SearchView.OnQueryTextListener;
Dmitri Plotnikov92a6fdf2010-07-09 13:19:33 -070032
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070033/**
Dmitri Plotnikovfcfdffb2010-07-15 18:00:55 -070034 * Adapter for the action bar at the top of the Contacts activity.
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070035 */
Dmitri Plotnikoveb5c3222011-02-22 18:27:13 -080036public class ActionBarAdapter
37 implements OnQueryTextListener, OnCloseListener, ContactListFilterListener {
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070038
39 public interface Listener {
Katherine Kuanb5760b92011-06-01 16:19:40 -070040 public enum Action {
41 CHANGE_SEARCH_QUERY, START_SEARCH_MODE, STOP_SEARCH_MODE
42 }
43
44 void onAction(Action action);
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070045 }
46
Dmitri Plotnikov15ccbb42010-10-05 17:29:07 -070047 private static final String EXTRA_KEY_SEARCH_MODE = "navBar.searchMode";
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070048 private static final String EXTRA_KEY_QUERY = "navBar.query";
49
Dmitri Plotnikov15ccbb42010-10-05 17:29:07 -070050 private boolean mSearchMode;
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070051 private String mQueryString;
Dmitri Plotnikov15ccbb42010-10-05 17:29:07 -070052
Katherine Kuanb5760b92011-06-01 16:19:40 -070053 private String mSearchLabelText;
Dmitri Plotnikov15ccbb42010-10-05 17:29:07 -070054 private SearchView mSearchView;
Dmitri Plotnikov92a6fdf2010-07-09 13:19:33 -070055
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070056 private final Context mContext;
57
58 private Listener mListener;
Dmitri Plotnikovbee8d3b2010-10-12 20:57:46 -070059 private ContactListFilterController mFilterController;
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070060
Katherine Kuanb5760b92011-06-01 16:19:40 -070061 private ActionBar mActionBar;
Dmitri Plotnikov8b826462010-11-17 14:52:24 -080062
Dmitri Plotnikovfcfdffb2010-07-15 18:00:55 -070063 public ActionBarAdapter(Context context) {
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070064 mContext = context;
Katherine Kuanb5760b92011-06-01 16:19:40 -070065 mSearchLabelText = mContext.getString(R.string.search_label);
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070066 }
67
Dmitri Plotnikov1a59cff2010-09-18 12:50:45 -070068 public void onCreate(Bundle savedState, ContactsRequest request, ActionBar actionBar) {
Katherine Kuanb5760b92011-06-01 16:19:40 -070069 mActionBar = actionBar;
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070070 mQueryString = null;
Katherine Kuanb5760b92011-06-01 16:19:40 -070071
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070072 if (savedState != null) {
Dmitri Plotnikov15ccbb42010-10-05 17:29:07 -070073 mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE);
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070074 mQueryString = savedState.getString(EXTRA_KEY_QUERY);
Dmitri Plotnikov15ccbb42010-10-05 17:29:07 -070075 } else {
76 mSearchMode = request.isSearchMode();
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070077 mQueryString = request.getQueryString();
78 }
Dmitri Plotnikov1a59cff2010-09-18 12:50:45 -070079
Katherine Kuanb5760b92011-06-01 16:19:40 -070080 if (mSearchView != null) {
81 mSearchView.setQuery(mQueryString, false);
Dmitri Plotnikov1173ae22011-01-09 14:00:39 -080082 }
Dmitri Plotnikov3bfccdd2010-11-04 13:29:11 -070083
Dmitri Plotnikovbee8d3b2010-10-12 20:57:46 -070084 update();
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070085 }
86
Katherine Kuanb5760b92011-06-01 16:19:40 -070087 public void setSearchView(SearchView searchView) {
88 mSearchView = searchView;
89 mSearchView.setOnQueryTextListener(this);
90 mSearchView.setOnCloseListener(this);
91 mSearchView.setQuery(mQueryString, false);
Dmitri Plotnikov8b826462010-11-17 14:52:24 -080092 }
93
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -070094 public void setListener(Listener listener) {
95 mListener = listener;
96 }
97
Dmitri Plotnikov15ccbb42010-10-05 17:29:07 -070098 public void setContactListFilterController(ContactListFilterController controller) {
Dmitri Plotnikovbee8d3b2010-10-12 20:57:46 -070099 mFilterController = controller;
Dmitri Plotnikovbee8d3b2010-10-12 20:57:46 -0700100 mFilterController.addListener(this);
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -0700101 }
102
Dmitri Plotnikov15ccbb42010-10-05 17:29:07 -0700103 public boolean isSearchMode() {
104 return mSearchMode;
105 }
106
107 public void setSearchMode(boolean flag) {
108 if (mSearchMode != flag) {
109 mSearchMode = flag;
Dmitri Plotnikovbee8d3b2010-10-12 20:57:46 -0700110 update();
Dmitri Plotnikov0b51a8d2010-10-21 21:22:52 -0700111 if (mSearchMode) {
112 mSearchView.requestFocus();
Dmitri Plotnikovab4d29f2010-10-28 12:43:54 -0700113 } else {
114 mSearchView.setQuery(null, false);
Dmitri Plotnikov0b51a8d2010-10-21 21:22:52 -0700115 }
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -0700116 }
117 }
118
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -0700119 public String getQueryString() {
120 return mQueryString;
121 }
122
123 public void setQueryString(String query) {
124 mQueryString = query;
Dmitri Plotnikov1a59cff2010-09-18 12:50:45 -0700125 mSearchView.setQuery(query, false);
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -0700126 }
127
Dmitri Plotnikovbee8d3b2010-10-12 20:57:46 -0700128 public void update() {
Katherine Kuanb5760b92011-06-01 16:19:40 -0700129 if (mSearchMode) {
130 mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
131 mActionBar.setTitle(mSearchLabelText);
132 if (mListener != null) {
133 mListener.onAction(Action.START_SEARCH_MODE);
Dmitri Plotnikovc9916d32010-10-13 11:42:09 -0700134 }
Dmitri Plotnikov15ccbb42010-10-05 17:29:07 -0700135 } else {
Katherine Kuanb5760b92011-06-01 16:19:40 -0700136 mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
137 mActionBar.setTitle(null);
138 if (mListener != null) {
139 mListener.onAction(Action.STOP_SEARCH_MODE);
Dmitri Plotnikovbee8d3b2010-10-12 20:57:46 -0700140 }
Dmitri Plotnikov88a405f2010-09-27 18:50:57 -0700141 }
Dmitri Plotnikov1a59cff2010-09-18 12:50:45 -0700142 }
143
144 @Override
Adam Powellc5792ae2011-01-20 18:35:48 -0800145 public boolean onQueryTextChange(String queryString) {
Katherine Kuanb5760b92011-06-01 16:19:40 -0700146 // TODO: Clean up SearchView code because it keeps setting the SearchView query,
147 // invoking onQueryChanged, setting up the fragment again, invalidating the options menu,
148 // storing the SearchView again, and etc... unless we add in the early return statements.
149 if (queryString.equals(mQueryString)) {
150 return false;
151 }
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -0700152 mQueryString = queryString;
Dmitri Plotnikovab4d29f2010-10-28 12:43:54 -0700153 if (!mSearchMode) {
154 if (!TextUtils.isEmpty(queryString)) {
155 setSearchMode(true);
Dmitri Plotnikov9806ed02010-10-25 16:20:53 -0700156 }
Dmitri Plotnikovab4d29f2010-10-28 12:43:54 -0700157 } else if (mListener != null) {
Katherine Kuanb5760b92011-06-01 16:19:40 -0700158 mListener.onAction(Action.CHANGE_SEARCH_QUERY);
Dmitri Plotnikov9806ed02010-10-25 16:20:53 -0700159 }
Dmitri Plotnikovab4d29f2010-10-28 12:43:54 -0700160
Dmitri Plotnikov1a59cff2010-09-18 12:50:45 -0700161 return true;
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -0700162 }
163
164 @Override
Adam Powellc5792ae2011-01-20 18:35:48 -0800165 public boolean onQueryTextSubmit(String query) {
Dmitri Plotnikov1a59cff2010-09-18 12:50:45 -0700166 return true;
167 }
168
169 @Override
170 public boolean onClose() {
Dmitri Plotnikov15ccbb42010-10-05 17:29:07 -0700171 setSearchMode(false);
172 return false;
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -0700173 }
174
175 public void onSaveInstanceState(Bundle outState) {
Dmitri Plotnikov15ccbb42010-10-05 17:29:07 -0700176 outState.putBoolean(EXTRA_KEY_SEARCH_MODE, mSearchMode);
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -0700177 outState.putString(EXTRA_KEY_QUERY, mQueryString);
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -0700178 }
Dmitri Plotnikovbee8d3b2010-10-12 20:57:46 -0700179
Dmitri Plotnikovfa49a662011-01-13 11:04:56 -0800180 public void onRestoreInstanceState(Bundle savedState) {
181 mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE);
182 mQueryString = savedState.getString(EXTRA_KEY_QUERY);
183 }
184
Dmitri Plotnikovbee8d3b2010-10-12 20:57:46 -0700185 @Override
186 public void onContactListFiltersLoaded() {
187 update();
188 }
189
190 @Override
191 public void onContactListFilterChanged() {
192 update();
193 }
194
195 @Override
196 public void onContactListFilterCustomizationRequest() {
197 }
Dmitri Plotnikov08e1c4e2010-07-02 17:57:51 -0700198}