Making filter selection persistent

Change-Id: I703a71b3cb59bc3d1bf6256b7eaf12beb44e467f
diff --git a/src/com/android/contacts/list/ContactListFilter.java b/src/com/android/contacts/list/ContactListFilter.java
index 3d32dd0..82d4213 100644
--- a/src/com/android/contacts/list/ContactListFilter.java
+++ b/src/com/android/contacts/list/ContactListFilter.java
@@ -16,6 +16,7 @@
 
 package com.android.contacts.list;
 
+import android.content.SharedPreferences;
 import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
 
@@ -26,9 +27,15 @@
 
     public static final int FILTER_TYPE_ALL_ACCOUNTS = -1;
     public static final int FILTER_TYPE_CUSTOM = -2;
+    public static final int FILTER_TYPE_DEFAULT = -3;
     public static final int FILTER_TYPE_ACCOUNT = 0;
     public static final int FILTER_TYPE_GROUP = 1;
 
+    private static final String KEY_FILTER_TYPE = "filter.type";
+    private static final String KEY_ACCOUNT_NAME = "filter.accountName";
+    private static final String KEY_ACCOUNT_TYPE = "filter.accountType";
+    private static final String KEY_GROUP_ID = "filter.groupId";
+
     public int filterType;
     public String accountType;
     public String accountName;
@@ -120,4 +127,26 @@
                 && TextUtils.equals(accountType, otherFilter.accountType)
                 && groupId == otherFilter.groupId;
     }
+
+    public static void storeToPreferences(SharedPreferences prefs, ContactListFilter filter) {
+        prefs.edit()
+            .putInt(KEY_FILTER_TYPE, filter == null ? FILTER_TYPE_DEFAULT : filter.filterType)
+            .putString(KEY_ACCOUNT_NAME, filter == null ? null : filter.accountName)
+            .putString(KEY_ACCOUNT_TYPE, filter == null ? null : filter.accountType)
+            .putLong(KEY_GROUP_ID, filter == null ? -1 : filter.groupId)
+            .apply();
+    }
+
+    public static ContactListFilter restoreFromPreferences(SharedPreferences prefs) {
+        int filterType = prefs.getInt(KEY_FILTER_TYPE, FILTER_TYPE_DEFAULT);
+        if (filterType == FILTER_TYPE_DEFAULT) {
+            return null;
+        }
+
+        ContactListFilter filter = new ContactListFilter(filterType);
+        filter.accountName = prefs.getString(KEY_ACCOUNT_NAME, null);
+        filter.accountType = prefs.getString(KEY_ACCOUNT_TYPE, null);
+        filter.groupId = prefs.getLong(KEY_GROUP_ID, -1);
+        return filter;
+    }
 }
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index 0cc8901..25ae7d8 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -68,6 +68,7 @@
     private NotifyingSpinner mFilterSpinner;
     private ContactListFilter mFilter;
     private boolean mFiltersLoaded;
+    private SharedPreferences mPrefs;
 
     private LoaderCallbacks<List<ContactListFilter>> mGroupFilterLoaderCallbacks =
             new LoaderCallbacks<List<ContactListFilter>>() {
@@ -213,8 +214,8 @@
             mFilterSpinner.setVisibility(View.GONE);
             return;
         }
+
         mFilterSpinner.setOnItemSelectedListener(this);
-        mFilterSpinner.setSetSelectionListener(this);
     }
 
     @Override
@@ -279,8 +280,10 @@
 
     @Override
     public void onStart() {
+        mPrefs = PreferenceManager.getDefaultSharedPreferences(getContext());
         if (mFilterEnabled) {
             mFiltersLoaded = false;
+            mFilter = ContactListFilter.restoreFromPreferences(mPrefs);
         }
         super.onStart();
     }
@@ -339,15 +342,21 @@
             }
         }
 
+        boolean filterChanged = false;
         mFiltersLoaded = true;
         if (mFilter == null  || !filterValid) {
+            filterChanged = mFilter != null;
             mFilter = getDefaultFilter();
         }
 
         mFilterSpinner.setAdapter(new FilterSpinnerAdapter());
         updateFilterView();
 
-        startLoading();
+        if (filterChanged) {
+            reloadData();
+        } else {
+            startLoading();
+        }
     }
 
     protected void setContactListFilter(int filterId) {
@@ -365,6 +374,7 @@
 
         if (!filter.equals(mFilter)) {
             mFilter = filter;
+            ContactListFilter.storeToPreferences(mPrefs, mFilter);
             updateFilterView();
             reloadData();
         }
@@ -394,6 +404,17 @@
 
     protected void updateFilterView() {
         if (mFiltersLoaded) {
+            mFilterSpinner.setSetSelectionListener(null);
+            if (mFilter != null && mFilters != null) {
+                int size = mFilters.size();
+                for (int i = 0; i < size; i++) {
+                    if (mFilters.valueAt(i).equals(mFilter)) {
+                        mFilterSpinner.setSelection(i);
+                        break;
+                    }
+                }
+            }
+            mFilterSpinner.setSetSelectionListener(this);
             mFilterSpinner.setVisibility(View.VISIBLE);
         }
     }