Using FilteredNumCompat for unblock

+ This CL updates the FilteredNumberAsyncQueryHandler#unblock methods
to use the FilteredNumberCompat class to properly choose between the
original Dialer blocking implementation and new blocking.

Bug=26664600

Change-Id: I528604eeafa4f7fa131cb1898d57a87708ba58b5
diff --git a/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java b/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
index 7279911..7af1a13 100644
--- a/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
+++ b/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
@@ -115,14 +115,6 @@
         }
     }
 
-    private static Uri getContentUri(Integer id) {
-        Uri uri = FilteredNumber.CONTENT_URI;
-        if (id != null) {
-            uri = ContentUris.withAppendedId(uri, id);
-        }
-        return uri;
-    }
-
     public final void incrementFilteredCount(Integer id) {
         // No concept of counts with new filtering
         if (FilteredNumberCompat.useNewFiltering()) {
@@ -228,22 +220,25 @@
     /**
      * Unblocks the number with the given id.
      *
-     * @param listener The {@link OnUnblockNumberListener} called after the number is unblocked.
+     * @param listener (optional) The {@link OnUnblockNumberListener} called after the number is
+     * unblocked.
      * @param id The id of the number to unblock.
      */
-    public void unblock(final OnUnblockNumberListener listener, Integer id) {
+    public void unblock(@Nullable final OnUnblockNumberListener listener, Integer id) {
         if (id == null) {
             throw new IllegalArgumentException("Null id passed into unblock");
         }
-        unblock(listener, getContentUri(id));
+        unblock(listener, FilteredNumberCompat.getContentUri(id));
     }
 
     /**
      * Removes row from database.
+     * @param listener (optional) The {@link OnUnblockNumberListener} called after the number is
+     * unblocked.
      * @param uri The uri of row to remove, from
-     *         {@link FilteredNumberAsyncQueryHandler#blockNumber}.
+     * {@link FilteredNumberAsyncQueryHandler#blockNumber}.
      */
-    public void unblock(final OnUnblockNumberListener listener, final Uri uri) {
+    public void unblock(@Nullable final OnUnblockNumberListener listener, final Uri uri) {
         startQuery(NO_TOKEN, new Listener() {
             @Override
             public void onQueryComplete(int token, Object cookie, Cursor cursor) {
@@ -256,7 +251,7 @@
                 cursor.moveToFirst();
                 final ContentValues values = new ContentValues();
                 DatabaseUtils.cursorRowToContentValues(cursor, values);
-                values.remove(FilteredNumberColumns._ID);
+                values.remove(FilteredNumberCompat.getIdColumnName());
 
                 startDelete(NO_TOKEN, new Listener() {
                     @Override
diff --git a/tests/src/com/android/dialer/database/FilteredNumberAsyncQueryHandlerTest.java b/tests/src/com/android/dialer/database/FilteredNumberAsyncQueryHandlerTest.java
index 88f38fd..28fdda0 100644
--- a/tests/src/com/android/dialer/database/FilteredNumberAsyncQueryHandlerTest.java
+++ b/tests/src/com/android/dialer/database/FilteredNumberAsyncQueryHandlerTest.java
@@ -16,6 +16,7 @@
 
 package com.android.dialer.database;
 
+import android.content.ContentUris;
 import android.content.ContentValues;
 import android.net.Uri;
 import android.provider.BlockedNumberContract;
@@ -31,6 +32,7 @@
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnBlockNumberListener;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnUnblockNumberListener;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumberSources;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumberTypes;
@@ -51,6 +53,8 @@
             Uri.withAppendedPath(FilteredNumberContract.AUTHORITY_URI, "filtered_numbers_table");
     private static final Uri BLOCKED_NUMBER_URI = CompatUtils.isNCompatible() ? BLOCKED_NUMBER_URI_N
             : BLOCKED_NUMBER_URI_M;
+    private static final Uri BLOCKED_NUMBER_URI_WITH_ID =
+            ContentUris.withAppendedId(BLOCKED_NUMBER_URI, ID);
     private static final Uri EXPECTED_URI = Uri.fromParts("android", "google", "dialer");
 
     private final MockContentResolver mContentResolver = new MockContentResolver();
@@ -226,6 +230,60 @@
         mContentProvider.verify();
     }
 
+    public void testUnblockNumber_Disabled() throws Throwable {
+        if (!CompatUtils.isNCompatible()) {
+            return;
+        }
+        FilteredNumberCompat.setIsEnabledForTest(false);
+        final MockContentResolver resolver = new MockContentResolver();
+        MockContentProvider disabledProvider = new MockContentProvider();
+        resolver.addProvider(FilteredNumberContract.AUTHORITY, disabledProvider);
+
+        Uri uriWithId = ContentUris.withAppendedId(BLOCKED_NUMBER_URI_M, ID);
+        disabledProvider.expectQuery(uriWithId)
+                .withProjection(null)
+                .withDefaultProjection(FilteredNumberCompat.getIdColumnName())
+                .withSelection(null, null)
+                .withSortOrder(null)
+                .returnRow(ID);
+        disabledProvider.expectDelete(uriWithId).returnRowsAffected(1);
+        final UnblockNumberListener listener = new UnblockNumberListener();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                new FilteredNumberAsyncQueryHandler(resolver).unblock(listener, ID);
+            }
+        });
+        assertNotNull(listener.waitForCallback());
+        disabledProvider.verify();
+    }
+
+    public void testUnblockNumber_NullId() {
+        try {
+            new FilteredNumberAsyncQueryHandler(mContentResolver).unblock(null, (Integer) null);
+            fail();
+        } catch (IllegalArgumentException e) {}
+    }
+
+    public void testUnblockNumber() throws Throwable {
+        mContentProvider.expectQuery(BLOCKED_NUMBER_URI_WITH_ID)
+                .withProjection(null)
+                .withDefaultProjection(FilteredNumberCompat.getIdColumnName())
+                .withSelection(null, null)
+                .withSortOrder(null)
+                .returnRow(ID);
+        mContentProvider.expectDelete(BLOCKED_NUMBER_URI_WITH_ID).returnRowsAffected(1);
+        final UnblockNumberListener listener = new UnblockNumberListener();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                new FilteredNumberAsyncQueryHandler(mContentResolver).unblock(listener, ID);
+            }
+        });
+        assertNotNull(listener.waitForCallback());
+        mContentProvider.verify();
+    }
+
     private Query newIsBlockedNumberExpectedQuery() {
         if (CompatUtils.isNCompatible()) {
             return newIsBlockedNumberExpectedQueryN();
@@ -353,4 +411,26 @@
             return uri;
         }
     }
+
+    private class UnblockNumberListener implements OnUnblockNumberListener {
+        public final CountDownLatch onUnblockCompleteCalled;
+        public Integer result;
+
+        public UnblockNumberListener() {
+            onUnblockCompleteCalled = new CountDownLatch(1);
+        }
+
+        @Override
+        public void onUnblockComplete(int rows, ContentValues values) {
+            result = rows;
+            onUnblockCompleteCalled.countDown();
+        }
+
+        public Integer waitForCallback() throws InterruptedException {
+            if (!onUnblockCompleteCalled.await(5000, TimeUnit.MILLISECONDS)) {
+                throw new IllegalStateException("Waiting on callback timed out.");
+            }
+            return result;
+        }
+    }
 }