ActionBarAdapter.java revision 2eb26aacc35a624607187418d61c78258eee8b2c
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.ContactsRequest;
21import com.android.contacts.widget.SearchEditText;
22import com.android.contacts.widget.SearchEditText.OnFilterTextListener;
23
24import android.content.Context;
25import android.os.Bundle;
26import android.view.LayoutInflater;
27import android.view.View;
28import android.view.View.OnClickListener;
29import android.view.inputmethod.InputMethodManager;
30import android.widget.ImageView;
31import android.widget.ToggleButton;
32
33import java.util.HashMap;
34
35/**
36 * Adapter for the action bar at the top of the Contacts activity.
37 */
38public class ActionBarAdapter implements OnFilterTextListener, OnClickListener {
39
40    public interface Listener {
41        void onAction();
42    }
43
44    private static final String EXTRA_KEY_DEFAULT_MODE = "navBar.defaultMode";
45    private static final String EXTRA_KEY_MODE = "navBar.mode";
46    private static final String EXTRA_KEY_QUERY = "navBar.query";
47
48    private static final String KEY_MODE_CONTACTS = "mode_contacts";
49    private static final String KEY_MODE_FAVORITES = "mode_favorites";
50    private static final String KEY_MODE_SEARCH = "mode_search";
51
52    private int mMode = ContactBrowserMode.MODE_CONTACTS;
53    private int mDefaultMode = ContactBrowserMode.MODE_CONTACTS;
54    private String mQueryString;
55    private HashMap<Integer, Bundle> mSavedStateByMode = new HashMap<Integer, Bundle>();
56
57
58    private SearchEditText mSearchEditText;
59    private View mNavigationBar;
60
61    private final Context mContext;
62
63    private Listener mListener;
64
65    private ToggleButton mContactsButton;
66    private ToggleButton mFavoritesButton;
67    private ToggleButton mSearchButton;
68    private ImageView mCancelSearchButton;
69
70    public ActionBarAdapter(Context context) {
71        mContext = context;
72    }
73
74    public void onCreate(Bundle savedState, ContactsRequest request) {
75        mDefaultMode = -1;
76        mMode = -1;
77        mQueryString = null;
78        if (savedState != null) {
79            mDefaultMode = savedState.getInt(EXTRA_KEY_DEFAULT_MODE, -1);
80            mMode = savedState.getInt(EXTRA_KEY_MODE, -1);
81            mQueryString = savedState.getString(EXTRA_KEY_QUERY);
82            restoreSavedState(savedState, ContactBrowserMode.MODE_CONTACTS, KEY_MODE_CONTACTS);
83            restoreSavedState(savedState, ContactBrowserMode.MODE_FAVORITES, KEY_MODE_FAVORITES);
84            restoreSavedState(savedState, ContactBrowserMode.MODE_SEARCH, KEY_MODE_SEARCH);
85        }
86
87        int actionCode = request.getActionCode();
88        if (mDefaultMode == -1) {
89            mDefaultMode = actionCode == ContactsRequest.ACTION_DEFAULT
90                    ? ContactBrowserMode.MODE_CONTACTS
91                    : ContactBrowserMode.MODE_FAVORITES;
92        }
93        if (mMode == -1) {
94            mMode = request.isSearchMode() ? ContactBrowserMode.MODE_SEARCH : mDefaultMode;
95        }
96        if (mQueryString == null) {
97            mQueryString = request.getQueryString();
98        }
99    }
100
101    public void setListener(Listener listener) {
102        mListener = listener;
103    }
104
105    public View onCreateView(LayoutInflater inflater) {
106        mNavigationBar = inflater.inflate(R.layout.navigation_bar, null);
107        mSearchEditText = (SearchEditText)mNavigationBar.findViewById(R.id.search_src_text);
108        mSearchEditText.setMaginfyingGlassEnabled(false);
109        mSearchEditText.setOnFilterTextListener(this);
110        mSearchEditText.setText(mQueryString);
111        mContactsButton = (ToggleButton)mNavigationBar.findViewById(R.id.nav_contacts);
112        mContactsButton.setOnClickListener(this);
113        mFavoritesButton = (ToggleButton)mNavigationBar.findViewById(R.id.nav_favorites);
114        mFavoritesButton.setOnClickListener(this);
115        mSearchButton = (ToggleButton)mNavigationBar.findViewById(R.id.nav_search);
116        mSearchButton.setOnClickListener(this);
117        mCancelSearchButton = (ImageView)mNavigationBar.findViewById(R.id.nav_cancel_search);
118        mCancelSearchButton.setOnClickListener(this);
119        update();
120
121        return mNavigationBar;
122    }
123
124    public int getMode() {
125        return mMode;
126    }
127
128    public void setMode(int mode) {
129        mMode = mode;
130        update();
131        if (mListener != null) {
132            mListener.onAction();
133        }
134    }
135
136    public int getDefaultMode() {
137        return mDefaultMode;
138    }
139
140    public void setDefaultMode(int defaultMode) {
141        mDefaultMode = defaultMode;
142    }
143
144    public String getQueryString() {
145        return mQueryString;
146    }
147
148    public void setQueryString(String query) {
149        mQueryString = query;
150        mSearchEditText.setText(query);
151    }
152
153    public void update() {
154        switch(mMode) {
155            case ContactBrowserMode.MODE_CONTACTS:
156                mContactsButton.setChecked(true);
157                mFavoritesButton.setChecked(false);
158                mSearchButton.setChecked(false);
159                mSearchButton.setVisibility(View.VISIBLE);
160                mSearchEditText.setVisibility(View.GONE);
161                mCancelSearchButton.setVisibility(View.GONE);
162                break;
163            case ContactBrowserMode.MODE_FAVORITES:
164                mContactsButton.setChecked(false);
165                mFavoritesButton.setChecked(true);
166                mSearchButton.setChecked(false);
167                mSearchButton.setVisibility(View.VISIBLE);
168                mSearchEditText.setVisibility(View.GONE);
169                mCancelSearchButton.setVisibility(View.GONE);
170                break;
171            case ContactBrowserMode.MODE_SEARCH:
172                mContactsButton.setChecked(false);
173                mFavoritesButton.setChecked(false);
174                mSearchButton.setVisibility(View.GONE);
175                mSearchEditText.setVisibility(View.VISIBLE);
176                mSearchEditText.requestFocus();
177                InputMethodManager inputMethodManager =
178                    (InputMethodManager)mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
179                inputMethodManager.showSoftInput(mSearchEditText, 0);
180                mCancelSearchButton.setVisibility(View.VISIBLE);
181                break;
182        }
183    }
184
185    public void toggleSearchMode() {
186        setMode(mMode == ContactBrowserMode.MODE_SEARCH
187                ? mDefaultMode
188                : ContactBrowserMode.MODE_SEARCH);
189    }
190
191    @Override
192    public void onClick(View view) {
193        if (view == mSearchButton) {
194            setMode(ContactBrowserMode.MODE_SEARCH);
195        } else if (view == mContactsButton) {
196            setMode(ContactBrowserMode.MODE_CONTACTS);
197            setDefaultMode(ContactBrowserMode.MODE_CONTACTS);
198        } else if (view == mFavoritesButton) {
199            setMode(ContactBrowserMode.MODE_FAVORITES);
200            setDefaultMode(ContactBrowserMode.MODE_FAVORITES);
201        } else {        // mCancelSearchButton
202            setMode(mDefaultMode);
203        }
204    }
205
206    @Override
207    public void onFilterChange(String queryString) {
208        mQueryString = queryString;
209        if (mListener != null) {
210            mListener.onAction();
211        }
212    }
213
214    @Override
215    public void onCancelSearch() {
216        setMode(mDefaultMode);
217    }
218
219    public void saveStateForMode(int mode, Bundle state) {
220        mSavedStateByMode.put(mode, state);
221    }
222
223    public Bundle getSavedStateForMode(int mode) {
224        return mSavedStateByMode.get(mode);
225    }
226
227    public void clearSavedState(int mode) {
228        mSavedStateByMode.remove(mode);
229    }
230
231    public void onSaveInstanceState(Bundle outState) {
232        outState.putInt(EXTRA_KEY_DEFAULT_MODE, mDefaultMode);
233        outState.putInt(EXTRA_KEY_MODE, mMode);
234        outState.putString(EXTRA_KEY_QUERY, mQueryString);
235        saveInstanceState(outState, ContactBrowserMode.MODE_CONTACTS, KEY_MODE_CONTACTS);
236        saveInstanceState(outState, ContactBrowserMode.MODE_FAVORITES, KEY_MODE_FAVORITES);
237        saveInstanceState(outState, ContactBrowserMode.MODE_SEARCH, KEY_MODE_SEARCH);
238    }
239
240    private void saveInstanceState(Bundle outState, int mode, String key) {
241        Bundle state = mSavedStateByMode.get(mode);
242        if (state != null) {
243            outState.putParcelable(key, state);
244        }
245    }
246
247    private void restoreSavedState(Bundle savedState, int mode, String key) {
248        Bundle bundle = savedState.getParcelable(key);
249        if (bundle == null) {
250            mSavedStateByMode.remove(mode);
251        } else {
252            mSavedStateByMode.put(mode, bundle);
253        }
254    }
255}
256