PeopleActivity.java revision 5b221086e4b994d6325d7396625900a79e27ae51
17aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/*
2fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project
37aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project *
47aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
57aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * you may not use this file except in compliance with the License.
67aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * You may obtain a copy of the License at
77aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project *
87aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
97aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project *
107aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
117aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
127aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * See the License for the specific language governing permissions and
147aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project * limitations under the License.
157aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */
167aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
1727834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovpackage com.android.contacts.activities;
187aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
19e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.app.Fragment;
20e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.app.FragmentManager;
21e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.app.FragmentTransaction;
22e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.content.Intent;
23e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.graphics.Rect;
24e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.net.Uri;
25e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Bundle;
26e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Parcelable;
279f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Chengimport android.os.UserManager;
28e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.preference.PreferenceActivity;
29e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract;
30e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.Contacts;
31e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.ProviderStatus;
32e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.QuickContact;
33e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.Settings;
34e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v13.app.FragmentPagerAdapter;
35e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v4.view.PagerAdapter;
36e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v4.view.ViewPager;
377d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglioimport android.text.TextUtils;
38e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.util.Log;
39e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.KeyCharacterMap;
40e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.KeyEvent;
41e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.Menu;
42e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuInflater;
43e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuItem;
44e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.View;
45e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.ViewGroup;
462b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulosimport android.widget.ImageButton;
47e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
486f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikovimport com.android.contacts.ContactsActivity;
4927834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovimport com.android.contacts.R;
504d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onukiimport com.android.contacts.activities.ActionBarAdapter.TabState;
51cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.ContactsUtils;
52c8dd78c595cfaf9766e59a2df012b16d6c05b213Chiao Chengimport com.android.contacts.common.dialog.ClearFrequentsDialog;
539692f2664e678b0a264c586c70cc4a9c0ffabc21Dmitri Plotnikovimport com.android.contacts.interactions.ContactDeletionInteraction;
54051f41d0e2e23fa3acd9258ffc91a60cdbe828ecChiao Chengimport com.android.contacts.common.interactions.ImportExportDialogFragment;
55821a657d618285c04cbb3c440f1777a08381f868Chiao Chengimport com.android.contacts.common.list.ContactEntryListFragment;
56a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListFilter;
570d5588da244d0992c3ff8f25d0875fdf95a8c644Chiao Chengimport com.android.contacts.common.list.ContactListFilterController;
58e776d0366d5bf2f93a0cd0f14e48804e564bccf2Chiao Chengimport com.android.contacts.common.list.ContactTileAdapter.DisplayType;
59d78ee90c0d4d93b82ad440396e87ae4f47f53e93Daniel Lehmannimport com.android.contacts.list.ContactTileListFragment;
600906ee326a5553a224eb7b004536f35b340bdcd3Dmitri Plotnikovimport com.android.contacts.list.ContactsIntentResolver;
611ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikovimport com.android.contacts.list.ContactsRequest;
628b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ContactsUnavailableFragment;
63b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuanimport com.android.contacts.list.DefaultContactBrowseListFragment;
64a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.DirectoryListLoader;
65732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport com.android.contacts.list.OnContactBrowserActionListener;
668b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.OnContactsUnavailableActionListener;
67c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onukiimport com.android.contacts.list.ProviderStatusWatcher;
68c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onukiimport com.android.contacts.list.ProviderStatusWatcher.ProviderStatusListener;
69c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikovimport com.android.contacts.preference.ContactsPreferenceActivity;
70edc0992377a76f385102249e29a9c48e82f2dbf7Daniel Lehmannimport com.android.contacts.preference.DisplayOptionsPreferenceFragment;
7130868d4ef831b6ff7b2e7a00027bb0222d93135dChiao Chengimport com.android.contacts.common.util.AccountFilterUtil;
722b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulosimport com.android.contacts.common.util.ViewUtil;
738a6f4ade05e5a8a89d91078ef9c22944450ac8baBrian Attwellimport com.android.contacts.quickcontact.QuickContactActivity;
74aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuanimport com.android.contacts.util.AccountPromptUtils;
75d9eab4da8b9946b76a2091e5cce6c858663ef1bbChiao Chengimport com.android.contacts.common.util.Constants;
763391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmannimport com.android.contacts.util.DialogManager;
778bb3d1ee5bc37f31051638c1e1303fd829662087Brian Attwellimport com.android.contacts.util.HelpUtils;
7857cf30f316b8013e172150d1ad0e197be6b46b87Tadashi G. Takaoka
797d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglioimport java.util.Locale;
806d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onukiimport java.util.concurrent.atomic.AtomicInteger;
81caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov
827aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/**
832c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * Displays a list to browse contacts.
847aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */
852b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulospublic class PeopleActivity extends ContactsActivity implements
862b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        View.OnCreateContextMenuListener,
872b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        View.OnClickListener,
882b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        ActionBarAdapter.Listener,
896e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        DialogManager.DialogShowingViewActivity,
902b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        ContactListFilterController.ContactListFilterListener,
912b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        ProviderStatusListener {
9257d27da940983fba40d8e3a6d8b99a57b48419eaDmitri Plotnikov
935e684a424e7036ba3d379221d1889b4dd7265021Dave Santoro    private static final String TAG = "PeopleActivity";
947aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
959ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    private static final String ENABLE_DEBUG_OPTIONS_HIDDEN_CODE = "debug debug!";
969ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
975c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    // These values needs to start at 2. See {@link ContactEntryListFragment}.
982c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell    private static final int SUBACTIVITY_ACCOUNT_FILTER = 2;
99c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
10034b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa    private final DialogManager mDialogManager = new DialogManager(this);
1013391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann
102ac0f783adb82ee8056e742fae4994e848e82ea3dDmitri Plotnikov    private ContactsIntentResolver mIntentResolver;
103fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ContactsRequest mRequest;
104caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov
105fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ActionBarAdapter mActionBarAdapter;
1067c5286ed8ba0d7fbe3683b560f69b3a2d4ff1e2aDmitri Plotnikov
1077979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro    private ContactTileListFragment.Listener mFavoritesFragmentListener =
108ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            new StrequentContactListFragmentListener();
109ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa
11015ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private ContactListFilterController mContactListFilterController;
1113c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
1128b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private ContactsUnavailableFragment mContactsUnavailableFragment;
113c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki    private ProviderStatusWatcher mProviderStatusWatcher;
114d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki    private ProviderStatusWatcher.Status mProviderStatus;
1158b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1160cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    private boolean mOptionsMenuContactsAvailable;
1170cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
11895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa    /**
11995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa     * Showing a list of Contacts. Also used for showing search results in search mode.
12095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa     */
1216e6c24190257fd77d99b4ab385501795537f6effDaniel Lehmann    private DefaultContactBrowseListFragment mAllFragment;
1227979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro    private ContactTileListFragment mFavoritesFragment;
1232b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos
1242c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell    /** ViewPager for swipe */
125250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private ViewPager mTabPager;
126250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private TabPagerAdapter mTabPagerAdapter;
1272e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki    private final TabPagerListener mTabPagerListener = new TabPagerListener();
12858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
1299ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    private boolean mEnableDebugMenuOptions;
1309ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
131417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
132417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * True if this activity instance is a re-created one.  i.e. set true after orientation change.
133417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * This is set in {@link #onCreate} for later use in {@link #onStart}.
134417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
135417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private boolean mIsRecreatedInstance;
136417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
137417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
138417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * If {@link #configureFragments(boolean)} is already called.  Used to avoid calling it twice
139417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * in {@link #onStart}.
140417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * (This initialization only needs to be done once in onStart() when the Activity was just
141417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * created from scratch -- i.e. onCreate() was just called)
142417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
143417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private boolean mFragmentInitialized;
144417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
145be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    /**
14632791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski     * This is to disable {@link #onOptionsItemSelected} when we trying to stop the activity.
14732791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski     */
14832791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski    private boolean mDisableOptionItemSelected;
14932791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski
1506d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    /** Sequential ID assigned to each instance; used for logging */
1516d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private final int mInstanceId;
1526d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private static final AtomicInteger sNextInstanceId = new AtomicInteger();
1536d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki
1549856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan    public PeopleActivity() {
1556d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        mInstanceId = sNextInstanceId.getAndIncrement();
1561540674a23a2ac0277a5aca3fa4ed41a6e1b74c3Dmitri Plotnikov        mIntentResolver = new ContactsIntentResolver(this);
157c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher = ProviderStatusWatcher.getInstance(this);
1586178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov    }
1596178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov
1606d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    @Override
1616d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    public String toString() {
1626d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        // Shown on logcat
1636d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        return String.format("%s@%d", getClass().getSimpleName(), mInstanceId);
1646d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    }
1656d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki
1668b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public boolean areContactsAvailable() {
167d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki        return (mProviderStatus != null)
168d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki                && mProviderStatus.status == ProviderStatus.STATUS_NORMAL;
1698b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
1708b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1716f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki    private boolean areContactWritableAccountsAvailable() {
1726f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki        return ContactsUtils.areContactWritableAccountsAvailable(this);
17349917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson    }
17449917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson
1756f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki    private boolean areGroupWritableAccountsAvailable() {
1766f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki        return ContactsUtils.areGroupWritableAccountsAvailable(this);
1776f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki    }
17849917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson
17950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki    /**
18050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * Initialize fragments that are (or may not be) in the layout.
18150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     *
18250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * For the fragments that are in the layout, we initialize them in
183417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * {@link #createViewsAndFragments(Bundle)} after inflating the layout.
18450445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     *
1852c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell     * However, the {@link ContactsUnavailableFragment} is a special fragment which may not
1862c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell     * be in the layout, so we have to do the initialization here.
1872c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell     *
1882c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell     * The ContactsUnavailableFragment is always created at runtime.
18950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     */
1907aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
19192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    public void onAttachFragment(Fragment fragment) {
1922c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        if (fragment instanceof ContactsUnavailableFragment) {
1938b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment = (ContactsUnavailableFragment)fragment;
1948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
1958b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                    new ContactsUnavailableFragmentListener());
19692a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        }
19792a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    }
19892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
19992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    @Override
20008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    protected void onCreate(Bundle savedState) {
20149627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
20249627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki            Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate start");
20349627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        }
20408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        super.onCreate(savedState);
2057aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
2066d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        if (!processIntent(false)) {
207417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            finish();
208417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return;
209417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
210a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mContactListFilterController = ContactListFilterController.getInstance(this);
211be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        mContactListFilterController.checkFilterValidity(false);
212a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mContactListFilterController.addListener(this);
213a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa
214c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.addListener(this);
215c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki
216417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mIsRecreatedInstance = (savedState != null);
217417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        createViewsAndFragments(savedState);
2184b1af3f8f68c3f5de459d17c218853fb0849d9f5Andrew Lee
21949627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
22049627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki            Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate finish");
22149627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        }
2225b221086e4b994d6325d7396625900a79e27ae51Sai Cheemalapati        getWindow().setBackgroundDrawable(null);
223fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
224fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
225fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
226fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    protected void onNewIntent(Intent intent) {
227fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        setIntent(intent);
2286d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        if (!processIntent(true)) {
229417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            finish();
230417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return;
231417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
232417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mActionBarAdapter.initialize(null, mRequest);
233417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
234be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        mContactListFilterController.checkFilterValidity(false);
235be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan
236417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Re-configure fragments.
237417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        configureFragments(true /* from request */);
238417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        invalidateOptionsMenuIfNeeded();
239fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
240fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
241417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
242417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * Resolve the intent and initialize {@link #mRequest}, and launch another activity if redirect
243417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * is needed.
244417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *
2456d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki     * @param forNewIntent set true if it's called from {@link #onNewIntent(Intent)}.
246417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * @return {@code true} if {@link PeopleActivity} should continue running.  {@code false}
247417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *         if it shouldn't, in which case the caller should finish() itself and shouldn't do
248417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *         farther initialization.
249417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
2506d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private boolean processIntent(boolean forNewIntent) {
2511ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // Extract relevant information from the intent
2521ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        mRequest = mIntentResolver.resolveIntent(getIntent());
253ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki        if (Log.isLoggable(TAG, Log.DEBUG)) {
2546d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki            Log.d(TAG, this + " processIntent: forNewIntent=" + forNewIntent
2556d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki                    + " intent=" + getIntent() + " request=" + mRequest);
2566d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        }
2571ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        if (!mRequest.isValid()) {
2586178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov            setResult(RESULT_CANCELED);
259417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return false;
2606178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov        }
2616178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov
2621ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        Intent redirect = mRequest.getRedirectIntent();
2631ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        if (redirect != null) {
2641ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            // Need to start a different activity
2656178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov            startActivity(redirect);
266417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return false;
2677aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
2687aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
2692c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT) {
27050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki            redirect = new Intent(this, ContactDetailActivity.class);
27150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki            redirect.setAction(Intent.ACTION_VIEW);
27250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki            redirect.setData(mRequest.getContactUri());
27350445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki            startActivity(redirect);
274417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return false;
27550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        }
276417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        return true;
277417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    }
27850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
279417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private void createViewsAndFragments(Bundle savedState) {
280417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        setContentView(R.layout.people_activity);
281417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
282417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        final FragmentManager fragmentManager = getFragmentManager();
283417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
284417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Hide all tabs (the current tab will later be reshown once a tab is selected)
285417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        final FragmentTransaction transaction = fragmentManager.beginTransaction();
286417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
2872c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mTabPager = getView(R.id.tab_pager);
2882c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mTabPagerAdapter = new TabPagerAdapter();
2892c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mTabPager.setAdapter(mTabPagerAdapter);
2902c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mTabPager.setOnPageChangeListener(mTabPagerListener);
291417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
2922c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        final String FAVORITE_TAG = "tab-pager-favorite";
2932c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        final String ALL_TAG = "tab-pager-all";
2942c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell
2952c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // Create the fragments and add as children of the view pager.
2962c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // The pager adapter will only change the visibility; it'll never create/destroy
2972c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // fragments.
2982c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // However, if it's after screen rotation, the fragments have been re-created by
2992c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // the fragment manager, so first see if there're already the target fragments
3002c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // existing.
3012c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mFavoritesFragment = (ContactTileListFragment)
3022c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell                fragmentManager.findFragmentByTag(FAVORITE_TAG);
3032c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mAllFragment = (DefaultContactBrowseListFragment)
3042c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell                fragmentManager.findFragmentByTag(ALL_TAG);
3052c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell
3062c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        if (mFavoritesFragment == null) {
3072c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            mFavoritesFragment = new ContactTileListFragment();
3082c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            mAllFragment = new DefaultContactBrowseListFragment();
3092c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell
3102c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            transaction.add(R.id.tab_pager, mFavoritesFragment, FAVORITE_TAG);
3112c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            transaction.add(R.id.tab_pager, mAllFragment, ALL_TAG);
312417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
313250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
314417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mFavoritesFragment.setListener(mFavoritesFragmentListener);
31550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
316417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mAllFragment.setOnContactListActionListener(new ContactBrowserActionListener());
31750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
318417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Hide all fragments for now.  We adjust visibility when we get onSelectedTabChanged()
319417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // from ActionBarAdapter.
320417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        transaction.hide(mFavoritesFragment);
321417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        transaction.hide(mAllFragment);
322f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro
3234b25da79091157935042d2942a8961ceba92166fMinh Pham        transaction.commitAllowingStateLoss();
324417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        fragmentManager.executePendingTransactions();
3254d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
3260c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro        // Setting Properties after fragment is created
3272c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mFavoritesFragment.setDisplayType(DisplayType.STREQUENT);
3280c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro
329417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Configure action bar
330a05431fe824f39e60a8b25a244a1fea39805a61bBrian Attwell        mActionBarAdapter = new ActionBarAdapter(this, this, getActionBar());
331417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mActionBarAdapter.initialize(savedState, mRequest);
33258fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
3332b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        // Configure action button
3342c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        final View floatingActionButtonContainer = findViewById(
3352c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell                R.id.floating_action_button_container);
3362c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        ViewUtil.setupFloatingActionButton(floatingActionButtonContainer, getResources());
3372c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        final ImageButton floatingActionButton = (ImageButton) findViewById(R.id.floating_action_button);
3382c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        floatingActionButton.setOnClickListener(this);
3392b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos
340417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        invalidateOptionsMenuIfNeeded();
341417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    }
34208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
343417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    @Override
344417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    protected void onStart() {
345417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        if (!mFragmentInitialized) {
346417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mFragmentInitialized = true;
347417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            /* Configure fragments if we haven't.
348417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
349417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * Note it's a one-shot initialization, so we want to do this in {@link #onCreate}.
350417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
351417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * However, because this method may indirectly touch views in fragments but fragments
352417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * created in {@link #configureContentView} using a {@link FragmentTransaction} will NOT
353417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * have views until {@link Activity#onCreate} finishes (they would if they were inflated
354417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * from a layout), we need to do it here in {@link #onStart()}.
355417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
356417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * (When {@link Fragment#onCreateView} is called is different in the former case and
357417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * in the latter case, unfortunately.)
358417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
359417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * Also, we skip most of the work in it if the activity is a re-created one.
360417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * (so the argument.)
361417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             */
362417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            configureFragments(!mIsRecreatedInstance);
363417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
364417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        super.onStart();
3653c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov    }
3663c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
3676e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
368174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    protected void onPause() {
369fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mOptionsMenuContactsAvailable = false;
370c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.stop();
371174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onPause();
372174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
373174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
374174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
375174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    protected void onResume() {
376174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onResume();
377697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus
378c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.start();
379697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus        updateViewConfiguration(true);
3804d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
3814d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // Re-register the listener, which may have been cleared when onSaveInstanceState was
3824d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // called.  See also: onSaveInstanceState
3834d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.setListener(this);
38432791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski        mDisableOptionItemSelected = false;
3852e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        if (mTabPager != null) {
3862e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki            mTabPager.setOnPageChangeListener(mTabPagerListener);
3872e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        }
388a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        // Current tab may have changed since the last onSaveInstanceState().  Make sure
389a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        // the actual contents match the tab.
390a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        updateFragmentsVisibility();
391174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
392174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
393174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
394be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    protected void onStop() {
395be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        super.onStop();
396be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    }
397be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan
398be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    @Override
3994d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    protected void onDestroy() {
400c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.removeListener(this);
401c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki
402b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        // Some of variables will be null if this Activity redirects Intent.
403b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        // See also onCreate() or other methods called during the Activity's initialization.
404c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki        if (mActionBarAdapter != null) {
405c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki            mActionBarAdapter.setListener(null);
406c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki        }
407b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        if (mContactListFilterController != null) {
408b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa            mContactListFilterController.removeListener(this);
409b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        }
410b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa
4114d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        super.onDestroy();
4124d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
4134d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
414955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov    private void configureFragments(boolean fromRequest) {
415009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov        if (fromRequest) {
41691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            ContactListFilter filter = null;
41791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            int actionCode = mRequest.getActionCode();
41853b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki            boolean searchMode = mRequest.isSearchMode();
41952aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            final int tabToOpen;
42091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            switch (actionCode) {
42191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_ALL_CONTACTS:
422be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    filter = ContactListFilter.createFilterWithType(
423be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                            ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
424ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
42591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
42691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
427be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    filter = ContactListFilter.createFilterWithType(
42891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                            ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY);
429ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
43091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
43191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov
43291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_FREQUENT:
43391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_STREQUENT:
43491ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_STARRED:
435ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.FAVORITES;
43691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
4379e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro                case ContactsRequest.ACTION_VIEW_CONTACT:
438ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
439ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    break;
44052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                default:
44152aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                    tabToOpen = -1;
44252aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                    break;
443ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki            }
44452aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            if (tabToOpen != -1) {
445ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                mActionBarAdapter.setCurrentTab(tabToOpen);
44691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            }
44791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov
44891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            if (filter != null) {
44991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                mContactListFilterController.setContactListFilter(filter, false);
45053b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki                searchMode = false;
451009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov            }
452d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
453d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            if (mRequest.getContactUri() != null) {
45453b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki                searchMode = false;
455d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            }
456d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
45753b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki            mActionBarAdapter.setSearchMode(searchMode);
4580ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan            configureContactListFragmentForRequest();
459fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
460fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
4610ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan        configureContactListFragment();
462fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
4638268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
4646e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
4656e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
4666e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
467d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    public void onContactListFilterChanged() {
46895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        if (mAllFragment == null || !mAllFragment.isAdded()) {
469d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov            return;
470d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov        }
471d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov
47295c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
473e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
4748268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
4753ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov    }
4763ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov
477fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    /**
478fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov     * Handler for action bar actions.
479fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov     */
480fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov    @Override
481311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann    public void onAction(int action) {
482b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        switch (action) {
483311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann            case ActionBarAdapter.Listener.Action.START_SEARCH_MODE:
484ff64220c681b48d54ff9cb3d82687fc53e2139e5Makoto Onuki                // Tell the fragments that we're in the search mode
485ff64220c681b48d54ff9cb3d82687fc53e2139e5Makoto Onuki                configureFragments(false /* from request */);
4864d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                updateFragmentsVisibility();
4878811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki                invalidateOptionsMenu();
488b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                break;
489311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann            case ActionBarAdapter.Listener.Action.STOP_SEARCH_MODE:
4901db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki                setQueryTextToFragment("");
4914d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                updateFragmentsVisibility();
4928811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki                invalidateOptionsMenu();
4938268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                break;
494311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann            case ActionBarAdapter.Listener.Action.CHANGE_SEARCH_QUERY:
4959ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                final String queryString = mActionBarAdapter.getQueryString();
4969ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                setQueryTextToFragment(queryString);
4979ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                updateDebugOptionsVisibility(
4989ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                        ENABLE_DEBUG_OPTIONS_HIDDEN_CODE.equals(queryString));
499b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                break;
500b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            default:
501b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                throw new IllegalStateException("Unkonwn ActionBarAdapter action: " + action);
502b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
503fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov    }
504fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov
5054d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    @Override
5064d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    public void onSelectedTabChanged() {
5074d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        updateFragmentsVisibility();
5084d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
5094d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
5106adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell    @Override
5116adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell    public void onUpButtonPressed() {
5126adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell        onBackPressed();
5136adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell    }
5146adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell
5159ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    private void updateDebugOptionsVisibility(boolean visible) {
5169ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki        if (mEnableDebugMenuOptions != visible) {
5179ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            mEnableDebugMenuOptions = visible;
5189ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            invalidateOptionsMenu();
5199ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki        }
5209ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    }
5219ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
5224d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    /**
5234d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     * Updates the fragment/view visibility according to the current mode, such as
5244d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     * {@link ActionBarAdapter#isSearchMode()} and {@link ActionBarAdapter#getCurrentTab()}.
5254d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     */
5264d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    private void updateFragmentsVisibility() {
52752aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann        int tab = mActionBarAdapter.getCurrentTab();
5284d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
5294d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        if (mActionBarAdapter.isSearchMode()) {
5302c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            mTabPagerAdapter.setSearchMode(true);
5312c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        } else {
5322c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            // No smooth scrolling if quitting from the search mode.
5332c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            final boolean wasSearchMode = mTabPagerAdapter.isSearchMode();
5342c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            mTabPagerAdapter.setSearchMode(false);
5352c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            if (mTabPager.getCurrentItem() != tab) {
5362c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell                mTabPager.setCurrentItem(tab, !wasSearchMode);
5372c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            }
5384d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        }
5392c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        invalidateOptionsMenu();
54066606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        showEmptyStateForTab(tab);
54166606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson    }
54266606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson
54352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann    private void showEmptyStateForTab(int tab) {
54466606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        if (mContactsUnavailableFragment != null) {
54566606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            switch (tab) {
54652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.FAVORITES:
54766606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    mContactsUnavailableFragment.setMessageText(
548a1bbf6139bb1e0d30078fe6c99effaf45f7416efIsaac Katzenelson                            R.string.listTotalAllContactsZeroStarred, -1);
54966606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    break;
55052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.ALL:
551a1bbf6139bb1e0d30078fe6c99effaf45f7416efIsaac Katzenelson                    mContactsUnavailableFragment.setMessageText(R.string.noContacts, -1);
55266606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    break;
55366606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            }
55466606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        }
5554d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
5564d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
557250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private class TabPagerListener implements ViewPager.OnPageChangeListener {
55870f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
55970f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // This package-protected constructor is here because of a possible compiler bug.
56070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // PeopleActivity$1.class should be generated due to the private outer/inner class access
56170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // needed here.  But for some reason, PeopleActivity$1.class is missing.
56270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // Since $1 class is needed as a jvm work around to get access to the inner class,
56370f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // changing the constructor to package-protected or public will solve the problem.
56470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // To verify whether $1 class is needed, javap PeopleActivity$TabPagerListener and look for
56570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // references to PeopleActivity$1.
56670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        //
56770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // When the constructor is private and PeopleActivity$1.class is missing, proguard will
56870f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // correctly catch this and throw warnings and error out the build on user/userdebug builds.
56970f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        //
57070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // All private inner classes below also need this fix.
57170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        TabPagerListener() {}
57270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
573250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
574250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageScrollStateChanged(int state) {
575250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
576250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
577250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
578250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
579250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
580250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
581250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
582250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageSelected(int position) {
583250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            // Make sure not in the search mode, in which case position != TabState.ordinal().
584250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (!mTabPagerAdapter.isSearchMode()) {
58552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                mActionBarAdapter.setCurrentTab(position, false);
58652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                showEmptyStateForTab(position);
5878811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki                invalidateOptionsMenu();
588250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
589250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
590250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    }
591250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
592250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    /**
593250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * Adapter for the {@link ViewPager}.  Unlike {@link FragmentPagerAdapter},
594250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * {@link #instantiateItem} returns existing fragments, and {@link #instantiateItem}/
595250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * {@link #destroyItem} show/hide fragments instead of attaching/detaching.
596250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     *
597250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * In search mode, we always show the "all" fragment, and disable the swipe.  We change the
598250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * number of items to 1 to disable the swipe.
599250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     *
600250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * TODO figure out a more straight way to disable swipe.
601250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     */
602250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private class TabPagerAdapter extends PagerAdapter {
603250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private final FragmentManager mFragmentManager;
604250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private FragmentTransaction mCurTransaction = null;
605250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
606250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private boolean mTabPagerAdapterSearchMode;
607250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
608746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        private Fragment mCurrentPrimaryItem;
609746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
610250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public TabPagerAdapter() {
611250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mFragmentManager = getFragmentManager();
612250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
613250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
614250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public boolean isSearchMode() {
615250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return mTabPagerAdapterSearchMode;
616250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
617250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
618250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void setSearchMode(boolean searchMode) {
619250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (searchMode == mTabPagerAdapterSearchMode) {
620250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                return;
621250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
622250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mTabPagerAdapterSearchMode = searchMode;
623250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            notifyDataSetChanged();
624250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
625250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
626250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
627250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public int getCount() {
62852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            return mTabPagerAdapterSearchMode ? 1 : TabState.COUNT;
629250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
630250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
631250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        /** Gets called when the number of items changes. */
632250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
633250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public int getItemPosition(Object object) {
634250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mTabPagerAdapterSearchMode) {
635250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mAllFragment) {
636250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return 0; // Only 1 page in search mode
637250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
638250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            } else {
639250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mFavoritesFragment) {
64052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                    return TabState.FAVORITES;
641250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
642250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mAllFragment) {
64352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                    return TabState.ALL;
644250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
645250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
646250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return POSITION_NONE;
647250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
648250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
649250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
650970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void startUpdate(ViewGroup container) {
651250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
652250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
653250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private Fragment getFragment(int position) {
654250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mTabPagerAdapterSearchMode) {
6558d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                if (position != 0) {
6568d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                    // This has only been observed in monkey tests.
6578d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                    // Let's log this issue, but not crash
6588d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                    Log.w(TAG, "Request fragment at position=" + position + ", eventhough we " +
6598d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                            "are in search mode");
660250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
6618d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                return mAllFragment;
662250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            } else {
66352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                if (position == TabState.FAVORITES) {
664250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return mFavoritesFragment;
66552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                } else if (position == TabState.ALL) {
666250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return mAllFragment;
667250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
668250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
669250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            throw new IllegalArgumentException("position: " + position);
670250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
671250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
672250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
673970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public Object instantiateItem(ViewGroup container, int position) {
674250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction == null) {
675250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = mFragmentManager.beginTransaction();
676250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
677250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            Fragment f = getFragment(position);
678250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mCurTransaction.show(f);
679746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
6809bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell            // Non primary pages are not visible.
6819bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell            f.setUserVisibleHint(f == mCurrentPrimaryItem);
682250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return f;
683250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
684250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
685250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
686970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void destroyItem(ViewGroup container, int position, Object object) {
687250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction == null) {
688250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = mFragmentManager.beginTransaction();
689250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
690250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mCurTransaction.hide((Fragment) object);
691250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
692250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
693250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
694970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void finishUpdate(ViewGroup container) {
695250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction != null) {
6964b25da79091157935042d2942a8961ceba92166fMinh Pham                mCurTransaction.commitAllowingStateLoss();
697250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = null;
698250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mFragmentManager.executePendingTransactions();
699250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
700250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
701250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
702250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
703250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public boolean isViewFromObject(View view, Object object) {
704250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return ((Fragment) object).getView() == view;
705250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
706250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
707250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
708970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void setPrimaryItem(ViewGroup container, int position, Object object) {
709746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            Fragment fragment = (Fragment) object;
710746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            if (mCurrentPrimaryItem != fragment) {
711746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                if (mCurrentPrimaryItem != null) {
7129bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell                    mCurrentPrimaryItem.setUserVisibleHint(false);
713746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                }
714746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                if (fragment != null) {
7159bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell                    fragment.setUserVisibleHint(true);
716746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                }
717746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                mCurrentPrimaryItem = fragment;
718746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            }
719746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        }
720746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
721746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        @Override
722250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public Parcelable saveState() {
723250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return null;
724250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
725250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
726250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
727250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void restoreState(Parcelable state, ClassLoader loader) {
728250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
729250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    }
730250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
7311db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki    private void setQueryTextToFragment(String query) {
73295c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        mAllFragment.setQueryString(query, true);
7331db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki        mAllFragment.setVisibleScrollbarEnabled(!mAllFragment.isSearchMode());
7348268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    }
7358268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan
7360ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureContactListFragmentForRequest() {
737fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        Uri contactUri = mRequest.getContactUri();
738fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (contactUri != null) {
73995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setSelectedContactUri(contactUri);
740fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
741238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
742a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
7431db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki        setQueryTextToFragment(mActionBarAdapter.getQueryString());
744238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
745fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (mRequest.isDirectorySearchEnabled()) {
74695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
747fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        } else {
74895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
749fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
75008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
75108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
7520ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureContactListFragment() {
753a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        // Filter may be changed when this Activity is in background.
754a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
755a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa
7562c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mAllFragment.setVerticalScrollbarPosition(getScrollBarPosition());
7572c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mAllFragment.setSelectionVisible(false);
758e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng    }
759e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng
7602c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell    private int getScrollBarPosition() {
7612c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        return isRTL() ? View.SCROLLBAR_POSITION_LEFT : View.SCROLLBAR_POSITION_RIGHT;
762e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng    }
763e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng
764e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng    private boolean isRTL() {
765e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng        final Locale locale = Locale.getDefault();
766e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng        return TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL;
7671ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    }
7681323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov
7698b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    @Override
7708b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public void onProviderStatusChange() {
771697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus        updateViewConfiguration(false);
7728b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
7738b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
774697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus    private void updateViewConfiguration(boolean forceUpdate) {
775d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki        ProviderStatusWatcher.Status providerStatus = mProviderStatusWatcher.getProviderStatus();
776d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki        if (!forceUpdate && (mProviderStatus != null)
777d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki                && (providerStatus.status == mProviderStatus.status)) return;
7788b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatus = providerStatus;
7798b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
7808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        View contactsUnavailableView = findViewById(R.id.contacts_unavailable_view);
7818b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
782d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki        if (mProviderStatus.status == ProviderStatus.STATUS_NORMAL) {
783b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            // Ensure that the mTabPager is visible; we may have made it invisible below.
784c3f2a52067b799e223f0964207a2d1957165e960Dmitri Plotnikov            contactsUnavailableView.setVisibility(View.GONE);
785b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            if (mTabPager != null) {
786b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus                mTabPager.setVisibility(View.VISIBLE);
787b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            }
788b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus
78995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            if (mAllFragment != null) {
79095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                mAllFragment.setEnabled(true);
7918b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
7928b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        } else {
793aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // If there are no accounts on the device and we should show the "no account" prompt
794aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // (based on {@link SharedPreferences}), then launch the account setup activity so the
795aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // user can sign-in or create an account.
7969f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng            //
7979f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng            // Also check for ability to modify accounts.  In limited user mode, you can't modify
7989f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng            // accounts so there is no point sending users to account setup activity.
7999f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng            final UserManager userManager = UserManager.get(this);
8009f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng            final boolean disallowModifyAccounts = userManager.getUserRestrictions().getBoolean(
8019f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng                    UserManager.DISALLOW_MODIFY_ACCOUNTS);
8029f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Cheng            if (!disallowModifyAccounts && !areContactWritableAccountsAvailable() &&
8036f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki                    AccountPromptUtils.shouldShowAccountPrompt(this)) {
804aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan                AccountPromptUtils.launchAccountPrompt(this);
805aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan                return;
806aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            }
807aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan
808aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // Otherwise, continue setting up the page so that the user can still use the app
809aaa2ad5d450d1923dae4fdf76cd050cd8a069040Katherine Kuan            // without an account.
81095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            if (mAllFragment != null) {
81195c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                mAllFragment.setEnabled(false);
8128b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
8138b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            if (mContactsUnavailableFragment == null) {
8148b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment = new ContactsUnavailableFragment();
8158b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
8168b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        new ContactsUnavailableFragmentListener());
8173ed426c842a68895a759548fef87bac359f937bbDianne Hackborn                getFragmentManager().beginTransaction()
8188b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment)
8194b25da79091157935042d2942a8961ceba92166fMinh Pham                        .commitAllowingStateLoss();
8208b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
821d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki            mContactsUnavailableFragment.updateStatus(mProviderStatus);
822b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus
823b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            // Show the contactsUnavailableView, and hide the mTabPager so that we don't
824b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            // see it sliding in underneath the contactsUnavailableView at the edges.
8258b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            contactsUnavailableView.setVisibility(View.VISIBLE);
826b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            if (mTabPager != null) {
827b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus                mTabPager.setVisibility(View.GONE);
828b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            }
829b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus
83052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            showEmptyStateForTab(mActionBarAdapter.getCurrentTab());
8318b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
8328b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
8338268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
8348b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
8358b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
8361ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
83770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        ContactBrowserActionListener() {}
838d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
839e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
840d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        public void onSelectionChange() {
841e5f1e4d30929783b26e285b3ddfbf9bc07bdef58Dmitri Plotnikov
8421ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
843e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov
844e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
8452c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        public void onViewContactAction(Uri contactLookupUri) {
8462c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            Intent intent = QuickContact.composeQuickContactsIntent(PeopleActivity.this,
84731c7bf977e06fe3ed198cacf34d94b0a2c131a14Paul Soulos                    (Rect) null, contactLookupUri, QuickContactActivity.MODE_FULLY_EXPANDED, null);
8481ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            startActivity(intent);
8491ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
850416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
851e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
8521ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onDeleteContactAction(Uri contactUri) {
8539856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false);
8541ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
8558a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
856e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
8571ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onFinishAction() {
8581ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            onBackPressed();
8591ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
8606e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
8616e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        @Override
8626e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        public void onInvalidSelection() {
863b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            ContactListFilter filter;
864b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            ContactListFilter currentFilter = mAllFragment.getFilter();
865b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            if (currentFilter != null
866b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                    && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
867b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                filter = ContactListFilter.createFilterWithType(
868b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                        ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
869b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                mAllFragment.setFilter(filter);
870b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            } else {
871b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                filter = ContactListFilter.createFilterWithType(
872b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                        ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
873b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                mAllFragment.setFilter(filter, false);
874b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            }
875d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mContactListFilterController.setContactListFilter(filter, true);
8766e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        }
8771ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    }
878416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
8798b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private class ContactsUnavailableFragmentListener
8808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            implements OnContactsUnavailableActionListener {
88170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        ContactsUnavailableFragmentListener() {}
8828b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
8838b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
8848b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onCreateNewContactAction() {
8858b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI));
8868b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
8878b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
8888b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
8898b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onAddAccountAction() {
8908b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            Intent intent = new Intent(Settings.ACTION_ADD_ACCOUNT);
8911fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
8928b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            intent.putExtra(Settings.EXTRA_AUTHORITIES,
8938b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                    new String[] { ContactsContract.AUTHORITY });
8948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(intent);
8958b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
8968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
8978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
8988b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onImportContactsFromFileAction() {
899a2a35d2022ec64716c6c4985900b55d1c15fe018Chiao Cheng            ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(),
900a2a35d2022ec64716c6c4985900b55d1c15fe018Chiao Cheng                    PeopleActivity.class);
9018b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
9028b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
9038b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
9048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onFreeInternalStorageAction() {
9058b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            startActivity(new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS));
9068b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
9078b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
9088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
909ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa    private final class StrequentContactListFragmentListener
9107979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro            implements ContactTileListFragment.Listener {
91170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        StrequentContactListFragmentListener() {}
91270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
913ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa        @Override
9147a700cf798a19a8452b8671f643a05336f63f611Katherine Kuan        public void onContactSelected(Uri contactUri, Rect targetRect) {
9152c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            Intent intent = QuickContact.composeQuickContactsIntent(PeopleActivity.this,
9168a6f4ade05e5a8a89d91078ef9c22944450ac8baBrian Attwell                    targetRect, contactUri, QuickContactActivity.MODE_FULLY_EXPANDED, null);
9172c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            startActivity(intent);
918ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa        }
9194e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus
9204e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus        @Override
9214e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus        public void onCallNumberDirectly(String phoneNumber) {
9224e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus            // No need to call phone number directly from People app.
9234e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus            Log.w(TAG, "unexpected invocation of onCallNumberDirectly()");
9244e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus        }
925ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa    }
926ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa
9277aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
9287aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
929946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki        if (!areContactsAvailable()) {
930946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki            // If contacts aren't available, hide all menu items.
931946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki            return false;
932946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki        }
933d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey        super.onCreateOptionsMenu(menu);
934d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey
935d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        MenuInflater inflater = getMenuInflater();
93618e0cabec8df2e20ab4b33320804cc3472f195c2Daisuke Miyakawa        inflater.inflate(R.menu.people_options, menu);
937971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan
938b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        return true;
939d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey    }
9407aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
9418268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    private void invalidateOptionsMenuIfNeeded() {
9420cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (isOptionsMenuChanged()) {
9438268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            invalidateOptionsMenu();
9440cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
9450cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    }
9460cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
9470cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    public boolean isOptionsMenuChanged() {
9480cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (mOptionsMenuContactsAvailable != areContactsAvailable()) {
9490cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
9500cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
9510cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
95295c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        if (mAllFragment != null && mAllFragment.isOptionsMenuChanged()) {
9530cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
9540cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
9550cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
9560cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        return false;
9570cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    }
9580cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
9590cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    @Override
960d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey    public boolean onPrepareOptionsMenu(Menu menu) {
9610cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        mOptionsMenuContactsAvailable = areContactsAvailable();
9620cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (!mOptionsMenuContactsAvailable) {
9638b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return false;
9648b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
9658b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
9662fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu        // Get references to individual menu items in the menu
967789bc596877861da26ca862c699a269783d8d42aIsaac Katzenelson        final MenuItem contactsFilterMenu = menu.findItem(R.id.menu_contacts_filter);
9682fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu        final MenuItem clearFrequentsMenu = menu.findItem(R.id.menu_clear_frequents);
9698bb3d1ee5bc37f31051638c1e1303fd829662087Brian Attwell        final MenuItem helpMenu = menu.findItem(R.id.menu_help);
9702fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu
971af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        final boolean isSearchMode = mActionBarAdapter.isSearchMode();
972af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        if (isSearchMode) {
973683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson            contactsFilterMenu.setVisible(false);
9742fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu            clearFrequentsMenu.setVisible(false);
9758bb3d1ee5bc37f31051638c1e1303fd829662087Brian Attwell            helpMenu.setVisible(false);
9768268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        } else {
9774d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki            switch (mActionBarAdapter.getCurrentTab()) {
97852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.FAVORITES:
979683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    contactsFilterMenu.setVisible(false);
9802fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                    clearFrequentsMenu.setVisible(hasFrequents());
981683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    break;
98252aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.ALL:
983683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    contactsFilterMenu.setVisible(true);
9842fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                    clearFrequentsMenu.setVisible(false);
9858268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    break;
9868268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            }
9878bb3d1ee5bc37f31051638c1e1303fd829662087Brian Attwell            HelpUtils.prepareHelpMenuItem(this, helpMenu, R.string.help_url_people_main);
988e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov        }
989af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        final boolean showMiscOptions = !isSearchMode;
990af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_search, showMiscOptions);
991af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_import_export, showMiscOptions);
992af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_accounts, showMiscOptions);
993af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_settings,
994af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki                showMiscOptions && !ContactsPreferenceActivity.isEmpty(this));
995e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
9969ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki        // Debug options need to be visible even in search mode.
9979ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki        makeMenuItemVisible(menu, R.id.export_database, mEnableDebugMenuOptions);
9989ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
999d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey        return true;
10007aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
10017aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
10022fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu    /**
10032fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu     * Returns whether there are any frequently contacted people being displayed
10042fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu     * @return
10052fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu     */
10062fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu    private boolean hasFrequents() {
10072c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        return mFavoritesFragment.hasFrequents();
10082fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu    }
10092fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu
1010af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki    private void makeMenuItemVisible(Menu menu, int itemId, boolean visible) {
1011af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        MenuItem item =menu.findItem(itemId);
1012af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        if (item != null) {
1013af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki            item.setVisible(visible);
1014af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        }
1015af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki    }
1016af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki
10177aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
10187aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
101932791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski        if (mDisableOptionItemSelected) {
102032791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski            return false;
102132791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski        }
102232791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski
10237aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        switch (item.getItemId()) {
1024e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki            case android.R.id.home: {
1025e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                // The home icon on the action bar is pressed
1026e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                if (mActionBarAdapter.isUpShowing()) {
1027e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                    // "UP" icon press -- should be treated as "back".
1028e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                    onBackPressed();
1029e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                }
1030e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                return true;
1031e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki            }
1032c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov            case R.id.menu_settings: {
1033c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov                final Intent intent = new Intent(this, ContactsPreferenceActivity.class);
1034c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell                // Since there is only one section right now, make sure it is selected on
1035c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell                // small screens.
1036c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell                intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT,
1037c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell                        DisplayOptionsPreferenceFragment.class.getName());
1038c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell                // By default, the title of the activity should be equivalent to the fragment
1039c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell                // title. We set this argument to avoid this. Because of a bug, the following
1040c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell                // line isn't necessary. But, once the bug is fixed this may become necessary.
1041c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell                // b/5045558 refers to this issue, as well as another.
1042c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell                intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT_TITLE,
1043c9c4db7ab9f47bcedfe6793db9898e851f38b447Brian Attwell                        R.string.activity_title_settings);
1044c15062754af08cadc50b4b8ec89c2175a4bec1feDaniel Lehmann                startActivity(intent);
10457aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                return true;
1046d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
1047b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case R.id.menu_contacts_filter: {
1048b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus                AccountFilterUtil.startAccountFilterActivityForResult(
1049b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus                        this, SUBACTIVITY_ACCOUNT_FILTER,
1050b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus                        mContactListFilterController.getFilter());
1051b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                return true;
1052b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
1053d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_search: {
10548e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov                onSearchRequested();
10557aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                return true;
1056d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
105749d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey            case R.id.menu_import_export: {
1058a2a35d2022ec64716c6c4985900b55d1c15fe018Chiao Cheng                ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(),
1059a2a35d2022ec64716c6c4985900b55d1c15fe018Chiao Cheng                        PeopleActivity.class);
1060d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1061d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
10622fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu            case R.id.menu_clear_frequents: {
10632fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                ClearFrequentsDialog.show(getFragmentManager());
10642fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                return true;
10652fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu            }
1066d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_accounts: {
1067d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS);
1068fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov                intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] {
1069d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                    ContactsContract.AUTHORITY
1070d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                });
10711fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
1072d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                startActivity(intent);
1073d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1074d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
10759ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            case R.id.export_database: {
10769ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                final Intent intent = new Intent("com.android.providers.contacts.DUMP_DATABASE");
10779ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
10789ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                startActivity(intent);
10799ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                return true;
10809ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            }
10817aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
10827aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return false;
10837aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
10847aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
10858e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov    @Override
108653b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki    public boolean onSearchRequested() { // Search key pressed.
108753b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki        mActionBarAdapter.setSearchMode(true);
108853b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki        return true;
1089db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov    }
1090db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov
109149d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey    @Override
1092d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
1093d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        switch (requestCode) {
109434b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa            case SUBACTIVITY_ACCOUNT_FILTER: {
109534b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa                AccountFilterUtil.handleAccountFilterResult(
109634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa                        mContactListFilterController, resultCode, data);
1097495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan                break;
1098495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            }
1099d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
11007aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann            // TODO: Using the new startActivityWithResultFromFragment API this should not be needed
11017aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann            // anymore
1102e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov            case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER:
1103d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov                if (resultCode == RESULT_OK) {
110495c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                    mAllFragment.onPickerResult(data);
1105d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov                }
1106d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
1107d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// TODO fix or remove multipicker code
1108d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov//                else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {
11091ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    // Finish the activity if the sub activity was canceled as back key is used
11101ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    // to confirm user selection in MODE_PICK_MULTIPLE_PHONES.
11111ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    finish();
11121ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
11131ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                break;
1114d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        }
1115d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    }
11167aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
11177aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
11187aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
11191ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // TODO move to the fragment
11207aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        switch (keyCode) {
11211ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            case KeyEvent.KEYCODE_CALL: {
11221ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                if (callSelection()) {
11231ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    return true;
11241ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
11251ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                break;
11261ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            }
1127db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov
11287aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            case KeyEvent.KEYCODE_DEL: {
11296c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov                if (deleteSelection()) {
11307aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                    return true;
11317aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                }
11327aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                break;
11337aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            }
11347bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann            default: {
11357bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                // Bring up the search UI if the user starts typing
11367bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                final int unicodeChar = event.getUnicodeChar();
11376b6df4774a62ecdd85cc4bc5bb00fe1422a863a0Makoto Onuki                if ((unicodeChar != 0)
11386b6df4774a62ecdd85cc4bc5bb00fe1422a863a0Makoto Onuki                        // If COMBINING_ACCENT is set, it's not a unicode character.
11396b6df4774a62ecdd85cc4bc5bb00fe1422a863a0Makoto Onuki                        && ((unicodeChar & KeyCharacterMap.COMBINING_ACCENT) == 0)
11406b6df4774a62ecdd85cc4bc5bb00fe1422a863a0Makoto Onuki                        && !Character.isWhitespace(unicodeChar)) {
11417bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                    String query = new String(new int[]{ unicodeChar }, 0, 1);
1142b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                    if (!mActionBarAdapter.isSearchMode()) {
1143b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        mActionBarAdapter.setQueryString(query);
1144b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        mActionBarAdapter.setSearchMode(true);
1145b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                        return true;
11467bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                    }
11477bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann                }
11487bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann            }
11497aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
11507aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
11517aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return super.onKeyDown(keyCode, event);
11527aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
1153ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov
1154ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    @Override
1155ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    public void onBackPressed() {
115653b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki        if (mActionBarAdapter.isSearchMode()) {
1157ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            mActionBarAdapter.setSearchMode(false);
1158ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        } else {
1159ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            super.onBackPressed();
1160ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        }
1161ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    }
11627aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
11636c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov    private boolean deleteSelection() {
11641ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // TODO move to the fragment
11651ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//        if (mActionCode == ContactsRequest.ACTION_DEFAULT) {
11661ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            final int position = mListView.getSelectedItemPosition();
11671ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            if (position != ListView.INVALID_POSITION) {
11681ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                Uri contactUri = getContactUri(position);
11691ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                if (contactUri != null) {
11701ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    doContactDelete(contactUri);
11711ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    return true;
11721ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
11731ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//            }
11741ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//        }
11756c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov        return false;
11766c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov    }
11776c776bcfa3bde9b5a94dddac8f6ebde1f358a796Dmitri Plotnikov
117808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
117908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    protected void onSaveInstanceState(Bundle outState) {
118008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        super.onSaveInstanceState(outState);
11814d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.onSaveInstanceState(outState);
11824d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
11834d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // Clear the listener to make sure we don't get callbacks after onSaveInstanceState,
11844d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // in order to avoid doing fragment transactions after it.
11854d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // TODO Figure out a better way to deal with the issue.
118632791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski        mDisableOptionItemSelected = true;
11874d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.setListener(null);
11882e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        if (mTabPager != null) {
11892e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki            mTabPager.setOnPageChangeListener(null);
11902e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        }
119108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
119208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
1193fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
119409d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann    protected void onRestoreInstanceState(Bundle savedInstanceState) {
119509d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        super.onRestoreInstanceState(savedInstanceState);
119609d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        // In our own lifecycle, the focus is saved and restore but later taken away by the
119709d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        // ViewPager. As a hack, we force focus on the SearchView if we know that we are searching.
119809d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        // This fixes the keyboard going away on screen rotation
119909d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        if (mActionBarAdapter.isSearchMode()) {
120009d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann            mActionBarAdapter.setFocusOnSearchView();
120109d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        }
120209d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann    }
120309d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann
120409d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann    @Override
12053391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    public DialogManager getDialogManager() {
12063391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann        return mDialogManager;
12073391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    }
1208ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov
12092b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos    @Override
12102b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos    public void onClick(View view) {
12112b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        switch (view.getId()) {
12122b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos            case R.id.floating_action_button:
12132b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
12142b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                Bundle extras = getIntent().getExtras();
12152b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                if (extras != null) {
12162b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                    intent.putExtras(extras);
12172b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                }
12182b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                startActivity(intent);
12192b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                break;
12202b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        default:
12212b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos            Log.wtf(TAG, "Unexpected onClick event from " + view);
12222b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        }
12232b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos    }
12247aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project}
1225