Adding mock shared preferences

Change-Id: I1af7cb97703191ce016a936fd843e1ac73be1022
diff --git a/src/com/android/contacts/ContactsActivity.java b/src/com/android/contacts/ContactsActivity.java
index 90a975f..79ebecb 100644
--- a/src/com/android/contacts/ContactsActivity.java
+++ b/src/com/android/contacts/ContactsActivity.java
@@ -20,6 +20,7 @@
 
 import android.app.Activity;
 import android.content.ContentResolver;
+import android.content.SharedPreferences;
 
 /**
  * A common superclass for Contacts activities that handles application-wide services.
@@ -43,6 +44,19 @@
     }
 
     @Override
+    public SharedPreferences getSharedPreferences(String name, int mode) {
+        InjectedServices services = ContactsApplication.getInjectedServices();
+        if (services != null) {
+            SharedPreferences prefs = services.getSharedPreferences();
+            if (prefs != null) {
+                return prefs;
+            }
+        }
+
+        return super.getSharedPreferences(name, mode);
+    }
+
+    @Override
     public Object getSystemService(String name) {
         Object service = super.getSystemService(name);
         if (service != null) {
diff --git a/src/com/android/contacts/ContactsApplication.java b/src/com/android/contacts/ContactsApplication.java
index 288a3d7..f0e2736 100644
--- a/src/com/android/contacts/ContactsApplication.java
+++ b/src/com/android/contacts/ContactsApplication.java
@@ -22,6 +22,7 @@
 import android.app.Application;
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.SharedPreferences;
 import android.os.StrictMode;
 import android.preference.PreferenceManager;
 
@@ -53,6 +54,18 @@
     }
 
     @Override
+    public SharedPreferences getSharedPreferences(String name, int mode) {
+        if (sInjectedServices != null) {
+            SharedPreferences prefs = sInjectedServices.getSharedPreferences();
+            if (prefs != null) {
+                return prefs;
+            }
+        }
+
+        return super.getSharedPreferences(name, mode);
+    }
+
+    @Override
     public Object getSystemService(String name) {
         if (sInjectedServices != null) {
             Object service = sInjectedServices.getSystemService(name);
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index a53fce7..0301f44 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -611,6 +611,9 @@
     private void restoreFilter() {
         if (mFilterEnabled) {
             mFilter = ContactListFilter.restoreFromPreferences(mPrefs);
+            if (mFilter == null) {
+                mFilter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+            }
         }
     }
 
diff --git a/src/com/android/contacts/test/InjectedServices.java b/src/com/android/contacts/test/InjectedServices.java
index f059f3a..b74481c 100644
--- a/src/com/android/contacts/test/InjectedServices.java
+++ b/src/com/android/contacts/test/InjectedServices.java
@@ -19,6 +19,7 @@
 import com.google.android.collect.Maps;
 
 import android.content.ContentResolver;
+import android.content.SharedPreferences;
 
 import java.util.HashMap;
 
@@ -30,16 +31,25 @@
 public class InjectedServices {
 
     private ContentResolver mContentResolver;
+    private SharedPreferences mSharedPreferences;
     private HashMap<String, Object> mSystemServices;
 
-    public void setContentResolver(ContentResolver mContentResolver) {
-        this.mContentResolver = mContentResolver;
+    public void setContentResolver(ContentResolver contentResolver) {
+        this.mContentResolver = contentResolver;
     }
 
     public ContentResolver getContentResolver() {
         return mContentResolver;
     }
 
+    public void setSharedPreferences(SharedPreferences sharedPreferences) {
+        this.mSharedPreferences = sharedPreferences;
+    }
+
+    public SharedPreferences getSharedPreferences() {
+        return mSharedPreferences;
+    }
+
     public void setSystemService(String name, Object service) {
         if (mSystemServices == null) {
             mSystemServices = Maps.newHashMap();
diff --git a/tests/src/com/android/contacts/activities/ContactBrowserActivityTest.java b/tests/src/com/android/contacts/activities/ContactBrowserActivityTest.java
index a0c768d..eb4cad0 100644
--- a/tests/src/com/android/contacts/activities/ContactBrowserActivityTest.java
+++ b/tests/src/com/android/contacts/activities/ContactBrowserActivityTest.java
@@ -25,10 +25,12 @@
 import com.android.contacts.tests.mocks.ContactsMockContext;
 import com.android.contacts.tests.mocks.MockAccountTypeManager;
 import com.android.contacts.tests.mocks.MockContentProvider;
+import com.android.contacts.tests.mocks.MockSharedPreferences;
 
 import android.accounts.Account;
 import android.content.Intent;
 import android.net.Uri;
+import android.os.AsyncTask;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.ContactCounts;
 import android.provider.ContactsContract.Contacts;
@@ -51,6 +53,11 @@
 public class ContactBrowserActivityTest
         extends ActivityInstrumentationTestCase2<ContactBrowserActivity>
 {
+    static {
+        // AsyncTask class needs to be initialized on the main thread.
+        AsyncTask.init();
+    }
+
     private ContactsMockContext mContext;
     private MockContentProvider mContactsProvider;
     private MockContentProvider mSettingsProvider;
@@ -66,6 +73,7 @@
         mSettingsProvider = mContext.getSettingsProvider();
         InjectedServices services = new InjectedServices();
         services.setContentResolver(mContext.getContentResolver());
+        services.setSharedPreferences(new MockSharedPreferences());
 
         FallbackAccountType accountType = new FallbackAccountType();
         accountType.accountType = "testAccountType";
diff --git a/tests/src/com/android/contacts/tests/mocks/MockSharedPreferences.java b/tests/src/com/android/contacts/tests/mocks/MockSharedPreferences.java
new file mode 100644
index 0000000..40fd934
--- /dev/null
+++ b/tests/src/com/android/contacts/tests/mocks/MockSharedPreferences.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2010 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.tests.mocks;
+
+import com.google.android.collect.Maps;
+
+import android.content.SharedPreferences;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * A programmable mock content provider.
+ */
+public class MockSharedPreferences implements SharedPreferences, SharedPreferences.Editor {
+
+    private HashMap<String, Object> mValues = Maps.newHashMap();
+    private HashMap<String, Object> mTempValues = Maps.newHashMap();
+
+    public Editor edit() {
+        return this;
+    }
+
+    public boolean contains(String key) {
+        return mValues.containsKey(key);
+    }
+
+    public Map<String, ?> getAll() {
+        return new HashMap<String, Object>(mValues);
+    }
+
+    public boolean getBoolean(String key, boolean defValue) {
+        if (mValues.containsKey(key)) {
+            return ((Boolean)mValues.get(key)).booleanValue();
+        }
+        return defValue;
+    }
+
+    public float getFloat(String key, float defValue) {
+        if (mValues.containsKey(key)) {
+            return ((Float)mValues.get(key)).floatValue();
+        }
+        return defValue;
+    }
+
+    public int getInt(String key, int defValue) {
+        if (mValues.containsKey(key)) {
+            return ((Integer)mValues.get(key)).intValue();
+        }
+        return defValue;
+    }
+
+    public long getLong(String key, long defValue) {
+        if (mValues.containsKey(key)) {
+            return ((Long)mValues.get(key)).longValue();
+        }
+        return defValue;
+    }
+
+    public String getString(String key, String defValue) {
+        if (mValues.containsKey(key))
+            return (String)mValues.get(key);
+        return defValue;
+    }
+
+    @SuppressWarnings("unchecked")
+    public Set<String> getStringSet(String key, Set<String> defValues) {
+        if (mValues.containsKey(key)) {
+            return (Set<String>) mValues.get(key);
+        }
+        return defValues;
+    }
+
+    public void registerOnSharedPreferenceChangeListener(
+            OnSharedPreferenceChangeListener listener) {
+        throw new UnsupportedOperationException();
+    }
+
+    public void unregisterOnSharedPreferenceChangeListener(
+            OnSharedPreferenceChangeListener listener) {
+        throw new UnsupportedOperationException();
+    }
+
+    public Editor putBoolean(String key, boolean value) {
+        mTempValues.put(key, Boolean.valueOf(value));
+        return this;
+    }
+
+    public Editor putFloat(String key, float value) {
+        mTempValues.put(key, value);
+        return this;
+    }
+
+    public Editor putInt(String key, int value) {
+        mTempValues.put(key, value);
+        return this;
+    }
+
+    public Editor putLong(String key, long value) {
+        mTempValues.put(key, value);
+        return this;
+    }
+
+    public Editor putString(String key, String value) {
+        mTempValues.put(key, value);
+        return this;
+    }
+
+    public Editor putStringSet(String key, Set<String> values) {
+        mTempValues.put(key, values);
+        return this;
+    }
+
+    public Editor remove(String key) {
+        mTempValues.remove(key);
+        return this;
+    }
+
+    public Editor clear() {
+        mTempValues.clear();
+        return this;
+    }
+
+    @SuppressWarnings("unchecked")
+    public boolean commit() {
+        mValues = (HashMap<String, Object>)mTempValues.clone();
+        return true;
+    }
+
+    public void apply() {
+        commit();
+    }
+}
diff --git a/tests/src/com/android/contacts/widget/TestLoaderManager.java b/tests/src/com/android/contacts/widget/TestLoaderManager.java
deleted file mode 100644
index 4c06970..0000000
--- a/tests/src/com/android/contacts/widget/TestLoaderManager.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2010 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.widget;
-
-import android.app.LoaderManager;
-import android.content.AsyncTaskLoader;
-import android.content.Loader;
-import android.content.Loader.OnLoadCompleteListener;
-import android.os.Bundle;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.LinkedHashMap;
-
-import junit.framework.Assert;
-
-/**
- * A {@link LoaderManager} that performs synchronous loading on demand for unit
- * testing.
- */
-public class TestLoaderManager extends LoaderManager {
-
-    // Using a linked hash map to get all loading done in a predictable order.
-    private LinkedHashMap<Integer, Loader<?>> mStartedLoaders = new LinkedHashMap<
-            Integer, Loader<?>>();
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public <D> Loader<D> getLoader(int id) {
-        return (Loader<D>)mStartedLoaders.get(id);
-    }
-
-    @Override
-    public <D> Loader<D> initLoader(int id, Bundle args, final LoaderCallbacks<D> callbacks) {
-        Loader<D> loader = callbacks.onCreateLoader(id, args);
-        loader.registerListener(id, new OnLoadCompleteListener<D>() {
-            @Override
-            public void onLoadComplete(Loader<D> loader, D data) {
-                callbacks.onLoadFinished(loader, data);
-            }
-        });
-
-        mStartedLoaders.put(id, loader);
-        return loader;
-    }
-
-    public <D> Loader<D> recreateLoader(int id, Bundle args, LoaderCallbacks<D> callbacks) {
-        return initLoader(id, args, callbacks);
-    }
-
-    public <D> Loader<D> restartLoader(int id, Bundle args, LoaderCallbacks<D> callbacks) {
-        return initLoader(id, args, callbacks);
-    }
-
-    public void destroyLoader(int id) {
-        mStartedLoaders.get(id).stopLoading();
-    }
-
-    public void stopLoader(int id) {
-        mStartedLoaders.get(id).stopLoading();
-    }
-
-    @Override
-    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
-    }
-
-    /**
-     * Synchronously runs all started loaders.
-     */
-    public void executeLoaders() {
-        for (Loader<?> loader : mStartedLoaders.values()) {
-            executeLoader(loader);
-        }
-    }
-
-    /**
-     * Synchronously runs the specified loader.
-     */
-    public void executeLoader(int id) {
-        Loader<?> loader = mStartedLoaders.get(id);
-        if (loader == null) {
-            Assert.fail("Loader not started: " + id);
-        }
-        executeLoader(loader);
-    }
-
-    @SuppressWarnings("unchecked")
-    private <D> void executeLoader(final Loader<D> loader) {
-        if (loader instanceof AsyncTaskLoader) {
-            AsyncTaskLoader<D> atLoader = (AsyncTaskLoader<D>)loader;
-            D data = atLoader.loadInBackground();
-            loader.deliverResult(data);
-        } else {
-            loader.forceLoad();
-        }
-    }
-}