ActionBarAdapter.java revision b5760b94bbf56ce348876ec36f4669d20a1530f5
108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov/*
2fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project
308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov *
408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * you may not use this file except in compliance with the License.
608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * You may obtain a copy of the License at
708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov *
808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov *
1008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
1108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
1208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * See the License for the specific language governing permissions and
1408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov * limitations under the License.
1508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov */
1608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
1708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovpackage com.android.contacts.activities;
1808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
1908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.R;
20b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.activities.ActionBarAdapter.Listener.Action;
2115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport com.android.contacts.list.ContactListFilterController;
22bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikovimport com.android.contacts.list.ContactListFilterController.ContactListFilterListener;
2308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.list.ContactsRequest;
2408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
251a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.app.ActionBar;
2608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.content.Context;
2708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.os.Bundle;
2815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport android.text.TextUtils;
291a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.widget.SearchView;
301a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.widget.SearchView.OnCloseListener;
31c5792ae6760291d435e91e0fdd28ece6b3311439Adam Powellimport android.widget.SearchView.OnQueryTextListener;
3292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
3308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov/**
34fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Adapter for the action bar at the top of the Contacts activity.
3508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov */
36eb5c3228af1e86db5552bc8baf6bf62c77612f3eDmitri Plotnikovpublic class ActionBarAdapter
37eb5c3228af1e86db5552bc8baf6bf62c77612f3eDmitri Plotnikov        implements OnQueryTextListener, OnCloseListener, ContactListFilterListener {
3808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
3908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public interface Listener {
40b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        public enum Action {
41b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            CHANGE_SEARCH_QUERY, START_SEARCH_MODE, STOP_SEARCH_MODE
42b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
43b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
44b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        void onAction(Action action);
4508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
4608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
4715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private static final String EXTRA_KEY_SEARCH_MODE = "navBar.searchMode";
4808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private static final String EXTRA_KEY_QUERY = "navBar.query";
4908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
5015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private boolean mSearchMode;
5108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private String mQueryString;
5215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov
53b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    private String mSearchLabelText;
5415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private SearchView mSearchView;
5592a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
5608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private final Context mContext;
5708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
5808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private Listener mListener;
59bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    private ContactListFilterController mFilterController;
6008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
61b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    private ActionBar mActionBar;
628b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
63fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    public ActionBarAdapter(Context context) {
6408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mContext = context;
65b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        mSearchLabelText = mContext.getString(R.string.search_label);
6608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
6708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
681a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    public void onCreate(Bundle savedState, ContactsRequest request, ActionBar actionBar) {
69b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        mActionBar = actionBar;
7008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mQueryString = null;
71b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan
7208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        if (savedState != null) {
7315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE);
7408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov            mQueryString = savedState.getString(EXTRA_KEY_QUERY);
7515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        } else {
7615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mSearchMode = request.isSearchMode();
7708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov            mQueryString = request.getQueryString();
7808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
7908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
80b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        if (mSearchView != null) {
81b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            mSearchView.setQuery(mQueryString, false);
821173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov        }
831a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov
84b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        update();
85b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    }
86bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov
87b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan    public void setSearchView(SearchView searchView) {
88b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        mSearchView = searchView;
89c5792ae6760291d435e91e0fdd28ece6b3311439Adam Powell        mSearchView.setOnQueryTextListener(this);
9015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchView.setOnCloseListener(this);
9115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchView.setQuery(mQueryString, false);
928b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
938b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
941a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    public void setListener(Listener listener) {
951a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov        mListener = listener;
9608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
9708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
9815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public void setContactListFilterController(ContactListFilterController controller) {
99bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov        mFilterController = controller;
100bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov        mFilterController.addListener(this);
10115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    }
10215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov
10315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public boolean isSearchMode() {
10415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        return mSearchMode;
10508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
10608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
10715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public void setSearchMode(boolean flag) {
10815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        if (mSearchMode != flag) {
10915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mSearchMode = flag;
110bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov            update();
1110b51a8d4539cc516dc2c02948335347d1df8769bDmitri Plotnikov            if (mSearchMode) {
1120b51a8d4539cc516dc2c02948335347d1df8769bDmitri Plotnikov                mSearchView.requestFocus();
113ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            } else {
114ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov                mSearchView.setQuery(null, false);
1150b51a8d4539cc516dc2c02948335347d1df8769bDmitri Plotnikov            }
11608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
11708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
11808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
11908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public String getQueryString() {
12008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        return mQueryString;
12108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
12208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
12308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public void setQueryString(String query) {
12408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mQueryString = query;
1251a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov        mSearchView.setQuery(query, false);
12608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
12708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
128bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    public void update() {
129b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        if (mSearchMode) {
130b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
131b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            mActionBar.setTitle(mSearchLabelText);
132b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            if (mListener != null) {
133b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                mListener.onAction(Action.START_SEARCH_MODE);
134c9916d303cc48b4a4ff94ef9c56d7ca5da72c4deDmitri Plotnikov            }
13515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        } else {
136b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
137b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            mActionBar.setTitle(null);
138b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            if (mListener != null) {
139b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                mListener.onAction(Action.STOP_SEARCH_MODE);
140bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov            }
14108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
14208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
14308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
14408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
145c5792ae6760291d435e91e0fdd28ece6b3311439Adam Powell    public boolean onQueryTextChange(String queryString) {
146b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        // TODO: Clean up SearchView code because it keeps setting the SearchView query,
147b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        // invoking onQueryChanged, setting up the fragment again, invalidating the options menu,
148b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        // storing the SearchView again, and etc... unless we add in the early return statements.
149b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        if (queryString.equals(mQueryString)) {
150b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            return false;
151b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
15208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mQueryString = queryString;
153ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        if (!mSearchMode) {
154ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            if (!TextUtils.isEmpty(queryString)) {
155ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov                setSearchMode(true);
1569806ed099226a19e92c29d9efa791cd187fd2a53Dmitri Plotnikov            }
157ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        } else if (mListener != null) {
158b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            mListener.onAction(Action.CHANGE_SEARCH_QUERY);
1599806ed099226a19e92c29d9efa791cd187fd2a53Dmitri Plotnikov        }
160ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov
1611a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov        return true;
1621a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    }
1631a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov
1641a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    @Override
165c5792ae6760291d435e91e0fdd28ece6b3311439Adam Powell    public boolean onQueryTextSubmit(String query) {
1661a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov        return true;
16708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
16808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
16908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
1701a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    public boolean onClose() {
17115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        setSearchMode(false);
17215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        return false;
17308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
17408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
17515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public void onSaveInstanceState(Bundle outState) {
17615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        outState.putBoolean(EXTRA_KEY_SEARCH_MODE, mSearchMode);
17715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        outState.putString(EXTRA_KEY_QUERY, mQueryString);
17808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
179bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov
180fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    public void onRestoreInstanceState(Bundle savedState) {
181fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE);
182fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mQueryString = savedState.getString(EXTRA_KEY_QUERY);
183fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
184fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
185bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    @Override
186bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    public void onContactListFiltersLoaded() {
187bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov        update();
188bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    }
189bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov
190bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    @Override
191bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    public void onContactListFilterChanged() {
192bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov        update();
193bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    }
194bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov
195bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    @Override
196bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    public void onContactListFilterCustomizationRequest() {
197bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    }
19808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov}
199