Restore the "Contacts to display" custom filter (1/3)

* Revert "Remove AccountFilterActivity and its usage (Contacts)"
  This reverts commit 1fc8847aa6bef1b6ceb017870d3de90f5960757e.
* But we don't restore the changes to DefaultContactBrowseListFragment
  since we won't be starting the "Contacts to display" filter
  from an overflow menu option on PeopleActivity.
* In DrawerActivity and PeopleActivity, everywhere we check for
  FITLER_TYPE_ALL_ACCOUNTS, we must also accept FILTER_TYPE_CUSTOM,
  since either of those can be used for the default/main contacts
  list again.

Bug 29185471

Change-Id: Ie77e8acb16980b9015bd1f1f4af9fb7a014f3c51
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d6954b3..4624b9b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -216,6 +216,18 @@
             android:theme="@style/ContactsPreferencesTheme"
             android:exported="false" />
 
+        <!-- Used to filter contacts list by account -->
+        <activity
+            android:name=".common.list.AccountFilterActivity"
+            android:label="@string/activity_title_contacts_filter"
+            android:theme="@style/ContactListFilterTheme" />
+
+        <!-- Used to select display and sync groups -->
+        <activity
+            android:name=".common.list.CustomContactListFilterActivity"
+            android:label="@string/custom_list_filter"
+            android:theme="@style/ContactListFilterTheme" />
+
         <activity
             android:name=".common.activity.RequestPermissionsActivity"
             android:label="@string/launcherActivityLabel"
diff --git a/res/drawable-hdpi/unknown_source.png b/res/drawable-hdpi/unknown_source.png
deleted file mode 100644
index 0a8f37d..0000000
--- a/res/drawable-hdpi/unknown_source.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/unknown_source.png b/res/drawable-mdpi/unknown_source.png
deleted file mode 100644
index 356748f..0000000
--- a/res/drawable-mdpi/unknown_source.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/unknown_source.png b/res/drawable-xhdpi/unknown_source.png
deleted file mode 100644
index 35e8fb4..0000000
--- a/res/drawable-xhdpi/unknown_source.png
+++ /dev/null
Binary files differ
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 0af01f7..b408d00 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -281,6 +281,10 @@
         <item name="android:listViewStyle">@style/ListViewStyle</item>
     </style>
 
+    <style name="ContactListFilterTheme" parent="@style/PeopleTheme">
+        <item name="android:listViewStyle">@style/ListViewStyle</item>
+    </style>
+
     <style name="NonPhoneActivityTheme" parent="@android:Theme.Translucent.NoTitleBar">
     </style>
 
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index cf44fe3..3ae009e 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -49,6 +49,7 @@
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.compat.CompatUtils;
 import com.android.contacts.common.editor.SelectAccountDialogFragment;
+import com.android.contacts.common.list.AccountFilterActivity;
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.common.list.ContactListFilterController;
 import com.android.contacts.common.model.AccountTypeManager;
@@ -465,7 +466,7 @@
                     positionOfLastFilter, menuName);
             mFilterMenuMap.put(filter, menuItem);
             final Intent intent = new Intent();
-            intent.putExtra(AccountFilterUtil.EXTRA_CONTACT_LIST_FILTER, filter);
+            intent.putExtra(AccountFilterActivity.EXTRA_CONTACT_LIST_FILTER, filter);
             menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                 @Override
                 public boolean onMenuItemClick(MenuItem item) {
@@ -496,7 +497,7 @@
 
     protected void updateFilterMenu(ContactListFilter filter) {
         clearCheckedMenus();
-        if (filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
+        if (ContactListFilter.isContactsFilterType(filter)) {
             if (mIdMenuMap != null && mIdMenuMap.get(R.id.nav_all_contacts) != null) {
                 mIdMenuMap.get(R.id.nav_all_contacts).setCheckable(true);
                 mIdMenuMap.get(R.id.nav_all_contacts).setChecked(true);
@@ -512,7 +513,7 @@
     }
 
     /**
-     * Returns the current filter if the child class is {@link PeopleActivity}, and null otherwise.
+     * Returns the current filter if the child class is PeopleActivity, and null otherwise.
      */
     protected ContactListFilter getContactListFilter() {
         return null;
@@ -526,7 +527,6 @@
     @Override
     public boolean onNavigationItemSelected(final MenuItem item) {
         final int id = item.getItemId();
-
         mToggle.runWhenIdle(new Runnable() {
             @Override
             public void run() {
@@ -564,8 +564,8 @@
 
     protected void switchToAllContacts() {
         final Intent intent = new Intent();
-        final ContactListFilter filter = createAllAccountsFilter();
-        intent.putExtra(AccountFilterUtil.EXTRA_CONTACT_LIST_FILTER, filter);
+        final ContactListFilter filter = createContactsFilter();
+        intent.putExtra(AccountFilterActivity.EXTRA_CONTACT_LIST_FILTER, filter);
         AccountFilterUtil.handleAccountFilterResult(
                 mContactListFilterController, AppCompatActivity.RESULT_OK, intent);
         if (shouldFinish()) {
@@ -578,8 +578,17 @@
                 Assistants.getDuplicatesActivityIntent(this));
     }
 
-    protected ContactListFilter createAllAccountsFilter() {
-        return ContactListFilter.createFilterWithType(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+    /**
+     * Returns a {@link ContactListFilter} of type
+     * {@link ContactListFilter#FILTER_TYPE_ALL_ACCOUNTS}, or if a custom "Contacts to display"
+     * filter has been set, then one of type {@link ContactListFilter#FILTER_TYPE_CUSTOM}.
+     */
+    protected ContactListFilter createContactsFilter() {
+        final int filterType =
+                ContactListFilterController.getInstance(this).isCustomFilterPersisted()
+                        ? ContactListFilter.FILTER_TYPE_CUSTOM
+                        : ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS;
+        return ContactListFilter.createFilterWithType(filterType);
     }
 
     private void clearCheckedMenus() {
@@ -587,7 +596,6 @@
         clearCheckedMenu(mGroupMenuMap);
         clearCheckedMenu(mIdMenuMap);
     }
-
     private void clearCheckedMenu(Map<?, MenuItem> map) {
         final Iterator it = map.entrySet().iterator();
         while (it.hasNext()) {
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 2ab0fef..fadede6 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -225,7 +225,7 @@
         // This is useful when user upgrades app while an account filter or a custom filter was
         // stored in sharedPreference in a previous version of Contacts app.
         final ContactListFilter filter = mIsRecreatedInstance
-                ? mContactListFilterController.getFilter() : createAllAccountsFilter();
+                ? mContactListFilterController.getFilter() : createContactsFilter();
         persistFilterIfNeeded(filter);
 
         createViewsAndFragments(savedState);
@@ -434,7 +434,7 @@
             final int tabToOpen;
             switch (actionCode) {
                 case ContactsRequest.ACTION_ALL_CONTACTS:
-                    filter = createAllAccountsFilter();
+                    filter = createContactsFilter();
                     tabToOpen = TabState.ALL;
                     break;
                 case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
@@ -460,7 +460,7 @@
             }
 
             if (filter != null) {
-                mContactListFilterController.setContactListFilter(filter, false);
+                mContactListFilterController.setContactListFilter(filter, /* persistent */ false);
                 searchMode = false;
             }
 
@@ -985,7 +985,7 @@
             ContactListFilter currentFilter = mAllFragment.getFilter();
             if (currentFilter != null
                     && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
-                filter = createAllAccountsFilter();
+                filter = createContactsFilter();
                 setFilterAndUpdateTitle(filter);
             } else {
                 filter = ContactListFilter.createFilterWithType(
@@ -1307,8 +1307,7 @@
                 Logger.logScreenView(this, ScreenType.SEARCH_EXIT);
                 Logger.logSearchEvent(mAllFragment.createSearchState());
             }
-        } else if (mContactListFilterController.getFilter().filterType !=
-                ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
+        } else if (!isAllContactsFilter(mContactListFilterController.getFilter())) {
             switchToAllContacts();
         } else {
             super.onBackPressed();
@@ -1392,7 +1391,7 @@
 
     private void setFilterAndUpdateTitle(ContactListFilter filter, boolean restoreSelectedUri) {
         mAllFragment.setFilter(filter, restoreSelectedUri);
-        final int listType =  filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS
+        final int listType = isAllContactsFilter(filter)
                 ? ListEvent.ListType.ALL_CONTACTS : ListEvent.ListType.ACCOUNT;
         mAllFragment.setListType(listType);
 
@@ -1425,7 +1424,7 @@
     }
 
     private boolean isAllContactsFilter(ContactListFilter filter) {
-        return filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS;
+        return ContactListFilter.isContactsFilterType(filter);
     }
 
     private boolean isDeviceContactsFilter(ContactListFilter filter) {
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index fd6c0c0..8fdce75 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -73,8 +73,11 @@
         final ContactListFilterController contactListFilterController =
                 ContactListFilterController.getInstance(getContext());
         final ContactListFilter filter = contactListFilterController.getFilter();
-        if (!isSearchMode()
-                && filter.filterType != ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
+        if (isSearchMode()) {
+            hideHeaderAndAddPadding(getContext(), getListView(), accountFilterContainer);
+        } else if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
+            bindListHeaderCustom(getListView(), accountFilterContainer);
+        } else if (filter.filterType != ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
             final AccountWithDataSet accountWithDataSet = new AccountWithDataSet(
                     filter.accountName, filter.accountType, filter.dataSet);
             bindListHeader(getContext(), getListView(), accountFilterContainer,
diff --git a/src/com/android/contacts/list/MultiSelectContactsListFragment.java b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
index af403ca..1e3c191 100644
--- a/src/com/android/contacts/list/MultiSelectContactsListFragment.java
+++ b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
@@ -299,6 +299,19 @@
         }
     }
 
+    protected void bindListHeaderCustom(View listView, View accountFilterContainer) {
+        bindListHeaderCommon(listView, accountFilterContainer);
+
+        final TextView accountFilterHeader = (TextView) accountFilterContainer.findViewById(
+                R.id.account_filter_header);
+        accountFilterHeader.setText(R.string.listCustomView);
+        accountFilterHeader.setAllCaps(false);
+
+        final ImageView accountFilterHeaderIcon = (ImageView) accountFilterContainer
+                .findViewById(R.id.account_filter_icon);
+        accountFilterHeaderIcon.setVisibility(View.INVISIBLE);
+    }
+
     /**
      * Show account icon, count of contacts and account name in the header of the list.
      */
@@ -309,9 +322,7 @@
             return;
         }
 
-        // Show header and remove top padding of the list
-        accountFilterContainer.setVisibility(View.VISIBLE);
-        listView.setPadding(0, 0, 0, 0);
+        bindListHeaderCommon(listView, accountFilterContainer);
 
         // Set text of count of contacts and account name (if it's a Google account)
         final TextView accountFilterHeader = (TextView) accountFilterContainer.findViewById(
@@ -333,9 +344,16 @@
         final Drawable icon = accountType != null ? accountType.getDisplayIcon(context) : null;
         final ImageView accountFilterHeaderIcon = (ImageView) accountFilterContainer
                 .findViewById(R.id.account_filter_icon);
+        accountFilterHeaderIcon.setVisibility(View.VISIBLE);
         accountFilterHeaderIcon.setImageDrawable(icon);
     }
 
+    private void bindListHeaderCommon(View listView, View accountFilterContainer) {
+        // Show header and remove top padding of the list
+        accountFilterContainer.setVisibility(View.VISIBLE);
+        listView.setPadding(0, 0, 0, 0);
+    }
+
     /**
      * Hide header of list view and add padding to the top of list view.
      */