Adding sharedPref for blocked number migration

+ Users are shown a dialog when they're running on an SDK which
supports the framework blocking solution, but they haven't yet
migrated. In order to determine whether the user has migrated or not,
a SharedPreference value is used. In a later CL which performs the
migration, this value will be updated as the final step.

Bug: 26664600
Change-Id: I5a12be643d0fb3b52ef408215779423bf0a2ddc7
diff --git a/src/com/android/dialer/DialerApplication.java b/src/com/android/dialer/DialerApplication.java
index 078b551..189c682 100644
--- a/src/com/android/dialer/DialerApplication.java
+++ b/src/com/android/dialer/DialerApplication.java
@@ -17,16 +17,23 @@
 package com.android.dialer;
 
 import android.app.Application;
+import android.content.Context;
 import android.os.Trace;
+import android.support.annotation.Nullable;
 
 import com.android.contacts.common.extensions.ExtensionsFactory;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.dialer.compat.FilteredNumberCompat;
 
 public class DialerApplication extends Application {
 
     private static final String TAG = "DialerApplication";
 
+    private static Context sContext;
+
     @Override
     public void onCreate() {
+        sContext = this;
         Trace.beginSection(TAG + " onCreate");
         super.onCreate();
         Trace.beginSection(TAG + " ExtensionsFactory initialization");
@@ -34,4 +41,14 @@
         Trace.endSection();
         Trace.endSection();
     }
+
+    @Nullable
+    public static Context getContext() {
+        return sContext;
+    }
+
+    @NeededForTesting
+    public static void setContextForTest(Context context) {
+        sContext = context;
+    }
 }
diff --git a/src/com/android/dialer/compat/FilteredNumberCompat.java b/src/com/android/dialer/compat/FilteredNumberCompat.java
index 63a2a32..3ad45e8 100644
--- a/src/com/android/dialer/compat/FilteredNumberCompat.java
+++ b/src/com/android/dialer/compat/FilteredNumberCompat.java
@@ -20,12 +20,15 @@
 
 import android.content.ContentUris;
 import android.content.ContentValues;
+import android.content.Context;
 import android.net.Uri;
+import android.preference.PreferenceManager;
 import android.support.annotation.Nullable;
 import android.telephony.PhoneNumberUtils;
 
 import com.android.contacts.common.compat.CompatUtils;
 import com.android.contacts.common.testing.NeededForTesting;
+import com.android.dialer.DialerApplication;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumberSources;
@@ -43,9 +46,12 @@
  */
 public class FilteredNumberCompat {
 
+    protected static final String HAS_MIGRATED_TO_NEW_BLOCKING_KEY = "migratedToNewBlocking";
+
     // Flag to enable feature.
     // TODO(maxwelb) remove when ready to enable new filtering.
     private static final boolean isNewFilteringEnabled = false;
+
     private static Boolean isEnabledForTest;
 
     /**
@@ -114,8 +120,28 @@
      * migration has been performed, {@code false} otherwise.
      */
     public static boolean useNewFiltering() {
-        // TODO(maxwelb): Add shared preference for when the Dialer blocked list has been migrated
-        return canUseNewFiltering();
+        return canUseNewFiltering() && hasMigratedToNewBlocking();
+    }
+
+    /**
+     * @return {@code true} if the user has migrated to use
+     * {@link android.provider.BlockedNumberContract} blocking, {@code false} otherwise.
+     */
+    public static boolean hasMigratedToNewBlocking() {
+        return PreferenceManager.getDefaultSharedPreferences(DialerApplication.getContext())
+                .getBoolean(HAS_MIGRATED_TO_NEW_BLOCKING_KEY, false);
+    }
+
+    /**
+     * Called to inform this class whether the user has fully migrated to use
+     * {@link android.provider.BlockedNumberContract} blocking or not.
+     *
+     * @param hasMigrated {@code true} if the user has migrated, {@code false} otherwise.
+     */
+    @NeededForTesting
+    public static void setHasMigratedToNewBlocking(boolean hasMigrated) {
+        PreferenceManager.getDefaultSharedPreferences(DialerApplication.getContext()).edit()
+                .putBoolean(HAS_MIGRATED_TO_NEW_BLOCKING_KEY, hasMigrated).apply();
     }
 
     @NeededForTesting
diff --git a/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java b/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java
index b9eb214..a57e1c2 100644
--- a/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java
+++ b/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java
@@ -16,19 +16,30 @@
 
 package com.android.dialer.compat;
 
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.when;
+
 import android.content.ContentUris;
 import android.content.ContentValues;
+import android.content.Context;
+import android.content.SharedPreferences;
 import android.net.Uri;
 import android.provider.BlockedNumberContract.BlockedNumbers;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.contacts.common.compat.CompatUtils;
+import com.android.dialer.DialerApplication;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumberSources;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumberTypes;
 
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
 import java.util.Arrays;
 
 @SmallTest
@@ -41,27 +52,52 @@
     private static final Uri EXPECTED_BASE_URI = CompatUtils.isNCompatible()
             ? BlockedNumbers.CONTENT_URI : FilteredNumber.CONTENT_URI;
 
+    @Mock private Context mContext;
+    @Mock private SharedPreferences mSharedPreferences;
+
     @Override
     public void setUp() throws Exception {
         super.setUp();
+        MockitoAnnotations.initMocks(this);
+        DialerApplication.setContextForTest(mContext);
+        when(mContext.getSharedPreferences(anyString(), anyInt())).thenReturn(mSharedPreferences);
         FilteredNumberCompat.setIsEnabledForTest(true);
     }
 
     public void testIsNewFilteringEnabled_TestValueFalse() {
         FilteredNumberCompat.setIsEnabledForTest(false);
-        assertFalse(FilteredNumberCompat.useNewFiltering());
+        assertFalse(FilteredNumberCompat.canUseNewFiltering());
     }
 
     public void testIsNewFilteringEnabled_TestValueTrue() {
         FilteredNumberCompat.setIsEnabledForTest(true);
-        assertEquals(CompatUtils.isNCompatible(), FilteredNumberCompat.useNewFiltering());
+        assertEquals(CompatUtils.isNCompatible(), FilteredNumberCompat.canUseNewFiltering());
+    }
+
+    public void testHasMigratedToNewBlocking_False() {
+        assertFalse(FilteredNumberCompat.hasMigratedToNewBlocking());
+    }
+
+    public void testHasMigratedToNewBlocking_Migrated() {
+        when(mSharedPreferences
+                .getBoolean(FilteredNumberCompat.HAS_MIGRATED_TO_NEW_BLOCKING_KEY, false))
+                .thenReturn(true);
+        assertTrue(FilteredNumberCompat.hasMigratedToNewBlocking());
     }
 
     public void testGetContentUri_NullId() {
-        assertEquals(EXPECTED_BASE_URI, FilteredNumberCompat.getContentUri(null));
+        assertEquals(FilteredNumber.CONTENT_URI, FilteredNumberCompat.getContentUri(null));
     }
 
-    public void testGetContentUri() {
+    public void testGetContentUri_NotMigrated() {
+        assertEquals(ContentUris.withAppendedId(FilteredNumber.CONTENT_URI, 1),
+                FilteredNumberCompat.getContentUri(1));
+    }
+
+    public void testGetContentUri_Migrated() {
+        when(mSharedPreferences
+                .getBoolean(FilteredNumberCompat.HAS_MIGRATED_TO_NEW_BLOCKING_KEY, false))
+                .thenReturn(true);
         assertEquals(ContentUris.withAppendedId(EXPECTED_BASE_URI, 1),
                 FilteredNumberCompat.getContentUri(1));
     }
@@ -87,12 +123,23 @@
         } catch (NullPointerException e) {}
     }
 
-    public void testNewBlockNumberContentValues_N() {
+    public void testNewBlockNumberContentValues_N_NotMigrated() {
+        if (!CompatUtils.isNCompatible()) {
+            return;
+        }
+        assertEquals(newExpectedContentValuesM(NON_E164_NUMBER, null, null),
+                FilteredNumberCompat.newBlockNumberContentValues(NON_E164_NUMBER, null, null));
+    }
+
+    public void testNewBlockNumberContentValues_N_Migrated() {
         if (!CompatUtils.isNCompatible()) {
             return;
         }
         ContentValues contentValues = new ContentValues();
         contentValues.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, NON_E164_NUMBER);
+        when(mSharedPreferences
+                .getBoolean(FilteredNumberCompat.HAS_MIGRATED_TO_NEW_BLOCKING_KEY, false))
+                .thenReturn(true);
         assertEquals(contentValues, FilteredNumberCompat.newBlockNumberContentValues(
                 NON_E164_NUMBER,
                 null, null));