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