Merge "DO NOT MERGE Revert "First pass on account swicther (1/2)""
diff --git a/Android.mk b/Android.mk
index c42434f..a03d671 100644
--- a/Android.mk
+++ b/Android.mk
@@ -12,7 +12,7 @@
 endif
 
 src_dirs := src src-bind $(phone_common_dir)/src
-res_dirs := res res-aosp res-bind res-icons $(phone_common_dir)/res
+res_dirs := res res-aosp res-icons $(phone_common_dir)/res
 asset_dirs := assets
 
 LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))
diff --git a/res-bind/layout/navigation_view.xml b/res-bind/layout/navigation_view.xml
deleted file mode 100644
index d553768..0000000
--- a/res-bind/layout/navigation_view.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<android.support.design.widget.NavigationView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/nav_view"
-    android:theme="@style/NavigationDrawerMenuItemTextAppearance"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent"
-    android:layout_gravity="start"
-    android:fitsSystemWindows="true"
-    android:background="@android:color/white"
-    app:itemBackground="@drawable/drawer_item_background"
-    app:headerLayout="@layout/nav_header_main"
-    app:menu="@menu/activity_main_drawer"/>
diff --git a/res/layout/contacts_drawer_activity.xml b/res/layout/contacts_drawer_activity.xml
index 904a46b..e560494 100644
--- a/res/layout/contacts_drawer_activity.xml
+++ b/res/layout/contacts_drawer_activity.xml
@@ -17,6 +17,7 @@
 
 <android.support.v4.widget.DrawerLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/drawer_layout"
     android:layout_width="match_parent"
@@ -25,9 +26,40 @@
     tools:openDrawer="start">
 
     <!-- To prevent hamburger menu from getting the initial focus. -->
-    <include layout="@layout/dummy_view_for_initial_focus"/>
+    <View
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:layout_width="1px"
+        android:layout_height="1px" >
+        <requestFocus/>
+    </View>
 
-    <include layout="@layout/contacts_main_content"/>
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/fragment_container"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
 
-    <include layout="@layout/navigation_view"/>
+        <include
+            layout="@layout/people_activity_toolbar"
+            android:id="@+id/toolbar_parent" />
+
+        <FrameLayout
+            android:id="@+id/content_frame"
+            android:layout_width="match_parent"
+            android:layout_height="fill_parent"
+            android:background="?android:attr/windowBackground" />
+    </LinearLayout>
+
+    <android.support.design.widget.NavigationView
+        android:id="@+id/nav_view"
+        android:theme="@style/NavigationDrawerMenuItemTextAppearance"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_gravity="start"
+        android:fitsSystemWindows="true"
+        app:itemBackground="@drawable/drawer_item_background"
+        app:headerLayout="@layout/nav_header_main"
+        app:menu="@menu/activity_main_drawer"/>
+
 </android.support.v4.widget.DrawerLayout>
\ No newline at end of file
diff --git a/res/layout/contacts_main_content.xml b/res/layout/contacts_main_content.xml
deleted file mode 100644
index 748bdbb..0000000
--- a/res/layout/contacts_main_content.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/fragment_container"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <include
-        layout="@layout/people_activity_toolbar"
-        android:id="@+id/toolbar_parent" />
-
-    <FrameLayout
-        android:id="@+id/content_frame"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:background="?android:attr/windowBackground" />
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/dummy_view_for_initial_focus.xml b/res/layout/dummy_view_for_initial_focus.xml
deleted file mode 100644
index 3876e98..0000000
--- a/res/layout/dummy_view_for_initial_focus.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<View
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:focusable="true"
-    android:focusableInTouchMode="true"
-    android:layout_width="1px"
-    android:layout_height="1px" >
-    <requestFocus/>
-</View>
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 56e43c3..41df84f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1835,9 +1835,6 @@
     <!-- Toast shown when a dynamic shortcut is tapped after being disabled because the contact was removed -->
     <string name="dynamic_shortcut_contact_removed_message">Contact was removed</string>
 
-    <!-- Error message displayed to user when they started the app, but could not sign in to Google's servers. [CHAR LIMIT=50]-->
-    <string name="connection_failed">Failed to sign in</string>
-
     <!-- Text for button shown in toolbar to start import of SIM contacts -->
     <string name="sim_import_button_text">Import</string>
 
diff --git a/src-bind/com/android/contactsbind/ObjectFactory.java b/src-bind/com/android/contactsbind/ObjectFactory.java
index e55b7a8..d6799e2 100644
--- a/src-bind/com/android/contactsbind/ObjectFactory.java
+++ b/src-bind/com/android/contactsbind/ObjectFactory.java
@@ -13,9 +13,7 @@
  */
 package com.android.contactsbind;
 
-import com.android.contacts.ContactsDrawerActivity;
 import com.android.contacts.common.logging.Logger;
-import com.android.contacts.common.util.NavigationDrawer;
 import com.android.contactsbind.search.AutocompleteHelper;
 import com.android.contacts.common.util.DeviceLocalAccountTypeFactory;
 
@@ -52,8 +50,4 @@
     public static Intent getContactSheetIntent(Context context, Uri contactLookupUri) {
         return null;
     }
-
-    public static NavigationDrawer getNavigationDrawer(ContactsDrawerActivity activity) {
-        return new NavigationDrawer.Default(activity);
-    }
 }
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index 4614a70..a56ce0d 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -26,7 +26,6 @@
 import android.os.Bundle;
 import android.provider.ContactsContract.Intents;
 import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
 import android.support.design.widget.NavigationView;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.view.MenuItemCompat;
@@ -34,7 +33,6 @@
 import android.support.v7.app.ActionBarDrawerToggle;
 import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.Toolbar;
-import android.text.TextUtils;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.LayoutInflater;
@@ -63,7 +61,6 @@
 import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
 import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.common.util.MaterialColorMapUtils;
-import com.android.contacts.common.util.NavigationDrawer;
 import com.android.contacts.common.util.ViewUtil;
 import com.android.contacts.editor.ContactEditorFragment;
 import com.android.contacts.editor.SelectAccountDialogFragment;
@@ -83,7 +80,6 @@
 import com.android.contactsbind.ObjectFactory;
 import com.android.contactsbind.experiments.Flags;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -149,7 +145,7 @@
 
         private void stopSearchAndSelection() {
             final MultiSelectContactsListFragment listFragment;
-            if (isAccountView()) {
+            if (isAllContactsView() || isAccountView()) {
                 listFragment = getAllFragment();
             } else if (isGroupView()) {
                 listFragment = getGroupFragment();
@@ -196,7 +192,7 @@
     }
 
     protected ContactListFilterController mContactListFilterController;
-    protected DrawerLayout mDrawerLayout;
+    protected DrawerLayout mDrawer;
     protected ContactsActionBarDrawerToggle mToggle;
     protected Toolbar mToolbar;
     protected NavigationView mNavigationView;
@@ -206,8 +202,6 @@
     // The account the new group will be created under.
     private AccountWithDataSet mNewGroupAccount;
 
-    private NavigationDrawer mNavigationDrawer;
-
     // Recycle badge if possible
     private TextView mAssistantNewBadge;
 
@@ -218,18 +212,10 @@
     protected Map<ContactListFilter, MenuItem> mFilterMenuMap = new HashMap<>();
     protected Map<Integer, MenuItem> mIdMenuMap = new HashMap<>();
 
-    private List<GroupListItem> mGroupListItems;
-    private List<ContactListFilter> mAccountFilterItems;
-    private AccountWithDataSet mCurrentAccount;
-
-    protected boolean mShouldShowAccountSwitcher;
-
     @Override
     protected void onCreate(Bundle savedState) {
         super.onCreate(savedState);
 
-        mShouldShowAccountSwitcher = Flags.getInstance().getBoolean(Experiments.ACCOUNT_SWITCHER);
-
         mContactListFilterController = ContactListFilterController.getInstance(this);
         mContactListFilterController.checkFilterValidity(false);
 
@@ -243,11 +229,11 @@
         ViewUtil.addRectangularOutlineProvider(findViewById(R.id.toolbar_parent), getResources());
 
         // Set up hamburger button.
-        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
-        mToggle = new ContactsActionBarDrawerToggle(this, mDrawerLayout, mToolbar,
+        mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
+        mToggle = new ContactsActionBarDrawerToggle(this, mDrawer, mToolbar,
                 R.string.navigation_drawer_open, R.string.navigation_drawer_close);
 
-        mDrawerLayout.setDrawerListener(mToggle);
+        mDrawer.setDrawerListener(mToggle);
         // Set fallback handler for when drawer is disabled.
         mToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
             @Override
@@ -260,27 +246,21 @@
         if (savedState != null) {
             mCurrentView = ContactsView.values()[savedState.getInt(KEY_CONTACTS_VIEW)];
         } else {
-            resetContactsView();
+            mCurrentView = ContactsView.ALL_CONTACTS;
         }
 
+        // Set up hamburger menu items.
+        mNavigationView = (NavigationView) findViewById(R.id.nav_view);
+        mNavigationView.setNavigationItemSelectedListener(this);
+        setUpMenu();
+
+        initializeAssistantNewBadge();
         loadGroupsAndFilters();
 
         if (savedState != null && savedState.containsKey(KEY_NEW_GROUP_ACCOUNT)) {
             mNewGroupAccount = AccountWithDataSet.unstringify(
                     savedState.getString(KEY_NEW_GROUP_ACCOUNT));
         }
-
-        mNavigationDrawer = ObjectFactory.getNavigationDrawer(this);
-
-        mNavigationView = mNavigationDrawer.getNavigationView();
-        mNavigationView.setNavigationItemSelectedListener(this);
-        setUpMenu();
-        initializeAssistantNewBadge();
-    }
-
-    protected void resetContactsView() {
-        mCurrentView = mShouldShowAccountSwitcher
-                ? ContactsView.ACCOUNT_VIEW : ContactsView.ALL_CONTACTS;
     }
 
     private void initializeAssistantNewBadge() {
@@ -305,7 +285,7 @@
 
     public void setDrawerLockMode(boolean enabled) {
         // Prevent drawer from being opened by sliding from the start of screen.
-        mDrawerLayout.setDrawerLockMode(enabled ? DrawerLayout.LOCK_MODE_UNLOCKED
+        mDrawer.setDrawerLockMode(enabled ? DrawerLayout.LOCK_MODE_UNLOCKED
                 : DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
 
         // Order of these statements matter.
@@ -346,14 +326,10 @@
             menu.removeItem(R.id.nav_help);
         }
 
-        if (!mShouldShowAccountSwitcher) {
-            final MenuItem allContactsMenu = menu.findItem(R.id.nav_all_contacts);
-            mIdMenuMap.put(R.id.nav_all_contacts, allContactsMenu);
-            if (isAllContactsView()) {
-                updateMenuSelection(allContactsMenu);
-            }
-        } else {
-            menu.removeItem(R.id.nav_all_contacts);
+        final MenuItem allContactsMenu = menu.findItem(R.id.nav_all_contacts);
+        mIdMenuMap.put(R.id.nav_all_contacts, allContactsMenu);
+        if (isAllContactsView()) {
+            updateMenuSelection(allContactsMenu);
         }
     }
 
@@ -373,11 +349,9 @@
     @Override
     protected void onResume() {
         super.onResume();
-        if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
+        if (mDrawer.isDrawerOpen(GravityCompat.START)) {
             updateStatusBarBackground();
         }
-        // Restoring recent accounts.
-        mNavigationDrawer.onResume();
     }
 
     public void updateStatusBarBackground() {
@@ -387,34 +361,15 @@
     public void updateStatusBarBackground(int color) {
         if (!CompatUtils.isLollipopCompatible()) return;
         if (color == -1) {
-            mDrawerLayout.setStatusBarBackgroundColor(
-                    MaterialColorMapUtils.getStatusBarColor(this));
+            mDrawer.setStatusBarBackgroundColor(MaterialColorMapUtils.getStatusBarColor(this));
         } else {
-            mDrawerLayout.setStatusBarBackgroundColor(color);
+            mDrawer.setStatusBarBackgroundColor(color);
         }
-        mDrawerLayout.invalidate();
+        mDrawer.invalidate();
         getWindow().setStatusBarColor(Color.TRANSPARENT);
     }
 
     @Override
-    protected void onStart() {
-        super.onStart();
-        mNavigationDrawer.onStart();
-    }
-
-    @Override
-    protected void onPause() {
-        mNavigationDrawer.onPause();
-        super.onPause();
-    }
-
-    @Override
-    protected void onStop() {
-        mNavigationDrawer.onStop();
-        super.onStop();
-    }
-
-    @Override
     protected void onPostCreate(Bundle savedInstanceState) {
         super.onPostCreate(savedInstanceState);
         mToggle.syncState();
@@ -466,39 +421,15 @@
     public void onGroupsLoaded(List<GroupListItem> groupListItems) {
         final Menu menu = mNavigationView.getMenu();
         final MenuItem groupsMenuItem = menu.findItem(R.id.nav_groups);
-        if (groupsMenuItem == null) {
-            return;
-        }
-        final SubMenu subMenu = groupsMenuItem.getSubMenu();
-        subMenu.removeGroup(R.id.nav_groups_items);
-
-        mGroupListItems = groupListItems;
-
-        if (mShouldShowAccountSwitcher && mCurrentAccount != null) {
-            updateGroupMenuForAccount(mCurrentAccount);
-        } else {
-            updateGroupMenuForAccount(null);
-        }
-    }
-
-    /**
-     * Update menu items in group section of navigation drawer based on {@link AccountWithDataSet}.
-     * If {@link AccountWithDataSet} is null, then we show groups in all accounts.
-     */
-    public void updateGroupMenuForAccount(AccountWithDataSet account) {
-        mCurrentAccount = account;
-
-        final Menu menu = mNavigationView.getMenu();
-        final MenuItem groupsMenuItem = menu.findItem(R.id.nav_groups);
         final SubMenu subMenu = groupsMenuItem.getSubMenu();
         subMenu.removeGroup(R.id.nav_groups_items);
         mGroupMenuMap = new HashMap<>();
 
         final GroupMetaData groupMetaData = getGroupMetaData();
 
-        if (mGroupListItems != null ) {
+        if (groupListItems != null) {
             // Add each group
-            for (final GroupListItem groupListItem : getGroupsForCurrentAccount(mCurrentAccount)) {
+            for (final GroupListItem groupListItem : groupListItems) {
                 if (GroupUtil.isEmptyFFCGroup(groupListItem)) {
                     continue;
                 }
@@ -522,7 +453,7 @@
                                 updateMenuSelection(menuItem);
                             }
                         });
-                        mDrawerLayout.closeDrawer(GravityCompat.START);
+                        mDrawer.closeDrawer(GravityCompat.START);
                         return true;
                     }
                 });
@@ -547,33 +478,17 @@
                         onCreateGroupMenuItemClicked();
                     }
                 });
-                mDrawerLayout.closeDrawer(GravityCompat.START);
+                mDrawer.closeDrawer(GravityCompat.START);
                 return true;
             }
         });
 
         if (isGroupView() && groupMetaData != null) {
-            updateGroupMenuCheckedStatus(groupMetaData);
+            updateGroupMenu(groupMetaData);
         }
     }
 
-    private List<GroupListItem> getGroupsForCurrentAccount(AccountWithDataSet account) {
-        final List<GroupListItem> desiredGroupItems = new ArrayList<>();
-        if (account == null) {
-            desiredGroupItems.addAll(mGroupListItems);
-        } else {
-            for (GroupListItem group : mGroupListItems) {
-                if (TextUtils.equals(mCurrentAccount.name, group.getAccountName())
-                        && TextUtils.equals(mCurrentAccount.type, group.getAccountType())
-                        && TextUtils.equals(mCurrentAccount.dataSet, group.getDataSet())) {
-                    desiredGroupItems.add(group);
-                }
-            }
-        }
-        return desiredGroupItems;
-    }
-
-    public void updateGroupMenuCheckedStatus(GroupMetaData groupMetaData) {
+    public void updateGroupMenu(GroupMetaData groupMetaData) {
         clearCheckedMenus();
         if (groupMetaData != null && mGroupMenuMap != null
                 && mGroupMenuMap.get(groupMetaData.groupId) != null) {
@@ -613,12 +528,7 @@
         final Account account = extras == null ? null :
                 (Account) extras.getParcelable(Intents.Insert.EXTRA_ACCOUNT);
         if (account == null) {
-            if (mShouldShowAccountSwitcher && mCurrentAccount != null) {
-                // Create a new group in current account.
-                onAccountChosen(mCurrentAccount, /* extraArgs */ null);
-            } else {
-                selectAccountForNewGroup();
-            }
+            selectAccountForNewGroup();
         } else {
             final String dataSet = extras == null
                     ? null : extras.getString(Intents.Insert.EXTRA_DATA_SET);
@@ -630,11 +540,6 @@
 
     @Override
     public void onFiltersLoaded(List<ContactListFilter> accountFilterItems) {
-        mAccountFilterItems = accountFilterItems;
-
-        // Don't show accounts in menu if we enable account switcher.
-        if (mShouldShowAccountSwitcher) return;
-
         final AccountDisplayInfoFactory accountDisplayFactory = AccountDisplayInfoFactory.
                 fromListFilters(this, accountFilterItems);
 
@@ -648,6 +553,7 @@
             return;
         }
 
+
         for (int i = 0; i < accountFilterItems.size(); i++) {
             final ContactListFilter filter = accountFilterItems.get(i);
             final AccountDisplayInfo displayableAccount =
@@ -671,7 +577,7 @@
                             updateMenuSelection(menuItem);
                         }
                     });
-                    mDrawerLayout.closeDrawer(GravityCompat.START);
+                    mDrawer.closeDrawer(GravityCompat.START);
                     return true;
                 }
             });
@@ -713,21 +619,8 @@
                 AppCompatActivity.RESULT_OK, intent);
     }
 
-    public void changeFilter(AccountWithDataSet account) {
-        for (ContactListFilter filter : mAccountFilterItems) {
-            if (account.equals(filter.toAccountWithDataSet())) {
-                final Intent intent = new Intent();
-                intent.putExtra(AccountFilterActivity.EXTRA_CONTACT_LIST_FILTER, filter);
-                AccountFilterUtil.handleAccountFilterResult(mContactListFilterController,
-                        AppCompatActivity.RESULT_OK, intent);
-                clearCheckedMenus();
-                break;
-            }
-        }
-    }
-
     @Override
-    public boolean onNavigationItemSelected(@NonNull final MenuItem item) {
+    public boolean onNavigationItemSelected(final MenuItem item) {
         final int id = item.getItemId();
         mToggle.runWhenIdle(new Runnable() {
             @Override
@@ -752,14 +645,10 @@
             }
         });
 
-        mDrawerLayout.closeDrawer(GravityCompat.START);
+        mDrawer.closeDrawer(GravityCompat.START);
         return true;
     }
 
-    public void closeDrawer() {
-        mDrawerLayout.closeDrawer(GravityCompat.START);
-    }
-
     private Intent createPreferenceIntent() {
         final Intent intent = new Intent(this, ContactsPreferenceActivity.class);
         intent.putExtra(ContactsPreferenceActivity.EXTRA_NEW_LOCAL_PROFILE,
@@ -768,15 +657,12 @@
     }
 
     public void switchToAllContacts() {
-        if (mShouldShowAccountSwitcher) {
-            clearCheckedMenus();
-        } else {
-            resetFilter();
+        resetFilter();
 
-            final Menu menu = mNavigationView.getMenu();
-            final MenuItem allContacts = menu.findItem(R.id.nav_all_contacts);
-            updateMenuSelection(allContacts);
-        }
+        final Menu menu = mNavigationView.getMenu();
+        final MenuItem allContacts = menu.findItem(R.id.nav_all_contacts);
+        updateMenuSelection(allContacts);
+
         setTitle(getString(R.string.contactsList));
     }
 
@@ -811,9 +697,6 @@
     }
 
     private void setMenuChecked(MenuItem menuItem, boolean checked) {
-        if (menuItem == null) {
-            return;
-        }
         menuItem.setCheckable(checked);
         menuItem.setChecked(checked);
     }
@@ -839,7 +722,6 @@
 
     @Override
     public void onAccountChosen(AccountWithDataSet account, Bundle extraArgs) {
-        if (account == null) return;
         mNewGroupAccount = account;
         GroupNameEditDialogFragment.newInstanceForCreation(
                 mNewGroupAccount, GroupUtil.ACTION_CREATE_GROUP)
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 5d5a8bf..90aa580 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -287,8 +287,8 @@
 
         if (isGroupDeleteAction(action)) {
             popSecondLevel();
-            resetContactsView();
             mMembersFragment.toastForSaveAction(action);
+            mCurrentView = ContactsView.ALL_CONTACTS;
             showFabWithAnimation(/* showFab */ true);
             return;
         }
@@ -538,9 +538,6 @@
         final int providerStatus = mProviderStatusWatcher.getProviderStatus();
         final Menu menu = mNavigationView.getMenu();
         final MenuItem groupsMenuItem = menu.findItem(R.id.nav_groups);
-        if (groupsMenuItem == null) {
-            return;
-        }
         final SubMenu subMenu = groupsMenuItem.getSubMenu();
 
         // Reload groups and filters if provider status changes to "normal" and there's no groups
@@ -644,8 +641,8 @@
         }
 
         // Handle the back event in drawer first.
-        if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
-            mDrawerLayout.closeDrawer(GravityCompat.START);
+        if (mDrawer.isDrawerOpen(GravityCompat.START)) {
+            mDrawer.closeDrawer(GravityCompat.START);
             return;
         }
 
@@ -712,8 +709,7 @@
             return true;
         }
 
-        if (!mShouldShowAccountSwitcher
-                && !AccountFilterUtil.isAllContactsFilter(mContactListFilterController.getFilter())
+        if (!AccountFilterUtil.isAllContactsFilter(mContactListFilterController.getFilter())
                 && !mAllFragment.isHidden()) {
             // If mAllFragment is hidden, then mContactsUnavailableFragment is visible so we
             // don't need to switch to all contacts.
@@ -808,17 +804,6 @@
         super.onFilterMenuItemClicked(intent);
     }
 
-    @Override
-    public void changeFilter(AccountWithDataSet account) {
-        super.changeFilter(account);
-        // We must pop second level first to "restart" mAllFragment, before changing filter.
-        if (isInSecondLevel()) {
-            popSecondLevel();
-            showFabWithAnimation(/* showFab */ true);
-        }
-        mCurrentView = ContactsView.ACCOUNT_VIEW;
-    }
-
     private void switchToOrUpdateGroupView(String action) {
         // If group fragment is active and visible, we simply update it.
         if (mMembersFragment != null && !mMembersFragment.isInactive()) {
@@ -881,7 +866,7 @@
             popSecondLevel();
         }
         mShouldSwitchToAllContacts = false;
-        resetContactsView();
+        mCurrentView = ContactsView.ALL_CONTACTS;
         showFabWithAnimation(/* showFab */ true);
         mAllFragment.scrollToTop();
 
diff --git a/src/com/android/contacts/common/Experiments.java b/src/com/android/contacts/common/Experiments.java
index 5891fdb..827083b 100644
--- a/src/com/android/contacts/common/Experiments.java
+++ b/src/com/android/contacts/common/Experiments.java
@@ -21,11 +21,6 @@
 public final class Experiments {
 
     /**
-     * Experiment to enable account switcher
-     */
-    public static final String ACCOUNT_SWITCHER = "Account__account_switcher_enable";
-
-    /**
      * Experiment to enable assistant in left navigation drawer.
      */
     public static final String ASSISTANT = "Assistant__enable_assistant";
diff --git a/src/com/android/contacts/common/list/ContactListFilter.java b/src/com/android/contacts/common/list/ContactListFilter.java
index f3bac38..5b7472d 100644
--- a/src/com/android/contacts/common/list/ContactListFilter.java
+++ b/src/com/android/contacts/common/list/ContactListFilter.java
@@ -394,7 +394,7 @@
 
     /**
      * Returns true if this ContactListFilter contains at least one Google account.
-     * (see {@link #isGoogleAccountType )
+     * (see {@link #isGoogleAccountType)
      */
     public boolean isSyncable(List<AccountWithDataSet> accounts) {
         if (isGoogleAccountType() && filterType == ContactListFilter.FILTER_TYPE_ACCOUNT) {
@@ -410,7 +410,8 @@
                 // If we're showing all contacts and there is any Google account on the device then
                 // we're syncable.
                 for (AccountWithDataSet account : accounts) {
-                    if (account.isWritableGoogleAccount()) {
+                    if (GoogleAccountType.ACCOUNT_TYPE.equals(account.type)
+                            && account.dataSet == null) {
                         return true;
                     }
                 }
@@ -420,7 +421,7 @@
     }
 
     /**
-     * Returns the Google accounts (see {@link #isGoogleAccountType ) for this ContactListFilter.
+     * Returns the Google accounts (see {@link #isGoogleAccountType) for this ContactListFilter.
      */
     public List<Account> getSyncableAccounts(List<AccountWithDataSet> accounts) {
         final List<Account> syncableAccounts = new ArrayList<>();
@@ -432,7 +433,8 @@
                 || filterType == ContactListFilter.FILTER_TYPE_DEFAULT) {
             if (accounts != null && accounts.size() > 0) {
                 for (AccountWithDataSet account : accounts) {
-                    if (account.isWritableGoogleAccount()) {
+                    if (GoogleAccountType.ACCOUNT_TYPE.equals(account.type)
+                            && account.dataSet == null) {
                         syncableAccounts.add(new Account(account.name, account.type));
                     }
                 }
diff --git a/src/com/android/contacts/common/list/ContactListFilterController.java b/src/com/android/contacts/common/list/ContactListFilterController.java
index 5ceef18..4d3d6ad 100644
--- a/src/com/android/contacts/common/list/ContactListFilterController.java
+++ b/src/com/android/contacts/common/list/ContactListFilterController.java
@@ -81,8 +81,6 @@
      * which case, we should switch to the last saved filter in {@link SharedPreferences}.
      */
     public abstract void checkFilterValidity(boolean notifyListeners);
-
-    public abstract Context getContext();
 }
 
 /**
@@ -198,9 +196,4 @@
                 mFilter.accountName, mFilter.accountType, mFilter.dataSet);
         return accountTypeManager.contains(filterAccount, /* contactWritableOnly */ false);
     }
-
-    @Override
-    public Context getContext() {
-        return mContext;
-    }
 }
diff --git a/src/com/android/contacts/common/model/AccountTypeManager.java b/src/com/android/contacts/common/model/AccountTypeManager.java
index 8d01892..15c9771 100644
--- a/src/com/android/contacts/common/model/AccountTypeManager.java
+++ b/src/com/android/contacts/common/model/AccountTypeManager.java
@@ -313,13 +313,13 @@
             return -1;
         } else if (a.name == null || a.type == null) {
             return 1;
-        } else if (a.isWritableGoogleAccount() && a.equals(mDefaultAccount)) {
+        } else if (isWritableGoogleAccount(a) && a.equals(mDefaultAccount)) {
             return -1;
-        } else if (b.isWritableGoogleAccount() && b.equals(mDefaultAccount)) {
+        } else if (isWritableGoogleAccount(b) && b.equals(mDefaultAccount)) {
             return 1;
-        } else if (a.isWritableGoogleAccount() && !b.isWritableGoogleAccount()) {
+        } else if (isWritableGoogleAccount(a) && !isWritableGoogleAccount(b)) {
             return -1;
-        } else if (b.isWritableGoogleAccount() && !a.isWritableGoogleAccount()) {
+        } else if (isWritableGoogleAccount(b) && !isWritableGoogleAccount(a)) {
             return 1;
         } else {
             int diff = a.name.compareToIgnoreCase(b.name);
@@ -339,6 +339,10 @@
             }
         }
     }
+
+    private static boolean isWritableGoogleAccount(AccountWithDataSet account) {
+        return GoogleAccountType.ACCOUNT_TYPE.equals(account.type) && account.dataSet == null;
+    }
 }
 
 class AccountTypeManagerImpl extends AccountTypeManager
diff --git a/src/com/android/contacts/common/model/account/AccountDisplayInfo.java b/src/com/android/contacts/common/model/account/AccountDisplayInfo.java
index c5463d6..f68fdd5 100644
--- a/src/com/android/contacts/common/model/account/AccountDisplayInfo.java
+++ b/src/com/android/contacts/common/model/account/AccountDisplayInfo.java
@@ -65,7 +65,7 @@
     }
 
     public boolean isGoogleAccount() {
-        return mSource.isWritableGoogleAccount();
+        return GoogleAccountType.ACCOUNT_TYPE.equals(mSource.type) && mSource.dataSet == null;
     }
 
     public boolean isDeviceAccount() {
diff --git a/src/com/android/contacts/common/model/account/AccountWithDataSet.java b/src/com/android/contacts/common/model/account/AccountWithDataSet.java
index 4917abc..3ee0aab 100644
--- a/src/com/android/contacts/common/model/account/AccountWithDataSet.java
+++ b/src/com/android/contacts/common/model/account/AccountWithDataSet.java
@@ -79,10 +79,6 @@
         mAccountTypeWithDataSet = AccountTypeWithDataSet.get(type, dataSet);
     }
 
-    public boolean isWritableGoogleAccount() {
-        return GoogleAccountType.ACCOUNT_TYPE.equals(type) && dataSet == null;
-    }
-
     public boolean isNullAccount() {
         return name == null && type == null && dataSet == null;
     }
diff --git a/src/com/android/contacts/common/preference/ContactsPreferences.java b/src/com/android/contacts/common/preference/ContactsPreferences.java
index 5a79877..ac7b0e0 100644
--- a/src/com/android/contacts/common/preference/ContactsPreferences.java
+++ b/src/com/android/contacts/common/preference/ContactsPreferences.java
@@ -20,7 +20,6 @@
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
 import android.preference.PreferenceManager;
@@ -68,10 +67,6 @@
 
     public static final boolean PREF_DISPLAY_ONLY_PHONES_DEFAULT = false;
 
-    private static final String NAV_DRAWER_FIRST_RECENT = "NavigationDrawer_first_recent";
-
-    private static final String NAV_DRAWER_SECOND_RECENT = "NavigationDrawer_second_recent";
-
     /**
      * Value to use when a preference is unassigned and needs to be read from the shared preferences
      */
@@ -238,26 +233,6 @@
         return false;
     }
 
-    public void setRecentAccounts(@NonNull List<String> recentAccounts) {
-        final int size = recentAccounts.size();
-        final Editor editor = mPreferences.edit();
-        editor.putString(NAV_DRAWER_FIRST_RECENT, size > 0 ? recentAccounts.get(0) : null);
-        editor.putString(NAV_DRAWER_SECOND_RECENT, size > 1 ? recentAccounts.get(1) : null);
-        editor.commit();
-    }
-
-    public void getRecentAccounts(List<String> recentAccounts) {
-        recentAccounts.clear();
-        String recent = mPreferences.getString(NAV_DRAWER_FIRST_RECENT, null);
-        if (recent != null) {
-            recentAccounts.add(recent);
-        }
-        recent = mPreferences.getString(NAV_DRAWER_SECOND_RECENT, null);
-        if (recent != null) {
-            recentAccounts.add(recent);
-        }
-    }
-
     public void registerChangeListener(ChangeListener listener) {
         if (mListener != null) unregisterChangeListener();
 
diff --git a/src/com/android/contacts/common/util/AccountFilterUtil.java b/src/com/android/contacts/common/util/AccountFilterUtil.java
index ed72f67..96c5113 100644
--- a/src/com/android/contacts/common/util/AccountFilterUtil.java
+++ b/src/com/android/contacts/common/util/AccountFilterUtil.java
@@ -32,7 +32,6 @@
 
 import com.android.contacts.R;
 import com.android.contacts.activities.ContactEditorActivity;
-import com.android.contacts.common.Experiments;
 import com.android.contacts.common.list.AccountFilterActivity;
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.common.list.ContactListFilterController;
@@ -43,7 +42,6 @@
 import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.contactsbind.ObjectFactory;
-import com.android.contactsbind.experiments.Flags;
 
 import com.google.common.collect.Lists;
 
@@ -91,7 +89,8 @@
             if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
                 filterController.selectCustomFilter();
             } else {
-                filterController.setContactListFilter(filter, shouldPersistFilter(filter));
+                filterController.setContactListFilter(filter, /* persistent */
+                        filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
             }
         }
     }
@@ -133,7 +132,6 @@
     private static List<ContactListFilter> loadAccountFilters(Context context,
             DeviceLocalAccountTypeFactory deviceAccountTypeFactory) {
         final ArrayList<ContactListFilter> accountFilters = Lists.newArrayList();
-
         final AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(context);
         final List<AccountWithDataSet> accounts = accountTypeManager.getSortedAccounts(
                 /* defaultAccount */ getDefaultAccount(context), /* contactWritableOnly */ true);
@@ -238,11 +236,4 @@
         return account.withFormattedName(context, R.string.title_from_other_accounts)
                 .getNameLabel().toString();
     }
-
-    public static boolean shouldPersistFilter(ContactListFilter filter) {
-        if (Flags.getInstance().getBoolean(Experiments.ACCOUNT_SWITCHER)) {
-            return true;
-        }
-        return filter != null && filter.isContactsFilterType();
-    }
 }
diff --git a/src/com/android/contacts/common/util/DeviceLocalAccountTypeFactory.java b/src/com/android/contacts/common/util/DeviceLocalAccountTypeFactory.java
index e54b31f..040a6b4 100644
--- a/src/com/android/contacts/common/util/DeviceLocalAccountTypeFactory.java
+++ b/src/com/android/contacts/common/util/DeviceLocalAccountTypeFactory.java
@@ -52,6 +52,7 @@
 
         public static boolean isLocalAccountType(DeviceLocalAccountTypeFactory factory,
                 String type) {
+
             return isLocalAccountType(factory.classifyAccount(type));
         }
     }
diff --git a/src/com/android/contacts/common/util/NavigationDrawer.java b/src/com/android/contacts/common/util/NavigationDrawer.java
deleted file mode 100644
index c60f029..0000000
--- a/src/com/android/contacts/common/util/NavigationDrawer.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.common.util;
-
-import android.support.design.widget.NavigationView;
-import android.support.v7.app.AppCompatActivity;
-
-import com.android.contacts.R;
-
-public interface NavigationDrawer {
-    void onStart();
-    void onResume();
-    void onPause();
-    void onStop();
-    NavigationView getNavigationView();
-
-    class Default implements NavigationDrawer {
-
-        AppCompatActivity mActivity;
-
-        public Default(AppCompatActivity activity) {
-            mActivity = activity;
-        }
-
-        @Override
-        public void onStart() {}
-
-        @Override
-        public void onResume() {}
-
-        @Override
-        public void onPause() {}
-
-        @Override
-        public void onStop() {}
-
-        @Override
-        public NavigationView getNavigationView() {
-            return (NavigationView) mActivity.findViewById(R.id.nav_view);
-        }
-    }
-}
diff --git a/src/com/android/contacts/group/GroupMembersFragment.java b/src/com/android/contacts/group/GroupMembersFragment.java
index ab978ac..be3b127 100644
--- a/src/com/android/contacts/group/GroupMembersFragment.java
+++ b/src/com/android/contacts/group/GroupMembersFragment.java
@@ -786,7 +786,7 @@
         maybeAttachCheckBoxListener();
 
         mActivity.setTitle(mGroupMetaData.groupName);
-        mActivity.updateGroupMenuCheckedStatus(mGroupMetaData);
+        mActivity.updateGroupMenu(mGroupMetaData);
         mActivity.invalidateOptionsMenu();
 
         // Start loading the group members
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index ad1a2ca..5539428 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -29,7 +29,6 @@
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
@@ -73,13 +72,8 @@
 import com.android.contacts.common.logging.Logger;
 import com.android.contacts.common.logging.ScreenEvent;
 import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.account.AccountDisplayInfo;
-import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
-import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.contacts.common.util.AccountFilterUtil;
-import com.android.contacts.common.util.DeviceLocalAccountTypeFactory;
 import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.interactions.ContactDeletionInteraction;
 import com.android.contacts.interactions.ContactMultiDeletionInteraction;
@@ -89,7 +83,6 @@
 import com.android.contacts.util.SyncUtil;
 import com.android.contactsbind.experiments.Flags;
 import com.android.contactsbind.FeatureHighlightHelper;
-import com.android.contactsbind.ObjectFactory;
 
 import java.util.List;
 import java.util.Locale;
@@ -163,7 +156,6 @@
     private ContactsDrawerActivity mActivity;
     private ContactsRequest mContactsRequest;
     private ContactListFilterController mContactListFilterController;
-    private DeviceLocalAccountTypeFactory mDeviceLocalFactory;
 
     private final ActionBarAdapter.Listener mActionBarListener = new ActionBarAdapter.Listener() {
         @Override
@@ -457,14 +449,13 @@
         mIsRecreatedInstance = (savedState != null);
         mContactListFilterController = ContactListFilterController.getInstance(getContext());
         mContactListFilterController.checkFilterValidity(false);
-        mDeviceLocalFactory = ObjectFactory.getDeviceLocalAccountTypeFactory(getContext());
-        if (!Flags.getInstance().getBoolean(Experiments.ACCOUNT_SWITCHER)
-                && !mIsRecreatedInstance) {
-            // Use FILTER_TYPE_ALL_ACCOUNTS filter if the instance is not a re-created one.
-            // This is useful when user upgrades app while an account filter was
-            // stored in sharedPreference in a previous version of Contacts app.
-            setContactListFilter(AccountFilterUtil.createContactsFilter(getContext()));
-        }
+        // Use FILTER_TYPE_ALL_ACCOUNTS filter if the instance is not a re-created one.
+        // This is useful when user upgrades app while an account filter was
+        // stored in sharedPreference in a previous version of Contacts app.
+        final ContactListFilter filter = mIsRecreatedInstance
+                ? getFilter()
+                : AccountFilterUtil.createContactsFilter(getContext());
+        setContactListFilter(filter);
     }
 
     @Override
@@ -960,7 +951,7 @@
      */
     private void setContactListFilter(ContactListFilter filter) {
         mContactListFilterController.setContactListFilter(filter,
-                AccountFilterUtil.shouldPersistFilter(filter));
+                /* persistent */ isAllContactsFilter(filter));
     }
 
     @Override