Update blocked number provider so that emergency numbers are not blocked.

BUG: 27534486
Change-Id: Ie7a0ee11af94b5c89f2fbb6a14f09d775efc65a9
diff --git a/src/com/android/providers/blockednumber/BlockedNumberProvider.java b/src/com/android/providers/blockednumber/BlockedNumberProvider.java
index d4fcaa8..69337cd 100644
--- a/src/com/android/providers/blockednumber/BlockedNumberProvider.java
+++ b/src/com/android/providers/blockednumber/BlockedNumberProvider.java
@@ -40,6 +40,7 @@
 import android.provider.BlockedNumberContract.SystemContract;
 import android.telecom.TelecomManager;
 import android.telephony.CarrierConfigManager;
+import android.telephony.PhoneNumberUtils;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.Log;
@@ -326,6 +327,16 @@
         return res;
     }
 
+    private boolean isEmergencyNumber(String phoneNumber) {
+        if (TextUtils.isEmpty(phoneNumber)) {
+            return false;
+        }
+
+        final String e164Number = Utils.getE164Number(getContext(), phoneNumber, null);
+        return PhoneNumberUtils.isEmergencyNumber(phoneNumber)
+                || PhoneNumberUtils.isEmergencyNumber(e164Number);
+    }
+
     private boolean isBlocked(String phoneNumber) {
         if (TextUtils.isEmpty(phoneNumber)) {
             return false;
@@ -394,6 +405,9 @@
         if (getBlockSuppressionStatus().isSuppressed) {
             return false;
         }
+        if (isEmergencyNumber(phoneNumber)) {
+            return false;
+        }
         return isBlocked(phoneNumber);
     }
 
diff --git a/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java b/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
index 8d58222..6839925 100644
--- a/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
+++ b/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
@@ -37,6 +37,7 @@
 import android.location.Country;
 import android.net.Uri;
 import android.os.PersistableBundle;
+import android.os.SystemProperties;
 import android.provider.BlockedNumberContract;
 import android.provider.BlockedNumberContract.BlockedNumbers;
 import android.provider.BlockedNumberContract.SystemContract;
@@ -45,7 +46,6 @@
 import android.test.AndroidTestCase;
 import android.test.MoreAsserts;
 import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
 
 import junit.framework.Assert;
 
@@ -55,7 +55,7 @@
 /**
  * runtest --path packages/providers/BlockedNumberProvider/tests
  */
-@SmallTest
+@MediumTest
 public class BlockedNumberProviderTest extends AndroidTestCase {
     private MyMockContext mMockContext;
     private ContentResolver mResolver;
@@ -256,7 +256,6 @@
         }
     }
 
-    @MediumTest
     public void testBlockSuppressionAfterEmergencyContact() {
         int blockSuppressionSeconds = 1000;
         when(mMockContext.mCarrierConfigManager.getConfig())
@@ -303,7 +302,6 @@
                 mMockContext.mIntentsBroadcasted.get(0));
     }
 
-    @MediumTest
     public void testBlockSuppressionAfterEmergencyContact_invalidCarrierConfigDefaultValueUsed() {
         int invalidBlockSuppressionSeconds = 700000; // > 1 week
         when(mMockContext.mCarrierConfigManager.getConfig())
@@ -481,6 +479,14 @@
         assertIsBlocked(false, "abcdef@gmail.com");
     }
 
+    public void testEmergencyNumbersAreNotBlockedBySystem() {
+        String emergencyNumber = getEmergencyNumberFromSystemPropertiesOrDefault();
+        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, emergencyNumber));
+
+        assertIsBlocked(true, emergencyNumber);
+        assertFalse(SystemContract.shouldSystemBlockNumber(mMockContext, emergencyNumber));
+    }
+
     private void assertIsBlocked(boolean expected, String phoneNumber) {
         assertEquals(expected, BlockedNumberContract.isBlocked(mMockContext, phoneNumber));
     }
@@ -525,4 +531,13 @@
                     c.getString(c.getColumnIndex(BlockedNumbers.COLUMN_E164_NUMBER)));
         }
     }
+
+    private String getEmergencyNumberFromSystemPropertiesOrDefault() {
+        String systemEmergencyNumbers = SystemProperties.get("ril.ecclist");
+        if (systemEmergencyNumbers == null) {
+            return "911";
+        } else {
+            return systemEmergencyNumbers.split(",")[0];
+        }
+    }
 }