ContactBrowseListFragment.java revision 1db00f68b34f6cf7e9d19fedb559cf12f8c05e9c
1732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov/*
2732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project
3732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov *
4732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
5732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * you may not use this file except in compliance with the License.
6732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * You may obtain a copy of the License at
7732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov *
8732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
9732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov *
10732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
11732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
12732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * See the License for the specific language governing permissions and
14732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * limitations under the License.
15732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov */
16732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovpackage com.android.contacts.list;
17732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
1893a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikovimport com.android.common.widget.CompositeCursorAdapter.Partition;
1968e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikovimport com.android.contacts.R;
20753f8f6fde5a4f74181310593acebee94a014fe2Dmitri Plotnikovimport com.android.contacts.widget.AutoScrollListView;
2168e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov
22d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikovimport android.app.Activity;
23892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikovimport android.content.AsyncQueryHandler;
24892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikovimport android.content.ContentResolver;
257d402246e9ac26e05eeb25528bc74083412d1a5aDmitri Plotnikovimport android.content.ContentUris;
26cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikovimport android.content.Loader;
276e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikovimport android.content.SharedPreferences;
28d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikovimport android.content.SharedPreferences.Editor;
29cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikovimport android.database.Cursor;
30732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport android.net.Uri;
31cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikovimport android.os.Bundle;
32d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikovimport android.os.Handler;
33d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikovimport android.os.Message;
34d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikovimport android.preference.PreferenceManager;
357ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikovimport android.provider.ContactsContract;
36cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikovimport android.provider.ContactsContract.Contacts;
377ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikovimport android.provider.ContactsContract.Directory;
387ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikovimport android.text.TextUtils;
39264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikovimport android.util.Log;
40732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
41892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikovimport java.util.List;
42892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov
43732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov/**
44416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov * Fragment containing a contact list used for browsing (as compared to
45416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov * picking a contact with one of the PICK intents).
46732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov */
47238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikovpublic abstract class ContactBrowseListFragment extends
48238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov        ContactEntryListFragment<ContactListAdapter> {
49732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
50264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov    private static final String TAG = "ContactList";
51264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov
52cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov    private static final String KEY_SELECTED_URI = "selectedUri";
536e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    private static final String KEY_SELECTION_VERIFIED = "selectionVerified";
54264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov    private static final String KEY_FILTER = "filter";
55682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov    private static final String KEY_LAST_SELECTED_POSITION = "lastSelected";
56d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
57d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private static final String PERSISTENT_SELECTION_PREFIX = "defaultContactBrowserSelection";
58d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
59d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    /**
60d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov     * The id for a delayed message that triggers automatic selection of the first
61d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov     * found contact in search mode.
62d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov     */
63d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private static final int MESSAGE_AUTOSELECT_FIRST_FOUND_CONTACT = 1;
64d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
65d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    /**
66d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov     * The delay that is used for automatically selecting the first found contact.
67d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov     */
68d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private static final int DELAY_AUTOSELECT_FIRST_FOUND_CONTACT_MILLIS = 500;
69d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
70d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    /**
71d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov     * The minimum number of characters in the search query that is required
72d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov     * before we automatically select the first found contact.
73d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov     */
74d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private static final int AUTOSELECT_FIRST_FOUND_CONTACT_MIN_QUERY_LENGTH = 2;
75d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
76d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private SharedPreferences mPrefs;
77d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private Handler mHandler;
783c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
79d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private boolean mStartedLoading;
80d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private boolean mSelectionRequired;
81d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private boolean mSelectionToScreenRequested;
82d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private boolean mSmoothScrollRequested;
83d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private boolean mSelectionPersistenceRequested;
84cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov    private Uri mSelectedContactUri;
857ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov    private long mSelectedContactDirectoryId;
867ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov    private String mSelectedContactLookupKey;
877d402246e9ac26e05eeb25528bc74083412d1a5aDmitri Plotnikov    private long mSelectedContactId;
886e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    private boolean mSelectionVerified;
89682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov    private int mLastSelectedPosition = -1;
90892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov    private boolean mRefreshingContactUri;
91d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private ContactListFilter mFilter;
92d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private String mPersistentSelectionPrefix = PERSISTENT_SELECTION_PREFIX;
93cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov
946e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    protected OnContactBrowserActionListener mListener;
95732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
96892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov    /**
97892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov     * Refreshes a contact URI: it may have changed as a result of aggregation
98892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov     * activity.
99892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov     */
100892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov    private class ContactUriQueryHandler extends AsyncQueryHandler {
1015ffd9298a6cd842c5bfb2612a2eda798fa92b7adDmitri Plotnikov
102892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        public ContactUriQueryHandler(ContentResolver cr) {
103892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov            super(cr);
104892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        }
105892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov
106892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        public void runQuery() {
107892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov            startQuery(0, mSelectedContactUri, mSelectedContactUri,
108892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov                    new String[] { Contacts._ID, Contacts.LOOKUP_KEY }, null, null, null);
1095ffd9298a6cd842c5bfb2612a2eda798fa92b7adDmitri Plotnikov        }
1105ffd9298a6cd842c5bfb2612a2eda798fa92b7adDmitri Plotnikov
1115ffd9298a6cd842c5bfb2612a2eda798fa92b7adDmitri Plotnikov        @Override
112892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        protected void onQueryComplete(int token, Object cookie, Cursor data) {
113892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov            long contactId = 0;
1147ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov            String lookupKey = null;
1158773bcb491d18e88b4e3d1f9cf7c57f6bc8e69edDmitri Plotnikov            if (data != null) {
1168773bcb491d18e88b4e3d1f9cf7c57f6bc8e69edDmitri Plotnikov                if (data.moveToFirst()) {
117892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov                    contactId = data.getLong(0);
118892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov                    lookupKey = data.getString(1);
1198773bcb491d18e88b4e3d1f9cf7c57f6bc8e69edDmitri Plotnikov                }
120892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov                data.close();
1215ffd9298a6cd842c5bfb2612a2eda798fa92b7adDmitri Plotnikov            }
122892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov
123892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov            if (!cookie.equals(mSelectedContactUri)) {
124892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov                return;
125892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov            }
126892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov
127a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov            Uri uri;
128a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov            if (contactId != 0 && lookupKey != null) {
129a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov                uri = Contacts.getLookupUri(contactId, lookupKey);
130a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov            } else {
131a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov                uri = null;
132a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov            }
133a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov
134a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov            onContactUriQueryFinished(uri);
1355ffd9298a6cd842c5bfb2612a2eda798fa92b7adDmitri Plotnikov        }
136892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov    }
137892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov
138892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov    private ContactUriQueryHandler mQueryHandler;
1395ffd9298a6cd842c5bfb2612a2eda798fa92b7adDmitri Plotnikov
1405251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov    private boolean mDelaySelection;
1415251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov
142d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private Handler getHandler() {
143d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        if (mHandler == null) {
144d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mHandler = new Handler() {
145d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                @Override
146d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                public void handleMessage(Message msg) {
147d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                    switch (msg.what) {
148d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                        case MESSAGE_AUTOSELECT_FIRST_FOUND_CONTACT:
149d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                            selectDefaultContact();
150d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                            break;
151d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                    }
152d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                }
153d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            };
154d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
155d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        return mHandler;
156d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    }
157d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
158d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    @Override
159d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    public void onAttach(Activity activity) {
160d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        super.onAttach(activity);
161892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        mQueryHandler = new ContactUriQueryHandler(activity.getContentResolver());
162d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        mPrefs = PreferenceManager.getDefaultSharedPreferences(activity);
163264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        restoreFilter();
164264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        restoreSelectedUri(false);
165d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    }
166d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
167fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
1681db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki    protected void setSearchMode(boolean flag) {
169fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (isSearchMode() != flag) {
170fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            if (!flag) {
171fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov                restoreSelectedUri(true);
172fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            }
173fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            super.setSearchMode(flag);
174fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
175d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    }
176d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
177d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    public void setFilter(ContactListFilter filter) {
178a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov        setFilter(filter, true);
179a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov    }
180a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov
181a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov    public void setFilter(ContactListFilter filter, boolean restoreSelectedUri) {
182d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        if (mFilter == null && filter == null) {
183d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            return;
184d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
185d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
186d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        if (mFilter != null && mFilter.equals(filter)) {
187d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            return;
188d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
189d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
1908daa1797310aca2333efcff0a0e0b0ed03187fffDmitri Plotnikov        Log.v(TAG, "New filter: " + filter);
191264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov
192d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        mFilter = filter;
193682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov        mLastSelectedPosition = -1;
194264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        saveFilter();
195a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov        if (restoreSelectedUri) {
196a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov            mSelectedContactUri = null;
197a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov            restoreSelectedUri(true);
198a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov        }
199d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        reloadData();
200d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    }
201d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
202d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    public ContactListFilter getFilter() {
203d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        return mFilter;
204d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    }
205d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
20668e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov    @Override
207cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov    public void restoreSavedState(Bundle savedState) {
208cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov        super.restoreSavedState(savedState);
209cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov
210cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov        if (savedState == null) {
211cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov            return;
212cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov        }
213cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov
214264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        mFilter = savedState.getParcelable(KEY_FILTER);
215cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov        mSelectedContactUri = savedState.getParcelable(KEY_SELECTED_URI);
2166e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        mSelectionVerified = savedState.getBoolean(KEY_SELECTION_VERIFIED);
217682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov        mLastSelectedPosition = savedState.getInt(KEY_LAST_SELECTED_POSITION);
218580286bf8b280cfb607942cd207b3eb68fb8af66Dmitri Plotnikov        parseSelectedContactUri();
219cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov    }
220cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov
221cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov    @Override
222cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov    public void onSaveInstanceState(Bundle outState) {
223cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov        super.onSaveInstanceState(outState);
224264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        outState.putParcelable(KEY_FILTER, mFilter);
225cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov        outState.putParcelable(KEY_SELECTED_URI, mSelectedContactUri);
2266e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        outState.putBoolean(KEY_SELECTION_VERIFIED, mSelectionVerified);
227682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov        outState.putInt(KEY_LAST_SELECTED_POSITION, mLastSelectedPosition);
228cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov    }
229cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov
230892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov    protected void refreshSelectedContactUri() {
231892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        if (mQueryHandler == null) {
232892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov            return;
233892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        }
234cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov
235892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        mQueryHandler.cancelOperation(0);
236d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
237d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        if (!isSelectionVisible()) {
238d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            return;
239d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
240d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
241892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        mRefreshingContactUri = true;
242d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
243d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        if (mSelectedContactUri == null) {
244892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov            onContactUriQueryFinished(null);
245d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            return;
246d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
247d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
248d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        if (mSelectedContactDirectoryId != Directory.DEFAULT
249d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                && mSelectedContactDirectoryId != Directory.LOCAL_INVISIBLE) {
250892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov            onContactUriQueryFinished(mSelectedContactUri);
2517ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov        } else {
252892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov            mQueryHandler.runQuery();
253892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        }
254d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    }
255d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
256892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov    protected void onContactUriQueryFinished(Uri uri) {
257892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        mRefreshingContactUri = false;
258892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        mSelectedContactUri = uri;
259892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        parseSelectedContactUri();
260892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        checkSelection();
2617ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov    }
2627ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov
263cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov    @Override
26468e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov    protected void prepareEmptyView() {
26568e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov        if (isSearchMode()) {
26668e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov            return;
26768e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov        } else if (isSyncActive()) {
26868e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov            if (hasIccCard()) {
26968e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov                setEmptyText(R.string.noContactsHelpTextWithSync);
27068e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov            } else {
27168e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov                setEmptyText(R.string.noContactsNoSimHelpTextWithSync);
27268e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov            }
27368e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov        } else {
27468e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov            if (hasIccCard()) {
27568e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov                setEmptyText(R.string.noContactsHelpText);
27668e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov            } else {
27768e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov                setEmptyText(R.string.noContactsNoSimHelpText);
27868e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov            }
27968e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov        }
28068e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov    }
28168e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov
282cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov    public Uri getSelectedContactUri() {
283cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov        return mSelectedContactUri;
284cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov    }
285cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov
286d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    /**
287d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov     * Sets the new selection for the list.
288d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov     */
289cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov    public void setSelectedContactUri(Uri uri) {
290264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        setSelectedContactUri(uri, true, true, true, false);
291d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    }
292d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
2935251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov    @Override
2945251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov    public void setQueryString(String queryString, boolean delaySelection) {
2955251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov        mDelaySelection = delaySelection;
2965251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov        super.setQueryString(queryString, delaySelection);
2975251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov    }
2985251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov
299264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov    /**
300264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov     * Sets the new contact selection.
301264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov     *
302264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov     * @param uri the new selection
303264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov     * @param required if true, we need to check if the selection is present in
304264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov     *            the list and if not notify the listener so that it can load a
305264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov     *            different list
306264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov     * @param smoothScroll if true, the UI will roll smoothly to the new
307264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov     *            selection
308264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov     * @param persistent if true, the selection will be stored in shared
309264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov     *            preferences.
310264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov     * @param willReloadData if true, the selection will be remembered but not
311264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov     *            actually shown, because we are expecting that the data will be
312264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov     *            reloaded momentarily
313264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov     */
314264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov    private void setSelectedContactUri(Uri uri, boolean required, boolean smoothScroll,
315264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov            boolean persistent, boolean willReloadData) {
316d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        mSmoothScrollRequested = smoothScroll;
317d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        mSelectionToScreenRequested = true;
318d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
319174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        if ((mSelectedContactUri == null && uri != null)
320cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov                || (mSelectedContactUri != null && !mSelectedContactUri.equals(uri))) {
321d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mSelectionVerified = false;
322d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mSelectionRequired = required;
323d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mSelectionPersistenceRequested = persistent;
3247ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov            mSelectedContactUri = uri;
325580286bf8b280cfb607942cd207b3eb68fb8af66Dmitri Plotnikov            parseSelectedContactUri();
3267ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov
327264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov            if (!willReloadData) {
328264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov                // Configure the adapter to show the selection based on the
329264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov                // lookup key extracted from the URI
330264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov                ContactListAdapter adapter = getAdapter();
331264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov                if (adapter != null) {
3327d402246e9ac26e05eeb25528bc74083412d1a5aDmitri Plotnikov                    adapter.setSelectedContact(mSelectedContactDirectoryId,
3337d402246e9ac26e05eeb25528bc74083412d1a5aDmitri Plotnikov                            mSelectedContactLookupKey, mSelectedContactId);
3342f28edacb95db9ee56631815f592e46ec928a33fDmitri Plotnikov                    getListView().invalidateViews();
335264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov                }
336264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov            }
337264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov
338892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov            // Also, launch a loader to pick up a new lookup URI in case it has changed
339892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov            refreshSelectedContactUri();
3407ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov        }
3417ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov    }
3427ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov
343580286bf8b280cfb607942cd207b3eb68fb8af66Dmitri Plotnikov    private void parseSelectedContactUri() {
344580286bf8b280cfb607942cd207b3eb68fb8af66Dmitri Plotnikov        if (mSelectedContactUri != null) {
345580286bf8b280cfb607942cd207b3eb68fb8af66Dmitri Plotnikov            String directoryParam =
346892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov                    mSelectedContactUri.getQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY);
34790715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            mSelectedContactDirectoryId = TextUtils.isEmpty(directoryParam) ? Directory.DEFAULT
348580286bf8b280cfb607942cd207b3eb68fb8af66Dmitri Plotnikov                    : Long.parseLong(directoryParam);
34990715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            if (mSelectedContactUri.toString().startsWith(Contacts.CONTENT_LOOKUP_URI.toString())) {
350892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov                List<String> pathSegments = mSelectedContactUri.getPathSegments();
351892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov                mSelectedContactLookupKey = Uri.encode(pathSegments.get(2));
352b906cbe036505547895a568b20187c8361b89fffDmitri Plotnikov                if (pathSegments.size() == 4) {
3530c708094307e6c6b782095c854a1b545b6972b86Dmitri Plotnikov                    mSelectedContactId = ContentUris.parseId(mSelectedContactUri);
3540c708094307e6c6b782095c854a1b545b6972b86Dmitri Plotnikov                }
355fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            } else if (mSelectedContactUri.toString().startsWith(Contacts.CONTENT_URI.toString()) &&
356fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov                    mSelectedContactUri.getPathSegments().size() >= 2) {
3577d402246e9ac26e05eeb25528bc74083412d1a5aDmitri Plotnikov                mSelectedContactLookupKey = null;
3587d402246e9ac26e05eeb25528bc74083412d1a5aDmitri Plotnikov                mSelectedContactId = ContentUris.parseId(mSelectedContactUri);
35990715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            } else {
3607d402246e9ac26e05eeb25528bc74083412d1a5aDmitri Plotnikov                Log.e(TAG, "Unsupported contact URI: " + mSelectedContactUri);
36190715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov                mSelectedContactLookupKey = null;
3627d402246e9ac26e05eeb25528bc74083412d1a5aDmitri Plotnikov                mSelectedContactId = 0;
36390715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov            }
36490715b38713ea97504f2b4a8452c8dd46d1c20ecDmitri Plotnikov
365580286bf8b280cfb607942cd207b3eb68fb8af66Dmitri Plotnikov        } else {
366580286bf8b280cfb607942cd207b3eb68fb8af66Dmitri Plotnikov            mSelectedContactDirectoryId = Directory.DEFAULT;
367580286bf8b280cfb607942cd207b3eb68fb8af66Dmitri Plotnikov            mSelectedContactLookupKey = null;
3687d402246e9ac26e05eeb25528bc74083412d1a5aDmitri Plotnikov            mSelectedContactId = 0;
369580286bf8b280cfb607942cd207b3eb68fb8af66Dmitri Plotnikov        }
370580286bf8b280cfb607942cd207b3eb68fb8af66Dmitri Plotnikov    }
371580286bf8b280cfb607942cd207b3eb68fb8af66Dmitri Plotnikov
3727ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov    @Override
3737ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov    protected void configureAdapter() {
3747ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov        super.configureAdapter();
3757ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov
3767ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov        ContactListAdapter adapter = getAdapter();
3777ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov        if (adapter == null) {
3787ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov            return;
379cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov        }
3807ccdc1f5337f2cb7b311358c8bb3c68aef6213d1Dmitri Plotnikov
3818fdf890892dd5aeec35f693c158777f9fdd7d0e4Isaac Katzenelson        boolean searchMode = isSearchMode();
3828fdf890892dd5aeec35f693c158777f9fdd7d0e4Isaac Katzenelson        if (!searchMode && mFilter != null) {
383d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            adapter.setFilter(mFilter);
3843c8c3e811917998620b4526330b83d32d3c17078Dmitri Plotnikov            if (mSelectionRequired
3853c8c3e811917998620b4526330b83d32d3c17078Dmitri Plotnikov                    || mFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
3867d402246e9ac26e05eeb25528bc74083412d1a5aDmitri Plotnikov                adapter.setSelectedContact(
3877d402246e9ac26e05eeb25528bc74083412d1a5aDmitri Plotnikov                        mSelectedContactDirectoryId, mSelectedContactLookupKey, mSelectedContactId);
38893a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov            }
389d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
3900a4d2258411478c7c78790cd55ba25c99f588c26Dave Santoro
3918fdf890892dd5aeec35f693c158777f9fdd7d0e4Isaac Katzenelson        // Display the user's profile if not in search mode
3928fdf890892dd5aeec35f693c158777f9fdd7d0e4Isaac Katzenelson        adapter.setIncludeProfile(!searchMode);
3936e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
3946e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
3956e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
396174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
397174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onLoadFinished(loader, data);
398d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        mSelectionVerified = false;
399892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov
400892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        // Refresh the currently selected lookup in case it changed while we were sleeping
401892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        refreshSelectedContactUri();
4026e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
4036e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
4040cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    @Override
4054ef95cc3329b4ad9fa450e4090efaad9935d493fDianne Hackborn    public void onLoaderReset(Loader<Cursor> loader) {
4064ef95cc3329b4ad9fa450e4090efaad9935d493fDianne Hackborn    }
4074ef95cc3329b4ad9fa450e4090efaad9935d493fDianne Hackborn
4086e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    private void checkSelection() {
409174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        if (mSelectionVerified) {
4106e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov            return;
4116e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        }
4126e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
41393a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov        if (mRefreshingContactUri) {
41493a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov            return;
41593a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov        }
41693a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov
41793a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov        if (isLoadingDirectoryList()) {
4186e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov            return;
4196e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        }
4206e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
421174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        ContactListAdapter adapter = getAdapter();
422264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        if (adapter == null) {
423d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            return;
424d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
425d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
42693a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov        boolean directoryLoading = true;
42793a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov        int count = adapter.getPartitionCount();
42893a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov        for (int i = 0; i < count; i++) {
42993a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov            Partition partition = adapter.getPartition(i);
43093a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov            if (partition instanceof DirectoryPartition) {
43193a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov                DirectoryPartition directory = (DirectoryPartition) partition;
43293a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov                if (directory.getDirectoryId() == mSelectedContactDirectoryId) {
43393a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov                    directoryLoading = directory.isLoading();
43493a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov                    break;
43593a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov                }
43693a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov            }
43793a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov        }
43893a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov
43993a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov        if (directoryLoading) {
44093a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov            return;
44193a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov        }
44293a05db5aa59dc031ccd5ce76f816f7b2ab1d3a4Dmitri Plotnikov
4437d402246e9ac26e05eeb25528bc74083412d1a5aDmitri Plotnikov        adapter.setSelectedContact(
4447d402246e9ac26e05eeb25528bc74083412d1a5aDmitri Plotnikov                mSelectedContactDirectoryId, mSelectedContactLookupKey, mSelectedContactId);
445264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov
446264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        int selectedPosition = adapter.getSelectedContactPosition();
447682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov        if (selectedPosition != -1) {
448682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov            mLastSelectedPosition = selectedPosition;
449682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov        } else {
450d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            if (isSearchMode()) {
4515251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov                if (mDelaySelection) {
4525251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov                    selectFirstFoundContactAfterDelay();
4535251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov                    if (mListener != null) {
4545251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov                        mListener.onSelectionChange();
4555251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov                    }
4565251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov                    return;
457264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov                }
4585251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov            } else if (mSelectionRequired) {
4598fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                // A specific contact was requested, but it's not in the loaded list.
4608fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov
4618fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                // Try reconfiguring and reloading the list that will hopefully contain
4628fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                // the requested contact. Only take one attempt to avoid an infinite loop
4638fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                // in case the contact cannot be found at all.
4648fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                mSelectionRequired = false;
4658fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov
4668fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                // If we were looking at a different specific contact, just reload
4678fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                if (mFilter != null
4688fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                        && mFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
4698fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                    reloadData();
4708fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                } else {
4718fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                    // Otherwise, call the listener, which will adjust the filter.
4728fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                    notifyInvalidSelection();
4738fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                }
4748fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                return;
4755251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov            } else if (mFilter != null
4768fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                    && mFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
4775251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov                // If we were trying to load a specific contact, but that contact no longer
4785251884bbcdb92dad577d027126547527285fcceDmitri Plotnikov                // exists, call the listener, which will adjust the filter.
4798fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                notifyInvalidSelection();
4808fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov                return;
4818fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov            }
4828fe7821d91764dc33270f70e1f08ec05647ef041Dmitri Plotnikov
483264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov            saveSelectedUri(null);
484264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov            selectDefaultContact();
485d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
486d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
487d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        mSelectionRequired = false;
488d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        mSelectionVerified = true;
489d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
490d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        if (mSelectionPersistenceRequested) {
491d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            saveSelectedUri(mSelectedContactUri);
492d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mSelectionPersistenceRequested = false;
493d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
494d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
495d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        if (mSelectionToScreenRequested) {
496753f8f6fde5a4f74181310593acebee94a014fe2Dmitri Plotnikov            requestSelectionToScreen();
497d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
498d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
4992f28edacb95db9ee56631815f592e46ec928a33fDmitri Plotnikov        getListView().invalidateViews();
500264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov
501d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        if (mListener != null) {
502d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mListener.onSelectionChange();
503d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
504d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    }
505d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
506d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    /**
507d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov     * Automatically selects the first found contact in search mode.  The selection
508d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov     * is updated after a delay to allow the user to type without to much UI churn
509d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov     * and to save bandwidth on directory queries.
510d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov     */
511d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    public void selectFirstFoundContactAfterDelay() {
512d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        Handler handler = getHandler();
513d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        handler.removeMessages(MESSAGE_AUTOSELECT_FIRST_FOUND_CONTACT);
514d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
515d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        String queryString = getQueryString();
516d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        if (queryString != null
517d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                && queryString.length() >= AUTOSELECT_FIRST_FOUND_CONTACT_MIN_QUERY_LENGTH) {
518d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            handler.sendEmptyMessageDelayed(MESSAGE_AUTOSELECT_FIRST_FOUND_CONTACT,
519d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                    DELAY_AUTOSELECT_FIRST_FOUND_CONTACT_MILLIS);
520d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        } else {
521264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov            setSelectedContactUri(null, false, false, false, false);
522d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
523d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    }
524d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
525d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    protected void selectDefaultContact() {
526682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov        Uri contactUri = null;
52707bf52d66b6a17be1d1a1016fdf53321a1b83861Dmitri Plotnikov        ContactListAdapter adapter = getAdapter();
528682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov        if (mLastSelectedPosition != -1) {
52907bf52d66b6a17be1d1a1016fdf53321a1b83861Dmitri Plotnikov            int count = adapter.getCount();
53007bf52d66b6a17be1d1a1016fdf53321a1b83861Dmitri Plotnikov            int pos = mLastSelectedPosition;
53107bf52d66b6a17be1d1a1016fdf53321a1b83861Dmitri Plotnikov            if (pos >= count && count > 0) {
53207bf52d66b6a17be1d1a1016fdf53321a1b83861Dmitri Plotnikov                pos = count - 1;
53307bf52d66b6a17be1d1a1016fdf53321a1b83861Dmitri Plotnikov            }
53407bf52d66b6a17be1d1a1016fdf53321a1b83861Dmitri Plotnikov            contactUri = adapter.getContactUri(pos);
535682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov        }
536682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov
537682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov        if (contactUri == null) {
53807bf52d66b6a17be1d1a1016fdf53321a1b83861Dmitri Plotnikov            contactUri = adapter.getFirstContactUri();
539682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov        }
540682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov
541682e152f65a14971d7df191ff849f9db9d50d617Dmitri Plotnikov        setSelectedContactUri(contactUri, false, mSmoothScrollRequested, false, false);
542d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    }
543d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
544d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    protected void requestSelectionToScreen() {
545d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        int selectedPosition = getAdapter().getSelectedContactPosition();
546d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        if (selectedPosition != -1) {
547753f8f6fde5a4f74181310593acebee94a014fe2Dmitri Plotnikov            AutoScrollListView listView = (AutoScrollListView)getListView();
548753f8f6fde5a4f74181310593acebee94a014fe2Dmitri Plotnikov            listView.requestPositionToScreen(
549d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov                    selectedPosition + listView.getHeaderViewsCount(), mSmoothScrollRequested);
550d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mSelectionToScreenRequested = false;
5516e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        }
5526e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
5536e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
554174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
555174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    public boolean isLoading() {
556892fb517ff1ba2e3f8804b0a9365a2173bff1f3aDmitri Plotnikov        return mRefreshingContactUri || super.isLoading();
557174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
558174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
5596e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
560264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov    protected void startLoading() {
561264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        mStartedLoading = true;
562264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        mSelectionVerified = false;
563264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        super.startLoading();
5646e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
5656e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
566a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov    public void reloadDataAndSetSelectedUri(Uri uri) {
567a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov        setSelectedContactUri(uri, true, true, true, true);
568a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov        reloadData();
569a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov    }
570a5a2744ab8102cf4ff5fbd3e1fa074a45257b3ddDmitri Plotnikov
5716e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
5726e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    public void reloadData() {
573d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        if (mStartedLoading) {
574d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mSelectionVerified = false;
57504bad51421ca4adab40900324dc2e108f5554e04Dmitri Plotnikov            mLastSelectedPosition = -1;
576d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            super.reloadData();
577d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
578cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov    }
579cfc648986f569bde83715584a91f89ed28dd8335Dmitri Plotnikov
580416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov    public void setOnContactListActionListener(OnContactBrowserActionListener listener) {
581732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        mListener = listener;
582732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
583732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
584238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov    public void createNewContact() {
5857152124ac79a2faf6fd8e4135069feb92edeb1feDmitri Plotnikov        if (mListener != null) mListener.onCreateNewContactAction();
586732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
587732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
588e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann    public void viewContact(Uri contactUri) {
589264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        setSelectedContactUri(contactUri, false, false, true, false);
590a5b3d4642e709153e202b187e8c9021506882323Daniel Lehmann        if (mListener != null) mListener.onViewContactAction(contactUri);
5911323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov    }
5921323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov
5931323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov    public void editContact(Uri contactUri) {
5947152124ac79a2faf6fd8e4135069feb92edeb1feDmitri Plotnikov        if (mListener != null) mListener.onEditContactAction(contactUri);
5951323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov    }
5961323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov
5971323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov    public void deleteContact(Uri contactUri) {
5987152124ac79a2faf6fd8e4135069feb92edeb1feDmitri Plotnikov        if (mListener != null) mListener.onDeleteContactAction(contactUri);
5991323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov    }
6001323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov
6011323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov    public void addToFavorites(Uri contactUri) {
6027152124ac79a2faf6fd8e4135069feb92edeb1feDmitri Plotnikov        if (mListener != null) mListener.onAddToFavoritesAction(contactUri);
6031323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov    }
6041323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov
6051323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov    public void removeFromFavorites(Uri contactUri) {
6067152124ac79a2faf6fd8e4135069feb92edeb1feDmitri Plotnikov        if (mListener != null) mListener.onRemoveFromFavoritesAction(contactUri);
6071323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov    }
6081323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov
6091323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov    public void callContact(Uri contactUri) {
6107152124ac79a2faf6fd8e4135069feb92edeb1feDmitri Plotnikov        if (mListener != null) mListener.onCallContactAction(contactUri);
6111323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov    }
612732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
6131323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov    public void smsContact(Uri contactUri) {
6147152124ac79a2faf6fd8e4135069feb92edeb1feDmitri Plotnikov        if (mListener != null) mListener.onSmsContactAction(contactUri);
615732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
616e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov
6176e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    private void notifyInvalidSelection() {
6187152124ac79a2faf6fd8e4135069feb92edeb1feDmitri Plotnikov        if (mListener != null) mListener.onInvalidSelection();
6196e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
6206e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
621e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov    @Override
622e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov    protected void finish() {
623e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov        super.finish();
6247152124ac79a2faf6fd8e4135069feb92edeb1feDmitri Plotnikov        if (mListener != null) mListener.onFinishAction();
625e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov    }
6268c6955ff3c05e1f3899110701c3cb5559a492f1eDmitri Plotnikov
627d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private void saveSelectedUri(Uri contactUri) {
628fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (isSearchMode()) {
629fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            return;
6308c6955ff3c05e1f3899110701c3cb5559a492f1eDmitri Plotnikov        }
6318c6955ff3c05e1f3899110701c3cb5559a492f1eDmitri Plotnikov
632fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        ContactListFilter.storeToPreferences(mPrefs, mFilter);
633fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
634fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        Editor editor = mPrefs.edit();
635fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (contactUri == null) {
636fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            editor.remove(getPersistentSelectionKey());
637fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        } else {
638fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov            editor.putString(getPersistentSelectionKey(), contactUri.toString());
6398c6955ff3c05e1f3899110701c3cb5559a492f1eDmitri Plotnikov        }
640fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        editor.apply();
6418c6955ff3c05e1f3899110701c3cb5559a492f1eDmitri Plotnikov    }
6426e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
643264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov    private void restoreSelectedUri(boolean willReloadData) {
644264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        // The meaning of mSelectionRequired is that we need to show some
645264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        // selection other than the previous selection saved in shared preferences
646264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        if (mSelectionRequired) {
647d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            return;
648d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
6496e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
650d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        String selectedUri = mPrefs.getString(getPersistentSelectionKey(), null);
651d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        if (selectedUri == null) {
652264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov            setSelectedContactUri(null, false, false, false, willReloadData);
653d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        } else {
654264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov            setSelectedContactUri(Uri.parse(selectedUri), false, false, false, willReloadData);
655264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov        }
656264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov    }
657264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov
658264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov    private void saveFilter() {
659fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        ContactListFilter.storeToPreferences(mPrefs, mFilter);
660264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov    }
661264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov
662264023c04b75043fa77267fd1b940d0afb13421dDmitri Plotnikov    private void restoreFilter() {
663d4ed72eb6610b1318545741140569a973c4ab452Daisuke Miyakawa        mFilter = ContactListFilter.restoreDefaultPreferences(mPrefs);
6646e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
66530cc853792b4a71871cef8bca03b67b805fdc34eDmitri Plotnikov
666d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    private String getPersistentSelectionKey() {
667d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        if (mFilter == null) {
668d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            return mPersistentSelectionPrefix;
669d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        } else {
670d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            return mPersistentSelectionPrefix + "-" + mFilter.getId();
671d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        }
67230cc853792b4a71871cef8bca03b67b805fdc34eDmitri Plotnikov    }
6730cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
6740cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    public boolean isOptionsMenuChanged() {
6750cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        // This fragment does not have an option menu of its own
6760cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        return false;
6770cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    }
678732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov}
679