ActionBarAdapter.java revision 8b8264620f9362e089322d1e3a7cc5620900e6f9
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;
2015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport com.android.contacts.list.ContactListFilterController;
21bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikovimport com.android.contacts.list.ContactListFilterController.ContactListFilterListener;
22251e4f7dc45928053133fe15fd456da00b7cbe8cDmitri Plotnikovimport com.android.contacts.list.ContactListFilterView;
2308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.list.ContactsRequest;
2408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
251a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.app.ActionBar;
263bfccddd6f61f6196a7f0af426c9e3f742de37f3Dmitri Plotnikovimport android.app.ActionBar.LayoutParams;
2708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.content.Context;
2808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.os.Bundle;
2915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport android.text.TextUtils;
3015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport android.view.LayoutInflater;
3108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.view.View;
32ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikovimport android.view.View.OnFocusChangeListener;
331a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.widget.SearchView;
341a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.widget.SearchView.OnCloseListener;
351a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.widget.SearchView.OnQueryChangeListener;
3615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport android.widget.TextView;
3792a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
3808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov/**
39fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Adapter for the action bar at the top of the Contacts activity.
4008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov */
41ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikovpublic class ActionBarAdapter implements OnQueryChangeListener, OnCloseListener,
42ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        ContactListFilterListener, OnFocusChangeListener {
4308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
4408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public interface Listener {
45fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov        void onAction();
4608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
4708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
4815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private static final String EXTRA_KEY_SEARCH_MODE = "navBar.searchMode";
4908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private static final String EXTRA_KEY_QUERY = "navBar.query";
5008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
5115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private boolean mSearchMode;
5208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private String mQueryString;
5315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov
5415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private View mNavigationBar;
5515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private TextView mSearchLabel;
5615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private SearchView mSearchView;
5792a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
5808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private final Context mContext;
5908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
6008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private Listener mListener;
61251e4f7dc45928053133fe15fd456da00b7cbe8cDmitri Plotnikov    private ContactListFilterView mFilterView;
62bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    private View mFilterIndicator;
63bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    private ContactListFilterController mFilterController;
64bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    private View mFilterContainer;
6508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
668b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private boolean mEnabled;
678b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
68fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    public ActionBarAdapter(Context context) {
6908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mContext = context;
7008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
7108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
721a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    public void onCreate(Bundle savedState, ContactsRequest request, ActionBar actionBar) {
7308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mQueryString = null;
7408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        if (savedState != null) {
7515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE);
7608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov            mQueryString = savedState.getString(EXTRA_KEY_QUERY);
7715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        } else {
7815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mSearchMode = request.isSearchMode();
7908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov            mQueryString = request.getQueryString();
8008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
8108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
823bfccddd6f61f6196a7f0af426c9e3f742de37f3Dmitri Plotnikov        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM);
833bfccddd6f61f6196a7f0af426c9e3f742de37f3Dmitri Plotnikov
8415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mNavigationBar = LayoutInflater.from(mContext).inflate(R.layout.navigation_bar, null);
853bfccddd6f61f6196a7f0af426c9e3f742de37f3Dmitri Plotnikov        LayoutParams layoutParams = new LayoutParams(
863bfccddd6f61f6196a7f0af426c9e3f742de37f3Dmitri Plotnikov                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
873bfccddd6f61f6196a7f0af426c9e3f742de37f3Dmitri Plotnikov        actionBar.setCustomView(mNavigationBar, layoutParams);
881a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov
89bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov        mFilterContainer = mNavigationBar.findViewById(R.id.filter_container);
90251e4f7dc45928053133fe15fd456da00b7cbe8cDmitri Plotnikov        mFilterView = (ContactListFilterView) mNavigationBar.findViewById(R.id.filter_view);
9115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchLabel = (TextView) mNavigationBar.findViewById(R.id.search_label);
92bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov        mFilterIndicator = mNavigationBar.findViewById(R.id.filter_indicator);
9315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchView = (SearchView) mNavigationBar.findViewById(R.id.search_view);
94bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov
9515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchView.setIconifiedByDefault(false);
9615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchView.setOnQueryChangeListener(this);
9715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchView.setOnCloseListener(this);
98ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        mSearchView.setOnQueryTextFocusChangeListener(this);
9915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchView.setQuery(mQueryString, false);
1001a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov
101bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov        update();
1021a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    }
10308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
1048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public void setEnabled(boolean enabled) {
1058b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mEnabled = enabled;
1068b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        update();
1078b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
1088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1091a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    public void setListener(Listener listener) {
1101a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov        mListener = listener;
11108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
11208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
11315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public void setContactListFilterController(ContactListFilterController controller) {
114bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov        mFilterController = controller;
115bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov        mFilterController.setAnchor(mFilterContainer);
116bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov        mFilterController.addListener(this);
11715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    }
11815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov
119ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    @Override
120ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    public void onFocusChange(View v, boolean hasFocus) {
121174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        if (v != mSearchView) {
122174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov            return;
123ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        }
124174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
125174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        // When we switch search mode on/off, the activity may need to change
126174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        // fragments, which may lead to focus temporarily leaving the search
127174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        // view or coming back to it, which could lead to an infinite loop.
128174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        // Postponing the change breaks that loop.
129174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        mNavigationBar.post(new Runnable() {
130174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
131174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov            @Override
132174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov            public void run() {
133174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov                setSearchMode(mSearchView.hasFocus());
134174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov            }
135174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        });
136ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    }
137ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov
13815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public boolean isSearchMode() {
13915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        return mSearchMode;
14008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
14108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
14215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public void setSearchMode(boolean flag) {
14315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        if (mSearchMode != flag) {
14415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mSearchMode = flag;
145bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov            update();
1460b51a8d4539cc516dc2c02948335347d1df8769bDmitri Plotnikov            if (mSearchMode) {
1470b51a8d4539cc516dc2c02948335347d1df8769bDmitri Plotnikov                mSearchView.requestFocus();
148ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            } else {
149ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov                mSearchView.setQuery(null, false);
1500b51a8d4539cc516dc2c02948335347d1df8769bDmitri Plotnikov            }
1511a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov            if (mListener != null) {
1521a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov                mListener.onAction();
1531a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov            }
15408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
15508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
15608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
15708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public String getQueryString() {
15808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        return mQueryString;
15908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
16008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
16108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public void setQueryString(String query) {
16208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mQueryString = query;
1631a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov        mSearchView.setQuery(query, false);
16408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
16508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
166bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    public void update() {
1678b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        if (!mEnabled) {
1688b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mNavigationBar.setVisibility(View.GONE);
1698b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        } else if (mSearchMode) {
1708b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mNavigationBar.setVisibility(View.VISIBLE);
17115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mSearchLabel.setVisibility(View.VISIBLE);
172251e4f7dc45928053133fe15fd456da00b7cbe8cDmitri Plotnikov            mFilterView.setVisibility(View.GONE);
173bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov            mFilterIndicator.setVisibility(View.INVISIBLE);
174c9916d303cc48b4a4ff94ef9c56d7ca5da72c4deDmitri Plotnikov            if (mFilterController != null) {
175c9916d303cc48b4a4ff94ef9c56d7ca5da72c4deDmitri Plotnikov                mFilterController.setEnabled(false);
176c9916d303cc48b4a4ff94ef9c56d7ca5da72c4deDmitri Plotnikov            }
17715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        } else {
1788b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mNavigationBar.setVisibility(View.VISIBLE);
17915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mSearchLabel.setVisibility(View.GONE);
180251e4f7dc45928053133fe15fd456da00b7cbe8cDmitri Plotnikov            mFilterView.setVisibility(View.VISIBLE);
181bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov            boolean showIndicator = false;
182c9916d303cc48b4a4ff94ef9c56d7ca5da72c4deDmitri Plotnikov            if (mFilterController != null){
183c9916d303cc48b4a4ff94ef9c56d7ca5da72c4deDmitri Plotnikov                mFilterController.setEnabled(true);
184c9916d303cc48b4a4ff94ef9c56d7ca5da72c4deDmitri Plotnikov                if (mFilterController.isLoaded()) {
185c9916d303cc48b4a4ff94ef9c56d7ca5da72c4deDmitri Plotnikov                    mFilterView.setContactListFilter(mFilterController.getFilter());
186a31fe548862fef70d3244dc3414a478f91b098f6Dmitri Plotnikov                    mFilterView.setSingleAccount(mFilterController.getAccountCount() == 1);
187c9916d303cc48b4a4ff94ef9c56d7ca5da72c4deDmitri Plotnikov                    mFilterView.bindView(false);
188a31fe548862fef70d3244dc3414a478f91b098f6Dmitri Plotnikov                    showIndicator = mFilterController.getFilterCount() > 1;
189c9916d303cc48b4a4ff94ef9c56d7ca5da72c4deDmitri Plotnikov                }
190bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov            }
191bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov            mFilterIndicator.setVisibility(showIndicator ? View.VISIBLE : View.INVISIBLE);
19208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
19308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
19408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
19508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
1961a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    public boolean onQueryTextChanged(String queryString) {
19708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mQueryString = queryString;
198ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        if (!mSearchMode) {
199ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            if (!TextUtils.isEmpty(queryString)) {
200ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov                setSearchMode(true);
2019806ed099226a19e92c29d9efa791cd187fd2a53Dmitri Plotnikov            }
202ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        } else if (mListener != null) {
203ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            mListener.onAction();
2049806ed099226a19e92c29d9efa791cd187fd2a53Dmitri Plotnikov        }
205ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov
2061a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov        return true;
2071a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    }
2081a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov
2091a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    @Override
2101a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    public boolean onSubmitQuery(String query) {
2111a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov        return true;
21208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
21308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
21408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
2151a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    public boolean onClose() {
21615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        setSearchMode(false);
21715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        return false;
21808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
21908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
22015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public void onSaveInstanceState(Bundle outState) {
22115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        outState.putBoolean(EXTRA_KEY_SEARCH_MODE, mSearchMode);
22215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        outState.putString(EXTRA_KEY_QUERY, mQueryString);
22308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
224bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov
225bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    @Override
226bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    public void onContactListFiltersLoaded() {
227bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov        update();
228bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    }
229bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov
230bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    @Override
231bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    public void onContactListFilterChanged() {
232bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov        update();
233bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    }
234bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov
235bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    @Override
236bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    public void onContactListFilterCustomizationRequest() {
237bee8d3bd37edf44c535c0cc401e8d03f095b8328Dmitri Plotnikov    }
23808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov}
239