ActionBarAdapter.java revision fcfdffb439ccf1ddef971109b82e782c47161572
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;
2008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.list.ContactsRequest;
2108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.widget.SearchEditText;
2208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.widget.SearchEditText.OnFilterTextListener;
2308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
2408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.content.Context;
2508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.os.Bundle;
2608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.view.LayoutInflater;
2708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.view.View;
2808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.view.View.OnClickListener;
2908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.view.inputmethod.InputMethodManager;
3008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.widget.ImageView;
3108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.widget.ToggleButton;
3208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
3392a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikovimport java.util.HashMap;
3492a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
3508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov/**
36fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Adapter for the action bar at the top of the Contacts activity.
3708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov */
38fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikovpublic class ActionBarAdapter implements OnFilterTextListener, OnClickListener {
3908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
4008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public interface Listener {
41fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov        void onAction();
4208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
4308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
4408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private static final String EXTRA_KEY_DEFAULT_MODE = "navBar.defaultMode";
4508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private static final String EXTRA_KEY_MODE = "navBar.mode";
4608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private static final String EXTRA_KEY_QUERY = "navBar.query";
4708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
4892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    private static final String KEY_MODE_CONTACTS = "mode_contacts";
4992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    private static final String KEY_MODE_FAVORITES = "mode_favorites";
5092a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    private static final String KEY_MODE_SEARCH = "mode_search";
5192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
52fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private int mMode = ContactBrowserMode.MODE_CONTACTS;
53fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private int mDefaultMode = ContactBrowserMode.MODE_CONTACTS;
5408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private String mQueryString;
5592a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    private HashMap<Integer, Bundle> mSavedStateByMode = new HashMap<Integer, Bundle>();
5692a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
5792a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
5808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private SearchEditText mSearchEditText;
5908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private View mNavigationBar;
6008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
6108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private final Context mContext;
6208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
6308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private Listener mListener;
6408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
6508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private ToggleButton mContactsButton;
6608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private ToggleButton mFavoritesButton;
6708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private ToggleButton mSearchButton;
6808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private ImageView mCancelSearchButton;
6908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
70fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    public ActionBarAdapter(Context context) {
7108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mContext = context;
7208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
7308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
7408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public void onCreate(Bundle savedState, ContactsRequest request) {
7508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mDefaultMode = -1;
7608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mMode = -1;
7708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mQueryString = null;
7808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        if (savedState != null) {
7908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov            mDefaultMode = savedState.getInt(EXTRA_KEY_DEFAULT_MODE, -1);
8008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov            mMode = savedState.getInt(EXTRA_KEY_MODE, -1);
8108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov            mQueryString = savedState.getString(EXTRA_KEY_QUERY);
82fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            restoreSavedState(savedState, ContactBrowserMode.MODE_CONTACTS, KEY_MODE_CONTACTS);
83fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            restoreSavedState(savedState, ContactBrowserMode.MODE_FAVORITES, KEY_MODE_FAVORITES);
84fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            restoreSavedState(savedState, ContactBrowserMode.MODE_SEARCH, KEY_MODE_SEARCH);
8508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
8608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
8708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        int actionCode = request.getActionCode();
8808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        if (mDefaultMode == -1) {
8908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov            mDefaultMode = actionCode == ContactsRequest.ACTION_DEFAULT
90fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov                    ? ContactBrowserMode.MODE_CONTACTS
91fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov                    : ContactBrowserMode.MODE_FAVORITES;
9208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
9308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        if (mMode == -1) {
94fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            mMode = request.isSearchMode() ? ContactBrowserMode.MODE_SEARCH : mDefaultMode;
9508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
9608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        if (mQueryString == null) {
9708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov            mQueryString = request.getQueryString();
9808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
9908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
10008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
10108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public void setListener(Listener listener) {
10208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mListener = listener;
10308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
10408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
10508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public View onCreateView(LayoutInflater inflater) {
10608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mNavigationBar = inflater.inflate(R.layout.navigation_bar, null);
10708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mSearchEditText = (SearchEditText)mNavigationBar.findViewById(R.id.search_src_text);
10808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mSearchEditText.setMaginfyingGlassEnabled(false);
10908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mSearchEditText.setOnFilterTextListener(this);
11008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mSearchEditText.setText(mQueryString);
11108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mContactsButton = (ToggleButton)mNavigationBar.findViewById(R.id.nav_contacts);
11208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mContactsButton.setOnClickListener(this);
11308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mFavoritesButton = (ToggleButton)mNavigationBar.findViewById(R.id.nav_favorites);
11408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mFavoritesButton.setOnClickListener(this);
11508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mSearchButton = (ToggleButton)mNavigationBar.findViewById(R.id.nav_search);
11608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mSearchButton.setOnClickListener(this);
11708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mCancelSearchButton = (ImageView)mNavigationBar.findViewById(R.id.nav_cancel_search);
11808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mCancelSearchButton.setOnClickListener(this);
11908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        update();
12008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
12108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        return mNavigationBar;
12208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
12308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
12408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public int getMode() {
12508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        return mMode;
12608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
12708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
12808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public void setMode(int mode) {
12908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mMode = mode;
13008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        update();
13108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        if (mListener != null) {
132fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            mListener.onAction();
13308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
13408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
13508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
13608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public int getDefaultMode() {
13708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        return mDefaultMode;
13808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
13908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
14008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public void setDefaultMode(int defaultMode) {
14108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mDefaultMode = defaultMode;
14208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
14308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
14408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public String getQueryString() {
14508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        return mQueryString;
14608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
14708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
14808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public void setQueryString(String query) {
14908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mQueryString = query;
15008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mSearchEditText.setText(query);
15108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
15208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
15308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public void update() {
15408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        switch(mMode) {
155fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            case ContactBrowserMode.MODE_CONTACTS:
15608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mContactsButton.setChecked(true);
15708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mFavoritesButton.setChecked(false);
15808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mSearchButton.setChecked(false);
15908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mSearchButton.setVisibility(View.VISIBLE);
16008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mSearchEditText.setVisibility(View.GONE);
16108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mCancelSearchButton.setVisibility(View.GONE);
16208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                break;
163fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            case ContactBrowserMode.MODE_FAVORITES:
16408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mContactsButton.setChecked(false);
16508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mFavoritesButton.setChecked(true);
16608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mSearchButton.setChecked(false);
16708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mSearchButton.setVisibility(View.VISIBLE);
16808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mSearchEditText.setVisibility(View.GONE);
16908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mCancelSearchButton.setVisibility(View.GONE);
17008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                break;
171fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            case ContactBrowserMode.MODE_SEARCH:
17208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mContactsButton.setChecked(false);
17308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mFavoritesButton.setChecked(false);
17408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mSearchButton.setVisibility(View.GONE);
17508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mSearchEditText.setVisibility(View.VISIBLE);
17608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mSearchEditText.requestFocus();
17708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                InputMethodManager inputMethodManager =
17808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                    (InputMethodManager)mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
17908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                inputMethodManager.showSoftInput(mSearchEditText, 0);
18008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                mCancelSearchButton.setVisibility(View.VISIBLE);
18108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov                break;
18208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
18308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
18408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
18508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public void toggleSearchMode() {
186fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov        setMode(mMode == ContactBrowserMode.MODE_SEARCH
187fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov                ? mDefaultMode
188fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov                : ContactBrowserMode.MODE_SEARCH);
18908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
19008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
19108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
19208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public void onClick(View view) {
19308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        if (view == mSearchButton) {
194fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            setMode(ContactBrowserMode.MODE_SEARCH);
19508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        } else if (view == mContactsButton) {
196fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            setMode(ContactBrowserMode.MODE_CONTACTS);
197fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            setDefaultMode(ContactBrowserMode.MODE_CONTACTS);
19808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        } else if (view == mFavoritesButton) {
199fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            setMode(ContactBrowserMode.MODE_FAVORITES);
200fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            setDefaultMode(ContactBrowserMode.MODE_FAVORITES);
20108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        } else {        // mCancelSearchButton
20208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov            setMode(mDefaultMode);
20308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
20408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
20508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
20608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
20708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public void onFilterChange(String queryString) {
20808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mQueryString = queryString;
20908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        if (mListener != null) {
210fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            mListener.onAction();
21108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
21208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
21308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
21408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
21508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public void onCancelSearch() {
21608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        setMode(mDefaultMode);
21708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
21808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
21992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    public void saveStateForMode(int mode, Bundle state) {
22092a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        mSavedStateByMode.put(mode, state);
22192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    }
22292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
22392a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    public Bundle getSavedStateForMode(int mode) {
22492a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        return mSavedStateByMode.get(mode);
22592a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    }
22692a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
22708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public void onSaveInstanceState(Bundle outState) {
22808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        outState.putInt(EXTRA_KEY_DEFAULT_MODE, mDefaultMode);
22908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        outState.putInt(EXTRA_KEY_MODE, mMode);
23008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        outState.putString(EXTRA_KEY_QUERY, mQueryString);
231fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov        saveInstanceState(outState, ContactBrowserMode.MODE_CONTACTS, KEY_MODE_CONTACTS);
232fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov        saveInstanceState(outState, ContactBrowserMode.MODE_FAVORITES, KEY_MODE_FAVORITES);
233fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov        saveInstanceState(outState, ContactBrowserMode.MODE_SEARCH, KEY_MODE_SEARCH);
23492a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    }
23592a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
23692a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    private void saveInstanceState(Bundle outState, int mode, String key) {
23792a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        Bundle state = mSavedStateByMode.get(mode);
23892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        if (state != null) {
23992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov            outState.putParcelable(key, state);
24092a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        }
24192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    }
24292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
24392a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    private void restoreSavedState(Bundle savedState, int mode, String key) {
24492a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        Bundle bundle = savedState.getParcelable(key);
24592a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        if (bundle == null) {
24692a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov            mSavedStateByMode.remove(mode);
24792a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        } else {
24892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov            mSavedStateByMode.put(mode, bundle);
24992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        }
25008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
25108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov}
252