ActionBarAdapter.java revision 8b8264620f9362e089322d1e3a7cc5620900e6f9
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.app.ActionBar.LayoutParams;
27import android.content.Context;
28import android.os.Bundle;
29import android.text.TextUtils;
30import android.view.LayoutInflater;
31import android.view.View;
32import android.view.View.OnFocusChangeListener;
33import android.widget.SearchView;
34import android.widget.SearchView.OnCloseListener;
35import android.widget.SearchView.OnQueryChangeListener;
36import android.widget.TextView;
37
38/**
39 * Adapter for the action bar at the top of the Contacts activity.
40 */
41public class ActionBarAdapter implements OnQueryChangeListener, OnCloseListener,
42        ContactListFilterListener, OnFocusChangeListener {
43
44    public interface Listener {
45        void onAction();
46    }
47
48    private static final String EXTRA_KEY_SEARCH_MODE = "navBar.searchMode";
49    private static final String EXTRA_KEY_QUERY = "navBar.query";
50
51    private boolean mSearchMode;
52    private String mQueryString;
53
54    private View mNavigationBar;
55    private TextView mSearchLabel;
56    private SearchView mSearchView;
57
58    private final Context mContext;
59
60    private Listener mListener;
61    private ContactListFilterView mFilterView;
62    private View mFilterIndicator;
63    private ContactListFilterController mFilterController;
64    private View mFilterContainer;
65
66    private boolean mEnabled;
67
68    public ActionBarAdapter(Context context) {
69        mContext = context;
70    }
71
72    public void onCreate(Bundle savedState, ContactsRequest request, ActionBar actionBar) {
73        mQueryString = null;
74        if (savedState != null) {
75            mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE);
76            mQueryString = savedState.getString(EXTRA_KEY_QUERY);
77        } else {
78            mSearchMode = request.isSearchMode();
79            mQueryString = request.getQueryString();
80        }
81
82        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM);
83
84        mNavigationBar = LayoutInflater.from(mContext).inflate(R.layout.navigation_bar, null);
85        LayoutParams layoutParams = new LayoutParams(
86                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
87        actionBar.setCustomView(mNavigationBar, layoutParams);
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 setEnabled(boolean enabled) {
105        mEnabled = enabled;
106        update();
107    }
108
109    public void setListener(Listener listener) {
110        mListener = listener;
111    }
112
113    public void setContactListFilterController(ContactListFilterController controller) {
114        mFilterController = controller;
115        mFilterController.setAnchor(mFilterContainer);
116        mFilterController.addListener(this);
117    }
118
119    @Override
120    public void onFocusChange(View v, boolean hasFocus) {
121        if (v != mSearchView) {
122            return;
123        }
124
125        // When we switch search mode on/off, the activity may need to change
126        // fragments, which may lead to focus temporarily leaving the search
127        // view or coming back to it, which could lead to an infinite loop.
128        // Postponing the change breaks that loop.
129        mNavigationBar.post(new Runnable() {
130
131            @Override
132            public void run() {
133                setSearchMode(mSearchView.hasFocus());
134            }
135        });
136    }
137
138    public boolean isSearchMode() {
139        return mSearchMode;
140    }
141
142    public void setSearchMode(boolean flag) {
143        if (mSearchMode != flag) {
144            mSearchMode = flag;
145            update();
146            if (mSearchMode) {
147                mSearchView.requestFocus();
148            } else {
149                mSearchView.setQuery(null, false);
150            }
151            if (mListener != null) {
152                mListener.onAction();
153            }
154        }
155    }
156
157    public String getQueryString() {
158        return mQueryString;
159    }
160
161    public void setQueryString(String query) {
162        mQueryString = query;
163        mSearchView.setQuery(query, false);
164    }
165
166    public void update() {
167        if (!mEnabled) {
168            mNavigationBar.setVisibility(View.GONE);
169        } else if (mSearchMode) {
170            mNavigationBar.setVisibility(View.VISIBLE);
171            mSearchLabel.setVisibility(View.VISIBLE);
172            mFilterView.setVisibility(View.GONE);
173            mFilterIndicator.setVisibility(View.INVISIBLE);
174            if (mFilterController != null) {
175                mFilterController.setEnabled(false);
176            }
177        } else {
178            mNavigationBar.setVisibility(View.VISIBLE);
179            mSearchLabel.setVisibility(View.GONE);
180            mFilterView.setVisibility(View.VISIBLE);
181            boolean showIndicator = false;
182            if (mFilterController != null){
183                mFilterController.setEnabled(true);
184                if (mFilterController.isLoaded()) {
185                    mFilterView.setContactListFilter(mFilterController.getFilter());
186                    mFilterView.setSingleAccount(mFilterController.getAccountCount() == 1);
187                    mFilterView.bindView(false);
188                    showIndicator = mFilterController.getFilterCount() > 1;
189                }
190            }
191            mFilterIndicator.setVisibility(showIndicator ? View.VISIBLE : View.INVISIBLE);
192        }
193    }
194
195    @Override
196    public boolean onQueryTextChanged(String queryString) {
197        mQueryString = queryString;
198        if (!mSearchMode) {
199            if (!TextUtils.isEmpty(queryString)) {
200                setSearchMode(true);
201            }
202        } else if (mListener != null) {
203            mListener.onAction();
204        }
205
206        return true;
207    }
208
209    @Override
210    public boolean onSubmitQuery(String query) {
211        return true;
212    }
213
214    @Override
215    public boolean onClose() {
216        setSearchMode(false);
217        return false;
218    }
219
220    public void onSaveInstanceState(Bundle outState) {
221        outState.putBoolean(EXTRA_KEY_SEARCH_MODE, mSearchMode);
222        outState.putString(EXTRA_KEY_QUERY, mQueryString);
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