ActionBarAdapter.java revision 15ccbb4d22fd65165cacb7970cbe61de1aa9aac4
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;
2108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport com.android.contacts.list.ContactsRequest;
2215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport com.android.contacts.widget.NotifyingSpinner;
2308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
241a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.app.ActionBar;
2508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.content.Context;
2608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.os.Bundle;
2715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport android.text.TextUtils;
2815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport android.view.LayoutInflater;
2908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikovimport android.view.View;
301a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.widget.SearchView;
311a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.widget.SearchView.OnCloseListener;
321a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikovimport android.widget.SearchView.OnQueryChangeListener;
3315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovimport android.widget.TextView;
3492a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
3508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov/**
36fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Adapter for the action bar at the top of the Contacts activity.
3708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov */
3815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikovpublic class ActionBarAdapter implements OnQueryChangeListener, OnCloseListener {
3908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
4008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public interface Listener {
41fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov        void onAction();
4208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
4308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
4415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private static final String EXTRA_KEY_SEARCH_MODE = "navBar.searchMode";
4508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private static final String EXTRA_KEY_QUERY = "navBar.query";
4608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
4715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private static final String KEY_MODE_DEFAULT = "mode_default";
4892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    private static final String KEY_MODE_SEARCH = "mode_search";
4992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
5015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private boolean mSearchMode;
5108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private String mQueryString;
5215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private Bundle mSavedStateForSearchMode;
5315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private Bundle mSavedStateForDefaultMode;
5415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov
5515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private View mNavigationBar;
5615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private TextView mSearchLabel;
5715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private SearchView mSearchView;
5892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
5908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private final Context mContext;
6008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
6108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    private Listener mListener;
6215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private NotifyingSpinner mFilterSpinner;
6308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
64fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    public ActionBarAdapter(Context context) {
6508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mContext = context;
6608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
6708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
681a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    public void onCreate(Bundle savedState, ContactsRequest request, ActionBar actionBar) {
6908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mQueryString = null;
7008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        if (savedState != null) {
7115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE);
7208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov            mQueryString = savedState.getString(EXTRA_KEY_QUERY);
7315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mSavedStateForDefaultMode = savedState.getParcelable(KEY_MODE_DEFAULT);
7415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mSavedStateForSearchMode = savedState.getParcelable(KEY_MODE_SEARCH);
7515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        } else {
7615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mSearchMode = request.isSearchMode();
7708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov            mQueryString = request.getQueryString();
7808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
7908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
8015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mNavigationBar = LayoutInflater.from(mContext).inflate(R.layout.navigation_bar, null);
8115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        actionBar.setCustomNavigationMode(mNavigationBar);
821a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov
8315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mFilterSpinner = (NotifyingSpinner) mNavigationBar.findViewById(R.id.filter_spinner);
8415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchLabel = (TextView) mNavigationBar.findViewById(R.id.search_label);
8515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchView = (SearchView) mNavigationBar.findViewById(R.id.search_view);
8615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchView.setIconifiedByDefault(false);
8715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchView.setEnabled(false);
8815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchView.setOnQueryChangeListener(this);
8915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchView.setOnCloseListener(this);
9015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchView.setQuery(mQueryString, false);
911a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov
9215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        updateVisibility();
931a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    }
9408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
951a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    public void setListener(Listener listener) {
961a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov        mListener = listener;
9708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
9808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
9915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public void setContactListFilterController(ContactListFilterController controller) {
10015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        controller.setFilterSpinner(mFilterSpinner);
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;
11015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            updateVisibility();
1111a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov            if (mListener != null) {
1121a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov                mListener.onAction();
1131a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov            }
11408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
11508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
11608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
11708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public String getQueryString() {
11808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        return mQueryString;
11908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
12008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
12108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    public void setQueryString(String query) {
12208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mQueryString = query;
1231a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov        mSearchView.setQuery(query, false);
12408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
12508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
12615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public void updateVisibility() {
12715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        if (mSearchMode) {
12815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mSearchLabel.setVisibility(View.VISIBLE);
12915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mFilterSpinner.setVisibility(View.GONE);
13015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        } else {
13115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mSearchLabel.setVisibility(View.GONE);
13215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            mFilterSpinner.setVisibility(View.VISIBLE);
13308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
13408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
13508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
13608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
1371a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    public boolean onQueryTextChanged(String queryString) {
13808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        mQueryString = queryString;
13915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSearchMode = !TextUtils.isEmpty(queryString);
14015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        updateVisibility();
14108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        if (mListener != null) {
142fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov            mListener.onAction();
14308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        }
1441a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov        return true;
1451a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    }
1461a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov
1471a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    @Override
1481a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    public boolean onSubmitQuery(String query) {
1491a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov        return true;
15008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
15108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
15208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
1531a59cffd839069ce91a9febb8a136442340ab4c8Dmitri Plotnikov    public boolean onClose() {
15415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        setSearchMode(false);
15515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        return false;
15608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
15708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
15815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public Bundle getSavedStateForSearchMode() {
15915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        return mSavedStateForSearchMode;
16092a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    }
16192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
16215ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public void setSavedStateForSearchMode(Bundle state) {
16315ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSavedStateForSearchMode = state;
1642eb26aacc35a624607187418d61c78258eee8b2cDmitri Plotnikov    }
1652eb26aacc35a624607187418d61c78258eee8b2cDmitri Plotnikov
16615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public Bundle getSavedStateForDefaultMode() {
16715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        return mSavedStateForDefaultMode;
16892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    }
16992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
17015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public void setSavedStateForDefaultMode(Bundle state) {
17115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        mSavedStateForDefaultMode = state;
17292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    }
17392a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
17415ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    public void onSaveInstanceState(Bundle outState) {
17515ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        outState.putBoolean(EXTRA_KEY_SEARCH_MODE, mSearchMode);
17615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        outState.putString(EXTRA_KEY_QUERY, mQueryString);
17715ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        if (mSavedStateForDefaultMode != null) {
17815ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            outState.putParcelable(KEY_MODE_DEFAULT, mSavedStateForDefaultMode);
17992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        }
18015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov        if (mSavedStateForSearchMode != null) {
18115ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov            outState.putParcelable(KEY_MODE_SEARCH, mSavedStateForSearchMode);
18292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        }
18308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
18408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov}
185