When vendor ImsService changed provisioning data, which should be updated in AOSP
When vendor ImsService changed provisioning data, which should be updated in AOSP.
Catch the event using IImsConfigCallback.
Bug: 243835885
Test: atest ImsProvisioningControllerTest
Test: manual oriole, tm-dev, VZW SIM
1. flash and reboot
2. hidden menu *#*#...
3. change provisioning status VoLTE, VT and VoWiFi
4. check text-based log
Change-Id: I6474f6d44101acf55157fbe3eca179b78f07d225
diff --git a/src/com/android/phone/ImsProvisioningController.java b/src/com/android/phone/ImsProvisioningController.java
index 696f567..6a6b155 100644
--- a/src/com/android/phone/ImsProvisioningController.java
+++ b/src/com/android/phone/ImsProvisioningController.java
@@ -41,6 +41,7 @@
import android.annotation.Nullable;
import android.content.Context;
import android.os.AsyncResult;
+import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
@@ -55,6 +56,7 @@
import android.telephony.ims.ProvisioningManager;
import android.telephony.ims.aidl.IFeatureProvisioningCallback;
import android.telephony.ims.aidl.IImsConfig;
+import android.telephony.ims.aidl.IImsConfigCallback;
import android.telephony.ims.feature.MmTelFeature.MmTelCapabilities;
import android.telephony.ims.feature.RcsFeature.RcsImsCapabilities;
import android.telephony.ims.stub.ImsConfigImplBase;
@@ -89,6 +91,7 @@
private static final int EVENT_PROVISIONING_CAPABILITY_CHANGED = 2;
@VisibleForTesting
protected static final int EVENT_MULTI_SIM_CONFIGURATION_CHANGE = 3;
+ private static final int EVENT_PROVISIONING_VALUE_CHANGED = 4;
// Provisioning Keys that are handled via AOSP cache and not sent to the ImsService
private static final int[] LOCAL_IMS_CONFIG_KEYS = {
@@ -245,6 +248,11 @@
int activeModemCount = (int) ((AsyncResult) msg.obj).result;
onMultiSimConfigChanged(activeModemCount);
break;
+ case EVENT_PROVISIONING_VALUE_CHANGED:
+ log("subId " + msg.arg1 + " changed provisioning value item : " + msg.arg2
+ + " value : " + (int) msg.obj);
+ updateCapabilityTechFromKey(msg.arg1, msg.arg2, (int) msg.obj);
+ break;
default:
log("unknown message " + msg);
break;
@@ -366,12 +374,15 @@
private boolean mRequiredNotify = false;
private int mSubId;
private int mSlotId;
+ private ConfigCallback mConfigCallback;
MmTelFeatureListener(int slotId) {
log(LOG_PREFIX, slotId, "created");
mSlotId = slotId;
mSubId = getSubId(slotId);
+ mConfigCallback = new ConfigCallback(mSubId);
+
mConnector = mMmTelFeatureConnector.create(
mApp, slotId, TAG, this, new HandlerExecutor(mHandler));
mConnector.connect();
@@ -389,10 +400,22 @@
mSubId = subId;
mSlotId = getSlotId(subId);
+ mConfigCallback.setSubId(subId);
}
public void destroy() {
log("destroy");
+ if (mImsManager != null) {
+ try {
+ ImsConfig imsConfig = getImsConfig(mImsManager);
+ if (imsConfig != null) {
+ imsConfig.removeConfigCallback(mConfigCallback);
+ }
+ } catch (ImsException e) {
+ logw(LOG_PREFIX, mSlotId, "destroy : " + e.getMessage());
+ }
+ }
+ mConfigCallback = null;
mConnector.disconnect();
mConnector = null;
mReady = false;
@@ -409,6 +432,17 @@
mReady = true;
mImsManager = manager;
+ if (mImsManager != null) {
+ try {
+ ImsConfig imsConfig = getImsConfig(mImsManager);
+ if (imsConfig != null) {
+ imsConfig.addConfigCallback(mConfigCallback);
+ }
+ } catch (ImsException e) {
+ logw(LOG_PREFIX, mSlotId, "addConfigCallback : " + e.getMessage());
+ }
+ }
+
onMmTelAvailable();
}
@@ -572,12 +606,15 @@
private boolean mRequiredNotify = false;
private int mSubId;
private int mSlotId;
+ private ConfigCallback mConfigCallback;
RcsFeatureListener(int slotId) {
log(LOG_PREFIX, slotId, "created");
mSlotId = slotId;
mSubId = getSubId(slotId);
+ mConfigCallback = new ConfigCallback(mSubId);
+
mConnector = mRcsFeatureConnector.create(
mApp, slotId, this, new HandlerExecutor(mHandler), TAG);
mConnector.connect();
@@ -595,10 +632,22 @@
mSubId = subId;
mSlotId = getSlotId(subId);
+ mConfigCallback.setSubId(subId);
}
public void destroy() {
log(LOG_PREFIX, mSlotId, "destroy");
+ if (mRcsFeatureManager != null) {
+ try {
+ ImsConfig imsConfig = getImsConfig(mRcsFeatureManager.getConfig());
+ if (imsConfig != null) {
+ imsConfig.removeConfigCallback(mConfigCallback);
+ }
+ } catch (ImsException e) {
+ logw(LOG_PREFIX, mSlotId, "destroy :" + e.getMessage());
+ }
+ }
+ mConfigCallback = null;
mConnector.disconnect();
mConnector = null;
mReady = false;
@@ -611,6 +660,17 @@
mReady = true;
mRcsFeatureManager = manager;
+ if (mRcsFeatureManager != null) {
+ try {
+ ImsConfig imsConfig = getImsConfig(mRcsFeatureManager.getConfig());
+ if (imsConfig != null) {
+ imsConfig.addConfigCallback(mConfigCallback);
+ }
+ } catch (ImsException e) {
+ logw(LOG_PREFIX, mSlotId, "addConfigCallback :" + e.getMessage());
+ }
+ }
+
onRcsAvailable();
}
@@ -726,6 +786,42 @@
}
}
+ // When vendor ImsService changed provisioning data, which should be updated in AOSP.
+ // Catch the event using IImsConfigCallback.
+ private final class ConfigCallback extends IImsConfigCallback.Stub {
+ private int mSubId;
+
+ ConfigCallback(int subId) {
+ mSubId = subId;
+ }
+
+ public void setSubId(int subId) {
+ mSubId = subId;
+ }
+
+ @Override
+ public void onIntConfigChanged(int item, int value) throws RemoteException {
+ if (!Arrays.stream(LOCAL_IMS_CONFIG_KEYS).anyMatch(keyValue -> keyValue == item)) {
+ return;
+ }
+
+ final long callingIdentity = Binder.clearCallingIdentity();
+ try {
+ if (mHandler != null) {
+ mHandler.sendMessage(mHandler.obtainMessage(
+ EVENT_PROVISIONING_VALUE_CHANGED, mSubId, item, (Object) value));
+ }
+ } finally {
+ Binder.restoreCallingIdentity(callingIdentity);
+ }
+ }
+
+ @Override
+ public void onStringConfigChanged(int item, String value) throws RemoteException {
+ // Ignore this callback.
+ }
+ }
+
/**
* Do NOT use this directly, instead use {@link #getInstance()}.
*/