summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbhijith Shastry <ashastry@google.com>2016-03-23 19:32:18 -0700
committerAbhijith Shastry <ashastry@google.com>2016-03-23 19:32:18 -0700
commit75718f1c00e7ce33369c1bc9418496ccfd49bdb9 (patch)
treeb4ddf23722c0467c9aab424d2058da9057712642
parent0e7df00b196c4d281da0c7f65cd04ce643489ba2 (diff)
downloadBlockedNumberProvider-75718f1c00e7ce33369c1bc9418496ccfd49bdb9.tar.gz
Implement unblock API for blocked numbers.
BUG: 27790536 Change-Id: Ic8cd41f54a588b41ebfdce871c4f7961895be029
-rw-r--r--src/com/android/providers/blockednumber/BlockedNumberProvider.java33
-rw-r--r--tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java37
2 files changed, 68 insertions, 2 deletions
diff --git a/src/com/android/providers/blockednumber/BlockedNumberProvider.java b/src/com/android/providers/blockednumber/BlockedNumberProvider.java
index 04d463b..a5bccfc 100644
--- a/src/com/android/providers/blockednumber/BlockedNumberProvider.java
+++ b/src/com/android/providers/blockednumber/BlockedNumberProvider.java
@@ -50,6 +50,8 @@ import com.android.common.content.ProjectionMap;
import com.android.internal.annotations.VisibleForTesting;
import com.android.providers.blockednumber.BlockedNumberDatabaseHelper.Tables;
+import java.util.Arrays;
+
/**
* Blocked phone number provider.
*
@@ -90,6 +92,12 @@ public class BlockedNumberProvider extends ContentProvider {
private static final String ID_SELECTION =
BlockedNumberContract.BlockedNumbers.COLUMN_ID + "=?";
+ private static final String ORIGINAL_NUMBER_SELECTION =
+ BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER + "=?";
+
+ private static final String E164_NUMBER_SELECTION =
+ BlockedNumberContract.BlockedNumbers.COLUMN_E164_NUMBER + "=?";
+
@VisibleForTesting
protected BlockedNumberDatabaseHelper mDbHelper;
@VisibleForTesting
@@ -306,6 +314,11 @@ public class BlockedNumberProvider extends ContentProvider {
res.putBoolean(
BlockedNumberContract.RES_CAN_BLOCK_NUMBERS, canCurrentUserBlockUsers());
break;
+ case BlockedNumberContract.METHOD_UNBLOCK:
+ enforceWritePermissionAndPrimaryUser();
+
+ res.putInt(BlockedNumberContract.RES_NUM_ROWS_DELETED, unblock(arg));
+ break;
case SystemContract.METHOD_NOTIFY_EMERGENCY_CONTACT:
enforceSystemWritePermissionAndPrimaryUser();
@@ -337,6 +350,26 @@ public class BlockedNumberProvider extends ContentProvider {
return res;
}
+ private int unblock(String phoneNumber) {
+ if (TextUtils.isEmpty(phoneNumber)) {
+ return 0;
+ }
+
+ StringBuilder selectionBuilder = new StringBuilder(ORIGINAL_NUMBER_SELECTION);
+ String[] selectionArgs = new String[]{phoneNumber};
+ final String e164Number = Utils.getE164Number(getContext(), phoneNumber, null);
+ if (!TextUtils.isEmpty(e164Number)) {
+ selectionBuilder.append(" or " + E164_NUMBER_SELECTION);
+ selectionArgs = new String[]{phoneNumber, e164Number};
+ }
+ String selection = selectionBuilder.toString();
+ if (DEBUG) {
+ Log.d(TAG, String.format("Unblocking numbers using selection: %s, args: %s",
+ selection, Arrays.toString(selectionArgs)));
+ }
+ return deleteBlockedNumber(selection, selectionArgs);
+ }
+
private boolean isEmergencyNumber(String phoneNumber) {
if (TextUtils.isEmpty(phoneNumber)) {
return false;
diff --git a/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java b/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
index 70f5170..19185be 100644
--- a/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
+++ b/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
@@ -21,8 +21,8 @@ import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.AppOpsManager;
@@ -32,7 +32,6 @@ import android.content.ContentValues;
import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.database.Cursor;
-import android.database.sqlite.SQLiteConstraintException;
import android.database.sqlite.SQLiteException;
import android.location.Country;
import android.net.Uri;
@@ -355,6 +354,12 @@ public class BlockedNumberProviderTest extends AndroidTestCase {
}
try {
+ BlockedNumberContract.unblock(mMockContext, "123");
+ fail("SecurityException expected");
+ } catch (SecurityException expected) {
+ }
+
+ try {
SystemContract.notifyEmergencyContact(mMockContext);
fail("SecurityException expected");
} catch (SecurityException expected) {
@@ -493,6 +498,22 @@ public class BlockedNumberProviderTest extends AndroidTestCase {
assertIsBlocked(false, "abcdef@gmail.com");
}
+ public void testUnblock() {
+ insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "+1-500-454-1111"));
+ insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1500-454-1111"));
+ insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "abc.def@gmail.com"));
+
+ // Unblocking non-existent number is a no-op.
+ assertEquals(0, BlockedNumberContract.unblock(mMockContext, "12345"));
+
+ // Both rows which map to the same E164 number are deleted.
+ assertEquals(2, BlockedNumberContract.unblock(mMockContext, "5004541111"));
+ assertIsBlocked(false, "1-500-454-1111");
+
+ assertEquals(1, BlockedNumberContract.unblock(mMockContext, "abc.def@gmail.com"));
+ assertIsBlocked(false, "abc.def@gmail.com");
+ }
+
public void testEmergencyNumbersAreNotBlockedBySystem() {
String emergencyNumber = getEmergencyNumberFromSystemPropertiesOrDefault();
insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, emergencyNumber));
@@ -529,6 +550,12 @@ public class BlockedNumberProviderTest extends AndroidTestCase {
fail("UnsupportedOperationException expected");
} catch (UnsupportedOperationException expected) {
}
+
+ try {
+ BlockedNumberContract.unblock(mMockContext, "123");
+ fail("UnsupportedOperationException expected");
+ } catch (UnsupportedOperationException expected) {
+ }
}
public void testRegularAppAccessingApisAsSecondaryUser() {
@@ -561,6 +588,12 @@ public class BlockedNumberProviderTest extends AndroidTestCase {
fail("SecurityException expected");
} catch (SecurityException expected) {
}
+
+ try {
+ BlockedNumberContract.unblock(mMockContext, "123");
+ fail("SecurityException expected");
+ } catch (SecurityException expected) {
+ }
}
private void assertIsBlocked(boolean expected, String phoneNumber) {