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