ActionBarAdapter.java revision eb5c3228af1e86db5552bc8baf6bf62c77612f3e
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.widget.SearchView;
33import android.widget.SearchView.OnCloseListener;
34import android.widget.SearchView.OnQueryTextListener;
35import android.widget.TextView;
36
37/**
38 * Adapter for the action bar at the top of the Contacts activity.
39 */
40public class ActionBarAdapter
41        implements OnQueryTextListener, OnCloseListener, ContactListFilterListener {
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 boolean mSearchMode;
51    private String mQueryString;
52
53    private View mNavigationBar;
54    private TextView mSearchLabel;
55    private SearchView mSearchView;
56
57    private final Context mContext;
58
59    private Listener mListener;
60    private ContactListFilterView mFilterView;
61    private ContactListFilterController mFilterController;
62
63    private boolean mEnabled;
64
65    public ActionBarAdapter(Context context) {
66        mContext = context;
67    }
68
69    public void onCreate(Bundle savedState, ContactsRequest request, ActionBar actionBar) {
70        mQueryString = null;
71        if (savedState != null) {
72            mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE);
73            mQueryString = savedState.getString(EXTRA_KEY_QUERY);
74        } else {
75            mSearchMode = request.isSearchMode();
76            mQueryString = request.getQueryString();
77        }
78
79        if (actionBar != null) {
80            actionBar.setDisplayOptions(
81                    ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM);
82        }
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        if (actionBar != null) {
88            actionBar.setCustomView(mNavigationBar, layoutParams);
89        }
90
91        mFilterView = (ContactListFilterView) mNavigationBar.findViewById(R.id.filter_view);
92        mSearchLabel = (TextView) mNavigationBar.findViewById(R.id.search_label);
93        mSearchView = (SearchView) mNavigationBar.findViewById(R.id.search_view);
94
95        mSearchView.setOnQueryTextListener(this);
96        mSearchView.setOnCloseListener(this);
97        mSearchView.setQuery(mQueryString, false);
98        mSearchView.setQueryHint(mContext.getString(R.string.hint_findContacts));
99
100        update();
101    }
102
103    public void setEnabled(boolean enabled) {
104        mEnabled = enabled;
105        update();
106    }
107
108    public void setListener(Listener listener) {
109        mListener = listener;
110    }
111
112    public void setContactListFilterController(ContactListFilterController controller) {
113        mFilterController = controller;
114        mFilterController.setAnchor(mFilterView);
115        mFilterController.addListener(this);
116    }
117
118    public boolean isSearchMode() {
119        return mSearchMode;
120    }
121
122    public void setSearchMode(boolean flag) {
123        if (mSearchMode != flag) {
124            mSearchMode = flag;
125            update();
126            if (mSearchMode) {
127                mSearchView.requestFocus();
128            } else {
129                mSearchView.setQuery(null, false);
130            }
131            if (mListener != null) {
132                mListener.onAction();
133            }
134        }
135    }
136
137    public String getQueryString() {
138        return mQueryString;
139    }
140
141    public void setQueryString(String query) {
142        mQueryString = query;
143        mSearchView.setQuery(query, false);
144    }
145
146    public void update() {
147        if (!mEnabled) {
148            mNavigationBar.setVisibility(View.GONE);
149        } else if (mSearchMode) {
150            mNavigationBar.setVisibility(View.VISIBLE);
151            mSearchLabel.setVisibility(View.VISIBLE);
152            mFilterView.setVisibility(View.GONE);
153            if (mFilterController != null) {
154                mFilterController.setEnabled(false);
155            }
156        } else {
157            mNavigationBar.setVisibility(View.VISIBLE);
158            mSearchLabel.setVisibility(View.GONE);
159            mFilterView.setVisibility(View.VISIBLE);
160            if (mFilterController != null){
161                mFilterController.setEnabled(true);
162                if (mFilterController.isLoaded()) {
163                    mFilterView.setContactListFilter(mFilterController.getFilter());
164                    mFilterView.setSingleAccount(mFilterController.getAccountCount() == 1);
165                    mFilterView.bindView(false);
166                }
167            }
168        }
169    }
170
171    @Override
172    public boolean onQueryTextChange(String queryString) {
173        mQueryString = queryString;
174        if (!mSearchMode) {
175            if (!TextUtils.isEmpty(queryString)) {
176                setSearchMode(true);
177            }
178        } else if (mListener != null) {
179            mListener.onAction();
180        }
181
182        return true;
183    }
184
185    @Override
186    public boolean onQueryTextSubmit(String query) {
187        return true;
188    }
189
190    @Override
191    public boolean onClose() {
192        setSearchMode(false);
193        return false;
194    }
195
196    public void onSaveInstanceState(Bundle outState) {
197        outState.putBoolean(EXTRA_KEY_SEARCH_MODE, mSearchMode);
198        outState.putString(EXTRA_KEY_QUERY, mQueryString);
199    }
200
201    public void onRestoreInstanceState(Bundle savedState) {
202        mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE);
203        mQueryString = savedState.getString(EXTRA_KEY_QUERY);
204    }
205
206    @Override
207    public void onContactListFiltersLoaded() {
208        update();
209    }
210
211    @Override
212    public void onContactListFilterChanged() {
213        update();
214    }
215
216    @Override
217    public void onContactListFilterCustomizationRequest() {
218    }
219}
220