Merge "Handle the cases when RCS config is null"
diff --git a/src/com/android/phone/RcsProvisioningMonitor.java b/src/com/android/phone/RcsProvisioningMonitor.java
index 8e4d35e..98003bd 100644
--- a/src/com/android/phone/RcsProvisioningMonitor.java
+++ b/src/com/android/phone/RcsProvisioningMonitor.java
@@ -333,6 +333,7 @@
             mConfigs.forEach((k, v) -> {
                 if (isAcsUsed(k)) {
                     logv("acs used, trigger to re-configure.");
+                    mConfigs.put(k, null);
                     notifyRcsAutoConfigurationRemoved(k);
                     triggerRcsReconfiguration(k);
                 } else {
@@ -345,6 +346,11 @@
 
     private void notifyRcsAutoConfigurationReceived(int subId, byte[] config,
             boolean isCompressed) {
+        if (config == null) {
+            logd("Rcs config is null for sub : " + subId);
+            return;
+        }
+
         IImsConfig imsConfig = getIImsConfig(subId, ImsFeature.FEATURE_RCS);
         if (imsConfig != null) {
             try {
@@ -358,6 +364,7 @@
     }
 
     private void notifyRcsAutoConfigurationRemoved(int subId) {
+        RcsConfig.updateConfigForSub(mPhone, subId, null, true);
         IImsConfig imsConfig = getIImsConfig(subId, ImsFeature.FEATURE_RCS);
         if (imsConfig != null) {
             try {
@@ -461,8 +468,7 @@
 
     private void onReconfigRequest(int subId) {
         logv("onReconfigRequest, subId:" + subId);
-        mConfigs.remove(subId);
-        RcsConfig.updateConfigForSub(mPhone, subId, null, true);
+        mConfigs.put(subId, null);
         notifyRcsAutoConfigurationRemoved(subId);
         triggerRcsReconfiguration(subId);
     }
diff --git a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
index 7ef9768..7c06507 100644
--- a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
+++ b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
@@ -29,6 +29,7 @@
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -156,6 +157,7 @@
 
     private class SimInfoContentProvider extends MockContentProvider {
         private Cursor mCursor;
+        private ContentValues mValues;
 
         SimInfoContentProvider(Context context) {
             super(context);
@@ -174,8 +176,13 @@
         @Override
         public int update(Uri uri, ContentValues values,
                 String selection, String[] selectionArgs) {
+            mValues = values;
             return 1;
         }
+
+        ContentValues getContentValues() {
+            return mValues;
+        }
     }
 
     @Before
@@ -272,7 +279,7 @@
 
     @Test
     @SmallTest
-    public void testInit() throws Exception {
+    public void testInitWithSavedConfig() throws Exception {
         createMonitor(3);
         ArgumentCaptor<Intent> captorIntent = ArgumentCaptor.forClass(Intent.class);
         for (int i = 0; i < 3; i++) {
@@ -291,6 +298,21 @@
 
     @Test
     @SmallTest
+    public void testInitWithoutSavedConfig() throws Exception {
+        when(mCursor.getBlob(anyInt())).thenReturn(null);
+        ArgumentCaptor<Intent> captorIntent = ArgumentCaptor.forClass(Intent.class);
+        createMonitor(3);
+
+        verify(mPhone, times(3)).sendBroadcast(captorIntent.capture());
+        Intent capturedIntent = captorIntent.getAllValues().get(1);
+        assertEquals(ProvisioningManager.ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE,
+                capturedIntent.getAction());
+        //Should not notify null config
+        verify(mIImsConfig, never()).notifyRcsAutoConfigurationReceived(any(), anyBoolean());
+    }
+
+    @Test
+    @SmallTest
     public void testSubInfoChanged() throws Exception {
         createMonitor(3);
         ArgumentCaptor<Intent> captorIntent = ArgumentCaptor.forClass(Intent.class);
@@ -318,17 +340,37 @@
 
     @Test
     @SmallTest
-    public void testDefaultMessagingApplicationChanged() throws Exception {
+    public void testDefaultMessagingApplicationChangedWithAcs() throws Exception {
+        createMonitor(1);
+        updateDefaultMessageApplication(DEFAULT_MESSAGING_APP2);
+        mBundle.putBoolean(CarrierConfigManager.KEY_USE_ACS_FOR_RCS_BOOL, true);
+        processAllMessages();
+        byte[] configCached = mRcsProvisioningMonitor.getConfig(FAKE_SUB_ID_BASE);
+
+        assertNull(configCached);
+        assertNull(mProvider.getContentValues().get(SimInfo.COLUMN_RCS_CONFIG));
+        verify(mIImsConfig, atLeastOnce()).notifyRcsAutoConfigurationRemoved();
+        verify(mIImsConfig, atLeastOnce()).triggerRcsReconfiguration();
+        // The api should only be called when monitor is initilized.
+        verify(mIImsConfig, times(1))
+                .notifyRcsAutoConfigurationReceived(any(), anyBoolean());
+    }
+
+    @Test
+    @SmallTest
+    public void testDefaultMessagingApplicationChangedWithoutAcs() throws Exception {
         createMonitor(1);
         updateDefaultMessageApplication(DEFAULT_MESSAGING_APP2);
         mBundle.putBoolean(CarrierConfigManager.KEY_USE_ACS_FOR_RCS_BOOL, false);
         processAllMessages();
-        verify(mIImsConfig, atLeastOnce())
+        byte[] configCached = mRcsProvisioningMonitor.getConfig(FAKE_SUB_ID_BASE);
+
+        assertTrue(Arrays.equals(SAMPLE_CONFIG.getBytes(), configCached));
+        verify(mIImsConfig, never()).notifyRcsAutoConfigurationRemoved();
+        // The api should be called 2 times, one happens when monitor is initilized,
+        // Another happens when DMS is changed.
+        verify(mIImsConfig, times(2))
                 .notifyRcsAutoConfigurationReceived(any(), anyBoolean());
-        mBundle.putBoolean(CarrierConfigManager.KEY_USE_ACS_FOR_RCS_BOOL, true);
-        updateDefaultMessageApplication(DEFAULT_MESSAGING_APP1);
-        processAllMessages();
-        verify(mIImsConfig, atLeastOnce()).triggerRcsReconfiguration();
     }
 
     @Test
@@ -494,7 +536,6 @@
         ((Map<String, IBinder>) field.get(null)).put(serviceName, binder);
     }
 
-
     private void processAllMessages() {
         while (!mLooper.getLooper().getQueue().isIdle()) {
             mLooper.processAllMessages();