Update blocked number provider to return reason for blocking.

Updating blocked number provider to return a reason for blocking the call
in addition to a boolean indicating the call was blocked or not.

Test: Manual, updated unit tests
Bug: 74524006
Change-Id: I9694f8a3dc02befcf5184591f845b9fd24fa6b82
diff --git a/src/com/android/providers/blockednumber/BlockedNumberProvider.java b/src/com/android/providers/blockednumber/BlockedNumberProvider.java
index 44a5f84..69291ff 100644
--- a/src/com/android/providers/blockednumber/BlockedNumberProvider.java
+++ b/src/com/android/providers/blockednumber/BlockedNumberProvider.java
@@ -308,8 +308,11 @@
         switch (method) {
             case BlockedNumberContract.METHOD_IS_BLOCKED:
                 enforceReadPermissionAndPrimaryUser();
-
-                res.putBoolean(BlockedNumberContract.RES_NUMBER_IS_BLOCKED, isBlocked(arg));
+                boolean isBlocked = isBlocked(arg);
+                res.putBoolean(BlockedNumberContract.RES_NUMBER_IS_BLOCKED, isBlocked);
+                res.putInt(BlockedNumberContract.RES_BLOCK_STATUS,
+                        isBlocked ? BlockedNumberContract.STATUS_BLOCKED_IN_LIST
+                                : BlockedNumberContract.STATUS_NOT_BLOCKED);
                 break;
             case BlockedNumberContract.METHOD_CAN_CURRENT_USER_BLOCK_NUMBERS:
                 // No permission checks: any app should be able to access this API.
@@ -341,8 +344,10 @@
                 break;
             case SystemContract.METHOD_SHOULD_SYSTEM_BLOCK_NUMBER:
                 enforceSystemReadPermissionAndPrimaryUser();
+                int blockReason = shouldSystemBlockNumber(arg, extras);
                 res.putBoolean(BlockedNumberContract.RES_NUMBER_IS_BLOCKED,
-                        shouldSystemBlockNumber(arg, extras));
+                        blockReason != BlockedNumberContract.STATUS_NOT_BLOCKED);
+                res.putInt(BlockedNumberContract.RES_BLOCK_STATUS, blockReason);
                 break;
             case SystemContract.METHOD_SHOULD_SHOW_EMERGENCY_CALL_NOTIFICATION:
                 enforceSystemReadPermissionAndPrimaryUser();
@@ -474,42 +479,54 @@
                 blockSuppressionExpiryTimeMillis);
     }
 
-    private boolean shouldSystemBlockNumber(String phoneNumber, Bundle extras) {
+    private int shouldSystemBlockNumber(String phoneNumber, Bundle extras) {
         if (getBlockSuppressionStatus().isSuppressed) {
-            return false;
+            return BlockedNumberContract.STATUS_NOT_BLOCKED;
         }
         if (isEmergencyNumber(phoneNumber)) {
-            return false;
+            return BlockedNumberContract.STATUS_NOT_BLOCKED;
         }
 
         boolean isBlocked = false;
+        int blockReason = BlockedNumberContract.STATUS_NOT_BLOCKED;
         if (extras != null && !extras.isEmpty()) {
             // check enhanced blocking setting
             boolean contactExist = extras.getBoolean(BlockedNumberContract.EXTRA_CONTACT_EXIST);
             int presentation = extras.getInt(BlockedNumberContract.EXTRA_CALL_PRESENTATION);
             switch (presentation) {
                 case TelecomManager.PRESENTATION_ALLOWED:
-                    isBlocked = getEnhancedBlockSetting(
+                    if (getEnhancedBlockSetting(
                             SystemContract.ENHANCED_SETTING_KEY_BLOCK_UNREGISTERED)
-                                    && !contactExist;
+                                    && !contactExist) {
+                        blockReason = BlockedNumberContract.STATUS_BLOCKED_NOT_IN_CONTACTS;
+                    }
                     break;
                 case TelecomManager.PRESENTATION_RESTRICTED:
-                    isBlocked = getEnhancedBlockSetting(
-                            SystemContract.ENHANCED_SETTING_KEY_BLOCK_PRIVATE);
+                    if (getEnhancedBlockSetting(
+                            SystemContract.ENHANCED_SETTING_KEY_BLOCK_PRIVATE)) {
+                        blockReason = BlockedNumberContract.STATUS_BLOCKED_RESTRICTED;
+                    }
                     break;
                 case TelecomManager.PRESENTATION_PAYPHONE:
-                    isBlocked = getEnhancedBlockSetting(
-                            SystemContract.ENHANCED_SETTING_KEY_BLOCK_PAYPHONE);
+                    if (getEnhancedBlockSetting(
+                            SystemContract.ENHANCED_SETTING_KEY_BLOCK_PAYPHONE)) {
+                        blockReason = BlockedNumberContract.STATUS_BLOCKED_PAYPHONE;
+                    }
                     break;
                 case TelecomManager.PRESENTATION_UNKNOWN:
-                    isBlocked = getEnhancedBlockSetting(
-                            SystemContract.ENHANCED_SETTING_KEY_BLOCK_UNKNOWN);
+                    if (getEnhancedBlockSetting(
+                            SystemContract.ENHANCED_SETTING_KEY_BLOCK_UNKNOWN)) {
+                        blockReason = BlockedNumberContract.STATUS_BLOCKED_UNKNOWN_NUMBER;
+                    }
                     break;
                 default:
                     break;
             }
         }
-        return isBlocked || isBlocked(phoneNumber);
+        if (blockReason == BlockedNumberContract.STATUS_NOT_BLOCKED && isBlocked(phoneNumber)) {
+            blockReason = BlockedNumberContract.STATUS_BLOCKED_IN_LIST;
+        }
+        return blockReason;
     }
 
     private boolean shouldShowEmergencyCallNotification() {
diff --git a/tests/src/com/android/providers/blockednumber/BlockedNumberContractTest.java b/tests/src/com/android/providers/blockednumber/BlockedNumberContractTest.java
index 89cca78..93e9cee 100644
--- a/tests/src/com/android/providers/blockednumber/BlockedNumberContractTest.java
+++ b/tests/src/com/android/providers/blockednumber/BlockedNumberContractTest.java
@@ -16,6 +16,7 @@
 
 package com.android.providers.blockednumber;
 
+import static android.provider.BlockedNumberContract.STATUS_NOT_BLOCKED;
 import static android.provider.BlockedNumberContract.SystemContract
         .ENHANCED_SETTING_KEY_BLOCK_PAYPHONE;
 
@@ -97,8 +98,9 @@
     @SmallTest
     @Test
     public void testShouldSystemBlockNumberException() {
-        assertFalse(BlockedNumberContract.SystemContract.shouldSystemBlockNumber(mMockContext,
-                TEST_NUMBER, null));
+        assertEquals(STATUS_NOT_BLOCKED,
+                BlockedNumberContract.SystemContract.shouldSystemBlockNumber(mMockContext,
+                        TEST_NUMBER, null));
     }
 
     /**
diff --git a/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java b/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
index 91d2430..828028f 100644
--- a/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
+++ b/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
@@ -611,19 +611,24 @@
         insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, emergencyNumber));
 
         assertIsBlocked(true, emergencyNumber);
-        assertFalse(SystemContract.shouldSystemBlockNumber(mMockContext, emergencyNumber, null));
+        assertEquals(BlockedNumberContract.STATUS_NOT_BLOCKED,
+                SystemContract.shouldSystemBlockNumber(mMockContext, emergencyNumber, null));
 
         setEnhancedBlockSetting(SystemContract.ENHANCED_SETTING_KEY_BLOCK_UNREGISTERED, true);
-        assertFalse(SystemContract.shouldSystemBlockNumber(mMockContext, emergencyNumber,
+        assertEquals(BlockedNumberContract.STATUS_NOT_BLOCKED,
+                SystemContract.shouldSystemBlockNumber(mMockContext, emergencyNumber,
                 createBundleForEnhancedBlocking(TelecomManager.PRESENTATION_ALLOWED, false)));
         setEnhancedBlockSetting(SystemContract.ENHANCED_SETTING_KEY_BLOCK_PRIVATE, true);
-        assertFalse(SystemContract.shouldSystemBlockNumber(mMockContext, emergencyNumber,
+        assertEquals(BlockedNumberContract.STATUS_NOT_BLOCKED,
+                SystemContract.shouldSystemBlockNumber(mMockContext, emergencyNumber,
                 createBundleForEnhancedBlocking(TelecomManager.PRESENTATION_RESTRICTED, false)));
         setEnhancedBlockSetting(SystemContract.ENHANCED_SETTING_KEY_BLOCK_PAYPHONE, true);
-        assertFalse(SystemContract.shouldSystemBlockNumber(mMockContext, emergencyNumber,
+        assertEquals(BlockedNumberContract.STATUS_NOT_BLOCKED,
+                SystemContract.shouldSystemBlockNumber(mMockContext, emergencyNumber,
                 createBundleForEnhancedBlocking(TelecomManager.PRESENTATION_PAYPHONE, false)));
         setEnhancedBlockSetting(SystemContract.ENHANCED_SETTING_KEY_BLOCK_UNKNOWN, true);
-        assertFalse(SystemContract.shouldSystemBlockNumber(mMockContext, emergencyNumber,
+        assertEquals(BlockedNumberContract.STATUS_NOT_BLOCKED,
+                SystemContract.shouldSystemBlockNumber(mMockContext, emergencyNumber,
                 createBundleForEnhancedBlocking(TelecomManager.PRESENTATION_UNKNOWN, false)));
     }
 
@@ -707,8 +712,9 @@
     }
 
     private void assertShouldSystemBlock(boolean expected, String phoneNumber, Bundle extras) {
-        assertEquals(expected, SystemContract.shouldSystemBlockNumber(mMockContext, phoneNumber,
-                extras));
+        assertEquals(expected,
+                SystemContract.shouldSystemBlockNumber(mMockContext, phoneNumber, extras)
+                        != BlockedNumberContract.STATUS_NOT_BLOCKED);
     }
 
     private void setEnhancedBlockSetting(String key, boolean value) {