Merge "Two cleanups in People UI"
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 049deb0..3488bed 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -123,8 +123,6 @@
 
     private boolean mSearchMode;
 
-    private ContactBrowseListFragment mListFragment;
-
     /**
      * Whether we have a right-side contact or group detail pane for displaying info on that
      * contact or group while browsing. Generally means "this is a tablet".
@@ -157,6 +155,9 @@
 
     private boolean mOptionsMenuContactsAvailable;
 
+    /**
+     * Showing a list of Contacts. Also used for showing search results in search mode.
+     */
     private DefaultContactBrowseListFragment mAllFragment;
     private StrequentContactListFragment mFavoritesFragment;
     private StrequentContactListFragment mFrequentFragment;
@@ -170,7 +171,30 @@
 
     private ContactDetailLayoutController mContactDetailLayoutController;
 
-    private Handler mHandler = new Handler();
+    private final Handler mHandler = new Handler();
+
+    /**
+     * TODO: Use ViewPager so that tabs can be swiped left and right. Figure out how to use the
+     * support library in our app.
+     */
+    private final TabListener mTabListener = new TabListener() {
+        @Override
+        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
+            hideFragmentOnTabUnselect((TabState) tab.getTag(), ft);
+        }
+
+        @Override
+        public void onTabSelected(Tab tab, FragmentTransaction ft) {
+            final TabState tabState = (TabState) tab.getTag();
+            setSelectedTab(tabState);
+            showFragmentOnTabSelect(tabState, ft);
+            invalidateOptionsMenu();
+        }
+
+        @Override
+        public void onTabReselected(Tab tab, FragmentTransaction ft) {
+        }
+    };
 
     private enum TabState {
         FAVORITES, ALL, GROUPS
@@ -191,12 +215,12 @@
 
     @Override
     public void onAttachFragment(Fragment fragment) {
-        if (fragment instanceof ContactBrowseListFragment) {
-            mListFragment = (ContactBrowseListFragment)fragment;
-            mListFragment.setOnContactListActionListener(new ContactBrowserActionListener());
+        if (fragment instanceof DefaultContactBrowseListFragment) {
+            mAllFragment = (DefaultContactBrowseListFragment)fragment;
+            mAllFragment.setOnContactListActionListener(new ContactBrowserActionListener());
             if (!getWindow().hasFeature(Window.FEATURE_ACTION_BAR)) {
-                mListFragment.setContextMenuAdapter(
-                        new ContactBrowseListContextMenuAdapter(mListFragment));
+                mAllFragment.setContextMenuAdapter(
+                        new ContactBrowseListContextMenuAdapter(mAllFragment));
             }
         } else if (fragment instanceof GroupBrowseListFragment) {
             mGroupsFragment = (GroupBrowseListFragment) fragment;
@@ -315,21 +339,21 @@
         if (createContentView) {
             actionBar.removeAllTabs();
             Tab favoritesTab = actionBar.newTab();
+            favoritesTab.setTag(TabState.FAVORITES);
             favoritesTab.setText(getString(R.string.contactsFavoritesLabel));
-            favoritesTab.setTabListener(new TabChangeListener(mFavoritesFragment,
-                    mFrequentFragment, TabState.FAVORITES));
+            favoritesTab.setTabListener(mTabListener);
             actionBar.addTab(favoritesTab);
 
             Tab allTab = actionBar.newTab();
+            allTab.setTag(TabState.ALL);
             allTab.setText(getString(R.string.contactsAllLabel));
-            allTab.setTabListener(new TabChangeListener(mAllFragment,
-                    mContactDetailLoaderFragment, TabState.ALL));
+            allTab.setTabListener(mTabListener);
             actionBar.addTab(allTab);
 
             Tab groupsTab = actionBar.newTab();
+            groupsTab.setTag(TabState.GROUPS);
             groupsTab.setText(getString(R.string.contactsGroupsLabel));
-            groupsTab.setTabListener(new TabChangeListener(mGroupsFragment,
-                    mGroupDetailFragment, TabState.GROUPS));
+            groupsTab.setTabListener(mTabListener);
             actionBar.addTab(groupsTab);
             actionBar.setDisplayShowTitleEnabled(true);
 
@@ -343,47 +367,61 @@
         configureFragments(savedState == null);
     }
 
-    /**
-     * Tab change listener that is instantiated once for each tab. Handles showing/hiding fragments.
-     * TODO: Use ViewPager so that tabs can be swiped left and right. Figure out how to use the
-     * support library in our app.
-     */
-    private class TabChangeListener implements TabListener {
-        private final Fragment mBrowseListFragment;
-
-        /**
-         * Right pane fragment that is present on larger screen sizes (can be
-         * null for smaller screen sizes).
-         */
-        private final Fragment mDetailFragment;
-        private final TabState mTabState;
-
-        public TabChangeListener(Fragment listFragment, Fragment detailFragment, TabState state) {
-            mBrowseListFragment = listFragment;
-            mDetailFragment = detailFragment;
-            mTabState = state;
-        }
-
-        @Override
-        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
-            ft.hide(mBrowseListFragment);
-            if (mDetailFragment != null) {
-                ft.hide(mDetailFragment);
+    private void hideFragmentOnTabUnselect(TabState newTabState, FragmentTransaction ft) {
+        switch (newTabState) {
+            case FAVORITES: {
+                ft.hide(mFavoritesFragment);
+                if (mFrequentFragment != null) {
+                    ft.hide(mFrequentFragment);
+                }
+                break;
+            }
+            case ALL: {
+                ft.hide(mAllFragment);
+                if (mContactDetailFragment != null) {
+                    ft.hide(mContactDetailFragment);
+                }
+                break;
+            }
+            case GROUPS: {
+                ft.hide(mGroupsFragment);
+                if (mGroupDetailFragment != null) {
+                    ft.hide(mGroupDetailFragment);
+                }
+                break;
+            }
+            default: {
+                throw new IllegalStateException("Unexpected tab state: " + newTabState);
             }
         }
+    }
 
-        @Override
-        public void onTabSelected(Tab tab, FragmentTransaction ft) {
-            ft.show(mBrowseListFragment);
-            if (mDetailFragment != null) {
-                ft.show(mDetailFragment);
+    private void showFragmentOnTabSelect(TabState newTabState, FragmentTransaction ft) {
+        switch (newTabState) {
+            case FAVORITES: {
+                ft.show(mFavoritesFragment);
+                if (mFrequentFragment != null) {
+                    ft.show(mFrequentFragment);
+                }
+                break;
             }
-            setSelectedTab(mTabState);
-            invalidateOptionsMenu();
-        }
-
-        @Override
-        public void onTabReselected(Tab tab, FragmentTransaction ft) {
+            case ALL: {
+                ft.show(mAllFragment);
+                if (mContactDetailFragment != null) {
+                    ft.show(mContactDetailFragment);
+                }
+                break;
+            }
+            case GROUPS: {
+                ft.show(mGroupsFragment);
+                if (mGroupDetailFragment != null) {
+                    ft.show(mGroupDetailFragment);
+                }
+                break;
+            }
+            default: {
+                throw new IllegalStateException("Unexpected tab state: " + newTabState);
+            }
         }
     }
 
@@ -474,7 +512,7 @@
                 mSearchMode = false;
             }
 
-            mListFragment.setContactsRequest(mRequest);
+            mAllFragment.setContactsRequest(mRequest);
             configureContactListFragmentForRequest();
 
         } else {
@@ -489,11 +527,11 @@
 
     @Override
     public void onContactListFilterChanged() {
-        if (mListFragment == null || !mListFragment.isAdded()) {
+        if (mAllFragment == null || !mAllFragment.isAdded()) {
             return;
         }
 
-        mListFragment.setFilter(mContactListFilterController.getFilter());
+        mAllFragment.setFilter(mContactListFilterController.getFilter());
 
         invalidateOptionsMenuIfNeeded();
     }
@@ -557,39 +595,39 @@
 
     private void loadSearch(String query) {
         configureFragments(false /* from request */);
-        mListFragment.setQueryString(query, true);
+        mAllFragment.setQueryString(query, true);
     }
 
     private void configureContactListFragmentForRequest() {
         Uri contactUri = mRequest.getContactUri();
         if (contactUri != null) {
-            mListFragment.setSelectedContactUri(contactUri);
+            mAllFragment.setSelectedContactUri(contactUri);
         }
 
-        mListFragment.setSearchMode(mRequest.isSearchMode());
-        mListFragment.setQueryString(mRequest.getQueryString(), false);
+        mAllFragment.setSearchMode(mRequest.isSearchMode());
+        mAllFragment.setQueryString(mRequest.getQueryString(), false);
 
         if (mRequest.isDirectorySearchEnabled()) {
-            mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
+            mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
         } else {
-            mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
+            mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
         }
 
         if (mContactListFilterController.isInitialized()) {
-            mListFragment.setFilter(mContactListFilterController.getFilter());
+            mAllFragment.setFilter(mContactListFilterController.getFilter());
         }
     }
 
     private void configureContactListFragment() {
-        mListFragment.setSearchMode(mSearchMode);
+        mAllFragment.setSearchMode(mSearchMode);
 
-        mListFragment.setVisibleScrollbarEnabled(!mSearchMode);
-        mListFragment.setVerticalScrollbarPosition(
+        mAllFragment.setVisibleScrollbarEnabled(!mSearchMode);
+        mAllFragment.setVerticalScrollbarPosition(
                 mContentPaneDisplayed
                         ? View.SCROLLBAR_POSITION_LEFT
                         : View.SCROLLBAR_POSITION_RIGHT);
-        mListFragment.setSelectionVisible(mContentPaneDisplayed);
-        mListFragment.setQuickContactEnabled(!mContentPaneDisplayed);
+        mAllFragment.setSelectionVisible(mContentPaneDisplayed);
+        mAllFragment.setQuickContactEnabled(!mContentPaneDisplayed);
     }
 
     private void configureGroupListFragment() {
@@ -621,12 +659,12 @@
             if (mainView != null) {
                 mainView.setVisibility(View.VISIBLE);
             }
-            if (mListFragment != null) {
-                mListFragment.setEnabled(true);
+            if (mAllFragment != null) {
+                mAllFragment.setEnabled(true);
             }
         } else {
-            if (mListFragment != null) {
-                mListFragment.setEnabled(false);
+            if (mAllFragment != null) {
+                mAllFragment.setEnabled(false);
             }
             if (mContactsUnavailableFragment == null) {
                 mContactsUnavailableFragment = new ContactsUnavailableFragment();
@@ -653,7 +691,7 @@
         @Override
         public void onSelectionChange() {
             if (mContentPaneDisplayed) {
-                setupContactDetailFragment(mListFragment.getSelectedContactUri());
+                setupContactDetailFragment(mAllFragment.getSelectedContactUri());
             }
         }
 
@@ -723,16 +761,16 @@
         @Override
         public void onInvalidSelection() {
             ContactListFilter filter;
-            ContactListFilter currentFilter = mListFragment.getFilter();
+            ContactListFilter currentFilter = mAllFragment.getFilter();
             if (currentFilter != null
                     && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
                 filter = ContactListFilter.createFilterWithType(
                         ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
-                mListFragment.setFilter(filter);
+                mAllFragment.setFilter(filter);
             } else {
                 filter = ContactListFilter.createFilterWithType(
                         ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
-                mListFragment.setFilter(filter, false);
+                mAllFragment.setFilter(filter, false);
             }
             mContactListFilterController.setContactListFilter(filter, true);
         }
@@ -948,7 +986,7 @@
             return true;
         }
 
-        if (mListFragment != null && mListFragment.isOptionsMenuChanged()) {
+        if (mAllFragment != null && mAllFragment.isOptionsMenuChanged()) {
             return true;
         }
 
@@ -1087,8 +1125,8 @@
     @Override
     public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData,
             boolean globalSearch) {
-        if (mListFragment != null && mListFragment.isAdded() && !globalSearch) {
-            mListFragment.startSearch(initialQuery);
+        if (mAllFragment != null && mAllFragment.isAdded() && !globalSearch) {
+            mAllFragment.startSearch(initialQuery);
         } else {
             super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
         }
@@ -1125,7 +1163,7 @@
             case SUBACTIVITY_NEW_CONTACT: {
                 if (resultCode == RESULT_OK && mContentPaneDisplayed) {
                     mRequest.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
-                    mListFragment.reloadDataAndSetSelectedUri(data.getData());
+                    mAllFragment.reloadDataAndSetSelectedUri(data.getData());
                 }
                 break;
             }
@@ -1143,7 +1181,7 @@
             // anymore
             case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER:
                 if (resultCode == RESULT_OK) {
-                    mListFragment.onPickerResult(data);
+                    mAllFragment.onPickerResult(data);
                 }
 
 // TODO fix or remove multipicker code
@@ -1158,7 +1196,7 @@
 
     @Override
     public boolean onContextItemSelected(MenuItem item) {
-        ContextMenuAdapter menuAdapter = mListFragment.getContextMenuAdapter();
+        ContextMenuAdapter menuAdapter = mAllFragment.getContextMenuAdapter();
         if (menuAdapter != null) {
             return menuAdapter.onContextItemSelected(item);
         }
@@ -1261,7 +1299,7 @@
 
     // Visible for testing
     public ContactBrowseListFragment getListFragment() {
-        return mListFragment;
+        return mAllFragment;
     }
 
     // Visible for testing