diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-06-30 02:27:01 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-06-30 02:27:01 +0000 |
commit | 838fd09d2f8ddbce1330bfceae8ea24d85cc9182 (patch) | |
tree | 2f4617984e74fde5b25135ab3c082e807527318b | |
parent | 6b5a7c2eea6b64a9f6322f45ce184fdc94bf4b0e (diff) | |
parent | 0f06937ca261ac49b49a595c30b0314fe7e57b10 (diff) | |
download | Telephony-android13-release.tar.gz |
Merge cherrypicks of [19048695] into tm-release.android-vts-13.0_r8android-vts-13.0_r7android-vts-13.0_r6android-vts-13.0_r5android-vts-13.0_r4android-vts-13.0_r3android-vts-13.0_r2android-vts-13.0_r1android-security-13.0.0_r1android-platform-13.0.0_r2android-platform-13.0.0_r1android-cts-13.0_r8android-cts-13.0_r7android-cts-13.0_r6android-cts-13.0_r5android-cts-13.0_r4android-cts-13.0_r3android-cts-13.0_r2android-cts-13.0_r1android-13.0.0_r8android-13.0.0_r7android-13.0.0_r6android-13.0.0_r5android-13.0.0_r4android-13.0.0_r31android-13.0.0_r3android-13.0.0_r2android-13.0.0_r12android-13.0.0_r1android13-tests-releaseandroid13-s3-releaseandroid13-s2-releaseandroid13-s1-releaseandroid13-release
Change-Id: I603600635f5ec655603af90ad90e9ecfbda483c6
-rw-r--r-- | src/com/android/phone/ImsProvisioningController.java | 64 | ||||
-rw-r--r-- | tests/src/com/android/phone/ImsProvisioningControllerTest.java | 215 |
2 files changed, 227 insertions, 52 deletions
diff --git a/src/com/android/phone/ImsProvisioningController.java b/src/com/android/phone/ImsProvisioningController.java index 1de2dcd72..696f56746 100644 --- a/src/com/android/phone/ImsProvisioningController.java +++ b/src/com/android/phone/ImsProvisioningController.java @@ -668,6 +668,10 @@ public class ImsProvisioningController { return retValue; } + public boolean isConnectionReady() { + return mReady; + } + public void onRcsAvailable() { log(LOG_PREFIX, mSlotId, "onRcsAvailable"); @@ -1117,8 +1121,19 @@ public class ImsProvisioningController { int key = ProvisioningManager.KEY_EAB_PROVISIONING_STATUS; int value = getIntValue(isProvisioned); try { - // set key and value to vendor ImsService for Rcs - mRcsFeatureListenersSlotMap.get(slotId).setProvisioningValue(key, value); + // On some older devices, EAB is managed on the MmTel ImsService when the RCS + // ImsService is not configured. If there is no RCS ImsService defined, fallback to + // MmTel. In the rare case that we hit a race condition where the RCS ImsService has + // crashed or has not come up yet, the value will be synchronized via + // setInitialProvisioningKeys(). + if (mRcsFeatureListenersSlotMap.get(slotId).isConnectionReady()) { + mRcsFeatureListenersSlotMap.get(slotId).setProvisioningValue(key, value); + } + + // EAB provisioning status should be updated to both the Rcs and MmTel ImsService, + // because the provisioning callback is listening to only MmTel provisioning key + // changes. + mMmTelFeatureListenersSlotMap.get(slotId).setProvisioningValue(key, value); } catch (NullPointerException e) { loge("can not access RcsFeatureListener with capability " + capability); } @@ -1155,14 +1170,21 @@ public class ImsProvisioningController { } try { - if (key == KEY_EAB_PROVISIONING_STATUS) { - // set key and value to vendor ImsService for Rcs - retVal = mRcsFeatureListenersSlotMap.get(slotId) - .setProvisioningValue(key, value); - } else { - // set key and value to vendor ImsService for MmTel - retVal = mMmTelFeatureListenersSlotMap.get(slotId) - .setProvisioningValue(key, value); + // set key and value to vendor ImsService for MmTel + // EAB provisioning status should be updated to both the Rcs and MmTel ImsService, + // because the provisioning callback is listening to only MmTel provisioning key + // changes. + retVal = mMmTelFeatureListenersSlotMap.get(slotId).setProvisioningValue(key, value); + + // If the Rcs ImsService is not available, the EAB provisioning status will be written + // to the MmTel ImsService for backwards compatibility. In the rare case that this is + // hit due to RCS ImsService temporarily unavailable, the value will be synchronized + // via setInitialProvisioningKeys() when the RCS ImsService comes back up. + if (key == KEY_EAB_PROVISIONING_STATUS + && mRcsFeatureListenersSlotMap.get(slotId).isConnectionReady()) { + // set key and value to vendor ImsService for RCS and use retVal from RCS if + // related to EAB when possible. + retVal = mRcsFeatureListenersSlotMap.get(slotId).setProvisioningValue(key, value); } } catch (NullPointerException e) { loge("can not access FeatureListener to set provisioning value"); @@ -1332,16 +1354,24 @@ public class ImsProvisioningController { private int getRcsValueFromImsService(int subId, int capability) { int config = ImsConfigImplBase.CONFIG_RESULT_UNKNOWN; + int slotId = getSlotId(subId); - if (capability == CAPABILITY_TYPE_PRESENCE_UCE) { - try { - config = mRcsFeatureListenersSlotMap.get(getSlotId(subId)) + if (capability != CAPABILITY_TYPE_PRESENCE_UCE) { + log("Capability " + capability + " has been provisioning"); + return config; + } + try { + if (mRcsFeatureListenersSlotMap.get(slotId).isConnectionReady()) { + config = mRcsFeatureListenersSlotMap.get(slotId) + .getProvisioningValue(ProvisioningManager.KEY_EAB_PROVISIONING_STATUS); + } else { + log("Rcs ImsService is not available, " + + "EAB provisioning status should be read from MmTel ImsService"); + config = mMmTelFeatureListenersSlotMap.get(slotId) .getProvisioningValue(ProvisioningManager.KEY_EAB_PROVISIONING_STATUS); - } catch (NullPointerException e) { - logw("can not access RcsFeatureListener"); } - } else { - log("Capability " + capability + " has been provisioning"); + } catch (NullPointerException e) { + logw("can not access FeatureListener : " + e.getMessage()); } return config; diff --git a/tests/src/com/android/phone/ImsProvisioningControllerTest.java b/tests/src/com/android/phone/ImsProvisioningControllerTest.java index 49ce6b5a9..2094e20ce 100644 --- a/tests/src/com/android/phone/ImsProvisioningControllerTest.java +++ b/tests/src/com/android/phone/ImsProvisioningControllerTest.java @@ -21,6 +21,7 @@ import static android.telephony.ims.ProvisioningManager.KEY_EAB_PROVISIONING_STA import static android.telephony.ims.ProvisioningManager.KEY_VOICE_OVER_WIFI_ENABLED_OVERRIDE; import static android.telephony.ims.ProvisioningManager.KEY_VOLTE_PROVISIONING_STATUS; import static android.telephony.ims.ProvisioningManager.KEY_VT_PROVISIONING_STATUS; +import static android.telephony.ims.ProvisioningManager.PROVISIONING_VALUE_DISABLED; import static android.telephony.ims.ProvisioningManager.PROVISIONING_VALUE_ENABLED; import static android.telephony.ims.feature.ImsFeature.FEATURE_MMTEL; import static android.telephony.ims.feature.ImsFeature.FEATURE_RCS; @@ -631,7 +632,7 @@ public class ImsProvisioningControllerTest { // verify return value assertEquals(expectedVoiceProvisioningStatus[i], provisioned); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(1)) .getProvisioningStatus(eq(mSubId0), eq(FEATURE_MMTEL), eq(capability), eq(RADIO_TECHS[i])); @@ -646,7 +647,7 @@ public class ImsProvisioningControllerTest { // verify return value assertEquals(expectedVideoProvisioningStatus[i], provisioned); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(1)) .getProvisioningStatus(eq(mSubId0), eq(FEATURE_MMTEL), eq(capability), eq(RADIO_TECHS[i])); @@ -661,7 +662,7 @@ public class ImsProvisioningControllerTest { // verify return value assertEquals(expectedUtProvisioningStatus[i], provisioned); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(1)) .getProvisioningStatus(eq(mSubId0), eq(FEATURE_MMTEL), eq(capability), eq(RADIO_TECHS[i])); @@ -716,10 +717,10 @@ public class ImsProvisioningControllerTest { verify(mImsProvisioningLoader, times(1)) .getProvisioningStatus(eq(mSubId0), eq(FEATURE_MMTEL), eq(capability), eq(tech)); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsConfig, times(1)).getConfigInt(eq(KEY_VOLTE_PROVISIONING_STATUS)); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(1)) .setProvisioningStatus(eq(mSubId0), eq(FEATURE_MMTEL), eq(capability), eq(tech), eq(provisioned)); @@ -739,10 +740,10 @@ public class ImsProvisioningControllerTest { verify(mImsProvisioningLoader, times(1)) .getProvisioningStatus(eq(mSubId0), eq(FEATURE_MMTEL), eq(capability), eq(tech)); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsConfig, times(1)).getConfigInt(eq(KEY_VT_PROVISIONING_STATUS)); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(1)) .setProvisioningStatus(eq(mSubId0), eq(FEATURE_MMTEL), eq(capability), eq(tech), eq(provisioned)); @@ -781,7 +782,7 @@ public class ImsProvisioningControllerTest { // verify return value assertEquals(expectedPresenceProvisioningStatus[i], provisioned); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(1)).getProvisioningStatus( eq(mSubId0), eq(FEATURE_RCS), eq(capability), eq(RADIO_TECHS[i])); } @@ -832,10 +833,10 @@ public class ImsProvisioningControllerTest { verify(mImsProvisioningLoader, times(1)).getProvisioningStatus( eq(mSubId0), eq(FEATURE_RCS), eq(capability), eq(tech)); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsConfig, times(1)).getConfigInt(eq(KEY_EAB_PROVISIONING_STATUS)); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(RADIO_TECHS.length)).setProvisioningStatus( eq(mSubId0), eq(FEATURE_RCS), eq(capability), anyInt(), eq(provisioned)); @@ -896,7 +897,7 @@ public class ImsProvisioningControllerTest { // verify return value default false - provisioned assertEquals(!provisionedFirst, provisionedSecond); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(2)) .getProvisioningStatus(eq(mSubId0), eq(FEATURE_MMTEL), eq(capability), eq(RADIO_TECHS[i])); @@ -904,13 +905,13 @@ public class ImsProvisioningControllerTest { .setProvisioningStatus(eq(mSubId0), eq(FEATURE_MMTEL), eq(capability), eq(RADIO_TECHS[i]), eq(provisionedSecond)); - // verify weather Callback is called or not + // verify whether Callback is called or not verify(mIFeatureProvisioningCallback0, times(1)) .onFeatureProvisioningChanged(eq(capability), eq(RADIO_TECHS[i]), eq(provisionedSecond)); } - // verify weather ImsConfig is called or not + // verify whether ImsConfig is called or not verify(mImsConfig, times(1)).setConfig( eq(KEY_VOLTE_PROVISIONING_STATUS), eq(PROVISIONING_VALUE_ENABLED)); verify(mImsConfig, times(1)).setConfig( @@ -975,7 +976,7 @@ public class ImsProvisioningControllerTest { // verify return value default false - provisioned assertEquals(!provisionedFirst, provisionedSecond); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(2)) .getProvisioningStatus(eq(mSubId0), eq(FEATURE_MMTEL), eq(capability), eq(RADIO_TECHS[i])); @@ -983,13 +984,13 @@ public class ImsProvisioningControllerTest { .setProvisioningStatus(eq(mSubId0), eq(FEATURE_MMTEL), eq(capability), eq(RADIO_TECHS[i]), eq(provisionedSecond)); - // verify weather Callback is called or not + // verify whether Callback is called or not verify(mIFeatureProvisioningCallback0, times(1)) .onFeatureProvisioningChanged(eq(capability), eq(RADIO_TECHS[i]), eq(provisionedSecond)); } - // verify weather ImsConfig is called or not + // verify whether ImsConfig is called or not verify(mImsConfig, times(1)).setConfig( eq(KEY_VT_PROVISIONING_STATUS), eq(PROVISIONING_VALUE_ENABLED)); @@ -1004,6 +1005,7 @@ public class ImsProvisioningControllerTest { public void setRcsProvisioningRequiredForCapability_withPresence() throws Exception { createImsProvisioningController(); + mMmTelConnectorListener0.getValue().connectionReady(mImsManager, mSubId0); mRcsConnectorListener0.getValue().connectionReady(mRcsFeatureManager, mSubId0); processAllMessages(); @@ -1052,20 +1054,21 @@ public class ImsProvisioningControllerTest { // verify return value default false - provisioned assertEquals(!provisionedFirst, provisionedSecond); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(2)).getProvisioningStatus( eq(mSubId0), eq(FEATURE_RCS), eq(capability), eq(REGISTRATION_TECH_LTE)); // verify setProvisioningStatus is called RADIO_TECHS.length times for all tech or not verify(mImsProvisioningLoader, times(1)).setProvisioningStatus( eq(mSubId0), eq(FEATURE_RCS), eq(capability), anyInt(), eq(provisionedSecond)); - // verify weather Callback is called RADIO_TECHS.length times for all tech or not + // verify whether Callback is called RADIO_TECHS.length times for all tech or not verify(mIFeatureProvisioningCallback0, times(1)) .onRcsFeatureProvisioningChanged(eq(capability), eq(REGISTRATION_TECH_LTE), eq(provisionedSecond)); - // verify weather ImsConfig is called or not - verify(mImsConfig, times(1)).setConfig( + // verify whether ImsConfig is called or not + // EAB provisioning status should be updated to both the Rcs and MmTel ImsService + verify(mImsConfig, times(2)).setConfig( eq(KEY_EAB_PROVISIONING_STATUS), eq(PROVISIONING_VALUE_ENABLED)); // verify reset @@ -1080,7 +1083,7 @@ public class ImsProvisioningControllerTest { // verify return value assertEquals(expected[i], provisionedSecond); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(1)).getProvisioningStatus( eq(mSubId0), eq(FEATURE_RCS), eq(capability), eq(RADIO_TECHS[i])); } @@ -1157,7 +1160,7 @@ public class ImsProvisioningControllerTest { // check return value assertEquals(ImsConfig.OperationStatusConstants.SUCCESS, result); - // check weather to save + // check whether to save verify(mImsProvisioningLoader, times(1)).setProvisioningStatus( eq(mSubId0), eq(FEATURE_MMTEL), eq(capas[i]), eq(techs[i]), eq(true)); @@ -1178,6 +1181,7 @@ public class ImsProvisioningControllerTest { public void setProvisioningValue_withRcsKey() throws Exception { createImsProvisioningController(); + mMmTelConnectorListener0.getValue().connectionReady(mImsManager, mSubId0); mRcsConnectorListener0.getValue().connectionReady(mRcsFeatureManager, mSubId0); processAllMessages(); @@ -1215,14 +1219,16 @@ public class ImsProvisioningControllerTest { // check return value assertEquals(ImsConfig.OperationStatusConstants.SUCCESS, result); - // check weather to save, for all techs 4 times + // check to save, for all techs 4 times verify(mImsProvisioningLoader, times(RADIO_TECHS.length)).setProvisioningStatus( eq(mSubId0), eq(FEATURE_RCS), eq(capa), anyInt(), eq(true)); verify(mIFeatureProvisioningCallback0, times(RADIO_TECHS.length)) .onRcsFeatureProvisioningChanged(eq(capa), anyInt(), eq(true)); - verify(mImsConfig, times(1)).setConfig(eq(key), eq(PROVISIONING_VALUE_ENABLED)); + // verify whether ImsConfig is called or not + // EAB provisioning status should be updated to both the Rcs and MmTel ImsService + verify(mImsConfig, times(2)).setConfig(eq(key), eq(PROVISIONING_VALUE_ENABLED)); verifyNoMoreInteractions(mIFeatureProvisioningCallback0); verifyNoMoreInteractions(mIFeatureProvisioningCallback1); @@ -1342,7 +1348,7 @@ public class ImsProvisioningControllerTest { // check return value assertEquals(PROVISIONING_VALUE_ENABLED, result); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(1)).getProvisioningStatus(eq(mSubId0), eq(FEATURE_MMTEL), eq(capas[i]), eq(techs[i])); } @@ -1358,7 +1364,7 @@ public class ImsProvisioningControllerTest { // check return value assertEquals(PROVISIONING_VALUE_ENABLED, result); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(1)).getProvisioningStatus( eq(mSubId0), eq(FEATURE_RCS), eq(capa), anyInt()); @@ -1446,18 +1452,18 @@ public class ImsProvisioningControllerTest { // check return value assertEquals(PROVISIONING_VALUE_ENABLED, result); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(1)).getProvisioningStatus(eq(mSubId0), eq(FEATURE_MMTEL), eq(capas[i]), eq(techs[i])); - // verify weather ImsConfig is called or not + // verify whether ImsConfig is called or not verify(mImsConfig, times(1)).getConfigInt(eq(keys[i])); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(1)).setProvisioningStatus(eq(mSubId0), eq(FEATURE_MMTEL), eq(capas[i]), eq(techs[i]), eq(true)); - // verify weather callback is called or not + // verify whether callback is called or not verify(mIFeatureProvisioningCallback0, times(1)).onFeatureProvisioningChanged( eq(capas[i]), eq(techs[i]), eq(true)); } @@ -1474,18 +1480,18 @@ public class ImsProvisioningControllerTest { // check return value assertEquals(PROVISIONING_VALUE_ENABLED, result); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(1)).getProvisioningStatus( eq(mSubId0), eq(FEATURE_RCS), eq(capa), anyInt()); - // verify weather ImsConfig is called or not + // verify whether ImsConfig is called or not verify(mImsConfig, times(1)).getConfigInt(eq(key)); - // verify weather ImsProvisioningLoader is called or not + // verify whether ImsProvisioningLoader is called or not verify(mImsProvisioningLoader, times(RADIO_TECHS.length)).setProvisioningStatus( eq(mSubId0), eq(FEATURE_RCS), eq(capa), anyInt(), eq(true)); - // verify weather callback is called or not + // verify whether callback is called or not verify(mIFeatureProvisioningCallback0, times(RADIO_TECHS.length)) .onRcsFeatureProvisioningChanged(eq(capa), anyInt(), eq(true)); @@ -1582,7 +1588,7 @@ public class ImsProvisioningControllerTest { capability, tech, !provisioned); processAllMessages(); - // verify weather Callback is called or not + // verify whether Callback is called or not verify(mIFeatureProvisioningCallback1, times(1)) .onFeatureProvisioningChanged(eq(capability), eq(tech), eq(!provisioned)); @@ -1591,6 +1597,145 @@ public class ImsProvisioningControllerTest { clearInvocations(mImsConfig); } + @Test + @SmallTest + public void eabProvisioningStatus_onlyMmTelConnectionReady() throws Exception { + createImsProvisioningController(); + + mMmTelConnectorListener0.getValue().connectionReady(mImsManager, mSubId0); + processAllMessages(); + + // add callback with valid obj + mTestImsProvisioningController.addFeatureProvisioningChangedCallback( + mSubId0, mIFeatureProvisioningCallback0); + + clearInvocations(mIFeatureProvisioningCallback0); + clearInvocations(mImsConfig); + clearInvocations(mImsProvisioningLoader); + + // provisioning required capability + // presence, all tech + setCarrierConfig(mSubId0, + CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY, RADIO_TECHS); + + // provisioning Status, all of provisioning status is not set + mRcsProvisioningStorage = new int[][]{ + {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE, -1}, + {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_IWLAN, -1}, + {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_CROSS_SIM, -1}, + {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_NR, -1} + }; + + // provisioning status in ImsService + mImsConfigStorage = new int[][] { + {KEY_EAB_PROVISIONING_STATUS, 1} + }; + + // Rcs keys + int key = KEY_EAB_PROVISIONING_STATUS; + int capa = CAPABILITY_TYPE_PRESENCE_UCE; + int tech = REGISTRATION_TECH_LTE; + + int result = mTestImsProvisioningController.getProvisioningValue(mSubId0, key); + processAllMessages(); + + // check return value + assertEquals(PROVISIONING_VALUE_ENABLED, result); + + // verify whether ImsProvisioningLoader is called or not + verify(mImsProvisioningLoader, times(1)).getProvisioningStatus( + eq(mSubId0), eq(FEATURE_RCS), eq(capa), anyInt()); + + // even if ImsConfig is not available in RcsFeatureListener, ImsConfig in + // MmTelFeatureListener will be called. + verify(mImsConfig, times(1)).getConfigInt( + eq(KEY_EAB_PROVISIONING_STATUS)); + + // verify whether ImsProvisioningLoader is called or not + verify(mImsProvisioningLoader, times(RADIO_TECHS.length)).setProvisioningStatus( + eq(mSubId0), eq(FEATURE_RCS), eq(capa), anyInt(), eq(true)); + + verifyNoMoreInteractions(mImsConfig); + verifyNoMoreInteractions(mImsProvisioningLoader); + + clearInvocations(mImsConfig); + clearInvocations(mImsProvisioningLoader); + + mTestImsProvisioningController.setProvisioningValue(mSubId0, key, + PROVISIONING_VALUE_DISABLED); + processAllMessages(); + + // verify whether ImsProvisioningLoader is called or not + verify(mImsProvisioningLoader, times(RADIO_TECHS.length)).setProvisioningStatus( + eq(mSubId0), eq(FEATURE_RCS), eq(capa), anyInt(), eq(false)); + + // even if ImsConfig is not available in RcsFeatureListener, ImsConfig in + // MmTelFeatureListener will be called. + verify(mImsConfig, times(1)).setConfig( + eq(KEY_EAB_PROVISIONING_STATUS), eq(PROVISIONING_VALUE_DISABLED)); + + verifyNoMoreInteractions(mImsConfig); + verifyNoMoreInteractions(mImsProvisioningLoader); + + clearInvocations(mImsConfig); + clearInvocations(mImsProvisioningLoader); + + // reset provisioning status, all of provisioning status is not set + mRcsProvisioningStorage = new int[][]{ + {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE, -1}, + {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_IWLAN, -1}, + {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_CROSS_SIM, -1}, + {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_NR, -1} + }; + + // reset provisioning status in ImsService + mImsConfigStorage = new int[][] { + {KEY_EAB_PROVISIONING_STATUS, 1} + }; + + boolean expected = true; + boolean provisioned = mTestImsProvisioningController.getRcsProvisioningStatusForCapability( + mSubId0, capa, tech); + processAllMessages(); + + assertEquals(expected, provisioned); + + // verify whether ImsProvisioningLoader is called or not + verify(mImsProvisioningLoader, times(1)).getProvisioningStatus( + eq(mSubId0), eq(FEATURE_RCS), eq(capa), eq(tech)); + + // even if ImsConfig is not available in RcsFeatureListener, ImsConfig in + // MmTelFeatureListener will be called. + verify(mImsConfig, times(1)).getConfigInt( + eq(KEY_EAB_PROVISIONING_STATUS)); + + // verify whether ImsProvisioningLoader is called or not + verify(mImsProvisioningLoader, times(RADIO_TECHS.length)).setProvisioningStatus( + eq(mSubId0), eq(FEATURE_RCS), eq(capa), anyInt(), eq(true)); + + verifyNoMoreInteractions(mImsConfig); + verifyNoMoreInteractions(mImsProvisioningLoader); + + clearInvocations(mImsConfig); + clearInvocations(mImsProvisioningLoader); + + mTestImsProvisioningController.setRcsProvisioningStatusForCapability( + mSubId0, capa, tech, !expected); + processAllMessages(); + + // verify whether ImsProvisioningLoader is called or not + verify(mImsProvisioningLoader, times(1)).setProvisioningStatus( + eq(mSubId0), eq(FEATURE_RCS), eq(capa), eq(tech), eq(!expected)); + + // even if ImsConfig is not available in RcsFeatureListener, ImsConfig in + // MmTelFeatureListener will be called. + verify(mImsConfig, times(1)).setConfig( + eq(KEY_EAB_PROVISIONING_STATUS), eq(PROVISIONING_VALUE_DISABLED)); + + verifyNoMoreInteractions(mImsConfig); + verifyNoMoreInteractions(mImsProvisioningLoader); + } + private void createImsProvisioningController() throws Exception { if (Looper.myLooper() == null) { Looper.prepare(); |