ActionBarAdapter.java revision ab4d29f6a2edbfae008dbaff35f25baad73aa0df
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
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;
20import com.android.contacts.list.ContactListFilterController;
21import com.android.contacts.list.ContactListFilterController.ContactListFilterListener;
22import com.android.contacts.list.ContactListFilterView;
23import com.android.contacts.list.ContactsRequest;
24
25import android.app.ActionBar;
26import android.content.Context;
27import android.os.Bundle;
28import android.text.TextUtils;
29import android.view.LayoutInflater;
30import android.view.View;
31import android.view.View.OnFocusChangeListener;
32import android.widget.SearchView;
33import android.widget.SearchView.OnCloseListener;
34import android.widget.SearchView.OnQueryChangeListener;
35import android.widget.TextView;
36
37/**
38 * Adapter for the action bar at the top of the Contacts activity.
39 */
40public class ActionBarAdapter implements OnQueryChangeListener, OnCloseListener,
41        ContactListFilterListener, OnFocusChangeListener {
42
43    public interface Listener {
44        void onAction();
45    }
46
47    private static final String EXTRA_KEY_SEARCH_MODE = "navBar.searchMode";
48    private static final String EXTRA_KEY_QUERY = "navBar.query";
49
50    private static final String KEY_MODE_DEFAULT = "mode_default";
51    private static final String KEY_MODE_SEARCH = "mode_search";
52
53    private boolean mSearchMode;
54    private String mQueryString;
55    private Bundle mSavedStateForSearchMode;
56    private Bundle mSavedStateForDefaultMode;
57
58    private View mNavigationBar;
59    private TextView mSearchLabel;
60    private SearchView mSearchView;
61
62    private final Context mContext;
63
64    private Listener mListener;
65    private ContactListFilterView mFilterView;
66    private View mFilterIndicator;
67    private ContactListFilterController mFilterController;
68    private View mFilterContainer;
69
70    public ActionBarAdapter(Context context) {
71        mContext = context;
72    }
73
74    public void onCreate(Bundle savedState, ContactsRequest request, ActionBar actionBar) {
75        mQueryString = null;
76        if (savedState != null) {
77            mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE);
78            mQueryString = savedState.getString(EXTRA_KEY_QUERY);
79            mSavedStateForDefaultMode = savedState.getParcelable(KEY_MODE_DEFAULT);
80            mSavedStateForSearchMode = savedState.getParcelable(KEY_MODE_SEARCH);
81        } else {
82            mSearchMode = request.isSearchMode();
83            mQueryString = request.getQueryString();
84        }
85
86        mNavigationBar = LayoutInflater.from(mContext).inflate(R.layout.navigation_bar, null);
87        actionBar.setCustomNavigationMode(mNavigationBar);
88
89        mFilterContainer = mNavigationBar.findViewById(R.id.filter_container);
90        mFilterView = (ContactListFilterView) mNavigationBar.findViewById(R.id.filter_view);
91        mSearchLabel = (TextView) mNavigationBar.findViewById(R.id.search_label);
92        mFilterIndicator = mNavigationBar.findViewById(R.id.filter_indicator);
93        mSearchView = (SearchView) mNavigationBar.findViewById(R.id.search_view);
94
95        mSearchView.setIconifiedByDefault(false);
96        mSearchView.setOnQueryChangeListener(this);
97        mSearchView.setOnCloseListener(this);
98        mSearchView.setOnQueryTextFocusChangeListener(this);
99        mSearchView.setQuery(mQueryString, false);
100
101        update();
102    }
103
104    public void setListener(Listener listener) {
105        mListener = listener;
106    }
107
108    public void setContactListFilterController(ContactListFilterController controller) {
109        mFilterController = controller;
110        mFilterController.setAnchor(mFilterContainer);
111        mFilterController.addListener(this);
112    }
113
114    @Override
115    public void onFocusChange(View v, boolean hasFocus) {
116        if (v == mSearchView) {
117            setSearchMode(hasFocus);
118        }
119    }
120
121    public boolean isSearchMode() {
122        return mSearchMode;
123    }
124
125    public void setSearchMode(boolean flag) {
126        if (mSearchMode != flag) {
127            mSearchMode = flag;
128            update();
129            if (mSearchMode) {
130                mSearchView.requestFocus();
131            } else {
132                mSearchView.setQuery(null, false);
133            }
134            if (mListener != null) {
135                mListener.onAction();
136            }
137        }
138    }
139
140    public String getQueryString() {
141        return mQueryString;
142    }
143
144    public void setQueryString(String query) {
145        mQueryString = query;
146        mSearchView.setQuery(query, false);
147    }
148
149    public void update() {
150        if (mSearchMode) {
151            mSearchLabel.setVisibility(View.VISIBLE);
152            mFilterView.setVisibility(View.GONE);
153            mFilterIndicator.setVisibility(View.INVISIBLE);
154            if (mFilterController != null) {
155                mFilterController.setEnabled(false);
156            }
157        } else {
158            mSearchLabel.setVisibility(View.GONE);
159            mFilterView.setVisibility(View.VISIBLE);
160            boolean showIndicator = false;
161            if (mFilterController != null){
162                mFilterController.setEnabled(true);
163                if (mFilterController.isLoaded()) {
164                    mFilterView.setContactListFilter(mFilterController.getFilter());
165                    mFilterView.bindView(false);
166                    showIndicator = mFilterController.getFilterList().size() > 1;
167                }
168            }
169            mFilterIndicator.setVisibility(showIndicator ? View.VISIBLE : View.INVISIBLE);
170        }
171    }
172
173    @Override
174    public boolean onQueryTextChanged(String queryString) {
175        mQueryString = queryString;
176        if (!mSearchMode) {
177            if (!TextUtils.isEmpty(queryString)) {
178                setSearchMode(true);
179            }
180        } else if (mListener != null) {
181            mListener.onAction();
182        }
183
184        return true;
185    }
186
187    @Override
188    public boolean onSubmitQuery(String query) {
189        return true;
190    }
191
192    @Override
193    public boolean onClose() {
194        setSearchMode(false);
195        return false;
196    }
197
198    public Bundle getSavedStateForSearchMode() {
199        return mSavedStateForSearchMode;
200    }
201
202    public void setSavedStateForSearchMode(Bundle state) {
203        mSavedStateForSearchMode = state;
204    }
205
206    public Bundle getSavedStateForDefaultMode() {
207        return mSavedStateForDefaultMode;
208    }
209
210    public void setSavedStateForDefaultMode(Bundle state) {
211        mSavedStateForDefaultMode = state;
212    }
213
214    public void onSaveInstanceState(Bundle outState) {
215        outState.putBoolean(EXTRA_KEY_SEARCH_MODE, mSearchMode);
216        outState.putString(EXTRA_KEY_QUERY, mQueryString);
217        if (mSavedStateForDefaultMode != null) {
218            outState.putParcelable(KEY_MODE_DEFAULT, mSavedStateForDefaultMode);
219        }
220        if (mSavedStateForSearchMode != null) {
221            outState.putParcelable(KEY_MODE_SEARCH, mSavedStateForSearchMode);
222        }
223    }
224
225    @Override
226    public void onContactListFiltersLoaded() {
227        update();
228    }
229
230    @Override
231    public void onContactListFilterChanged() {
232        update();
233    }
234
235    @Override
236    public void onContactListFilterCustomizationRequest() {
237    }
238}
239