PeopleActivity.java revision 82c9033a8f17470a335dd85936479669b50e5877
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;
22d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shraunerimport android.content.ActivityNotFoundException;
2320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwellimport android.content.ContentUris;
2473a6764f6724f69496afcce602234621efe7fca0Brian Attwellimport android.content.Context;
25e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.content.Intent;
262f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wangimport android.content.pm.PackageManager;
272f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wangimport android.content.pm.ResolveInfo;
28e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.graphics.Rect;
29e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.net.Uri;
301fc3ef4f7469e8abf8994a2c8f949f42fdda4ccbWenyi Wangimport android.os.Build;
31e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Bundle;
32e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Parcelable;
339f0a1c7d7825c4a96278977bc467db46e48fabb7Chiao Chengimport android.os.UserManager;
34e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.preference.PreferenceActivity;
35e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract;
36e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.Contacts;
37e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.ProviderStatus;
38ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Waiimport android.provider.ContactsContract.QuickContact;
39e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.Settings;
40e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v13.app.FragmentPagerAdapter;
41e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v4.view.PagerAdapter;
42e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v4.view.ViewPager;
43b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wangimport android.telecom.TelecomManager;
447d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglioimport android.text.TextUtils;
45e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.util.Log;
46e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.KeyCharacterMap;
47e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.KeyEvent;
48e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.Menu;
49e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuInflater;
50e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuItem;
51e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.View;
52e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.ViewGroup;
53bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangimport android.view.Window;
542b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulosimport android.widget.ImageButton;
55d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shraunerimport android.widget.Toast;
56bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangimport android.widget.Toolbar;
57e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
58bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangimport com.android.contacts.ContactsActivity;
5927834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovimport com.android.contacts.R;
604d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onukiimport com.android.contacts.activities.ActionBarAdapter.TabState;
61cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.ContactsUtils;
62bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwellimport com.android.contacts.common.activity.RequestPermissionsActivity;
63b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wangimport com.android.contacts.common.compat.TelecomManagerUtil;
64c8dd78c595cfaf9766e59a2df012b16d6c05b213Chiao Chengimport com.android.contacts.common.dialog.ClearFrequentsDialog;
65051f41d0e2e23fa3acd9258ffc91a60cdbe828ecChiao Chengimport com.android.contacts.common.interactions.ImportExportDialogFragment;
66821a657d618285c04cbb3c440f1777a08381f868Chiao Chengimport com.android.contacts.common.list.ContactEntryListFragment;
67a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListFilter;
680d5588da244d0992c3ff8f25d0875fdf95a8c644Chiao Chengimport com.android.contacts.common.list.ContactListFilterController;
69e776d0366d5bf2f93a0cd0f14e48804e564bccf2Chiao Chengimport com.android.contacts.common.list.ContactTileAdapter.DisplayType;
70f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.list.DirectoryListLoader;
71f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.list.ViewPagerTabs;
72f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.logging.Logger;
73f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.logging.ScreenEvent;
74f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.preference.ContactsPreferenceActivity;
75f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.preference.DisplayOptionsPreferenceFragment;
76f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.util.AccountFilterUtil;
77f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.util.Constants;
785d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliuimport com.android.contacts.common.util.ImplicitIntentsUtil;
79f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.util.ViewUtil;
805d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliuimport com.android.contacts.common.widget.FloatingActionButtonController;
81f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.editor.EditorIntents;
82f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.interactions.ContactDeletionInteraction;
83d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwellimport com.android.contacts.interactions.ContactMultiDeletionInteraction;
84d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwellimport com.android.contacts.interactions.ContactMultiDeletionInteraction.MultiContactDeleteListener;
85d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwellimport com.android.contacts.interactions.JoinContactsDialogFragment;
86d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwellimport com.android.contacts.interactions.JoinContactsDialogFragment.JoinContactsListener;
87d78ee90c0d4d93b82ad440396e87ae4f47f53e93Daniel Lehmannimport com.android.contacts.list.ContactTileListFragment;
880906ee326a5553a224eb7b004536f35b340bdcd3Dmitri Plotnikovimport com.android.contacts.list.ContactsIntentResolver;
891ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikovimport com.android.contacts.list.ContactsRequest;
908b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ContactsUnavailableFragment;
91f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.list.MultiSelectContactsListFragment;
92f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.list.MultiSelectContactsListFragment.OnCheckBoxListActionListener;
93732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport com.android.contacts.list.OnContactBrowserActionListener;
948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.OnContactsUnavailableActionListener;
95c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onukiimport com.android.contacts.list.ProviderStatusWatcher;
96c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onukiimport com.android.contacts.list.ProviderStatusWatcher.ProviderStatusListener;
978a6f4ade05e5a8a89d91078ef9c22944450ac8baBrian Attwellimport com.android.contacts.quickcontact.QuickContactActivity;
983391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmannimport com.android.contacts.util.DialogManager;
99f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.util.PhoneCapabilityTester;
10056bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwellimport com.android.contactsbind.HelpUtils;
10157cf30f316b8013e172150d1ad0e197be6b46b87Tadashi G. Takaoka
10220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwellimport java.util.List;
1037d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglioimport java.util.Locale;
1046d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onukiimport java.util.concurrent.atomic.AtomicInteger;
105caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov
1067aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/**
1072c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * Displays a list to browse contacts.
1087aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */
109bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangpublic class PeopleActivity extends ContactsActivity implements
1102b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        View.OnCreateContextMenuListener,
1112b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        View.OnClickListener,
1122b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        ActionBarAdapter.Listener,
1136e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        DialogManager.DialogShowingViewActivity,
1142b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        ContactListFilterController.ContactListFilterListener,
115d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell        ProviderStatusListener,
116d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell        MultiContactDeleteListener,
117d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell        JoinContactsListener {
11857d27da940983fba40d8e3a6d8b99a57b48419eaDmitri Plotnikov
1195e684a424e7036ba3d379221d1889b4dd7265021Dave Santoro    private static final String TAG = "PeopleActivity";
1207aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
1219ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    private static final String ENABLE_DEBUG_OPTIONS_HIDDEN_CODE = "debug debug!";
1229ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
1235c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    // These values needs to start at 2. See {@link ContactEntryListFragment}.
1242c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell    private static final int SUBACTIVITY_ACCOUNT_FILTER = 2;
125c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
12634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa    private final DialogManager mDialogManager = new DialogManager(this);
1273391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann
128ac0f783adb82ee8056e742fae4994e848e82ea3dDmitri Plotnikov    private ContactsIntentResolver mIntentResolver;
129fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ContactsRequest mRequest;
130caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov
131fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ActionBarAdapter mActionBarAdapter;
132865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell    private FloatingActionButtonController mFloatingActionButtonController;
133865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell    private View mFloatingActionButtonContainer;
134865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell    private boolean wasLastFabAnimationScaleIn = false;
1357c5286ed8ba0d7fbe3683b560f69b3a2d4ff1e2aDmitri Plotnikov
1367979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro    private ContactTileListFragment.Listener mFavoritesFragmentListener =
137ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            new StrequentContactListFragmentListener();
138ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa
13915ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private ContactListFilterController mContactListFilterController;
1403c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
1418b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private ContactsUnavailableFragment mContactsUnavailableFragment;
142c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki    private ProviderStatusWatcher mProviderStatusWatcher;
143c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell    private Integer mProviderStatus;
1448b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1450cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    private boolean mOptionsMenuContactsAvailable;
1460cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
14795c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa    /**
14895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa     * Showing a list of Contacts. Also used for showing search results in search mode.
14995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa     */
15020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell    private MultiSelectContactsListFragment mAllFragment;
1517979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro    private ContactTileListFragment mFavoritesFragment;
1522b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos
1532c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell    /** ViewPager for swipe */
154250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private ViewPager mTabPager;
1553c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell    private ViewPagerTabs mViewPagerTabs;
156250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private TabPagerAdapter mTabPagerAdapter;
1573c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell    private String[] mTabTitles;
1582e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki    private final TabPagerListener mTabPagerListener = new TabPagerListener();
15958fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
1609ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    private boolean mEnableDebugMenuOptions;
1619ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
162417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
163417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * True if this activity instance is a re-created one.  i.e. set true after orientation change.
164417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * This is set in {@link #onCreate} for later use in {@link #onStart}.
165417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
166417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private boolean mIsRecreatedInstance;
167417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
168417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
169417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * If {@link #configureFragments(boolean)} is already called.  Used to avoid calling it twice
170417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * in {@link #onStart}.
171417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * (This initialization only needs to be done once in onStart() when the Activity was just
172417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * created from scratch -- i.e. onCreate() was just called)
173417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
174417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private boolean mFragmentInitialized;
175417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
176be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    /**
17732791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski     * This is to disable {@link #onOptionsItemSelected} when we trying to stop the activity.
17832791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski     */
17932791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski    private boolean mDisableOptionItemSelected;
18032791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski
1816d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    /** Sequential ID assigned to each instance; used for logging */
1826d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private final int mInstanceId;
1836d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private static final AtomicInteger sNextInstanceId = new AtomicInteger();
1846d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki
1859856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan    public PeopleActivity() {
1866d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        mInstanceId = sNextInstanceId.getAndIncrement();
1871540674a23a2ac0277a5aca3fa4ed41a6e1b74c3Dmitri Plotnikov        mIntentResolver = new ContactsIntentResolver(this);
188c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher = ProviderStatusWatcher.getInstance(this);
1896178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov    }
1906178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov
1916d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    @Override
1926d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    public String toString() {
1936d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        // Shown on logcat
1946d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        return String.format("%s@%d", getClass().getSimpleName(), mInstanceId);
1956d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    }
1966d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki
1978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public boolean areContactsAvailable() {
1982f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang        return (mProviderStatus != null) && mProviderStatus.equals(ProviderStatus.STATUS_NORMAL);
1998b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
2008b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
2016f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki    private boolean areGroupWritableAccountsAvailable() {
2026f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki        return ContactsUtils.areGroupWritableAccountsAvailable(this);
2036f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki    }
20449917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson
20550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki    /**
20650445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * Initialize fragments that are (or may not be) in the layout.
20750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     *
20850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * For the fragments that are in the layout, we initialize them in
209417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * {@link #createViewsAndFragments(Bundle)} after inflating the layout.
21050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     *
2112c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell     * However, the {@link ContactsUnavailableFragment} is a special fragment which may not
2122c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell     * be in the layout, so we have to do the initialization here.
2132c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell     *
2142c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell     * The ContactsUnavailableFragment is always created at runtime.
21550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     */
2167aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
21792a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    public void onAttachFragment(Fragment fragment) {
2182c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        if (fragment instanceof ContactsUnavailableFragment) {
2198b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment = (ContactsUnavailableFragment)fragment;
2208b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
2218b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                    new ContactsUnavailableFragmentListener());
22292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        }
22392a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    }
22492a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
22592a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    @Override
22608e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    protected void onCreate(Bundle savedState) {
22749627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
22849627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki            Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate start");
22949627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        }
23008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        super.onCreate(savedState);
2317aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
232bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell        if (RequestPermissionsActivity.startPermissionActivity(this)) {
233bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell            return;
234bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell        }
235bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell
2366d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        if (!processIntent(false)) {
237417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            finish();
238417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return;
239417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
240a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mContactListFilterController = ContactListFilterController.getInstance(this);
241be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        mContactListFilterController.checkFilterValidity(false);
242a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mContactListFilterController.addListener(this);
243a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa
244c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.addListener(this);
245c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki
246417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mIsRecreatedInstance = (savedState != null);
247417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        createViewsAndFragments(savedState);
2484b1af3f8f68c3f5de459d17c218853fb0849d9f5Andrew Lee
24949627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
25049627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki            Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate finish");
25149627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        }
2525b221086e4b994d6325d7396625900a79e27ae51Sai Cheemalapati        getWindow().setBackgroundDrawable(null);
253fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
254fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
255fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
256fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    protected void onNewIntent(Intent intent) {
257fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        setIntent(intent);
2586d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        if (!processIntent(true)) {
259417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            finish();
260417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return;
261417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
262417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mActionBarAdapter.initialize(null, mRequest);
263417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
264be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        mContactListFilterController.checkFilterValidity(false);
265be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan
266417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Re-configure fragments.
267417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        configureFragments(true /* from request */);
2689cfa24cbd952a027d8e0dea2b0f164820dd6ab8dBrian Attwell        initializeFabVisibility();
269417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        invalidateOptionsMenuIfNeeded();
270fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
271fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
272417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
273417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * Resolve the intent and initialize {@link #mRequest}, and launch another activity if redirect
274417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * is needed.
275417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *
2766d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki     * @param forNewIntent set true if it's called from {@link #onNewIntent(Intent)}.
277417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * @return {@code true} if {@link PeopleActivity} should continue running.  {@code false}
278417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *         if it shouldn't, in which case the caller should finish() itself and shouldn't do
279417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *         farther initialization.
280417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
2816d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private boolean processIntent(boolean forNewIntent) {
2821ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // Extract relevant information from the intent
2831ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        mRequest = mIntentResolver.resolveIntent(getIntent());
284ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki        if (Log.isLoggable(TAG, Log.DEBUG)) {
2856d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki            Log.d(TAG, this + " processIntent: forNewIntent=" + forNewIntent
2866d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki                    + " intent=" + getIntent() + " request=" + mRequest);
2876d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        }
2881ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        if (!mRequest.isValid()) {
2896178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov            setResult(RESULT_CANCELED);
290417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return false;
2916178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov        }
2926178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov
2932c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT) {
294c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell            final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(
295c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell                    mRequest.getContactUri(), QuickContactActivity.MODE_FULLY_EXPANDED);
296c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell            ImplicitIntentsUtil.startActivityInApp(this, intent);
297417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return false;
29850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        }
299417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        return true;
300417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    }
30150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
302417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private void createViewsAndFragments(Bundle savedState) {
303bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang        // Disable the ActionBar so that we can use a Toolbar. This needs to be called before
304bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang        // setContentView().
305bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
306bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang
307417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        setContentView(R.layout.people_activity);
308417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
309417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        final FragmentManager fragmentManager = getFragmentManager();
310417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
311417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Hide all tabs (the current tab will later be reshown once a tab is selected)
312417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        final FragmentTransaction transaction = fragmentManager.beginTransaction();
313417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
3143c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        mTabTitles = new String[TabState.COUNT];
3153c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        mTabTitles[TabState.FAVORITES] = getString(R.string.favorites_tab_label);
3163c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        mTabTitles[TabState.ALL] = getString(R.string.all_contacts_tab_label);
3172c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mTabPager = getView(R.id.tab_pager);
3182c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mTabPagerAdapter = new TabPagerAdapter();
3192c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mTabPager.setAdapter(mTabPagerAdapter);
3202c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mTabPager.setOnPageChangeListener(mTabPagerListener);
321417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
322bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang        // Configure toolbar and toolbar tabs. If in landscape mode, we  configure tabs differntly.
3233c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        final Toolbar toolbar = getView(R.id.toolbar);
324bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang        setActionBar(toolbar);
3253c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        final ViewPagerTabs portraitViewPagerTabs
3263c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell                = (ViewPagerTabs) findViewById(R.id.lists_pager_header);
3273c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        ViewPagerTabs landscapeViewPagerTabs = null;
3283c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        if (portraitViewPagerTabs ==  null) {
3293c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell            landscapeViewPagerTabs = (ViewPagerTabs) getLayoutInflater().inflate(
3303c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell                    R.layout.people_activity_tabs_lands, toolbar, /* attachToRoot = */ false);
3313c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell            mViewPagerTabs = landscapeViewPagerTabs;
3323c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        } else {
3333c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell            mViewPagerTabs = portraitViewPagerTabs;
3343c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        }
3353c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        mViewPagerTabs.setViewPager(mTabPager);
3363c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell
3372c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        final String FAVORITE_TAG = "tab-pager-favorite";
3382c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        final String ALL_TAG = "tab-pager-all";
3392c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell
3402c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // Create the fragments and add as children of the view pager.
3412c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // The pager adapter will only change the visibility; it'll never create/destroy
3422c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // fragments.
3432c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // However, if it's after screen rotation, the fragments have been re-created by
3442c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // the fragment manager, so first see if there're already the target fragments
3452c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // existing.
3462c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mFavoritesFragment = (ContactTileListFragment)
3472c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell                fragmentManager.findFragmentByTag(FAVORITE_TAG);
34820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        mAllFragment = (MultiSelectContactsListFragment)
3492c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell                fragmentManager.findFragmentByTag(ALL_TAG);
3502c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell
3512c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        if (mFavoritesFragment == null) {
3522c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            mFavoritesFragment = new ContactTileListFragment();
35320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mAllFragment = new MultiSelectContactsListFragment();
3542c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell
3552c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            transaction.add(R.id.tab_pager, mFavoritesFragment, FAVORITE_TAG);
3562c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            transaction.add(R.id.tab_pager, mAllFragment, ALL_TAG);
357417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
358250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
359417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mFavoritesFragment.setListener(mFavoritesFragmentListener);
36050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
361417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mAllFragment.setOnContactListActionListener(new ContactBrowserActionListener());
36220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        mAllFragment.setCheckBoxListListener(new CheckBoxListListener());
36350445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
364417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Hide all fragments for now.  We adjust visibility when we get onSelectedTabChanged()
365417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // from ActionBarAdapter.
366417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        transaction.hide(mFavoritesFragment);
367417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        transaction.hide(mAllFragment);
368f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro
3694b25da79091157935042d2942a8961ceba92166fMinh Pham        transaction.commitAllowingStateLoss();
370417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        fragmentManager.executePendingTransactions();
3714d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
3720c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro        // Setting Properties after fragment is created
3732c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mFavoritesFragment.setDisplayType(DisplayType.STREQUENT);
3740c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro
375bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang        mActionBarAdapter = new ActionBarAdapter(this, this, getActionBar(),
3763c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell                portraitViewPagerTabs, landscapeViewPagerTabs, toolbar);
377417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mActionBarAdapter.initialize(savedState, mRequest);
37858fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
379d41ab8ace81a2e44f8b28aa8782679b9e9cca1b9Brian Attwell        // Add shadow under toolbar
380d41ab8ace81a2e44f8b28aa8782679b9e9cca1b9Brian Attwell        ViewUtil.addRectangularOutlineProvider(findViewById(R.id.toolbar_parent), getResources());
381d41ab8ace81a2e44f8b28aa8782679b9e9cca1b9Brian Attwell
382865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        // Configure floating action button
383865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        mFloatingActionButtonContainer = findViewById(R.id.floating_action_button_container);
384865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        final ImageButton floatingActionButton
385865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                = (ImageButton) findViewById(R.id.floating_action_button);
3862c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        floatingActionButton.setOnClickListener(this);
387865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        mFloatingActionButtonController = new FloatingActionButtonController(this,
388865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                mFloatingActionButtonContainer, floatingActionButton);
3899cfa24cbd952a027d8e0dea2b0f164820dd6ab8dBrian Attwell        initializeFabVisibility();
3902b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos
391417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        invalidateOptionsMenuIfNeeded();
392417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    }
39308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
394417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    @Override
395417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    protected void onStart() {
396417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        if (!mFragmentInitialized) {
397417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mFragmentInitialized = true;
398417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            /* Configure fragments if we haven't.
399417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
400417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * Note it's a one-shot initialization, so we want to do this in {@link #onCreate}.
401417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
402417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * However, because this method may indirectly touch views in fragments but fragments
403417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * created in {@link #configureContentView} using a {@link FragmentTransaction} will NOT
404417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * have views until {@link Activity#onCreate} finishes (they would if they were inflated
405417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * from a layout), we need to do it here in {@link #onStart()}.
406417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
407417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * (When {@link Fragment#onCreateView} is called is different in the former case and
408417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * in the latter case, unfortunately.)
409417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
410417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * Also, we skip most of the work in it if the activity is a re-created one.
411417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * (so the argument.)
412417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             */
413417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            configureFragments(!mIsRecreatedInstance);
414417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
415417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        super.onStart();
4163c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov    }
4173c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
4186e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
419174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    protected void onPause() {
420fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mOptionsMenuContactsAvailable = false;
421c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.stop();
422174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onPause();
423174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
424174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
425174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
426174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    protected void onResume() {
427174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onResume();
428697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus
429c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.start();
430697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus        updateViewConfiguration(true);
4314d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
4324d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // Re-register the listener, which may have been cleared when onSaveInstanceState was
4334d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // called.  See also: onSaveInstanceState
4344d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.setListener(this);
43532791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski        mDisableOptionItemSelected = false;
4362e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        if (mTabPager != null) {
4372e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki            mTabPager.setOnPageChangeListener(mTabPagerListener);
4382e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        }
439a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        // Current tab may have changed since the last onSaveInstanceState().  Make sure
440a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        // the actual contents match the tab.
441a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        updateFragmentsVisibility();
442174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
443174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
444174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
4454d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    protected void onDestroy() {
446c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.removeListener(this);
447c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki
448b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        // Some of variables will be null if this Activity redirects Intent.
449b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        // See also onCreate() or other methods called during the Activity's initialization.
450c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki        if (mActionBarAdapter != null) {
451c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki            mActionBarAdapter.setListener(null);
452c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki        }
453b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        if (mContactListFilterController != null) {
454b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa            mContactListFilterController.removeListener(this);
455b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        }
456b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa
4574d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        super.onDestroy();
4584d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
4594d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
460955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov    private void configureFragments(boolean fromRequest) {
461009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov        if (fromRequest) {
46291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            ContactListFilter filter = null;
46391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            int actionCode = mRequest.getActionCode();
46453b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki            boolean searchMode = mRequest.isSearchMode();
46552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            final int tabToOpen;
46691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            switch (actionCode) {
46791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_ALL_CONTACTS:
468be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    filter = ContactListFilter.createFilterWithType(
469be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                            ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
470ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
47191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
47291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
473be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    filter = ContactListFilter.createFilterWithType(
47491ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                            ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY);
475ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
47691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
47791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov
47891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_FREQUENT:
47991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_STREQUENT:
48091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_STARRED:
481ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.FAVORITES;
48291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
4839e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro                case ContactsRequest.ACTION_VIEW_CONTACT:
484ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
485ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    break;
48652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                default:
48752aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                    tabToOpen = -1;
48852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                    break;
489ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki            }
49052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            if (tabToOpen != -1) {
491ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                mActionBarAdapter.setCurrentTab(tabToOpen);
49291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            }
49391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov
49491ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            if (filter != null) {
49591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                mContactListFilterController.setContactListFilter(filter, false);
49653b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki                searchMode = false;
497009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov            }
498d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
499d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            if (mRequest.getContactUri() != null) {
50053b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki                searchMode = false;
501d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            }
502d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
50353b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki            mActionBarAdapter.setSearchMode(searchMode);
5040ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan            configureContactListFragmentForRequest();
505fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
506fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
5070ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan        configureContactListFragment();
508fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
5098268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
5106e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
5116e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
512865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell    private void initializeFabVisibility() {
513865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        final boolean hideFab = mActionBarAdapter.isSearchMode()
514865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                || mActionBarAdapter.isSelectionMode();
515865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        mFloatingActionButtonContainer.setVisibility(hideFab ? View.GONE : View.VISIBLE);
5169cfa24cbd952a027d8e0dea2b0f164820dd6ab8dBrian Attwell        mFloatingActionButtonController.resetIn();
517865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        wasLastFabAnimationScaleIn = !hideFab;
518865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell    }
519865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell
520865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell    private void showFabWithAnimation(boolean showFab) {
521865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        if (mFloatingActionButtonContainer == null) {
522865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            return;
523865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        }
524865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        if (showFab) {
525865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            if (!wasLastFabAnimationScaleIn) {
526865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                mFloatingActionButtonContainer.setVisibility(View.VISIBLE);
527865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                mFloatingActionButtonController.scaleIn(0);
528865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            }
529865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            wasLastFabAnimationScaleIn = true;
530865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell
531865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        } else {
532865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            if (wasLastFabAnimationScaleIn) {
533865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                mFloatingActionButtonContainer.setVisibility(View.VISIBLE);
534865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                mFloatingActionButtonController.scaleOut();
535865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            }
536865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            wasLastFabAnimationScaleIn = false;
537865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        }
538865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell    }
539865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell
5406e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
541d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    public void onContactListFilterChanged() {
54295c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        if (mAllFragment == null || !mAllFragment.isAdded()) {
543d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov            return;
544d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov        }
545d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov
54695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
547e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
5488268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
5493ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov    }
5503ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov
551fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    /**
552fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov     * Handler for action bar actions.
553fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov     */
554fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov    @Override
555311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann    public void onAction(int action) {
556b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        switch (action) {
55720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            case ActionBarAdapter.Listener.Action.START_SELECTION_MODE:
55820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                mAllFragment.displayCheckBoxes(true);
559a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang                startSearchOrSelectionMode();
560a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang                break;
561311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann            case ActionBarAdapter.Listener.Action.START_SEARCH_MODE:
562a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang                if (!mIsRecreatedInstance) {
56382c9033a8f17470a335dd85936479669b50e5877Walter Jang                    Logger.logScreenView(ScreenEvent.SEARCH, this, ScreenEvent.TAG_SEARCH);
564a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang                }
565a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang                startSearchOrSelectionMode();
566865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                break;
567865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            case ActionBarAdapter.Listener.Action.BEGIN_STOPPING_SEARCH_AND_SELECTION_MODE:
568865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                showFabWithAnimation(/* showFabWithAnimation = */ true);
569b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                break;
57020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            case ActionBarAdapter.Listener.Action.STOP_SEARCH_AND_SELECTION_MODE:
5711db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki                setQueryTextToFragment("");
5724d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                updateFragmentsVisibility();
5738811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki                invalidateOptionsMenu();
574865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                showFabWithAnimation(/* showFabWithAnimation = */ true);
5758268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                break;
576311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann            case ActionBarAdapter.Listener.Action.CHANGE_SEARCH_QUERY:
5779ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                final String queryString = mActionBarAdapter.getQueryString();
5789ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                setQueryTextToFragment(queryString);
5799ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                updateDebugOptionsVisibility(
5809ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                        ENABLE_DEBUG_OPTIONS_HIDDEN_CODE.equals(queryString));
581b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                break;
582b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            default:
583b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                throw new IllegalStateException("Unkonwn ActionBarAdapter action: " + action);
584b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
585fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov    }
586fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov
587a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang    private void startSearchOrSelectionMode() {
588a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang        configureFragments(false /* from request */);
589a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang        updateFragmentsVisibility();
590a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang        invalidateOptionsMenu();
591a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang        showFabWithAnimation(/* showFabWithAnimation = */ false);
592a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang    }
593a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang
5944d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    @Override
5954d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    public void onSelectedTabChanged() {
5964d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        updateFragmentsVisibility();
5974d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
5984d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
5996adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell    @Override
6006adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell    public void onUpButtonPressed() {
6016adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell        onBackPressed();
6026adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell    }
6036adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell
6049ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    private void updateDebugOptionsVisibility(boolean visible) {
6059ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki        if (mEnableDebugMenuOptions != visible) {
6069ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            mEnableDebugMenuOptions = visible;
6079ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            invalidateOptionsMenu();
6089ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki        }
6099ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    }
6109ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
6114d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    /**
6124d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     * Updates the fragment/view visibility according to the current mode, such as
6134d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     * {@link ActionBarAdapter#isSearchMode()} and {@link ActionBarAdapter#getCurrentTab()}.
6144d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     */
6154d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    private void updateFragmentsVisibility() {
61652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann        int tab = mActionBarAdapter.getCurrentTab();
6174d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
61820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        if (mActionBarAdapter.isSearchMode() || mActionBarAdapter.isSelectionMode()) {
61920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mTabPagerAdapter.setTabsHidden(true);
6202c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        } else {
62120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            // No smooth scrolling if quitting from the search/selection mode.
62220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            final boolean wereTabsHidden = mTabPagerAdapter.areTabsHidden()
62320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                    || mActionBarAdapter.isSelectionMode();
62420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mTabPagerAdapter.setTabsHidden(false);
6252c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            if (mTabPager.getCurrentItem() != tab) {
62620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                mTabPager.setCurrentItem(tab, !wereTabsHidden);
6272c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            }
6284d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        }
629d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell        if (!mActionBarAdapter.isSelectionMode()) {
630d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell            mAllFragment.displayCheckBoxes(false);
631d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell        }
6322c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        invalidateOptionsMenu();
63366606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        showEmptyStateForTab(tab);
63466606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson    }
63566606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson
63652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann    private void showEmptyStateForTab(int tab) {
63766606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        if (mContactsUnavailableFragment != null) {
6389203788d3f55e84d55db4c5a87bbbf1fa1e36b43Brian Attwell            switch (getTabPositionForTextDirection(tab)) {
63952aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.FAVORITES:
640b0cfae543ca16136f251634cb29d78dbb4e40b43Wenyi Wang                    mContactsUnavailableFragment.setTabInfo(
641b0cfae543ca16136f251634cb29d78dbb4e40b43Wenyi Wang                            R.string.listTotalAllContactsZeroStarred, TabState.FAVORITES);
64266606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    break;
64352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.ALL:
644b0cfae543ca16136f251634cb29d78dbb4e40b43Wenyi Wang                    mContactsUnavailableFragment.setTabInfo(R.string.noContacts, TabState.ALL);
64566606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    break;
64666606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            }
6478d71f11c70c974518f3482c46a10a5601628a029Brian Attwell            // When using the mContactsUnavailableFragment the ViewPager doesn't contain two views.
6488d71f11c70c974518f3482c46a10a5601628a029Brian Attwell            // Therefore, we have to trick the ViewPagerTabs into thinking we have changed tabs
6498d71f11c70c974518f3482c46a10a5601628a029Brian Attwell            // when the mContactsUnavailableFragment changes. Otherwise the tab strip won't move.
6508d71f11c70c974518f3482c46a10a5601628a029Brian Attwell            mViewPagerTabs.onPageScrolled(tab, 0, 0);
65166606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        }
6524d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
6534d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
654250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private class TabPagerListener implements ViewPager.OnPageChangeListener {
65570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
65670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // This package-protected constructor is here because of a possible compiler bug.
65770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // PeopleActivity$1.class should be generated due to the private outer/inner class access
65870f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // needed here.  But for some reason, PeopleActivity$1.class is missing.
65970f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // Since $1 class is needed as a jvm work around to get access to the inner class,
66070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // changing the constructor to package-protected or public will solve the problem.
66170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // To verify whether $1 class is needed, javap PeopleActivity$TabPagerListener and look for
66270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // references to PeopleActivity$1.
66370f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        //
66470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // When the constructor is private and PeopleActivity$1.class is missing, proguard will
66570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // correctly catch this and throw warnings and error out the build on user/userdebug builds.
66670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        //
66770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // All private inner classes below also need this fix.
66870f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        TabPagerListener() {}
66970f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
670250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
671250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageScrollStateChanged(int state) {
67220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (!mTabPagerAdapter.areTabsHidden()) {
6733c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell                mViewPagerTabs.onPageScrollStateChanged(state);
6743c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell            }
675250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
676250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
677250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
678250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
67920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (!mTabPagerAdapter.areTabsHidden()) {
6803c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell                mViewPagerTabs.onPageScrolled(position, positionOffset, positionOffsetPixels);
6813c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell            }
682250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
683250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
684250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
685250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageSelected(int position) {
686250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            // Make sure not in the search mode, in which case position != TabState.ordinal().
68720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (!mTabPagerAdapter.areTabsHidden()) {
68852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                mActionBarAdapter.setCurrentTab(position, false);
6893c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell                mViewPagerTabs.onPageSelected(position);
69052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                showEmptyStateForTab(position);
6918811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki                invalidateOptionsMenu();
692250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
693250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
694250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    }
695250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
696250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    /**
697250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * Adapter for the {@link ViewPager}.  Unlike {@link FragmentPagerAdapter},
698250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * {@link #instantiateItem} returns existing fragments, and {@link #instantiateItem}/
699250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * {@link #destroyItem} show/hide fragments instead of attaching/detaching.
700250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     *
701250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * In search mode, we always show the "all" fragment, and disable the swipe.  We change the
702250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * number of items to 1 to disable the swipe.
703250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     *
704250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * TODO figure out a more straight way to disable swipe.
705250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     */
706250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private class TabPagerAdapter extends PagerAdapter {
707250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private final FragmentManager mFragmentManager;
708250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private FragmentTransaction mCurTransaction = null;
709250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
71020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        private boolean mAreTabsHiddenInTabPager;
711250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
712746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        private Fragment mCurrentPrimaryItem;
713746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
714250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public TabPagerAdapter() {
715250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mFragmentManager = getFragmentManager();
716250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
717250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
71820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        public boolean areTabsHidden() {
71920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            return mAreTabsHiddenInTabPager;
720250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
721250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
72220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        public void setTabsHidden(boolean hideTabs) {
72320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (hideTabs == mAreTabsHiddenInTabPager) {
724250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                return;
725250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
72620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mAreTabsHiddenInTabPager = hideTabs;
727250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            notifyDataSetChanged();
728250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
729250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
730250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
731250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public int getCount() {
73220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            return mAreTabsHiddenInTabPager ? 1 : TabState.COUNT;
733250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
734250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
735250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        /** Gets called when the number of items changes. */
736250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
737250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public int getItemPosition(Object object) {
73820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (mAreTabsHiddenInTabPager) {
739250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mAllFragment) {
740250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return 0; // Only 1 page in search mode
741250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
742250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            } else {
743250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mFavoritesFragment) {
744962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell                    return getTabPositionForTextDirection(TabState.FAVORITES);
745250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
746250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mAllFragment) {
747962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell                    return getTabPositionForTextDirection(TabState.ALL);
748250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
749250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
750250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return POSITION_NONE;
751250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
752250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
753250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
754970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void startUpdate(ViewGroup container) {
755250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
756250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
757250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private Fragment getFragment(int position) {
758962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell            position = getTabPositionForTextDirection(position);
75920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (mAreTabsHiddenInTabPager) {
7608d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                if (position != 0) {
7618d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                    // This has only been observed in monkey tests.
7628d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                    // Let's log this issue, but not crash
7638d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                    Log.w(TAG, "Request fragment at position=" + position + ", eventhough we " +
7648d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                            "are in search mode");
765250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
7668d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                return mAllFragment;
767250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            } else {
76852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                if (position == TabState.FAVORITES) {
769250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return mFavoritesFragment;
77052aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                } else if (position == TabState.ALL) {
771250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return mAllFragment;
772250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
773250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
774250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            throw new IllegalArgumentException("position: " + position);
775250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
776250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
777250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
778970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public Object instantiateItem(ViewGroup container, int position) {
779250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction == null) {
780250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = mFragmentManager.beginTransaction();
781250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
782250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            Fragment f = getFragment(position);
783250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mCurTransaction.show(f);
784746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
7859bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell            // Non primary pages are not visible.
7869bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell            f.setUserVisibleHint(f == mCurrentPrimaryItem);
787250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return f;
788250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
789250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
790250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
791970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void destroyItem(ViewGroup container, int position, Object object) {
792250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction == null) {
793250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = mFragmentManager.beginTransaction();
794250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
795250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mCurTransaction.hide((Fragment) object);
796250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
797250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
798250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
799970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void finishUpdate(ViewGroup container) {
800250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction != null) {
8014b25da79091157935042d2942a8961ceba92166fMinh Pham                mCurTransaction.commitAllowingStateLoss();
802250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = null;
803250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mFragmentManager.executePendingTransactions();
804250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
805250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
806250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
807250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
808250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public boolean isViewFromObject(View view, Object object) {
809250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return ((Fragment) object).getView() == view;
810250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
811250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
812250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
813970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void setPrimaryItem(ViewGroup container, int position, Object object) {
814746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            Fragment fragment = (Fragment) object;
815746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            if (mCurrentPrimaryItem != fragment) {
816746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                if (mCurrentPrimaryItem != null) {
8179bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell                    mCurrentPrimaryItem.setUserVisibleHint(false);
818746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                }
819746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                if (fragment != null) {
8209bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell                    fragment.setUserVisibleHint(true);
821746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                }
822746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                mCurrentPrimaryItem = fragment;
823746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            }
824746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        }
825746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
826746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        @Override
827250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public Parcelable saveState() {
828250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return null;
829250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
830250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
831250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
832250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void restoreState(Parcelable state, ClassLoader loader) {
833250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
8343c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell
8353c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        @Override
8363c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        public CharSequence getPageTitle(int position) {
8373c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell            return mTabTitles[position];
8383c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        }
839250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    }
840250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
8411db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki    private void setQueryTextToFragment(String query) {
84295c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        mAllFragment.setQueryString(query, true);
8431db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki        mAllFragment.setVisibleScrollbarEnabled(!mAllFragment.isSearchMode());
8448268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    }
8458268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan
8460ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureContactListFragmentForRequest() {
847fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        Uri contactUri = mRequest.getContactUri();
848fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (contactUri != null) {
84995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setSelectedContactUri(contactUri);
850fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
851238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
852a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
8531db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki        setQueryTextToFragment(mActionBarAdapter.getQueryString());
854238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
855fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (mRequest.isDirectorySearchEnabled()) {
85695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
857fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        } else {
85895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
859fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
86008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
86108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
8620ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureContactListFragment() {
863a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        // Filter may be changed when this Activity is in background.
864a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
865a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa
8662c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mAllFragment.setVerticalScrollbarPosition(getScrollBarPosition());
8672c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mAllFragment.setSelectionVisible(false);
868e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng    }
869e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng
8702c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell    private int getScrollBarPosition() {
8712c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        return isRTL() ? View.SCROLLBAR_POSITION_LEFT : View.SCROLLBAR_POSITION_RIGHT;
872e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng    }
873e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng
874e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng    private boolean isRTL() {
875e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng        final Locale locale = Locale.getDefault();
876e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng        return TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL;
8771ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    }
8781323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov
8798b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    @Override
8808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public void onProviderStatusChange() {
881697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus        updateViewConfiguration(false);
8828b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
8838b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
884697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus    private void updateViewConfiguration(boolean forceUpdate) {
885c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell        int providerStatus = mProviderStatusWatcher.getProviderStatus();
886d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki        if (!forceUpdate && (mProviderStatus != null)
887c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell                && (mProviderStatus.equals(providerStatus))) return;
8888b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatus = providerStatus;
8898b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
8908b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        View contactsUnavailableView = findViewById(R.id.contacts_unavailable_view);
8918b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
892c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell        if (mProviderStatus.equals(ProviderStatus.STATUS_NORMAL)) {
893b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            // Ensure that the mTabPager is visible; we may have made it invisible below.
894c3f2a52067b799e223f0964207a2d1957165e960Dmitri Plotnikov            contactsUnavailableView.setVisibility(View.GONE);
895b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            if (mTabPager != null) {
896b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus                mTabPager.setVisibility(View.VISIBLE);
897b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            }
898b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus
89995c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            if (mAllFragment != null) {
90095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                mAllFragment.setEnabled(true);
9018b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
9028b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        } else {
9035d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliu            // Setting up the page so that the user can still use the app
9045d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliu            // even without an account.
90595c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            if (mAllFragment != null) {
90695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                mAllFragment.setEnabled(false);
9078b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
9088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            if (mContactsUnavailableFragment == null) {
9098b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment = new ContactsUnavailableFragment();
9108b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
9118b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        new ContactsUnavailableFragmentListener());
9123ed426c842a68895a759548fef87bac359f937bbDianne Hackborn                getFragmentManager().beginTransaction()
9138b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment)
9144b25da79091157935042d2942a8961ceba92166fMinh Pham                        .commitAllowingStateLoss();
9158b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
916d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki            mContactsUnavailableFragment.updateStatus(mProviderStatus);
917b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus
918b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            // Show the contactsUnavailableView, and hide the mTabPager so that we don't
919b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            // see it sliding in underneath the contactsUnavailableView at the edges.
9208b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            contactsUnavailableView.setVisibility(View.VISIBLE);
921b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            if (mTabPager != null) {
922b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus                mTabPager.setVisibility(View.GONE);
923b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            }
924b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus
92552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            showEmptyStateForTab(mActionBarAdapter.getCurrentTab());
9268b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
9278b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
9288268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
9298b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
9308b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
9311ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
93270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        ContactBrowserActionListener() {}
933d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
934e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
935d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        public void onSelectionChange() {
936e5f1e4d30929783b26e285b3ddfbf9bc07bdef58Dmitri Plotnikov
9371ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
938e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov
939e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
940ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai        public void onViewContactAction(Uri contactLookupUri, boolean isEnterpriseContact) {
941ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai            if (isEnterpriseContact) {
942ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai                // No implicit intent as user may have a different contacts app in work profile.
943ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai                QuickContact.showQuickContact(PeopleActivity.this, new Rect(), contactLookupUri,
944ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai                        QuickContactActivity.MODE_FULLY_EXPANDED, null);
945ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai            } else {
946ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai                final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(
947ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai                        contactLookupUri,
948ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai                        QuickContactActivity.MODE_FULLY_EXPANDED);
949ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai                ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent);
950ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai            }
9511ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
952416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
953e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
9541ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onDeleteContactAction(Uri contactUri) {
9559856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false);
9561ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
9578a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
958e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
9591ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onFinishAction() {
9601ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            onBackPressed();
9611ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
9626e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
9636e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        @Override
9646e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        public void onInvalidSelection() {
965b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            ContactListFilter filter;
966b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            ContactListFilter currentFilter = mAllFragment.getFilter();
967b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            if (currentFilter != null
968b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                    && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
969b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                filter = ContactListFilter.createFilterWithType(
970b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                        ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
971b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                mAllFragment.setFilter(filter);
972b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            } else {
973b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                filter = ContactListFilter.createFilterWithType(
974b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                        ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
975b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                mAllFragment.setFilter(filter, false);
976b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            }
977d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mContactListFilterController.setContactListFilter(filter, true);
9786e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        }
9791ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    }
980416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
98120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell    private final class CheckBoxListListener implements OnCheckBoxListActionListener {
98220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        @Override
98320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        public void onStartDisplayingCheckBoxes() {
984865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            mActionBarAdapter.setSelectionMode(true);
985865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            invalidateOptionsMenu();
98620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        }
98720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell
98820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        @Override
98920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        public void onSelectedContactIdsChanged() {
99020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mActionBarAdapter.setSelectionCount(mAllFragment.getSelectedContactIds().size());
99120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            invalidateOptionsMenu();
99220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        }
9938f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell
9948f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell        @Override
9958f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell        public void onStopDisplayingCheckBoxes() {
9968f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell            mActionBarAdapter.setSelectionMode(false);
9978f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell        }
99820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell    }
99920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell
10008b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private class ContactsUnavailableFragmentListener
10018b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            implements OnContactsUnavailableActionListener {
100270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        ContactsUnavailableFragmentListener() {}
10038b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
10048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
10058b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onCreateNewContactAction() {
1006c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell            ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this,
10075a7a23bdb698b8e741a425c9617c5e33e6314cddWalter Jang                    EditorIntents.createCompactInsertContactIntent());
10088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
10098b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
10108b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
10118b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onAddAccountAction() {
10125d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliu            final Intent intent = ImplicitIntentsUtil.getIntentForAddingAccount();
1013c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell            ImplicitIntentsUtil.startActivityOutsideApp(PeopleActivity.this, intent);
10148b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
10158b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
10168b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
10178b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onImportContactsFromFileAction() {
10189379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang            showImportExportDialogFragment();
10198b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
10208b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
10218b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1022ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa    private final class StrequentContactListFragmentListener
10237979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro            implements ContactTileListFragment.Listener {
102470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        StrequentContactListFragmentListener() {}
102570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
1026ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa        @Override
10277a700cf798a19a8452b8671f643a05336f63f611Katherine Kuan        public void onContactSelected(Uri contactUri, Rect targetRect) {
1028c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell            final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(contactUri,
1029c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell                    QuickContactActivity.MODE_FULLY_EXPANDED);
1030c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell            ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent);
1031ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa        }
10324e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus
10334e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus        @Override
10344e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus        public void onCallNumberDirectly(String phoneNumber) {
10354e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus            // No need to call phone number directly from People app.
10364e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus            Log.w(TAG, "unexpected invocation of onCallNumberDirectly()");
10374e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus        }
1038ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa    }
1039ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa
10407aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
10417aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
1042946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki        if (!areContactsAvailable()) {
1043946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki            // If contacts aren't available, hide all menu items.
1044946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki            return false;
1045946070f67043bf0be82a15e3904c7dfb219290cdMakoto Onuki        }
1046d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey        super.onCreateOptionsMenu(menu);
1047d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey
1048d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        MenuInflater inflater = getMenuInflater();
104918e0cabec8df2e20ab4b33320804cc3472f195c2Daisuke Miyakawa        inflater.inflate(R.menu.people_options, menu);
1050971116e466757434f4979a61d4f58ea0deac1ea4Katherine Kuan
1051b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        return true;
1052d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey    }
10537aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
10548268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    private void invalidateOptionsMenuIfNeeded() {
10550cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (isOptionsMenuChanged()) {
10568268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            invalidateOptionsMenu();
10570cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
10580cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    }
10590cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
10600cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    public boolean isOptionsMenuChanged() {
10610cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (mOptionsMenuContactsAvailable != areContactsAvailable()) {
10620cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
10630cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
10640cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
106595c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        if (mAllFragment != null && mAllFragment.isOptionsMenuChanged()) {
10660cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov            return true;
10670cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        }
10680cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
10690cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        return false;
10700cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    }
10710cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
10720cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    @Override
1073d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey    public boolean onPrepareOptionsMenu(Menu menu) {
10740cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        mOptionsMenuContactsAvailable = areContactsAvailable();
10750cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov        if (!mOptionsMenuContactsAvailable) {
10768b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            return false;
10778b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
10788b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
10792fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu        // Get references to individual menu items in the menu
1080789bc596877861da26ca862c699a269783d8d42aIsaac Katzenelson        final MenuItem contactsFilterMenu = menu.findItem(R.id.menu_contacts_filter);
10812fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu        final MenuItem clearFrequentsMenu = menu.findItem(R.id.menu_clear_frequents);
10828bb3d1ee5bc37f31051638c1e1303fd829662087Brian Attwell        final MenuItem helpMenu = menu.findItem(R.id.menu_help);
10832fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu
108420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        final boolean isSearchOrSelectionMode = mActionBarAdapter.isSearchMode()
108520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                || mActionBarAdapter.isSelectionMode();
108620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        if (isSearchOrSelectionMode) {
1087683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson            contactsFilterMenu.setVisible(false);
10882fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu            clearFrequentsMenu.setVisible(false);
10898bb3d1ee5bc37f31051638c1e1303fd829662087Brian Attwell            helpMenu.setVisible(false);
10908268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        } else {
10919203788d3f55e84d55db4c5a87bbbf1fa1e36b43Brian Attwell            switch (getTabPositionForTextDirection(mActionBarAdapter.getCurrentTab())) {
109252aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.FAVORITES:
1093683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    contactsFilterMenu.setVisible(false);
10942fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                    clearFrequentsMenu.setVisible(hasFrequents());
1095683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    break;
109652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.ALL:
1097683b57e1fbf27c81c9973de814fc8bb1852e6df8Isaac Katzenelson                    contactsFilterMenu.setVisible(true);
10982fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                    clearFrequentsMenu.setVisible(false);
10998268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                    break;
11008268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan            }
110156bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwell            helpMenu.setVisible(HelpUtils.isHelpAndFeedbackAvailable());
1102e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov        }
110320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        final boolean showMiscOptions = !isSearchOrSelectionMode;
1104b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wang        final boolean showBlockedNumbers = PhoneCapabilityTester.isPhone(this)
1105b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wang                && ContactsUtils.FLAG_N_FEATURE;
1106af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_search, showMiscOptions);
1107af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_import_export, showMiscOptions);
1108af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_accounts, showMiscOptions);
11099d115f0e9222e0f4b95a1ef55085ba6bdd8eb3b4Wenyi Wang        makeMenuItemVisible(menu, R.id.menu_blocked_numbers, showMiscOptions && showBlockedNumbers);
1110af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_settings,
1111af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki                showMiscOptions && !ContactsPreferenceActivity.isEmpty(this));
1112e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
111320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        final boolean showSelectedContactOptions = mActionBarAdapter.isSelectionMode()
111420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                && mAllFragment.getSelectedContactIds().size() != 0;
111520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        makeMenuItemVisible(menu, R.id.menu_share, showSelectedContactOptions);
111620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        makeMenuItemVisible(menu, R.id.menu_delete, showSelectedContactOptions);
1117687d218928bd188a13cc32a3c553590fe0d564b1Wenyi Wang        final boolean showLinkContactsOptions = mActionBarAdapter.isSelectionMode()
1118687d218928bd188a13cc32a3c553590fe0d564b1Wenyi Wang                && mAllFragment.getSelectedContactIds().size() > 1;
1119687d218928bd188a13cc32a3c553590fe0d564b1Wenyi Wang        makeMenuItemVisible(menu, R.id.menu_join, showLinkContactsOptions);
112020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell
11219ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki        // Debug options need to be visible even in search mode.
11222f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang        makeMenuItemVisible(menu, R.id.export_database, mEnableDebugMenuOptions &&
11232f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang                hasExportIntentHandler());
11249ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
1125d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey        return true;
11267aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
11277aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
11282f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang    private boolean hasExportIntentHandler() {
11292f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang        final Intent intent = new Intent();
11302f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang        intent.setAction("com.android.providers.contacts.DUMP_DATABASE");
11312f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang        final List<ResolveInfo> receivers = getPackageManager().queryIntentActivities(intent,
11322f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang                PackageManager.MATCH_DEFAULT_ONLY);
11332f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang        return receivers != null && receivers.size() > 0;
11342f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang    }
11352f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang
11362fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu    /**
11372fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu     * Returns whether there are any frequently contacted people being displayed
11382fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu     * @return
11392fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu     */
11402fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu    private boolean hasFrequents() {
11412c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        return mFavoritesFragment.hasFrequents();
11422fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu    }
11432fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu
1144af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki    private void makeMenuItemVisible(Menu menu, int itemId, boolean visible) {
1145d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell        final MenuItem item = menu.findItem(itemId);
1146af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        if (item != null) {
1147af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki            item.setVisible(visible);
1148af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        }
1149af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki    }
1150af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki
1151d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell    private void makeMenuItemEnabled(Menu menu, int itemId, boolean visible) {
1152d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell        final MenuItem item = menu.findItem(itemId);
1153d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell        if (item != null) {
1154d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell            item.setEnabled(visible);
1155d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell        }
1156d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell    }
1157d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell
11587aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
11597aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
116032791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski        if (mDisableOptionItemSelected) {
116132791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski            return false;
116232791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski        }
116332791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski
11647aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        switch (item.getItemId()) {
1165e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki            case android.R.id.home: {
1166e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                // The home icon on the action bar is pressed
1167e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                if (mActionBarAdapter.isUpShowing()) {
1168e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                    // "UP" icon press -- should be treated as "back".
1169e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                    onBackPressed();
1170e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                }
1171e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                return true;
1172e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki            }
1173c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov            case R.id.menu_settings: {
117486f2a86b99ccd4430dcaa7fcf88e8190cb64eb05Wenyi Wang                startActivity(new Intent(this, ContactsPreferenceActivity.class));
11757aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                return true;
1176d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
1177b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case R.id.menu_contacts_filter: {
1178b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus                AccountFilterUtil.startAccountFilterActivityForResult(
1179b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus                        this, SUBACTIVITY_ACCOUNT_FILTER,
1180b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus                        mContactListFilterController.getFilter());
1181b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                return true;
1182b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
1183d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_search: {
11848e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov                onSearchRequested();
11857aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                return true;
1186d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
118720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            case R.id.menu_share:
118820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                shareSelectedContacts();
118920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                return true;
1190d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell            case R.id.menu_join:
1191d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell                joinSelectedContacts();
1192d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell                return true;
1193d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell            case R.id.menu_delete:
1194d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell                deleteSelectedContacts();
1195d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell                return true;
119649d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey            case R.id.menu_import_export: {
11979379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang                showImportExportDialogFragment();
1198d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1199d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
12002fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu            case R.id.menu_clear_frequents: {
12012fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                ClearFrequentsDialog.show(getFragmentManager());
12022fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                return true;
12032fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu            }
120456bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwell            case R.id.menu_help:
120556bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwell                HelpUtils.launchHelpAndFeedbackForMainScreen(this);
120656bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwell                return true;
1207d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_accounts: {
1208d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS);
1209fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov                intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] {
1210d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                    ContactsContract.AUTHORITY
1211d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                });
12121fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
1213c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell                ImplicitIntentsUtil.startActivityInAppIfPossible(this, intent);
1214d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1215d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
12161fc3ef4f7469e8abf8994a2c8f949f42fdda4ccbWenyi Wang            case R.id.menu_blocked_numbers: {
1217b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wang                TelecomManagerUtil.launchBlockedNumbersActivity(
1218b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wang                        (TelecomManager) getSystemService(Context.TELECOM_SERVICE));
12191fc3ef4f7469e8abf8994a2c8f949f42fdda4ccbWenyi Wang                return true;
12201fc3ef4f7469e8abf8994a2c8f949f42fdda4ccbWenyi Wang            }
12219ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            case R.id.export_database: {
12229ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                final Intent intent = new Intent("com.android.providers.contacts.DUMP_DATABASE");
12239ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
1224c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell                ImplicitIntentsUtil.startActivityOutsideApp(this, intent);
12259ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                return true;
12269ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            }
12277aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
12287aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return false;
12297aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
12307aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
12319379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang    private void showImportExportDialogFragment(){
12329379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang        final boolean isOnFavoriteTab = mTabPagerAdapter.mCurrentPrimaryItem == mFavoritesFragment;
12339379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang        if (isOnFavoriteTab) {
12349379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang            ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(),
12359379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang                    PeopleActivity.class, ImportExportDialogFragment.EXPORT_MODE_FAVORITES);
12369379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang        } else {
12379379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang            ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(),
12389379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang                    PeopleActivity.class, ImportExportDialogFragment.EXPORT_MODE_ALL_CONTACTS);
12399379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang        }
12409379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang    }
12419379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang
12428e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov    @Override
124353b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki    public boolean onSearchRequested() { // Search key pressed.
124420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        if (!mActionBarAdapter.isSelectionMode()) {
124520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mActionBarAdapter.setSearchMode(true);
124620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        }
124753b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki        return true;
1248db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov    }
1249db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov
125020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell    /**
125120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell     * Share all contacts that are currently selected in mAllFragment. This method is pretty
125220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell     * inefficient for handling large numbers of contacts. I don't expect this to be a problem.
125320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell     */
125420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell    private void shareSelectedContacts() {
125520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        final StringBuilder uriListBuilder = new StringBuilder();
125620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        for (Long contactId : mAllFragment.getSelectedContactIds()) {
125720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            final Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
125820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            final Uri lookupUri = Contacts.getLookupUri(getContentResolver(), contactUri);
12595b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            if (lookupUri == null) {
12605b69125ca54b41429374041d73febd33af0dd596Jay Shrauner                continue;
12615b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            }
12625b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            final List<String> pathSegments = lookupUri.getPathSegments();
12635b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            if (pathSegments.size() < 2) {
12645b69125ca54b41429374041d73febd33af0dd596Jay Shrauner                continue;
12655b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            }
12665b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            final String lookupKey = pathSegments.get(pathSegments.size() - 2);
12675b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            if (uriListBuilder.length() > 0) {
12685b69125ca54b41429374041d73febd33af0dd596Jay Shrauner                uriListBuilder.append(':');
12695b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            }
12705b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            uriListBuilder.append(Uri.encode(lookupKey));
12715b69125ca54b41429374041d73febd33af0dd596Jay Shrauner        }
12725b69125ca54b41429374041d73febd33af0dd596Jay Shrauner        if (uriListBuilder.length() == 0) {
12735b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            return;
127420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        }
127520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        final Uri uri = Uri.withAppendedPath(
127620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                Contacts.CONTENT_MULTI_VCARD_URI,
127720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                Uri.encode(uriListBuilder.toString()));
127820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        final Intent intent = new Intent(Intent.ACTION_SEND);
127920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        intent.setType(Contacts.CONTENT_VCARD_TYPE);
128020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        intent.putExtra(Intent.EXTRA_STREAM, uri);
128120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        ImplicitIntentsUtil.startActivityOutsideApp(this, intent);
128220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell    }
1283a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang
1284d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell    private void joinSelectedContacts() {
1285d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell        JoinContactsDialogFragment.start(this, mAllFragment.getSelectedContactIds());
1286d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell    }
1287d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell
1288d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell    @Override
1289d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell    public void onContactsJoined() {
12901154bbabc1f174f7dca40d92f59d2b2731930b3aBrian Attwell        mActionBarAdapter.setSelectionMode(false);
1291d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell    }
1292d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell
1293d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell    private void deleteSelectedContacts() {
1294d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell        ContactMultiDeletionInteraction.start(PeopleActivity.this,
1295d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell                mAllFragment.getSelectedContactIds());
1296d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell    }
1297d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell
1298d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell    @Override
1299d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell    public void onDeletionFinished() {
13001154bbabc1f174f7dca40d92f59d2b2731930b3aBrian Attwell        mActionBarAdapter.setSelectionMode(false);
1301d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell    }
1302d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell
130349d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey    @Override
1304d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
1305d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        switch (requestCode) {
130634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa            case SUBACTIVITY_ACCOUNT_FILTER: {
130734b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa                AccountFilterUtil.handleAccountFilterResult(
130834b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa                        mContactListFilterController, resultCode, data);
1309495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan                break;
1310495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            }
1311d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
13127aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann            // TODO: Using the new startActivityWithResultFromFragment API this should not be needed
13137aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann            // anymore
1314e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov            case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER:
1315d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov                if (resultCode == RESULT_OK) {
131695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                    mAllFragment.onPickerResult(data);
1317d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov                }
1318d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
1319d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// TODO fix or remove multipicker code
1320d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov//                else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {
13211ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    // Finish the activity if the sub activity was canceled as back key is used
13221ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    // to confirm user selection in MODE_PICK_MULTIPLE_PHONES.
13231ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    finish();
13241ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
13251ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                break;
1326d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        }
1327d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    }
13287aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
13297aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
13307aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
13311ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // TODO move to the fragment
1332db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov
133320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        // Bring up the search UI if the user starts typing
133420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        final int unicodeChar = event.getUnicodeChar();
133520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        if ((unicodeChar != 0)
133620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                // If COMBINING_ACCENT is set, it's not a unicode character.
133720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                && ((unicodeChar & KeyCharacterMap.COMBINING_ACCENT) == 0)
133820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                && !Character.isWhitespace(unicodeChar)) {
133920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (mActionBarAdapter.isSelectionMode()) {
134020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                // Ignore keyboard input when in selection mode.
134120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                return true;
13427aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            }
134320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            String query = new String(new int[]{unicodeChar}, 0, 1);
134420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (!mActionBarAdapter.isSearchMode()) {
134520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                mActionBarAdapter.setSearchMode(true);
134620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                mActionBarAdapter.setQueryString(query);
134720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                return true;
13487bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann            }
13497aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
13507aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
13517aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return super.onKeyDown(keyCode, event);
13527aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
1353ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov
1354ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    @Override
1355ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    public void onBackPressed() {
13567712aef22da432331a67c710cfc18bce2c493887Jay Shrauner        if (!isSafeToCommitTransactions()) {
1357c3fdc8f6c1429a40c3c54dcf01b6da0eb7606dc1Jay Shrauner            return;
1358c3fdc8f6c1429a40c3c54dcf01b6da0eb7606dc1Jay Shrauner        }
1359c3fdc8f6c1429a40c3c54dcf01b6da0eb7606dc1Jay Shrauner
136020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        if (mActionBarAdapter.isSelectionMode()) {
136120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mActionBarAdapter.setSelectionMode(false);
136220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mAllFragment.displayCheckBoxes(false);
136320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        } else if (mActionBarAdapter.isSearchMode()) {
1364ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            mActionBarAdapter.setSearchMode(false);
1365a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang
1366a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang            if (mAllFragment.wasSearchResultClicked()) {
1367a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang                mAllFragment.resetSearchResultClicked();
1368a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang            } else {
136982c9033a8f17470a335dd85936479669b50e5877Walter Jang                Logger.logScreenView(ScreenEvent.SEARCH_EXIT, this, ScreenEvent.TAG_SEARCH_EXIT);
137082c9033a8f17470a335dd85936479669b50e5877Walter Jang                Logger.logSearchEvent(mAllFragment.createSearchState());
1371a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang            }
1372ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        } else {
1373ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            super.onBackPressed();
1374ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        }
1375ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    }
13767aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
137708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
137808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    protected void onSaveInstanceState(Bundle outState) {
137908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        super.onSaveInstanceState(outState);
13804d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.onSaveInstanceState(outState);
13814d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
13824d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // Clear the listener to make sure we don't get callbacks after onSaveInstanceState,
13834d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // in order to avoid doing fragment transactions after it.
13844d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // TODO Figure out a better way to deal with the issue.
138532791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski        mDisableOptionItemSelected = true;
13864d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.setListener(null);
13872e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        if (mTabPager != null) {
13882e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki            mTabPager.setOnPageChangeListener(null);
13892e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        }
139008e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
139108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
1392fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
139309d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann    protected void onRestoreInstanceState(Bundle savedInstanceState) {
139409d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        super.onRestoreInstanceState(savedInstanceState);
139509d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        // In our own lifecycle, the focus is saved and restore but later taken away by the
139609d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        // ViewPager. As a hack, we force focus on the SearchView if we know that we are searching.
139709d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        // This fixes the keyboard going away on screen rotation
139809d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        if (mActionBarAdapter.isSearchMode()) {
139909d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann            mActionBarAdapter.setFocusOnSearchView();
140009d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        }
140109d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann    }
140209d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann
140309d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann    @Override
14043391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    public DialogManager getDialogManager() {
14053391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann        return mDialogManager;
14063391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    }
1407ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov
14082b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos    @Override
14092b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos    public void onClick(View view) {
14102b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        switch (view.getId()) {
14112b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos            case R.id.floating_action_button:
14122b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
14132b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                Bundle extras = getIntent().getExtras();
14142b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                if (extras != null) {
14152b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                    intent.putExtras(extras);
14162b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                }
1417d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner                try {
1418c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell                    ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent);
1419d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner                } catch (ActivityNotFoundException ex) {
1420d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner                    Toast.makeText(PeopleActivity.this, R.string.missing_app,
1421d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner                            Toast.LENGTH_SHORT).show();
1422d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner                }
14232b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                break;
14242b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        default:
14252b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos            Log.wtf(TAG, "Unexpected onClick event from " + view);
14262b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        }
14272b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos    }
1428962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell
1429962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell    /**
1430962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell     * Returns the tab position adjusted for the text direction.
1431962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell     */
1432962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell    private int getTabPositionForTextDirection(int position) {
1433962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell        if (isRTL()) {
1434962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell            return TabState.COUNT - 1 - position;
1435962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell        }
1436962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell        return position;
1437962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell    }
14387aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project}
1439