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;
30e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Bundle;
31e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Parcelable;
322cf389622f504115bc62d5a4380e95f1e3978c44Wenyi Wangimport android.provider.BlockedNumberContract;
33e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract;
34e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.Contacts;
35e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.ContactsContract.ProviderStatus;
36ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Waiimport android.provider.ContactsContract.QuickContact;
37e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.provider.Settings;
38e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v13.app.FragmentPagerAdapter;
39e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v4.view.PagerAdapter;
40e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.support.v4.view.ViewPager;
41b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wangimport android.telecom.TelecomManager;
427d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglioimport android.text.TextUtils;
43e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.util.Log;
44e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.KeyCharacterMap;
45e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.KeyEvent;
46e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.Menu;
47e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuInflater;
48e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.MenuItem;
49e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.View;
50e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.ViewGroup;
51bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangimport android.view.Window;
522b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulosimport android.widget.ImageButton;
53d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shraunerimport android.widget.Toast;
54bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangimport android.widget.Toolbar;
55e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
56bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangimport com.android.contacts.ContactsActivity;
5727834b2ae8bb5a65dfc20c212844d98d1c252caeDmitri Plotnikovimport com.android.contacts.R;
584d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onukiimport com.android.contacts.activities.ActionBarAdapter.TabState;
59cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.ContactsUtils;
60bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwellimport com.android.contacts.common.activity.RequestPermissionsActivity;
61b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wangimport com.android.contacts.common.compat.TelecomManagerUtil;
62c8dd78c595cfaf9766e59a2df012b16d6c05b213Chiao Chengimport com.android.contacts.common.dialog.ClearFrequentsDialog;
63051f41d0e2e23fa3acd9258ffc91a60cdbe828ecChiao Chengimport com.android.contacts.common.interactions.ImportExportDialogFragment;
64821a657d618285c04cbb3c440f1777a08381f868Chiao Chengimport com.android.contacts.common.list.ContactEntryListFragment;
65a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListFilter;
660d5588da244d0992c3ff8f25d0875fdf95a8c644Chiao Chengimport com.android.contacts.common.list.ContactListFilterController;
67e776d0366d5bf2f93a0cd0f14e48804e564bccf2Chiao Chengimport com.android.contacts.common.list.ContactTileAdapter.DisplayType;
68f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.list.DirectoryListLoader;
69f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.list.ViewPagerTabs;
70f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.logging.Logger;
7162a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jangimport com.android.contacts.common.logging.ScreenEvent.ScreenType;
72f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.preference.ContactsPreferenceActivity;
73f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.util.AccountFilterUtil;
74f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.util.Constants;
755d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliuimport com.android.contacts.common.util.ImplicitIntentsUtil;
76f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.common.util.ViewUtil;
775d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliuimport com.android.contacts.common.widget.FloatingActionButtonController;
78f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.editor.EditorIntents;
79f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.interactions.ContactDeletionInteraction;
80d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwellimport com.android.contacts.interactions.ContactMultiDeletionInteraction;
81d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwellimport com.android.contacts.interactions.ContactMultiDeletionInteraction.MultiContactDeleteListener;
82d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwellimport com.android.contacts.interactions.JoinContactsDialogFragment;
83d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwellimport com.android.contacts.interactions.JoinContactsDialogFragment.JoinContactsListener;
84d78ee90c0d4d93b82ad440396e87ae4f47f53e93Daniel Lehmannimport com.android.contacts.list.ContactTileListFragment;
850906ee326a5553a224eb7b004536f35b340bdcd3Dmitri Plotnikovimport com.android.contacts.list.ContactsIntentResolver;
861ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikovimport com.android.contacts.list.ContactsRequest;
878b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.ContactsUnavailableFragment;
88f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.list.MultiSelectContactsListFragment;
89f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.list.MultiSelectContactsListFragment.OnCheckBoxListActionListener;
90732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport com.android.contacts.list.OnContactBrowserActionListener;
918b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikovimport com.android.contacts.list.OnContactsUnavailableActionListener;
92c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onukiimport com.android.contacts.list.ProviderStatusWatcher;
93c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onukiimport com.android.contacts.list.ProviderStatusWatcher.ProviderStatusListener;
948a6f4ade05e5a8a89d91078ef9c22944450ac8baBrian Attwellimport com.android.contacts.quickcontact.QuickContactActivity;
953391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmannimport com.android.contacts.util.DialogManager;
96f597ec6bd74cdb687866a1922fdbfe3541585e37guanxiongliuimport com.android.contacts.util.PhoneCapabilityTester;
9756bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwellimport com.android.contactsbind.HelpUtils;
9857cf30f316b8013e172150d1ad0e197be6b46b87Tadashi G. Takaoka
9920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwellimport java.util.List;
1007d3b91577f84a4f5092d28ed0f3cfe7e0df32696Fabrice Di Meglioimport java.util.Locale;
1016d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onukiimport java.util.concurrent.atomic.AtomicInteger;
102caf0bc759c4ef96dde5bb0a5256c1dcb51b6ccc4Dmitri Plotnikov
1037aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project/**
1042c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell * Displays a list to browse contacts.
1057aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project */
106bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wangpublic class PeopleActivity extends ContactsActivity implements
1072b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        View.OnCreateContextMenuListener,
1082b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        View.OnClickListener,
1092b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        ActionBarAdapter.Listener,
1106e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        DialogManager.DialogShowingViewActivity,
1112b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        ContactListFilterController.ContactListFilterListener,
112d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell        ProviderStatusListener,
113d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell        MultiContactDeleteListener,
114d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell        JoinContactsListener {
11557d27da940983fba40d8e3a6d8b99a57b48419eaDmitri Plotnikov
1165e684a424e7036ba3d379221d1889b4dd7265021Dave Santoro    private static final String TAG = "PeopleActivity";
1177aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
1189ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    private static final String ENABLE_DEBUG_OPTIONS_HIDDEN_CODE = "debug debug!";
1199ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
1205c3a0a1440625fab859aab420cb08bc0276358a0Katherine Kuan    // These values needs to start at 2. See {@link ContactEntryListFragment}.
1212c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell    private static final int SUBACTIVITY_ACCOUNT_FILTER = 2;
122c6b8afe730255537978f2c938cca6986cae63c34Katherine Kuan
12334b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa    private final DialogManager mDialogManager = new DialogManager(this);
1243391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann
125ac0f783adb82ee8056e742fae4994e848e82ea3dDmitri Plotnikov    private ContactsIntentResolver mIntentResolver;
126fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ContactsRequest mRequest;
127caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov
128fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    private ActionBarAdapter mActionBarAdapter;
129865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell    private FloatingActionButtonController mFloatingActionButtonController;
130865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell    private View mFloatingActionButtonContainer;
131865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell    private boolean wasLastFabAnimationScaleIn = false;
1327c5286ed8ba0d7fbe3683b560f69b3a2d4ff1e2aDmitri Plotnikov
1337979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro    private ContactTileListFragment.Listener mFavoritesFragmentListener =
134ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa            new StrequentContactListFragmentListener();
135ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa
13615ccbb4d22fd65165cacb7970cbe61de1aa9aac4Dmitri Plotnikov    private ContactListFilterController mContactListFilterController;
1373c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
1388b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private ContactsUnavailableFragment mContactsUnavailableFragment;
139c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki    private ProviderStatusWatcher mProviderStatusWatcher;
140c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell    private Integer mProviderStatus;
1418b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1420cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov    private boolean mOptionsMenuContactsAvailable;
1430cd01309feeaf08b1a9852d33fc123c6cbddca6cDmitri Plotnikov
14495c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa    /**
14595c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa     * Showing a list of Contacts. Also used for showing search results in search mode.
14695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa     */
14720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell    private MultiSelectContactsListFragment mAllFragment;
1487979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro    private ContactTileListFragment mFavoritesFragment;
1492b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos
1502c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell    /** ViewPager for swipe */
151250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private ViewPager mTabPager;
1523c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell    private ViewPagerTabs mViewPagerTabs;
153250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private TabPagerAdapter mTabPagerAdapter;
1543c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell    private String[] mTabTitles;
1552e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki    private final TabPagerListener mTabPagerListener = new TabPagerListener();
15658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
1579ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    private boolean mEnableDebugMenuOptions;
1589ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
159417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
160417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * True if this activity instance is a re-created one.  i.e. set true after orientation change.
161417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * This is set in {@link #onCreate} for later use in {@link #onStart}.
162417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
163417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private boolean mIsRecreatedInstance;
164417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
165417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
166417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * If {@link #configureFragments(boolean)} is already called.  Used to avoid calling it twice
167417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * in {@link #onStart}.
168417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * (This initialization only needs to be done once in onStart() when the Activity was just
169417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * created from scratch -- i.e. onCreate() was just called)
170417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
171417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private boolean mFragmentInitialized;
172417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
173be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan    /**
17432791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski     * This is to disable {@link #onOptionsItemSelected} when we trying to stop the activity.
17532791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski     */
17632791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski    private boolean mDisableOptionItemSelected;
17732791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski
1786d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    /** Sequential ID assigned to each instance; used for logging */
1796d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private final int mInstanceId;
1806d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private static final AtomicInteger sNextInstanceId = new AtomicInteger();
1816d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki
1829856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan    public PeopleActivity() {
1836d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        mInstanceId = sNextInstanceId.getAndIncrement();
1841540674a23a2ac0277a5aca3fa4ed41a6e1b74c3Dmitri Plotnikov        mIntentResolver = new ContactsIntentResolver(this);
185c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher = ProviderStatusWatcher.getInstance(this);
1866178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov    }
1876178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov
1886d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    @Override
1896d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    public String toString() {
1906d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        // Shown on logcat
1916d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        return String.format("%s@%d", getClass().getSimpleName(), mInstanceId);
1926d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    }
1936d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki
1948b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public boolean areContactsAvailable() {
1952f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang        return (mProviderStatus != null) && mProviderStatus.equals(ProviderStatus.STATUS_NORMAL);
1968b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
1978b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1986f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki    private boolean areGroupWritableAccountsAvailable() {
1996f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki        return ContactsUtils.areGroupWritableAccountsAvailable(this);
2006f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki    }
20149917b3ed3272dd0e26112d8403a3891fbc48ce1Isaac Katzenelson
20250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki    /**
20350445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * Initialize fragments that are (or may not be) in the layout.
20450445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     *
20550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * For the fragments that are in the layout, we initialize them in
206417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * {@link #createViewsAndFragments(Bundle)} after inflating the layout.
20750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     *
2082c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell     * However, the {@link ContactsUnavailableFragment} is a special fragment which may not
2092c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell     * be in the layout, so we have to do the initialization here.
2102c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell     *
2112c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell     * The ContactsUnavailableFragment is always created at runtime.
21250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     */
2137aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
21492a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    public void onAttachFragment(Fragment fragment) {
2152c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        if (fragment instanceof ContactsUnavailableFragment) {
2168b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment = (ContactsUnavailableFragment)fragment;
2178b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
2188b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                    new ContactsUnavailableFragmentListener());
21992a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov        }
22092a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    }
22192a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov
22292a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov    @Override
22308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    protected void onCreate(Bundle savedState) {
22449627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
22549627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki            Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate start");
22649627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        }
22708e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        super.onCreate(savedState);
2287aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
229bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell        if (RequestPermissionsActivity.startPermissionActivity(this)) {
230bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell            return;
231bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell        }
232bdd32641ae2c2bc6214608cc5712dfb2b96e0305Brian Attwell
2336d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        if (!processIntent(false)) {
234417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            finish();
235417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return;
236417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
237a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mContactListFilterController = ContactListFilterController.getInstance(this);
238be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        mContactListFilterController.checkFilterValidity(false);
239a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mContactListFilterController.addListener(this);
240a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa
241c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.addListener(this);
242c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki
243417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mIsRecreatedInstance = (savedState != null);
244417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        createViewsAndFragments(savedState);
2454b1af3f8f68c3f5de459d17c218853fb0849d9f5Andrew Lee
24649627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
24749627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki            Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate finish");
24849627cc3f606085d001397ebba93dcb52bf67a5cMakoto Onuki        }
2495b221086e4b994d6325d7396625900a79e27ae51Sai Cheemalapati        getWindow().setBackgroundDrawable(null);
250fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
251fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
252fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
253fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    protected void onNewIntent(Intent intent) {
254fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        setIntent(intent);
2556d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        if (!processIntent(true)) {
256417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            finish();
257417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return;
258417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
259417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mActionBarAdapter.initialize(null, mRequest);
260417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
261be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan        mContactListFilterController.checkFilterValidity(false);
262be79b8f05f45c4cddeea9106399521529ec27caeKatherine Kuan
263417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Re-configure fragments.
264417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        configureFragments(true /* from request */);
2659cfa24cbd952a027d8e0dea2b0f164820dd6ab8dBrian Attwell        initializeFabVisibility();
266417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        invalidateOptionsMenuIfNeeded();
267fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    }
268fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
269417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    /**
270417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * Resolve the intent and initialize {@link #mRequest}, and launch another activity if redirect
271417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * is needed.
272417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *
2736d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki     * @param forNewIntent set true if it's called from {@link #onNewIntent(Intent)}.
274417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     * @return {@code true} if {@link PeopleActivity} should continue running.  {@code false}
275417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *         if it shouldn't, in which case the caller should finish() itself and shouldn't do
276417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     *         farther initialization.
277417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki     */
2786d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki    private boolean processIntent(boolean forNewIntent) {
2791ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // Extract relevant information from the intent
2801ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        mRequest = mIntentResolver.resolveIntent(getIntent());
281ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki        if (Log.isLoggable(TAG, Log.DEBUG)) {
2826d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki            Log.d(TAG, this + " processIntent: forNewIntent=" + forNewIntent
2836d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki                    + " intent=" + getIntent() + " request=" + mRequest);
2846d9befe1de956c50e31e4d1c22809fe9826f680cMakoto Onuki        }
2851ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        if (!mRequest.isValid()) {
2866178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov            setResult(RESULT_CANCELED);
287417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return false;
2886178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov        }
2896178cb47846e7efc9c245a9b9ba93032a0038921Dmitri Plotnikov
2902c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT) {
291c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell            final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(
292c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell                    mRequest.getContactUri(), QuickContactActivity.MODE_FULLY_EXPANDED);
29362a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jang            intent.putExtra(QuickContactActivity.EXTRA_PREVIOUS_SCREEN_TYPE, ScreenType.UNKNOWN);
294c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell            ImplicitIntentsUtil.startActivityInApp(this, intent);
295417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            return false;
29650445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        }
297417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        return true;
298417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    }
29950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
300417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    private void createViewsAndFragments(Bundle savedState) {
301bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang        // Disable the ActionBar so that we can use a Toolbar. This needs to be called before
302bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang        // setContentView().
303bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
304bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang
305417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        setContentView(R.layout.people_activity);
306417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
307417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        final FragmentManager fragmentManager = getFragmentManager();
308417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
309417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Hide all tabs (the current tab will later be reshown once a tab is selected)
310417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        final FragmentTransaction transaction = fragmentManager.beginTransaction();
311417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
3123c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        mTabTitles = new String[TabState.COUNT];
3133c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        mTabTitles[TabState.FAVORITES] = getString(R.string.favorites_tab_label);
3143c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        mTabTitles[TabState.ALL] = getString(R.string.all_contacts_tab_label);
3152c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mTabPager = getView(R.id.tab_pager);
3162c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mTabPagerAdapter = new TabPagerAdapter();
3172c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mTabPager.setAdapter(mTabPagerAdapter);
3182c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mTabPager.setOnPageChangeListener(mTabPagerListener);
319417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki
320bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang        // Configure toolbar and toolbar tabs. If in landscape mode, we  configure tabs differntly.
3213c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        final Toolbar toolbar = getView(R.id.toolbar);
322bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang        setActionBar(toolbar);
3233c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        final ViewPagerTabs portraitViewPagerTabs
3243c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell                = (ViewPagerTabs) findViewById(R.id.lists_pager_header);
3253c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        ViewPagerTabs landscapeViewPagerTabs = null;
3263c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        if (portraitViewPagerTabs ==  null) {
3273c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell            landscapeViewPagerTabs = (ViewPagerTabs) getLayoutInflater().inflate(
3283c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell                    R.layout.people_activity_tabs_lands, toolbar, /* attachToRoot = */ false);
3293c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell            mViewPagerTabs = landscapeViewPagerTabs;
3303c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        } else {
3313c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell            mViewPagerTabs = portraitViewPagerTabs;
3323c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        }
3333c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        mViewPagerTabs.setViewPager(mTabPager);
3343c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell
3352c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        final String FAVORITE_TAG = "tab-pager-favorite";
3362c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        final String ALL_TAG = "tab-pager-all";
3372c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell
3382c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // Create the fragments and add as children of the view pager.
3392c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // The pager adapter will only change the visibility; it'll never create/destroy
3402c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // fragments.
3412c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // However, if it's after screen rotation, the fragments have been re-created by
3422c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // the fragment manager, so first see if there're already the target fragments
3432c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        // existing.
3442c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mFavoritesFragment = (ContactTileListFragment)
3452c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell                fragmentManager.findFragmentByTag(FAVORITE_TAG);
34620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        mAllFragment = (MultiSelectContactsListFragment)
3472c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell                fragmentManager.findFragmentByTag(ALL_TAG);
3482c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell
3492c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        if (mFavoritesFragment == null) {
3502c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            mFavoritesFragment = new ContactTileListFragment();
35120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mAllFragment = new MultiSelectContactsListFragment();
3522c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell
3532c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            transaction.add(R.id.tab_pager, mFavoritesFragment, FAVORITE_TAG);
3542c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            transaction.add(R.id.tab_pager, mAllFragment, ALL_TAG);
355417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
356250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
357417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mFavoritesFragment.setListener(mFavoritesFragmentListener);
35850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
359417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mAllFragment.setOnContactListActionListener(new ContactBrowserActionListener());
36020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        mAllFragment.setCheckBoxListListener(new CheckBoxListListener());
36150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
362417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // Hide all fragments for now.  We adjust visibility when we get onSelectedTabChanged()
363417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        // from ActionBarAdapter.
364417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        transaction.hide(mFavoritesFragment);
365417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        transaction.hide(mAllFragment);
366f00ff8b91e6c452839bb80c195bc8616797b9a0cFrank Sposaro
3674b25da79091157935042d2942a8961ceba92166fMinh Pham        transaction.commitAllowingStateLoss();
368417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        fragmentManager.executePendingTransactions();
3694d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
3700c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro        // Setting Properties after fragment is created
3712c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mFavoritesFragment.setDisplayType(DisplayType.STREQUENT);
3720c07935a3d838ed24db7d20df839be97fe4c625aFrank Sposaro
373bf96dd1b542c7aa5bf5e97903b22dbd2cbe2a316Wenyi Wang        mActionBarAdapter = new ActionBarAdapter(this, this, getActionBar(),
3743c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell                portraitViewPagerTabs, landscapeViewPagerTabs, toolbar);
375417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        mActionBarAdapter.initialize(savedState, mRequest);
37658fc577bd7966e6566cdcac09589a0d3e05128e7Katherine Kuan
377d41ab8ace81a2e44f8b28aa8782679b9e9cca1b9Brian Attwell        // Add shadow under toolbar
378d41ab8ace81a2e44f8b28aa8782679b9e9cca1b9Brian Attwell        ViewUtil.addRectangularOutlineProvider(findViewById(R.id.toolbar_parent), getResources());
379d41ab8ace81a2e44f8b28aa8782679b9e9cca1b9Brian Attwell
380865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        // Configure floating action button
381865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        mFloatingActionButtonContainer = findViewById(R.id.floating_action_button_container);
382865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        final ImageButton floatingActionButton
383865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                = (ImageButton) findViewById(R.id.floating_action_button);
3842c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        floatingActionButton.setOnClickListener(this);
385865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        mFloatingActionButtonController = new FloatingActionButtonController(this,
386865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                mFloatingActionButtonContainer, floatingActionButton);
3879cfa24cbd952a027d8e0dea2b0f164820dd6ab8dBrian Attwell        initializeFabVisibility();
3882b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos
389417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        invalidateOptionsMenuIfNeeded();
390417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    }
39108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
392417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    @Override
393417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki    protected void onStart() {
394417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        if (!mFragmentInitialized) {
395417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            mFragmentInitialized = true;
396417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            /* Configure fragments if we haven't.
397417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
398417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * Note it's a one-shot initialization, so we want to do this in {@link #onCreate}.
399417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
400417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * However, because this method may indirectly touch views in fragments but fragments
401417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * created in {@link #configureContentView} using a {@link FragmentTransaction} will NOT
402417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * have views until {@link Activity#onCreate} finishes (they would if they were inflated
403417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * from a layout), we need to do it here in {@link #onStart()}.
404417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
405417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * (When {@link Fragment#onCreateView} is called is different in the former case and
406417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * in the latter case, unfortunately.)
407417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             *
408417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * Also, we skip most of the work in it if the activity is a re-created one.
409417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             * (so the argument.)
410417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki             */
411417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki            configureFragments(!mIsRecreatedInstance);
412417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        }
413417ca4983c7fd76ce6086db5b66f10a95ff9b7d6Makoto Onuki        super.onStart();
4143c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov    }
4153c69e21d278b1f99b9af817f8459044215238938Dmitri Plotnikov
4166e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
417174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    protected void onPause() {
418fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        mOptionsMenuContactsAvailable = false;
419c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.stop();
420174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onPause();
421174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
422174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
423174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
424174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    protected void onResume() {
425174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov        super.onResume();
426697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus
427c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.start();
428697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus        updateViewConfiguration(true);
4294d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
4304d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // Re-register the listener, which may have been cleared when onSaveInstanceState was
4314d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // called.  See also: onSaveInstanceState
4324d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.setListener(this);
43332791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski        mDisableOptionItemSelected = false;
4342e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        if (mTabPager != null) {
4352e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki            mTabPager.setOnPageChangeListener(mTabPagerListener);
4362e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        }
437a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        // Current tab may have changed since the last onSaveInstanceState().  Make sure
438a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        // the actual contents match the tab.
439a4505fc31c7a1072d1aee1781cd86710207d6c79Makoto Onuki        updateFragmentsVisibility();
440174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    }
441174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov
442174fdc2dcb965f11cf4eb25e4ea961f0e1e56c85Dmitri Plotnikov    @Override
4434d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    protected void onDestroy() {
444c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki        mProviderStatusWatcher.removeListener(this);
445c2bd6138e19fdcf734843eb55c83d6ffe00e91daMakoto Onuki
446b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        // Some of variables will be null if this Activity redirects Intent.
447b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        // See also onCreate() or other methods called during the Activity's initialization.
448c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki        if (mActionBarAdapter != null) {
449c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki            mActionBarAdapter.setListener(null);
450c1eed6d4fe14599fb89644d460c45020057789beMakoto Onuki        }
451b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        if (mContactListFilterController != null) {
452b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa            mContactListFilterController.removeListener(this);
453b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa        }
454b2a23189be94c824eadae9d0f7c5d58a7ee12fd0Daisuke Miyakawa
4554d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        super.onDestroy();
4564d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
4574d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
458955846efce2fb378b527bc74fe322fce655f75e2Dmitri Plotnikov    private void configureFragments(boolean fromRequest) {
459009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov        if (fromRequest) {
46091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            ContactListFilter filter = null;
46191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            int actionCode = mRequest.getActionCode();
46253b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki            boolean searchMode = mRequest.isSearchMode();
46352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            final int tabToOpen;
46491ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            switch (actionCode) {
46591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_ALL_CONTACTS:
466be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    filter = ContactListFilter.createFilterWithType(
467be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                            ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
468ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
46991ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
47091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
471be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    filter = ContactListFilter.createFilterWithType(
47291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                            ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY);
473ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
47491ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
47591ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov
47691ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_FREQUENT:
47791ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_STREQUENT:
47891ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                case ContactsRequest.ACTION_STARRED:
479ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.FAVORITES;
48091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                    break;
4819e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro                case ContactsRequest.ACTION_VIEW_CONTACT:
482ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    tabToOpen = TabState.ALL;
483ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                    break;
48452aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                default:
48552aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                    tabToOpen = -1;
48652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                    break;
487ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki            }
48852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            if (tabToOpen != -1) {
489ea14605e56c98fcaa93f2f1e4186ce9db5e2f159Makoto Onuki                mActionBarAdapter.setCurrentTab(tabToOpen);
49091ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            }
49191ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov
49291ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov            if (filter != null) {
49391ab5b436ebf12e29fdf3e19b3ea195287fcc1d9Dmitri Plotnikov                mContactListFilterController.setContactListFilter(filter, false);
49453b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki                searchMode = false;
495009676f9f2a5d8d47756be37abd9a14f2e564979Dmitri Plotnikov            }
496d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
497d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            if (mRequest.getContactUri() != null) {
49853b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki                searchMode = false;
499d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            }
500d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
50153b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki            mActionBarAdapter.setSearchMode(searchMode);
5020ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan            configureContactListFragmentForRequest();
503fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
504fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
5050ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan        configureContactListFragment();
506fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov
5078268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
5086e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    }
5096e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
510865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell    private void initializeFabVisibility() {
511865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        final boolean hideFab = mActionBarAdapter.isSearchMode()
512865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                || mActionBarAdapter.isSelectionMode();
513865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        mFloatingActionButtonContainer.setVisibility(hideFab ? View.GONE : View.VISIBLE);
5149cfa24cbd952a027d8e0dea2b0f164820dd6ab8dBrian Attwell        mFloatingActionButtonController.resetIn();
515865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        wasLastFabAnimationScaleIn = !hideFab;
516865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell    }
517865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell
518865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell    private void showFabWithAnimation(boolean showFab) {
519865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        if (mFloatingActionButtonContainer == null) {
520865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            return;
521865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        }
522865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        if (showFab) {
523865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            if (!wasLastFabAnimationScaleIn) {
524865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                mFloatingActionButtonContainer.setVisibility(View.VISIBLE);
525865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                mFloatingActionButtonController.scaleIn(0);
526865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            }
527865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            wasLastFabAnimationScaleIn = true;
528865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell
529865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        } else {
530865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            if (wasLastFabAnimationScaleIn) {
531865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                mFloatingActionButtonContainer.setVisibility(View.VISIBLE);
532865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                mFloatingActionButtonController.scaleOut();
533865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            }
534865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            wasLastFabAnimationScaleIn = false;
535865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell        }
536865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell    }
537865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell
5386e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov    @Override
539d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov    public void onContactListFilterChanged() {
54095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        if (mAllFragment == null || !mAllFragment.isAdded()) {
541d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov            return;
542d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov        }
543d07335a54090a7c41baa99a2c0a6a869ecc6cfbaDmitri Plotnikov
54495c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
545e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
5468268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
5473ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov    }
5483ad2f35559f81e0d1b5ff362795ae77c0493bd0aDmitri Plotnikov
549fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov    /**
550fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov     * Handler for action bar actions.
551fcfdffb439ccf1ddef971109b82e782c47161572Dmitri Plotnikov     */
552fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov    @Override
553311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann    public void onAction(int action) {
554b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        switch (action) {
55520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            case ActionBarAdapter.Listener.Action.START_SELECTION_MODE:
55620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                mAllFragment.displayCheckBoxes(true);
557a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang                startSearchOrSelectionMode();
558a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang                break;
559311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann            case ActionBarAdapter.Listener.Action.START_SEARCH_MODE:
560a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang                if (!mIsRecreatedInstance) {
56162a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jang                    Logger.logScreenView(this, ScreenType.SEARCH);
562a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang                }
563a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang                startSearchOrSelectionMode();
564865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                break;
565865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            case ActionBarAdapter.Listener.Action.BEGIN_STOPPING_SEARCH_AND_SELECTION_MODE:
566865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                showFabWithAnimation(/* showFabWithAnimation = */ true);
567b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                break;
56820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            case ActionBarAdapter.Listener.Action.STOP_SEARCH_AND_SELECTION_MODE:
5691db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki                setQueryTextToFragment("");
5704d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki                updateFragmentsVisibility();
5718811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki                invalidateOptionsMenu();
572865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell                showFabWithAnimation(/* showFabWithAnimation = */ true);
5738268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan                break;
574311882ab2fc1e9c8264f5892a6d50722b834e348Daniel Lehmann            case ActionBarAdapter.Listener.Action.CHANGE_SEARCH_QUERY:
5759ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                final String queryString = mActionBarAdapter.getQueryString();
5769ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                setQueryTextToFragment(queryString);
5779ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                updateDebugOptionsVisibility(
5789ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                        ENABLE_DEBUG_OPTIONS_HIDDEN_CODE.equals(queryString));
579b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                break;
580b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            default:
581b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                throw new IllegalStateException("Unkonwn ActionBarAdapter action: " + action);
582b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan        }
583fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov    }
584fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov
585a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang    private void startSearchOrSelectionMode() {
586a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang        configureFragments(false /* from request */);
587a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang        updateFragmentsVisibility();
588a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang        invalidateOptionsMenu();
589a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang        showFabWithAnimation(/* showFabWithAnimation = */ false);
590a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang    }
591a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang
5924d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    @Override
5934d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    public void onSelectedTabChanged() {
5944d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        updateFragmentsVisibility();
5954d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
5964d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
5976adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell    @Override
5986adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell    public void onUpButtonPressed() {
5996adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell        onBackPressed();
6006adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell    }
6016adbf1e7870e9de4ad203d334c8786ffca7d123dBrian Attwell
6029ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    private void updateDebugOptionsVisibility(boolean visible) {
6039ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki        if (mEnableDebugMenuOptions != visible) {
6049ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            mEnableDebugMenuOptions = visible;
6059ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            invalidateOptionsMenu();
6069ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki        }
6079ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki    }
6089ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
6094d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    /**
6104d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     * Updates the fragment/view visibility according to the current mode, such as
6114d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     * {@link ActionBarAdapter#isSearchMode()} and {@link ActionBarAdapter#getCurrentTab()}.
6124d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki     */
6134d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    private void updateFragmentsVisibility() {
61452aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann        int tab = mActionBarAdapter.getCurrentTab();
6154d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
61620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        if (mActionBarAdapter.isSearchMode() || mActionBarAdapter.isSelectionMode()) {
61720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mTabPagerAdapter.setTabsHidden(true);
6182c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        } else {
61920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            // No smooth scrolling if quitting from the search/selection mode.
62020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            final boolean wereTabsHidden = mTabPagerAdapter.areTabsHidden()
62120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                    || mActionBarAdapter.isSelectionMode();
62220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mTabPagerAdapter.setTabsHidden(false);
6232c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            if (mTabPager.getCurrentItem() != tab) {
62420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                mTabPager.setCurrentItem(tab, !wereTabsHidden);
6252c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell            }
6264d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        }
627d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell        if (!mActionBarAdapter.isSelectionMode()) {
628d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell            mAllFragment.displayCheckBoxes(false);
629d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell        }
6302c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        invalidateOptionsMenu();
63166606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        showEmptyStateForTab(tab);
63266606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson    }
63366606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson
63452aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann    private void showEmptyStateForTab(int tab) {
63566606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        if (mContactsUnavailableFragment != null) {
6369203788d3f55e84d55db4c5a87bbbf1fa1e36b43Brian Attwell            switch (getTabPositionForTextDirection(tab)) {
63752aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.FAVORITES:
638b0cfae543ca16136f251634cb29d78dbb4e40b43Wenyi Wang                    mContactsUnavailableFragment.setTabInfo(
639b0cfae543ca16136f251634cb29d78dbb4e40b43Wenyi Wang                            R.string.listTotalAllContactsZeroStarred, TabState.FAVORITES);
64066606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    break;
64152aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                case TabState.ALL:
642b0cfae543ca16136f251634cb29d78dbb4e40b43Wenyi Wang                    mContactsUnavailableFragment.setTabInfo(R.string.noContacts, TabState.ALL);
64366606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson                    break;
64466606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson            }
6458d71f11c70c974518f3482c46a10a5601628a029Brian Attwell            // When using the mContactsUnavailableFragment the ViewPager doesn't contain two views.
6468d71f11c70c974518f3482c46a10a5601628a029Brian Attwell            // Therefore, we have to trick the ViewPagerTabs into thinking we have changed tabs
6478d71f11c70c974518f3482c46a10a5601628a029Brian Attwell            // when the mContactsUnavailableFragment changes. Otherwise the tab strip won't move.
6488d71f11c70c974518f3482c46a10a5601628a029Brian Attwell            mViewPagerTabs.onPageScrolled(tab, 0, 0);
64966606b648d7eee16b6e5a55506bbee141887b55eIsaac Katzenelson        }
6504d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
6514d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
652250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private class TabPagerListener implements ViewPager.OnPageChangeListener {
65370f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
65470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // This package-protected constructor is here because of a possible compiler bug.
65570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // PeopleActivity$1.class should be generated due to the private outer/inner class access
65670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // needed here.  But for some reason, PeopleActivity$1.class is missing.
65770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // Since $1 class is needed as a jvm work around to get access to the inner class,
65870f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // changing the constructor to package-protected or public will solve the problem.
65970f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // To verify whether $1 class is needed, javap PeopleActivity$TabPagerListener and look for
66070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // references to PeopleActivity$1.
66170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        //
66270f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // When the constructor is private and PeopleActivity$1.class is missing, proguard will
66370f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // correctly catch this and throw warnings and error out the build on user/userdebug builds.
66470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        //
66570f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        // All private inner classes below also need this fix.
66670f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        TabPagerListener() {}
66770f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
668250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
669250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageScrollStateChanged(int state) {
67020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (!mTabPagerAdapter.areTabsHidden()) {
6713c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell                mViewPagerTabs.onPageScrollStateChanged(state);
6723c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell            }
673250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
674250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
675250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
676250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
67720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (!mTabPagerAdapter.areTabsHidden()) {
6783c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell                mViewPagerTabs.onPageScrolled(position, positionOffset, positionOffsetPixels);
6793c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell            }
680250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
681250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
682250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
683250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void onPageSelected(int position) {
684250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            // Make sure not in the search mode, in which case position != TabState.ordinal().
68520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (!mTabPagerAdapter.areTabsHidden()) {
68652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                mActionBarAdapter.setCurrentTab(position, false);
6873c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell                mViewPagerTabs.onPageSelected(position);
68852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                showEmptyStateForTab(position);
6898811b7c3fe518246b8ee2aa00a90319dfafd10c6Makoto Onuki                invalidateOptionsMenu();
690250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
691250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
692250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    }
693250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
694250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    /**
695250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * Adapter for the {@link ViewPager}.  Unlike {@link FragmentPagerAdapter},
696250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * {@link #instantiateItem} returns existing fragments, and {@link #instantiateItem}/
697250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * {@link #destroyItem} show/hide fragments instead of attaching/detaching.
698250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     *
699250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * In search mode, we always show the "all" fragment, and disable the swipe.  We change the
700250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * number of items to 1 to disable the swipe.
701250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     *
702250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     * TODO figure out a more straight way to disable swipe.
703250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki     */
704250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    private class TabPagerAdapter extends PagerAdapter {
705250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private final FragmentManager mFragmentManager;
706250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private FragmentTransaction mCurTransaction = null;
707250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
70820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        private boolean mAreTabsHiddenInTabPager;
709250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
710746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        private Fragment mCurrentPrimaryItem;
711746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
712250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public TabPagerAdapter() {
713250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mFragmentManager = getFragmentManager();
714250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
715250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
71620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        public boolean areTabsHidden() {
71720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            return mAreTabsHiddenInTabPager;
718250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
719250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
72020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        public void setTabsHidden(boolean hideTabs) {
72120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (hideTabs == mAreTabsHiddenInTabPager) {
722250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                return;
723250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
72420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mAreTabsHiddenInTabPager = hideTabs;
725250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            notifyDataSetChanged();
726250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
727250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
728250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
729250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public int getCount() {
73020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            return mAreTabsHiddenInTabPager ? 1 : TabState.COUNT;
731250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
732250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
733250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        /** Gets called when the number of items changes. */
734250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
735250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public int getItemPosition(Object object) {
73620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (mAreTabsHiddenInTabPager) {
737250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mAllFragment) {
738250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return 0; // Only 1 page in search mode
739250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
740250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            } else {
741250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mFavoritesFragment) {
742962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell                    return getTabPositionForTextDirection(TabState.FAVORITES);
743250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
744250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                if (object == mAllFragment) {
745962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell                    return getTabPositionForTextDirection(TabState.ALL);
746250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
747250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
748250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return POSITION_NONE;
749250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
750250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
751250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
752970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void startUpdate(ViewGroup container) {
753250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
754250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
755250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        private Fragment getFragment(int position) {
756962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell            position = getTabPositionForTextDirection(position);
75720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (mAreTabsHiddenInTabPager) {
7588d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                if (position != 0) {
7598d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                    // This has only been observed in monkey tests.
7608d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                    // Let's log this issue, but not crash
7618d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                    Log.w(TAG, "Request fragment at position=" + position + ", eventhough we " +
7628d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                            "are in search mode");
763250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
7648d9ca013dbd0725dd04e6f3a0d9d138d19411832Daniel Lehmann                return mAllFragment;
765250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            } else {
76652aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                if (position == TabState.FAVORITES) {
767250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return mFavoritesFragment;
76852aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann                } else if (position == TabState.ALL) {
769250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                    return mAllFragment;
770250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                }
771250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
772250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            throw new IllegalArgumentException("position: " + position);
773250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
774250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
775250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
776970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public Object instantiateItem(ViewGroup container, int position) {
777250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction == null) {
778250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = mFragmentManager.beginTransaction();
779250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
780250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            Fragment f = getFragment(position);
781250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mCurTransaction.show(f);
782746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
7839bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell            // Non primary pages are not visible.
7849bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell            f.setUserVisibleHint(f == mCurrentPrimaryItem);
785250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return f;
786250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
787250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
788250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
789970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void destroyItem(ViewGroup container, int position, Object object) {
790250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction == null) {
791250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = mFragmentManager.beginTransaction();
792250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
793250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            mCurTransaction.hide((Fragment) object);
794250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
795250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
796250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
797970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void finishUpdate(ViewGroup container) {
798250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            if (mCurTransaction != null) {
7994b25da79091157935042d2942a8961ceba92166fMinh Pham                mCurTransaction.commitAllowingStateLoss();
800250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mCurTransaction = null;
801250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki                mFragmentManager.executePendingTransactions();
802250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            }
803250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
804250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
805250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
806250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public boolean isViewFromObject(View view, Object object) {
807250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return ((Fragment) object).getView() == view;
808250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
809250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
810250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
811970454497bcc42e4d9dc5395b2c8ca2f95667893Katherine Kuan        public void setPrimaryItem(ViewGroup container, int position, Object object) {
812746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            Fragment fragment = (Fragment) object;
813746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            if (mCurrentPrimaryItem != fragment) {
814746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                if (mCurrentPrimaryItem != null) {
8159bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell                    mCurrentPrimaryItem.setUserVisibleHint(false);
816746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                }
817746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                if (fragment != null) {
8189bd59f27cc5ad318b4bb78fc0576604e57f0b7a6Adam Powell                    fragment.setUserVisibleHint(true);
819746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                }
820746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki                mCurrentPrimaryItem = fragment;
821746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki            }
822746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        }
823746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki
824746316a47c9ab982ebcc03edbc636019e9e34f40Makoto Onuki        @Override
825250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public Parcelable saveState() {
826250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki            return null;
827250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
828250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
829250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        @Override
830250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        public void restoreState(Parcelable state, ClassLoader loader) {
831250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki        }
8323c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell
8333c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        @Override
8343c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        public CharSequence getPageTitle(int position) {
8353c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell            return mTabTitles[position];
8363c763b3a614375a1dbe273feec5a7664cd5939d3Brian Attwell        }
837250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki    }
838250ce43794cdf6820f7a13ef0195a566bd0c8c64Makoto Onuki
8391db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki    private void setQueryTextToFragment(String query) {
84095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa        mAllFragment.setQueryString(query, true);
8411db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki        mAllFragment.setVisibleScrollbarEnabled(!mAllFragment.isSearchMode());
8428268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan    }
8438268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan
8440ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureContactListFragmentForRequest() {
845fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        Uri contactUri = mRequest.getContactUri();
846fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (contactUri != null) {
84795c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setSelectedContactUri(contactUri);
848fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
849238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
850a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
8511db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki        setQueryTextToFragment(mActionBarAdapter.getQueryString());
852238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov
853fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        if (mRequest.isDirectorySearchEnabled()) {
85495c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
855fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        } else {
85695c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
857fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov        }
85808e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
85908e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
8600ff0e317cbf788adc4dce38257d27691e032d6caKatherine Kuan    private void configureContactListFragment() {
861a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        // Filter may be changed when this Activity is in background.
862a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa        mAllFragment.setFilter(mContactListFilterController.getFilter());
863a012aec6f22dd6a37c518c895db45b173e186ef4Daisuke Miyakawa
8642c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mAllFragment.setVerticalScrollbarPosition(getScrollBarPosition());
8652c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        mAllFragment.setSelectionVisible(false);
866e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng    }
867e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng
8682c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell    private int getScrollBarPosition() {
8692c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        return isRTL() ? View.SCROLLBAR_POSITION_LEFT : View.SCROLLBAR_POSITION_RIGHT;
870e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng    }
871e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng
872e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng    private boolean isRTL() {
873e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng        final Locale locale = Locale.getDefault();
874e90783822d17ef7696d8ec09ebb3ddd6d1768986Chiao Cheng        return TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL;
8751ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    }
8761323d69c40649914ae2195088573a20cc35da86eDmitri Plotnikov
8778b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    @Override
8788b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    public void onProviderStatusChange() {
879697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus        updateViewConfiguration(false);
8808b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
8818b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
882697ab26ed2e5173f5c2a20d09e6a064f93b760a9Josh Gargus    private void updateViewConfiguration(boolean forceUpdate) {
883c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell        int providerStatus = mProviderStatusWatcher.getProviderStatus();
884d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki        if (!forceUpdate && (mProviderStatus != null)
885c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell                && (mProviderStatus.equals(providerStatus))) return;
8868b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        mProviderStatus = providerStatus;
8878b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
8888b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        View contactsUnavailableView = findViewById(R.id.contacts_unavailable_view);
8898b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
890c3d202ccbaf93ddd8291672027e59f549c32eee3Brian Attwell        if (mProviderStatus.equals(ProviderStatus.STATUS_NORMAL)) {
891b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            // Ensure that the mTabPager is visible; we may have made it invisible below.
892c3f2a52067b799e223f0964207a2d1957165e960Dmitri Plotnikov            contactsUnavailableView.setVisibility(View.GONE);
893b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            if (mTabPager != null) {
894b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus                mTabPager.setVisibility(View.VISIBLE);
895b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            }
896b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus
89795c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            if (mAllFragment != null) {
89895c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                mAllFragment.setEnabled(true);
8998b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
9008b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        } else {
9015d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliu            // Setting up the page so that the user can still use the app
9025d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliu            // even without an account.
90395c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa            if (mAllFragment != null) {
90495c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                mAllFragment.setEnabled(false);
9058b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
9068b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            if (mContactsUnavailableFragment == null) {
9078b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment = new ContactsUnavailableFragment();
9088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
9098b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        new ContactsUnavailableFragmentListener());
9103ed426c842a68895a759548fef87bac359f937bbDianne Hackborn                getFragmentManager().beginTransaction()
9118b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov                        .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment)
9124b25da79091157935042d2942a8961ceba92166fMinh Pham                        .commitAllowingStateLoss();
9138b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            }
914d8fa716e5428791f79f54437087df3005cc907bfMakoto Onuki            mContactsUnavailableFragment.updateStatus(mProviderStatus);
915b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus
916b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            // Show the contactsUnavailableView, and hide the mTabPager so that we don't
917b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            // see it sliding in underneath the contactsUnavailableView at the edges.
9188b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            contactsUnavailableView.setVisibility(View.VISIBLE);
919b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            if (mTabPager != null) {
920b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus                mTabPager.setVisibility(View.GONE);
921b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus            }
922b8f11b9213502040b4a9723e216f34e431c49e53Josh Gargus
92352aa32db432085ab2cd4864bd1edd1ef843da867Daniel Lehmann            showEmptyStateForTab(mActionBarAdapter.getCurrentTab());
9248b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
9258b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
9268268bbe65440c70db46b4c505433fac1fdc36e58Katherine Kuan        invalidateOptionsMenuIfNeeded();
9278b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
9288b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
9291ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
93070f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        ContactBrowserActionListener() {}
931d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov
932e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
933d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov        public void onSelectionChange() {
934e5f1e4d30929783b26e285b3ddfbf9bc07bdef58Dmitri Plotnikov
9351ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
936e3fbfd99842607a0c208d0a930878bb54bb91dedDmitri Plotnikov
937e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
938ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai        public void onViewContactAction(Uri contactLookupUri, boolean isEnterpriseContact) {
939ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai            if (isEnterpriseContact) {
940ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai                // No implicit intent as user may have a different contacts app in work profile.
941ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai                QuickContact.showQuickContact(PeopleActivity.this, new Rect(), contactLookupUri,
942ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai                        QuickContactActivity.MODE_FULLY_EXPANDED, null);
943ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai            } else {
944ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai                final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(
94562a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jang                        contactLookupUri, QuickContactActivity.MODE_FULLY_EXPANDED);
94662a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jang                intent.putExtra(QuickContactActivity.EXTRA_PREVIOUS_SCREEN_TYPE,
94762a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jang                        mAllFragment.isSearchMode() ? ScreenType.SEARCH : ScreenType.ALL_CONTACTS);
948ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai                ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent);
949ed5202a2cc0b5916ed21f3afb3f2f19123eb028bRicky Wai            }
9501ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
951416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
952e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
9531ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onDeleteContactAction(Uri contactUri) {
9549856fcee477d04f51bdbcbfdf632876c6b8a1173Katherine Kuan            ContactDeletionInteraction.start(PeopleActivity.this, contactUri, false);
9551ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
9568a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
957e20d3432a370dd3996deec2df4e3cdf726c94992Daniel Lehmann        @Override
9581ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        public void onFinishAction() {
9591ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov            onBackPressed();
9601ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        }
9616e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov
9626e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        @Override
9636e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        public void onInvalidSelection() {
964b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            ContactListFilter filter;
965b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            ContactListFilter currentFilter = mAllFragment.getFilter();
966b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            if (currentFilter != null
967b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                    && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
968b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                filter = ContactListFilter.createFilterWithType(
969b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                        ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
970b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                mAllFragment.setFilter(filter);
971b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            } else {
972b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                filter = ContactListFilter.createFilterWithType(
973b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                        ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
974b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa                mAllFragment.setFilter(filter, false);
975b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa            }
976d959104d37df65f0d6de9290c3fa2b59065be0fcDmitri Plotnikov            mContactListFilterController.setContactListFilter(filter, true);
9776e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikov        }
9781ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov    }
979416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov
98020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell    private final class CheckBoxListListener implements OnCheckBoxListActionListener {
98120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        @Override
98220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        public void onStartDisplayingCheckBoxes() {
983865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            mActionBarAdapter.setSelectionMode(true);
984865847b1f567cb28664a57ac9cac05c3f2a8de32Brian Attwell            invalidateOptionsMenu();
98520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        }
98620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell
98720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        @Override
98820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        public void onSelectedContactIdsChanged() {
98920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mActionBarAdapter.setSelectionCount(mAllFragment.getSelectedContactIds().size());
99020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            invalidateOptionsMenu();
99120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        }
9928f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell
9938f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell        @Override
9948f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell        public void onStopDisplayingCheckBoxes() {
9958f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell            mActionBarAdapter.setSelectionMode(false);
9968f8937f9b33d220a4ca4f17fc334ad21cdd6fe8aBrian Attwell        }
99720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell    }
99820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell
9998b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    private class ContactsUnavailableFragmentListener
10008b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov            implements OnContactsUnavailableActionListener {
100170f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        ContactsUnavailableFragmentListener() {}
10028b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
10038b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
10048b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onCreateNewContactAction() {
1005c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell            ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this,
10065a7a23bdb698b8e741a425c9617c5e33e6314cddWalter Jang                    EditorIntents.createCompactInsertContactIntent());
10078b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
10088b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
10098b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
10108b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onAddAccountAction() {
10115d7bb268bae15843e729ffafc01de0ec9677d7aaguanxiongliu            final Intent intent = ImplicitIntentsUtil.getIntentForAddingAccount();
1012c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell            ImplicitIntentsUtil.startActivityOutsideApp(PeopleActivity.this, intent);
10138b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
10148b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
10158b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        @Override
10168b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        public void onImportContactsFromFileAction() {
10179379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang            showImportExportDialogFragment();
10188b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov        }
10198b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov    }
10208b8264620f9362e089322d1e3a7cc5620900e6f9Dmitri Plotnikov
1021ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa    private final class StrequentContactListFragmentListener
10227979ea27c046dfc2d9305b3282233046acef6ec4Frank Sposaro            implements ContactTileListFragment.Listener {
102370f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng        StrequentContactListFragmentListener() {}
102470f77ea66f8c842902401d0960dd432d66d38d9eChiao Cheng
1025ee179470c986594ac8f8cbacb7bdddff332ecfc7Daisuke Miyakawa        @Override
10267a700cf798a19a8452b8671f643a05336f63f611Katherine Kuan        public void onContactSelected(Uri contactUri, Rect targetRect) {
1027c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell            final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(contactUri,
1028c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell                    QuickContactActivity.MODE_FULLY_EXPANDED);
102962a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jang            intent.putExtra(QuickContactActivity.EXTRA_PREVIOUS_SCREEN_TYPE, ScreenType.FAVORITES);
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)
11057494e913d7bc044319ff143c02a6b1c108f66dd0Wenyi Wang                && ContactsUtils.FLAG_N_FEATURE
11062cf389622f504115bc62d5a4380e95f1e3978c44Wenyi Wang                && BlockedNumberContract.canCurrentUserBlockNumbers(this);
1107af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_search, showMiscOptions);
1108af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_import_export, showMiscOptions);
1109af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_accounts, showMiscOptions);
11109d115f0e9222e0f4b95a1ef55085ba6bdd8eb3b4Wenyi Wang        makeMenuItemVisible(menu, R.id.menu_blocked_numbers, showMiscOptions && showBlockedNumbers);
1111af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        makeMenuItemVisible(menu, R.id.menu_settings,
1112af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki                showMiscOptions && !ContactsPreferenceActivity.isEmpty(this));
1113e898a9fa52728b2ff6fcd3add693471e9e15553dDmitri Plotnikov
111420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        final boolean showSelectedContactOptions = mActionBarAdapter.isSelectionMode()
111520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                && mAllFragment.getSelectedContactIds().size() != 0;
111620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        makeMenuItemVisible(menu, R.id.menu_share, showSelectedContactOptions);
111720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        makeMenuItemVisible(menu, R.id.menu_delete, showSelectedContactOptions);
1118687d218928bd188a13cc32a3c553590fe0d564b1Wenyi Wang        final boolean showLinkContactsOptions = mActionBarAdapter.isSelectionMode()
1119687d218928bd188a13cc32a3c553590fe0d564b1Wenyi Wang                && mAllFragment.getSelectedContactIds().size() > 1;
1120687d218928bd188a13cc32a3c553590fe0d564b1Wenyi Wang        makeMenuItemVisible(menu, R.id.menu_join, showLinkContactsOptions);
112120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell
11229ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki        // Debug options need to be visible even in search mode.
11232f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang        makeMenuItemVisible(menu, R.id.export_database, mEnableDebugMenuOptions &&
11242f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang                hasExportIntentHandler());
11259ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki
1126d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey        return true;
11277aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
11287aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
11292f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang    private boolean hasExportIntentHandler() {
11302f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang        final Intent intent = new Intent();
11312f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang        intent.setAction("com.android.providers.contacts.DUMP_DATABASE");
11322f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang        final List<ResolveInfo> receivers = getPackageManager().queryIntentActivities(intent,
11332f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang                PackageManager.MATCH_DEFAULT_ONLY);
11342f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang        return receivers != null && receivers.size() > 0;
11352f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang    }
11362f09e604bc8292015bb728b054032443dcbc69c6Wenyi Wang
11372fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu    /**
11382fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu     * Returns whether there are any frequently contacted people being displayed
11392fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu     * @return
11402fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu     */
11412fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu    private boolean hasFrequents() {
11422c1bfd01bcd8f00723110c6964b399b96405a12eBrian Attwell        return mFavoritesFragment.hasFrequents();
11432fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu    }
11442fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu
1145af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki    private void makeMenuItemVisible(Menu menu, int itemId, boolean visible) {
1146d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell        final MenuItem item = menu.findItem(itemId);
1147af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        if (item != null) {
1148af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki            item.setVisible(visible);
1149af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki        }
1150af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki    }
1151af0a9d47e9ac629266884b902bcc480bed5e2b1bMakoto Onuki
1152d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell    private void makeMenuItemEnabled(Menu menu, int itemId, boolean visible) {
1153d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell        final MenuItem item = menu.findItem(itemId);
1154d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell        if (item != null) {
1155d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell            item.setEnabled(visible);
1156d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell        }
1157d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell    }
1158d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell
11597aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
11607aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
116132791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski        if (mDisableOptionItemSelected) {
116232791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski            return false;
116332791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski        }
116432791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski
11657aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        switch (item.getItemId()) {
1166e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki            case android.R.id.home: {
1167e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                // The home icon on the action bar is pressed
1168e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                if (mActionBarAdapter.isUpShowing()) {
1169e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                    // "UP" icon press -- should be treated as "back".
1170e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                    onBackPressed();
1171e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                }
1172e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki                return true;
1173e0c66aff27473d0edbd95660b95f0f2a80ab63ecMakoto Onuki            }
1174c85ad182093f5556d6dbb310f4708cdc174b2665Dmitri Plotnikov            case R.id.menu_settings: {
117586f2a86b99ccd4430dcaa7fcf88e8190cb64eb05Wenyi Wang                startActivity(new Intent(this, ContactsPreferenceActivity.class));
11767aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                return true;
1177d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
1178b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            case R.id.menu_contacts_filter: {
1179b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus                AccountFilterUtil.startAccountFilterActivityForResult(
1180b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus                        this, SUBACTIVITY_ACCOUNT_FILTER,
1181b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus                        mContactListFilterController.getFilter());
1182b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan                return true;
1183b5760b94bbf56ce348876ec36f4669d20a1530f5Katherine Kuan            }
1184d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_search: {
11858e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov                onSearchRequested();
11867aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project                return true;
1187d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
118820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            case R.id.menu_share:
118920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                shareSelectedContacts();
119020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                return true;
1191d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell            case R.id.menu_join:
1192d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell                joinSelectedContacts();
1193d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell                return true;
1194d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell            case R.id.menu_delete:
1195d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell                deleteSelectedContacts();
1196d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell                return true;
119749d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey            case R.id.menu_import_export: {
11989379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang                showImportExportDialogFragment();
1199d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1200d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
12012fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu            case R.id.menu_clear_frequents: {
12022fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                ClearFrequentsDialog.show(getFragmentManager());
12032fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu                return true;
12042fc4de31fe2d6a261d3eeaff69ea944a5383003eMaurice Chu            }
120556bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwell            case R.id.menu_help:
120656bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwell                HelpUtils.launchHelpAndFeedbackForMainScreen(this);
120756bcc2fc455dcb434545fcdeb07c5f916dece847Brian Attwell                return true;
1208d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            case R.id.menu_accounts: {
1209d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS);
1210fe42e55dfc483b69c8a7831c16fbdbc5ab19929eDmitri Plotnikov                intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] {
1211d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                    ContactsContract.AUTHORITY
1212d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                });
12131fbcbd1053c72e165009ad9a7d735dd2c0755c36Dmitri Plotnikov                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
1214c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell                ImplicitIntentsUtil.startActivityInAppIfPossible(this, intent);
1215d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey                return true;
1216d9798aefc844dd9ce29da085cb8ab7e769f63e75Jeff Sharkey            }
12171fc3ef4f7469e8abf8994a2c8f949f42fdda4ccbWenyi Wang            case R.id.menu_blocked_numbers: {
1218350030706b8b9de028c86c5a56d8e84ba3641812Wenyi Wang                final Intent intent = TelecomManagerUtil.createManageBlockedNumbersIntent(
1219b49c527b2ac16a189dfa61f9cdecdcafbf61fcc2Wenyi Wang                        (TelecomManager) getSystemService(Context.TELECOM_SERVICE));
1220350030706b8b9de028c86c5a56d8e84ba3641812Wenyi Wang                if (intent != null) {
1221350030706b8b9de028c86c5a56d8e84ba3641812Wenyi Wang                    startActivity(intent);
1222350030706b8b9de028c86c5a56d8e84ba3641812Wenyi Wang                }
12231fc3ef4f7469e8abf8994a2c8f949f42fdda4ccbWenyi Wang                return true;
12241fc3ef4f7469e8abf8994a2c8f949f42fdda4ccbWenyi Wang            }
12259ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            case R.id.export_database: {
12269ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                final Intent intent = new Intent("com.android.providers.contacts.DUMP_DATABASE");
12279ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
1228c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell                ImplicitIntentsUtil.startActivityOutsideApp(this, intent);
12299ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki                return true;
12309ae60417f9e189ecb1f86da9107ba02baae0659bMakoto Onuki            }
12317aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
12327aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return false;
12337aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
12347aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
12359379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang    private void showImportExportDialogFragment(){
12369379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang        final boolean isOnFavoriteTab = mTabPagerAdapter.mCurrentPrimaryItem == mFavoritesFragment;
12379379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang        if (isOnFavoriteTab) {
12389379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang            ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(),
12399379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang                    PeopleActivity.class, ImportExportDialogFragment.EXPORT_MODE_FAVORITES);
12409379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang        } else {
12419379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang            ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(),
12429379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang                    PeopleActivity.class, ImportExportDialogFragment.EXPORT_MODE_ALL_CONTACTS);
12439379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang        }
12449379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang    }
12459379f4a2cbdf81bfbfc6cfc4559422df2ddc8513Wenyi Wang
12468e86b75681659ce124e89f73d0410efe39025d11Dmitri Plotnikov    @Override
124753b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki    public boolean onSearchRequested() { // Search key pressed.
124820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        if (!mActionBarAdapter.isSelectionMode()) {
124920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mActionBarAdapter.setSearchMode(true);
125020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        }
125153b427b3dc6f04340133b2da135b3f5efea4de11Makoto Onuki        return true;
1252db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov    }
1253db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov
125420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell    /**
125520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell     * Share all contacts that are currently selected in mAllFragment. This method is pretty
125620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell     * inefficient for handling large numbers of contacts. I don't expect this to be a problem.
125720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell     */
125820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell    private void shareSelectedContacts() {
125920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        final StringBuilder uriListBuilder = new StringBuilder();
126020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        for (Long contactId : mAllFragment.getSelectedContactIds()) {
126120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            final Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
126220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            final Uri lookupUri = Contacts.getLookupUri(getContentResolver(), contactUri);
12635b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            if (lookupUri == null) {
12645b69125ca54b41429374041d73febd33af0dd596Jay Shrauner                continue;
12655b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            }
12665b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            final List<String> pathSegments = lookupUri.getPathSegments();
12675b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            if (pathSegments.size() < 2) {
12685b69125ca54b41429374041d73febd33af0dd596Jay Shrauner                continue;
12695b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            }
12705b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            final String lookupKey = pathSegments.get(pathSegments.size() - 2);
12715b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            if (uriListBuilder.length() > 0) {
12725b69125ca54b41429374041d73febd33af0dd596Jay Shrauner                uriListBuilder.append(':');
12735b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            }
12745b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            uriListBuilder.append(Uri.encode(lookupKey));
12755b69125ca54b41429374041d73febd33af0dd596Jay Shrauner        }
12765b69125ca54b41429374041d73febd33af0dd596Jay Shrauner        if (uriListBuilder.length() == 0) {
12775b69125ca54b41429374041d73febd33af0dd596Jay Shrauner            return;
127820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        }
127920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        final Uri uri = Uri.withAppendedPath(
128020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                Contacts.CONTENT_MULTI_VCARD_URI,
128120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                Uri.encode(uriListBuilder.toString()));
128220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        final Intent intent = new Intent(Intent.ACTION_SEND);
128320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        intent.setType(Contacts.CONTENT_VCARD_TYPE);
128420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        intent.putExtra(Intent.EXTRA_STREAM, uri);
128520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        ImplicitIntentsUtil.startActivityOutsideApp(this, intent);
128620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell    }
1287a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang
1288d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell    private void joinSelectedContacts() {
1289d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell        JoinContactsDialogFragment.start(this, mAllFragment.getSelectedContactIds());
1290d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell    }
1291d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell
1292d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell    @Override
1293d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell    public void onContactsJoined() {
12941154bbabc1f174f7dca40d92f59d2b2731930b3aBrian Attwell        mActionBarAdapter.setSelectionMode(false);
1295d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell    }
1296d3946cae17273ed1c2fceb507990882e3f828ba9Brian Attwell
1297d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell    private void deleteSelectedContacts() {
1298d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell        ContactMultiDeletionInteraction.start(PeopleActivity.this,
1299d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell                mAllFragment.getSelectedContactIds());
1300d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell    }
1301d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell
1302d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell    @Override
1303d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell    public void onDeletionFinished() {
13041154bbabc1f174f7dca40d92f59d2b2731930b3aBrian Attwell        mActionBarAdapter.setSelectionMode(false);
1305d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell    }
1306d2962a3bb669a381d31a586df3b906033a8fa571Brian Attwell
130749d17b3e7692ae9442c342db236fa93d4a837c28Jeff Sharkey    @Override
1308d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
1309d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        switch (requestCode) {
131034b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa            case SUBACTIVITY_ACCOUNT_FILTER: {
131134b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa                AccountFilterUtil.handleAccountFilterResult(
131234b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa                        mContactListFilterController, resultCode, data);
1313495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan                break;
1314495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            }
1315d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
13167aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann            // TODO: Using the new startActivityWithResultFromFragment API this should not be needed
13177aa9b2888e4f630c6311458ea27ecbc13a527b00Daniel Lehmann            // anymore
1318e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov            case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER:
1319d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov                if (resultCode == RESULT_OK) {
132095c5c2a8f8ab17688af10d2ff01bcb5b9ce760b0Daisuke Miyakawa                    mAllFragment.onPickerResult(data);
1321d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov                }
1322d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
1323d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov// TODO fix or remove multipicker code
1324d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov//                else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {
13251ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    // Finish the activity if the sub activity was canceled as back key is used
13261ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    // to confirm user selection in MODE_PICK_MULTIPLE_PHONES.
13271ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                    finish();
13281ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                }
13291ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov//                break;
1330d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        }
1331d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    }
13327aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
13337aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    @Override
13347aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
13351ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        // TODO move to the fragment
1336db3d143dba9a0a9e3fb4cb57f27e619fee98e845Dmitri Plotnikov
133720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        // Bring up the search UI if the user starts typing
133820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        final int unicodeChar = event.getUnicodeChar();
133920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        if ((unicodeChar != 0)
134020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                // If COMBINING_ACCENT is set, it's not a unicode character.
134120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                && ((unicodeChar & KeyCharacterMap.COMBINING_ACCENT) == 0)
134220510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                && !Character.isWhitespace(unicodeChar)) {
134320510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (mActionBarAdapter.isSelectionMode()) {
134420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                // Ignore keyboard input when in selection mode.
134520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                return true;
13467aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project            }
134720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            String query = new String(new int[]{unicodeChar}, 0, 1);
134820510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            if (!mActionBarAdapter.isSearchMode()) {
134920510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                mActionBarAdapter.setSearchMode(true);
135020510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                mActionBarAdapter.setQueryString(query);
135120510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell                return true;
13527bb2add27b874d194c294d30c1661dffa78f44bbDaniel Lehmann            }
13537aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        }
13547aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
13557aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project        return super.onKeyDown(keyCode, event);
13567aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project    }
1357ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov
1358ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    @Override
1359ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    public void onBackPressed() {
13607712aef22da432331a67c710cfc18bce2c493887Jay Shrauner        if (!isSafeToCommitTransactions()) {
1361c3fdc8f6c1429a40c3c54dcf01b6da0eb7606dc1Jay Shrauner            return;
1362c3fdc8f6c1429a40c3c54dcf01b6da0eb7606dc1Jay Shrauner        }
1363c3fdc8f6c1429a40c3c54dcf01b6da0eb7606dc1Jay Shrauner
136420510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        if (mActionBarAdapter.isSelectionMode()) {
136520510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mActionBarAdapter.setSelectionMode(false);
136620510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell            mAllFragment.displayCheckBoxes(false);
136720510ec0a26e7eeb7f3a321deb755e984445fe74Brian Attwell        } else if (mActionBarAdapter.isSearchMode()) {
1368ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            mActionBarAdapter.setSearchMode(false);
1369a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang
1370a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang            if (mAllFragment.wasSearchResultClicked()) {
1371a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang                mAllFragment.resetSearchResultClicked();
1372a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang            } else {
137362a2074bb3b8dc66996e9fc6a8748b999ab2b51cWalter Jang                Logger.logScreenView(this, ScreenType.SEARCH_EXIT);
137482c9033a8f17470a335dd85936479669b50e5877Walter Jang                Logger.logSearchEvent(mAllFragment.createSearchState());
1375a84fe61b45522d3beeabdc6de9eaa05697df2281Walter Jang            }
1376ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        } else {
1377ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov            super.onBackPressed();
1378ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov        }
1379ab4d29f6a2edbfae008dbaff35f25baad73aa0dfDmitri Plotnikov    }
13807aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project
138108e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    @Override
138208e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    protected void onSaveInstanceState(Bundle outState) {
138308e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov        super.onSaveInstanceState(outState);
13844d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.onSaveInstanceState(outState);
13854d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
13864d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // Clear the listener to make sure we don't get callbacks after onSaveInstanceState,
13874d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // in order to avoid doing fragment transactions after it.
13884d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        // TODO Figure out a better way to deal with the issue.
138932791d4f8d3d29d17cf35b77c294593cc6d28da1Paul Sliwowski        mDisableOptionItemSelected = true;
13904d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        mActionBarAdapter.setListener(null);
13912e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        if (mTabPager != null) {
13922e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki            mTabPager.setOnPageChangeListener(null);
13932e177304ab03e8521e951b710460906ec49c07d2Makoto Onuki        }
139408e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov    }
139508e1c4e49947daee26cfc435d01605febb7ae6faDmitri Plotnikov
1396fa49a66979567894c85fe2489d1375216d67597eDmitri Plotnikov    @Override
139709d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann    protected void onRestoreInstanceState(Bundle savedInstanceState) {
139809d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        super.onRestoreInstanceState(savedInstanceState);
139909d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        // In our own lifecycle, the focus is saved and restore but later taken away by the
140009d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        // ViewPager. As a hack, we force focus on the SearchView if we know that we are searching.
140109d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        // This fixes the keyboard going away on screen rotation
140209d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        if (mActionBarAdapter.isSearchMode()) {
140309d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann            mActionBarAdapter.setFocusOnSearchView();
140409d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann        }
140509d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann    }
140609d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann
140709d66a382d1f94618b52fec11ba54d9243a95a18Daniel Lehmann    @Override
14083391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    public DialogManager getDialogManager() {
14093391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann        return mDialogManager;
14103391dbed3575b3454c2bebf35dae4a19d8f987f2Daniel Lehmann    }
1411ab75f82f6a95b221157f2ce3125d76d62f869ebbDmitri Plotnikov
14122b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos    @Override
14132b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos    public void onClick(View view) {
14142b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        switch (view.getId()) {
14152b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos            case R.id.floating_action_button:
14162b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
14172b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                Bundle extras = getIntent().getExtras();
14182b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                if (extras != null) {
14192b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                    intent.putExtras(extras);
14202b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                }
1421d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner                try {
1422c6100ffd22ae176a3e84a1062d8cb92d955faef2Brian Attwell                    ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent);
1423d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner                } catch (ActivityNotFoundException ex) {
1424d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner                    Toast.makeText(PeopleActivity.this, R.string.missing_app,
1425d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner                            Toast.LENGTH_SHORT).show();
1426d391f8493fe19776d4f319b8d8ff74a894b04eccJay Shrauner                }
14272b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos                break;
14282b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        default:
14292b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos            Log.wtf(TAG, "Unexpected onClick event from " + view);
14302b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos        }
14312b9563d4c3aa7d3f57ab16ea4cb98cd9e588c50dPaul Soulos    }
1432962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell
1433962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell    /**
1434962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell     * Returns the tab position adjusted for the text direction.
1435962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell     */
1436962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell    private int getTabPositionForTextDirection(int position) {
1437962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell        if (isRTL()) {
1438962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell            return TabState.COUNT - 1 - position;
1439962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell        }
1440962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell        return position;
1441962677f56389b2c12b452135673a85b6f6de7d05Brian Attwell    }
14427aa0e4cb91c869108238733ca107d18ccb888df7The Android Open Source Project}
1443