Merge "Allow REQUEST_NOT_SUPPORTED for nr dual connectivity config"
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index ef83ead..ae6f072 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -30,6 +30,9 @@
 import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerExecutor;
+import android.os.Looper;
 import android.os.PersistableBundle;
 import android.os.UserManager;
 import android.preference.Preference;
@@ -40,8 +43,8 @@
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telephony.CarrierConfigManager;
-import android.telephony.PhoneStateListener;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyCallback;
 import android.telephony.TelephonyManager;
 import android.telephony.ims.ProvisioningManager;
 import android.telephony.ims.feature.ImsFeature;
@@ -103,6 +106,7 @@
     private ImsManager mImsMgr;
     private SubscriptionInfoHelper mSubscriptionInfoHelper;
     private TelecomManager mTelecomManager;
+    private TelephonyCallback mTelephonyCallback;
 
     private SwitchPreference mButtonAutoRetry;
     private PreferenceScreen mVoicemailSettingsScreen;
@@ -263,6 +267,7 @@
         mSubscriptionInfoHelper.setActionBarTitle(
                 getActionBar(), getResourcesForSubId(), R.string.call_settings_with_label);
         mTelecomManager = getSystemService(TelecomManager.class);
+        mTelephonyCallback = new CallFeaturesTelephonyCallback();
     }
 
     private void updateImsManager(Phone phone) {
@@ -279,11 +284,16 @@
     private void listenPhoneState(boolean listen) {
         TelephonyManager telephonyManager = getSystemService(TelephonyManager.class)
                 .createForSubscriptionId(mPhone.getSubId());
-        telephonyManager.listen(mPhoneStateListener, listen
-                ? PhoneStateListener.LISTEN_CALL_STATE : PhoneStateListener.LISTEN_NONE);
+        if (listen) {
+            telephonyManager.registerTelephonyCallback(
+                    new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback);
+        } else {
+            telephonyManager.unregisterTelephonyCallback(mTelephonyCallback);
+        }
     }
 
-    private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+    private final class CallFeaturesTelephonyCallback extends TelephonyCallback implements
+            TelephonyCallback.CallStateListener {
         @Override
         public void onCallStateChanged(int state, String incomingNumber) {
             if (DBG) log("PhoneStateListener onCallStateChanged: state is " + state);
diff --git a/src/com/android/phone/CallNotifier.java b/src/com/android/phone/CallNotifier.java
index 6c18623..1a867b6 100644
--- a/src/com/android/phone/CallNotifier.java
+++ b/src/com/android/phone/CallNotifier.java
@@ -25,13 +25,14 @@
 import android.media.ToneGenerator;
 import android.os.AsyncResult;
 import android.os.Handler;
+import android.os.HandlerExecutor;
 import android.os.Message;
 import android.os.SystemProperties;
 import android.telecom.TelecomManager;
-import android.telephony.PhoneStateListener;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
+import android.telephony.TelephonyCallback;
 import android.telephony.TelephonyManager;
 import android.util.ArrayMap;
 import android.util.Log;
@@ -68,8 +69,8 @@
     /** The singleton instance. */
     private static CallNotifier sInstance;
 
-    private Map<Integer, CallNotifierPhoneStateListener> mPhoneStateListeners =
-            new ArrayMap<Integer, CallNotifierPhoneStateListener>();
+    private Map<Integer, CallNotifierTelephonyCallback> mTelephonyCallback =
+            new ArrayMap<Integer, CallNotifierTelephonyCallback>();
     private Map<Integer, Boolean> mCFIStatus = new ArrayMap<Integer, Boolean>();
     private Map<Integer, Boolean> mMWIStatus = new ArrayMap<Integer, Boolean>();
     private PhoneGlobals mApplication;
@@ -566,7 +567,7 @@
         // slot 0 first then slot 1. This is needed to ensure that when CFI or MWI is enabled for
         // both slots, user always sees icon related to slot 0 on left side followed by that of
         // slot 1.
-        List<Integer> subIdList = new ArrayList<Integer>(mPhoneStateListeners.keySet());
+        List<Integer> subIdList = new ArrayList<Integer>(mTelephonyCallback.keySet());
         Collections.sort(subIdList, new Comparator<Integer>() {
             public int compare(Integer sub1, Integer sub2) {
                 int slotId1 = SubscriptionController.getInstance().getSlotIndex(sub1);
@@ -583,10 +584,9 @@
                 mApplication.notificationMgr.updateMwi(subId, false);
                 mApplication.notificationMgr.updateCfi(subId, false);
 
-                // Listening to LISTEN_NONE removes the listener.
-                mTelephonyManager.listen(
-                        mPhoneStateListeners.get(subId), PhoneStateListener.LISTEN_NONE);
-                mPhoneStateListeners.remove(subId);
+                // Unregister the listener.
+                mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback.get(subId));
+                mTelephonyCallback.remove(subId);
             } else {
                 Log.d(LOG_TAG, "updatePhoneStateListeners: update CF notifications.");
 
@@ -616,12 +616,11 @@
         // Register new phone listeners for active subscriptions.
         for (int i = 0; i < subInfos.size(); i++) {
             int subId = subInfos.get(i).getSubscriptionId();
-            if (!mPhoneStateListeners.containsKey(subId)) {
-                CallNotifierPhoneStateListener listener = new CallNotifierPhoneStateListener(subId);
-                mTelephonyManager.createForSubscriptionId(subId).listen(listener,
-                        PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR
-                        | PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR);
-                mPhoneStateListeners.put(subId, listener);
+            if (!mTelephonyCallback.containsKey(subId)) {
+                CallNotifierTelephonyCallback listener = new CallNotifierTelephonyCallback(subId);
+                mTelephonyManager.createForSubscriptionId(subId).registerTelephonyCallback(
+                        new HandlerExecutor(this), listener);
+                mTelephonyCallback.put(subId, listener);
             }
         }
     }
@@ -768,10 +767,13 @@
                 }
             };
 
-    private class CallNotifierPhoneStateListener extends PhoneStateListener {
+    private class CallNotifierTelephonyCallback extends TelephonyCallback implements
+            TelephonyCallback.MessageWaitingIndicatorListener,
+            TelephonyCallback.CallForwardingIndicatorListener {
+
         private final int mSubId;
 
-        CallNotifierPhoneStateListener(int subId) {
+        CallNotifierTelephonyCallback(int subId) {
             super();
             this.mSubId = subId;
         }
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 75234be..46559d6 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -159,6 +159,7 @@
 import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.ProxyController;
 import com.android.internal.telephony.RIL;
+import com.android.internal.telephony.RadioInterfaceCapabilityController;
 import com.android.internal.telephony.ServiceStateTracker;
 import com.android.internal.telephony.SmsController;
 import com.android.internal.telephony.SmsPermissions;
@@ -341,6 +342,7 @@
     private SubscriptionController mSubscriptionController;
     private SharedPreferences mTelephonySharedPreferences;
     private PhoneConfigurationManager mPhoneConfigurationManager;
+    private final RadioInterfaceCapabilityController mRadioInterfaceCapabilities;
 
     /** User Activity */
     private AtomicBoolean mNotifyUserActivity;
@@ -861,6 +863,10 @@
                                 request.result =
                                         TelephonyManager
                                                 .ENABLE_NR_DUAL_CONNECTIVITY_RADIO_NOT_AVAILABLE;
+                            } else if (error == CommandException.Error.REQUEST_NOT_SUPPORTED) {
+                                request.result =
+                                        TelephonyManager
+                                                .ENABLE_NR_DUAL_CONNECTIVITY_NOT_SUPPORTED;
                             }
                             loge("enableNrDualConnectivity" + ": CommandException: "
                                     + ar.exception);
@@ -2091,6 +2097,7 @@
                 PreferenceManager.getDefaultSharedPreferences(mApp);
         mNetworkScanRequestTracker = new NetworkScanRequestTracker();
         mPhoneConfigurationManager = PhoneConfigurationManager.getInstance();
+        mRadioInterfaceCapabilities = RadioInterfaceCapabilityController.getInstance();
         mNotifyUserActivity = new AtomicBoolean(false);
 
         publish();
@@ -2798,9 +2805,7 @@
             if (sst == null) return "";
             LocaleTracker lt = sst.getLocaleTracker();
             if (lt == null) return "";
-            if (!TextUtils.isEmpty(lt.getCurrentCountry())) return lt.getCurrentCountry();
-            EmergencyNumberTracker ent = phone.getEmergencyNumberTracker();
-            return (ent == null) ? "" : ent.getEmergencyCountryIso();
+            return lt.getCurrentCountry();
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
@@ -9315,7 +9320,7 @@
     public boolean isRadioInterfaceCapabilitySupported(
             @NonNull @TelephonyManager.RadioInterfaceCapability String capability) {
         Set<String> radioInterfaceCapabilities =
-                mPhoneConfigurationManager.getRadioInterfaceCapabilities();
+                mRadioInterfaceCapabilities.getCapabilities();
         if (radioInterfaceCapabilities == null) {
             throw new RuntimeException("radio interface capabilities are not available");
         } else {
@@ -9631,10 +9636,10 @@
      * Register RCS provisioning callback.
      */
     @Override
-    public void registerRcsProvisioningChangedCallback(int subId,
+    public void registerRcsProvisioningCallback(int subId,
             IRcsConfigCallback callback) {
         TelephonyPermissions.enforceAnyPermissionGrantedOrCarrierPrivileges(mApp, subId,
-                Binder.getCallingUid(), "registerRcsProvisioningChangedCallback",
+                Binder.getCallingUid(), "registerRcsProvisioningCallback",
                 Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION,
                 permission.READ_PRIVILEGED_PHONE_STATE);
 
@@ -9649,7 +9654,7 @@
         final long identity = Binder.clearCallingIdentity();
         try {
             if (!RcsProvisioningMonitor.getInstance()
-                    .registerRcsProvisioningChangedCallback(subId, callback)) {
+                    .registerRcsProvisioningCallback(subId, callback)) {
                 throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
                         "Service not available for the subscription.");
             }
@@ -9662,10 +9667,10 @@
      * Unregister RCS provisioning callback.
      */
     @Override
-    public void unregisterRcsProvisioningChangedCallback(int subId,
+    public void unregisterRcsProvisioningCallback(int subId,
             IRcsConfigCallback callback) {
         TelephonyPermissions.enforceAnyPermissionGrantedOrCarrierPrivileges(mApp, subId,
-                Binder.getCallingUid(), "unregisterRcsProvisioningChangedCallback",
+                Binder.getCallingUid(), "unregisterRcsProvisioningCallback",
                 Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION,
                 permission.READ_PRIVILEGED_PHONE_STATE);
 
@@ -9680,7 +9685,7 @@
         final long identity = Binder.clearCallingIdentity();
         try {
             RcsProvisioningMonitor.getInstance()
-                    .unregisterRcsProvisioningChangedCallback(subId, callback);
+                    .unregisterRcsProvisioningCallback(subId, callback);
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
diff --git a/src/com/android/phone/RcsProvisioningMonitor.java b/src/com/android/phone/RcsProvisioningMonitor.java
index 2191e28..bcf1491 100644
--- a/src/com/android/phone/RcsProvisioningMonitor.java
+++ b/src/com/android/phone/RcsProvisioningMonitor.java
@@ -558,13 +558,13 @@
     }
 
     /**
-     * Called when the application registers rcs provisioning changed callback
+     * Called when the application registers rcs provisioning callback
      */
-    public boolean registerRcsProvisioningChangedCallback(int subId, IRcsConfigCallback cb) {
+    public boolean registerRcsProvisioningCallback(int subId, IRcsConfigCallback cb) {
         RcsProvisioningInfo info = mRcsProvisioningInfos.get(subId);
         // should not happen in normal case
         if (info == null) {
-            logd("fail to register rcs provisioning changed due to subscription unavailable");
+            logd("fail to register rcs provisioning callback due to subscription unavailable");
             return false;
         }
 
@@ -572,9 +572,9 @@
     }
 
     /**
-     * Called when the application unregisters rcs provisioning changed callback
+     * Called when the application unregisters rcs provisioning callback
      */
-    public boolean unregisterRcsProvisioningChangedCallback(int subId, IRcsConfigCallback cb) {
+    public boolean unregisterRcsProvisioningCallback(int subId, IRcsConfigCallback cb) {
         RcsProvisioningInfo info = mRcsProvisioningInfos.get(subId);
         // should not happen in normal case
         if (info == null) {
diff --git a/src/com/android/phone/TelephonyShellCommand.java b/src/com/android/phone/TelephonyShellCommand.java
index 74d6b57..5bd810c 100644
--- a/src/com/android/phone/TelephonyShellCommand.java
+++ b/src/com/android/phone/TelephonyShellCommand.java
@@ -114,6 +114,9 @@
     private static final String UCE_GET_DEVICE_ENABLED = "get-device-enabled";
     private static final String UCE_SET_DEVICE_ENABLED = "set-device-enabled";
 
+    // Check if a package has carrier privileges on any SIM, regardless of subId/phoneId.
+    private static final String HAS_CARRIER_PRIVILEGES_COMMAND = "has-carrier-privileges";
+
     // Take advantage of existing methods that already contain permissions checks when possible.
     private final ITelephony mInterface;
 
@@ -206,6 +209,8 @@
                 return handleRestartModemCommand();
             case UNATTENDED_REBOOT:
                 return handleUnattendedReboot();
+            case HAS_CARRIER_PRIVILEGES_COMMAND:
+                return handleHasCarrierPrivilegesCommand();
             default: {
                 return handleDefaultCommands(cmd);
             }
@@ -238,6 +243,8 @@
         pw.println("    Restart modem command.");
         pw.println("  unattended-reboot");
         pw.println("    Prepare for unattended reboot.");
+        pw.println("  has-carrier-privileges [package]");
+        pw.println("    Query carrier privilege status for a package. Prints true or false.");
         onHelpIms();
         onHelpUce();
         onHelpEmergencyNumber();
@@ -666,7 +673,7 @@
             errPw.println("message value must be a valid integer");
             return -1;
         }
-        
+
         try {
             mInterface.sendDeviceToDeviceMessage(messageType, messageValue);
         } catch (RemoteException e) {
@@ -1866,4 +1873,22 @@
         getOutPrintWriter().println(result);
         return 0;
     }
+
+    private int handleHasCarrierPrivilegesCommand() {
+        String packageName = getNextArgRequired();
+
+        boolean hasCarrierPrivileges;
+        try {
+            hasCarrierPrivileges =
+                    mInterface.checkCarrierPrivilegesForPackageAnyPhone(packageName)
+                            == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
+        } catch (RemoteException e) {
+            Log.w(LOG_TAG, HAS_CARRIER_PRIVILEGES_COMMAND + " exception", e);
+            getErrPrintWriter().println("Exception: " + e.getMessage());
+            return -1;
+        }
+
+        getOutPrintWriter().println(hasCarrierPrivileges);
+        return 0;
+    }
 }
diff --git a/src/com/android/phone/settings/AccessibilitySettingsFragment.java b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
index ad3f133..8355fa6 100644
--- a/src/com/android/phone/settings/AccessibilitySettingsFragment.java
+++ b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
@@ -19,6 +19,9 @@
 import android.content.Context;
 import android.media.AudioManager;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerExecutor;
+import android.os.Looper;
 import android.os.PersistableBundle;
 import android.preference.Preference;
 import android.preference.PreferenceFragment;
@@ -27,8 +30,8 @@
 import android.provider.Settings;
 import android.telephony.AccessNetworkConstants;
 import android.telephony.CarrierConfigManager;
-import android.telephony.PhoneStateListener;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyCallback;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.Log;
@@ -56,13 +59,10 @@
 
     private static final int WFC_QUERY_TIMEOUT_MILLIS = 20;
 
-    private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
-        /**
-         * Disable the TTY setting when in/out of a call (and if carrier doesn't
-         * support VoLTE with TTY).
-         * @see android.telephony.PhoneStateListener#onCallStateChanged(int,
-         * java.lang.String)
-         */
+    private final TelephonyCallback mTelephonyCallback = new AccessibilityTelephonyCallback();
+
+    private final class AccessibilityTelephonyCallback extends TelephonyCallback implements
+            TelephonyCallback.CallStateListener {
         @Override
         public void onCallStateChanged(int state, String incomingNumber) {
             if (DBG) Log.d(LOG_TAG, "PhoneStateListener.onCallStateChanged: state=" + state);
@@ -148,7 +148,8 @@
         super.onResume();
         TelephonyManager tm =
                 (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
-        tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
+        tm.registerTelephonyCallback(new HandlerExecutor(new Handler(Looper.getMainLooper())),
+                mTelephonyCallback);
     }
 
     @Override
@@ -156,7 +157,7 @@
         super.onPause();
         TelephonyManager tm =
                 (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
-        tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+        tm.unregisterTelephonyCallback(mTelephonyCallback);
     }
 
     @Override
diff --git a/src/com/android/phone/settings/RadioInfo.java b/src/com/android/phone/settings/RadioInfo.java
index b7a413c..3f4ae58 100644
--- a/src/com/android/phone/settings/RadioInfo.java
+++ b/src/com/android/phone/settings/RadioInfo.java
@@ -36,6 +36,7 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.HandlerExecutor;
 import android.os.Message;
 import android.os.PersistableBundle;
 import android.os.SystemProperties;
@@ -56,13 +57,13 @@
 import android.telephony.CellSignalStrengthWcdma;
 import android.telephony.DataSpecificRegistrationInfo;
 import android.telephony.NetworkRegistrationInfo;
-import android.telephony.PhoneStateListener;
 import android.telephony.PhysicalChannelConfig;
 import android.telephony.PreciseCallState;
 import android.telephony.RadioAccessFamily;
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyCallback;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.Log;
@@ -295,10 +296,20 @@
     };
 
     // not final because we need to recreate this object to register on a new subId (b/117555407)
-    private PhoneStateListener mPhoneStateListener = new RadioInfoPhoneStateListener();
-    private class RadioInfoPhoneStateListener extends PhoneStateListener {
+    private TelephonyCallback mTelephonyCallback = new RadioInfoTelephonyCallback();
+    private class RadioInfoTelephonyCallback extends TelephonyCallback implements
+            TelephonyCallback.DataConnectionStateListener,
+            TelephonyCallback.DataActivityListener,
+            TelephonyCallback.CallStateListener,
+            TelephonyCallback.MessageWaitingIndicatorListener,
+            TelephonyCallback.CallForwardingIndicatorListener,
+            TelephonyCallback.CellInfoListener,
+            TelephonyCallback.SignalStrengthsListener,
+            TelephonyCallback.ServiceStateListener, 
+            TelephonyCallback.PreciseCallStateListener {
+
         @Override
-        public void onDataConnectionStateChanged(int state) {
+        public void onDataConnectionStateChanged(int state, int networkType) {
             updateDataState();
             updateNetworkType();
         }
@@ -673,7 +684,7 @@
 
         log("onPause: unregister phone & data intents");
 
-        mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+        mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback);
         mTelephonyManager.setCellInfoListRate(sCellInfoListRateDisabled);
         mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
 
@@ -774,7 +785,7 @@
     }
 
     private void unregisterPhoneStateListener() {
-        mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+        mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback);
         mPhone.unregisterForPhysicalChannelConfig(mHandler);
 
         // clear all fields so they are blank until the next listener event occurs
@@ -796,21 +807,11 @@
         mPhyChanConfig.setText("");
     }
 
-    // register mPhoneStateListener for relevant fields using the current TelephonyManager
+    // register mTelephonyCallback for relevant fields using the current TelephonyManager
     private void registerPhoneStateListener() {
-        mPhoneStateListener = new RadioInfoPhoneStateListener();
-        mTelephonyManager.listen(mPhoneStateListener,
-                  PhoneStateListener.LISTEN_CALL_STATE
-        //b/27803938 - RadioInfo currently cannot read PRECISE_CALL_STATE
-        //      | PhoneStateListener.LISTEN_PRECISE_CALL_STATE
-                | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
-                | PhoneStateListener.LISTEN_DATA_ACTIVITY
-                | PhoneStateListener.LISTEN_CELL_LOCATION
-                | PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR
-                | PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR
-                | PhoneStateListener.LISTEN_CELL_INFO
-                | PhoneStateListener.LISTEN_SERVICE_STATE
-                | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
+        mTelephonyCallback = new RadioInfoTelephonyCallback();
+        mTelephonyManager.registerTelephonyCallback(new HandlerExecutor(mHandler),
+                mTelephonyCallback);
     }
 
     private void updateDnsCheckState() {
diff --git a/src/com/android/phone/vvm/VvmSimStateTracker.java b/src/com/android/phone/vvm/VvmSimStateTracker.java
index c648d9c..a77bd7b 100644
--- a/src/com/android/phone/vvm/VvmSimStateTracker.java
+++ b/src/com/android/phone/vvm/VvmSimStateTracker.java
@@ -20,13 +20,16 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.os.Handler;
+import android.os.HandlerExecutor;
+import android.os.Looper;
 import android.os.SystemProperties;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telephony.CarrierConfigManager;
-import android.telephony.PhoneStateListener;
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyCallback;
 import android.telephony.TelephonyManager;
 import android.util.ArrayMap;
 import android.util.ArraySet;
@@ -68,7 +71,8 @@
      * Waits for the account to become {@link ServiceState#STATE_IN_SERVICE} and notify the
      * connected event. Will unregister itself once the event has been triggered.
      */
-    private class ServiceStateListener extends PhoneStateListener {
+    private class ServiceStateListener extends TelephonyCallback implements
+            TelephonyCallback.ServiceStateListener  {
 
         private final PhoneAccountHandle mPhoneAccountHandle;
         private final Context mContext;
@@ -84,7 +88,8 @@
                 VvmLog.e(TAG, "Cannot create TelephonyManager from " + mPhoneAccountHandle);
                 return;
             }
-            telephonyManager.listen(this, PhoneStateListener.LISTEN_SERVICE_STATE);
+            telephonyManager.registerTelephonyCallback(
+                    new HandlerExecutor(new Handler(Looper.getMainLooper())), this);
         }
 
         public void unlisten() {
@@ -92,7 +97,7 @@
             // PhoneStateListener, and mPhoneAccountHandle might be invalid at this point
             // (e.g. SIM removal)
             mContext.getSystemService(TelephonyManager.class)
-                    .listen(this, PhoneStateListener.LISTEN_NONE);
+                    .unregisterTelephonyCallback(this);
             sListeners.put(mPhoneAccountHandle, null);
         }
 
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 9d4edfd..9226cae 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -32,6 +32,7 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.HandlerExecutor;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.PersistableBundle;
@@ -42,11 +43,11 @@
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telephony.CarrierConfigManager;
-import android.telephony.PhoneStateListener;
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
+import android.telephony.TelephonyCallback;
 import android.telephony.TelephonyManager;
 import android.telephony.ims.ImsException;
 import android.telephony.ims.ImsMmTelManager;
@@ -113,6 +114,8 @@
     private static final String EXTRA_SUPPORTS_VIDEO_CALLING_FALLBACK =
             "android.telecom.extra.SUPPORTS_VIDEO_CALLING_FALLBACK";
 
+    private Handler mHandler;
+
     final class AccountEntry implements PstnPhoneCapabilitiesNotifier.Listener {
         private final Phone mPhone;
         private PhoneAccount mAccount;
@@ -1078,7 +1081,11 @@
         }
     };
 
-    private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+    private final TelephonyCallback mTelephonyCallback = new TelecomAccountTelephonyCallback();
+
+    private class TelecomAccountTelephonyCallback extends TelephonyCallback implements
+            TelephonyCallback.ActiveDataSubscriptionIdListener,
+            TelephonyCallback.ServiceStateListener {
         @Override
         public void onServiceStateChanged(ServiceState serviceState) {
             int newState = serviceState.getState();
@@ -1144,6 +1151,7 @@
         mTelephonyManager = TelephonyManager.from(context);
         mSubscriptionManager = SubscriptionManager.from(context);
         mHandlerThread.start();
+        mHandler = new Handler(Looper.getMainLooper());
         mRegisterSubscriptionListenerBackoff = new ExponentialBackoff(
                 REGISTER_START_DELAY_MS,
                 REGISTER_MAXIMUM_DELAY_MS,
@@ -1371,8 +1379,8 @@
 
         // We also need to listen for changes to the service state (e.g. emergency -> in service)
         // because this could signal a removal or addition of a SIM in a single SIM phone.
-        mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE
-                | PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE);
+        mTelephonyManager.registerTelephonyCallback(new HandlerExecutor(mHandler),
+                mTelephonyCallback);
 
         // Listen for user switches.  When the user switches, we need to ensure that if the current
         // use is not the primary user we disable video calling.
@@ -1392,8 +1400,7 @@
 
     private void registerContentObservers() {
         // Listen to the RTT system setting so that we update it when the user flips it.
-        ContentObserver rttUiSettingObserver = new ContentObserver(
-                new Handler(Looper.getMainLooper())) {
+        ContentObserver rttUiSettingObserver = new ContentObserver(mHandler) {
             @Override
             public void onChange(boolean selfChange) {
                 synchronized (mAccountsLock) {
@@ -1409,8 +1416,7 @@
                 rttSettingUri, false, rttUiSettingObserver);
 
         // Listen to the changes to the user's Contacts Discovery Setting.
-        ContentObserver contactDiscoveryObserver = new ContentObserver(
-                new Handler(Looper.getMainLooper())) {
+        ContentObserver contactDiscoveryObserver = new ContentObserver(mHandler) {
             @Override
             public void onChange(boolean selfChange) {
                 synchronized (mAccountsLock) {
diff --git a/testapps/TestRcsApp/TestApp/AndroidManifest.xml b/testapps/TestRcsApp/TestApp/AndroidManifest.xml
index 2eea909..05745c8 100644
--- a/testapps/TestRcsApp/TestApp/AndroidManifest.xml
+++ b/testapps/TestRcsApp/TestApp/AndroidManifest.xml
@@ -19,8 +19,8 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.google.android.sample.rcsclient"
-    android:versionCode="6"
-    android:versionName="1.0.5">
+    android:versionCode="7"
+    android:versionName="1.0.6">
 
     <uses-sdk
         android:minSdkVersion="30"
diff --git a/testapps/TestRcsApp/TestApp/res/layout/provision_layout.xml b/testapps/TestRcsApp/TestApp/res/layout/provision_layout.xml
index d98dde2..a70cd4a 100644
--- a/testapps/TestRcsApp/TestApp/res/layout/provision_layout.xml
+++ b/testapps/TestRcsApp/TestApp/res/layout/provision_layout.xml
@@ -11,12 +11,30 @@
         android:layout_height="wrap_content"
         android:orientation="vertical">
 
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/rcs_profile"
+                android:textSize="15dp"
+                android:textStyle="bold" />
+
+            <Spinner
+                android:id="@+id/rcs_profile_list"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+        </LinearLayout>
+
         <Button
             android:id="@+id/provisioning_register_btn"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginTop="10dp"
-            android:text="register"
+            android:text="@string/register_provisioning_callback"
             android:textAllCaps="false" />
 
         <Button
@@ -24,7 +42,7 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginTop="10dp"
-            android:text="unregister"
+            android:text="@string/unregister_provisioning_callback"
             android:textAllCaps="false" />
 
         <Button
@@ -33,7 +51,7 @@
             android:layout_height="wrap_content"
             android:layout_marginTop="10dp"
             android:layout_marginBottom="10dp"
-            android:text="isRcsVolteSingleRegCapable"
+            android:text="@string/isRcsVolteSingleRegCapable"
             android:textAllCaps="false" />
 
         <TextView
diff --git a/testapps/TestRcsApp/TestApp/res/values/donottranslate_strings.xml b/testapps/TestRcsApp/TestApp/res/values/donottranslate_strings.xml
index a193b46..502874f 100644
--- a/testapps/TestRcsApp/TestApp/res/values/donottranslate_strings.xml
+++ b/testapps/TestRcsApp/TestApp/res/values/donottranslate_strings.xml
@@ -6,6 +6,10 @@
     <string name="gba_test">GBA Test</string>
     <string name="test_msg_client">TestMessageClient</string>
     <string name="db_client">DBClient</string>
+    <string name="rcs_profile">RcsProfile:</string>
+    <string name="register_provisioning_callback">registerProvisioningCallback</string>
+    <string name="unregister_provisioning_callback">unRegisterProvisioningCallback</string>
+    <string name="isRcsVolteSingleRegCapable">isRcsVolteSingleRegCapable</string>
     <string name="result">Result:</string>
     <string name="callback_result">Callback Result:</string>
     <string name="initialize_delegate">initializeSipDelegate</string>
@@ -49,6 +53,10 @@
     <string name="registration_failed">Registration failed</string>
     <string name="version_info">Version: %s</string>
 
+    <string-array name="rcs_profile">
+        <item>UP_1.0</item>
+        <item>UP_2.3</item>
+    </string-array>
     <string-array name="organization">
         <item>NONE</item>
         <item>3GPP</item>
diff --git a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ProvisioningActivity.java b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ProvisioningActivity.java
index aa90487..0c2996c 100644
--- a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ProvisioningActivity.java
+++ b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ProvisioningActivity.java
@@ -20,6 +20,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
@@ -32,7 +33,11 @@
 import android.text.method.ScrollingMovementMethod;
 import android.util.Log;
 import android.view.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
 import android.widget.Button;
+import android.widget.Spinner;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
@@ -47,15 +52,27 @@
 public class ProvisioningActivity extends AppCompatActivity {
 
     private static final String TAG = "TestRcsApp.ProvisioningActivity";
+    private static final String UP_10 = "UP_1.0";
+    private static final String UP_23 = "UP_2.3";
+    private static final String V_6 = "6.0";
+    private static final String V_9 = "9.0";
+    private static final String RCS_CONFIG = "CONFIG";
+    private static final String RCS_PROFILE = "RCS_PROFILE";
+    private static final String RCS_VERSION = "RCS_VERSION";
     private static final int MSG_RESULT = 1;
+
     private final ExecutorService mExecutorService = Executors.newSingleThreadExecutor();
     private int mDefaultSmsSubId;
     private ProvisioningManager mProvisioningManager;
+    private Spinner mRcsProfileSpinner;
+    private String mRcsVersion;
+    private String mRcsProfile;
     private Button mRegisterButton;
     private Button mUnRegisterButton;
     private Button mIsCapableButton;
     private TextView mSingleRegResult;
     private TextView mCallbackResult;
+    private SharedPreferences mPref;
     private SingleRegCapabilityReceiver mSingleRegCapabilityReceiver;
     private boolean mIsRegistered = false;
     private Handler mHandler;
@@ -85,10 +102,10 @@
             };
 
     // Static configuration.
-    private static RcsClientConfiguration getDefaultClientConfiguration() {
+    private RcsClientConfiguration getDefaultClientConfiguration() {
         return new RcsClientConfiguration(
-                /*rcsVersion=*/ "6.0",
-                /*rcsProfile=*/ "UP_1.0",
+                /*rcsVersion=*/ mRcsVersion,
+                /*rcsProfile=*/ mRcsProfile,
                 /*clientVendor=*/ "Goog",
                 /*clientVersion=*/ "RCSAndrd-1.0");
     }
@@ -112,6 +129,8 @@
                 }
             }
         };
+        mPref = getSharedPreferences(RCS_CONFIG, MODE_PRIVATE);
+        initRcsProfile();
     }
 
     @Override
@@ -130,7 +149,7 @@
         super.onDestroy();
         this.unregisterReceiver(mSingleRegCapabilityReceiver);
         if (mIsRegistered) {
-            mProvisioningManager.unregisterRcsProvisioningChangedCallback(mCallback);
+            mProvisioningManager.unregisterRcsProvisioningCallback(mCallback);
         }
     }
 
@@ -157,9 +176,9 @@
                 Log.i(TAG, "Using configuration: " + getDefaultClientConfiguration());
                 try {
                     Log.i(TAG, "setRcsClientConfiguration()");
-                    Log.i(TAG, "registerRcsProvisioningChangedCallback()");
+                    Log.i(TAG, "registerRcsProvisioningCallback()");
                     mProvisioningManager.setRcsClientConfiguration(getDefaultClientConfiguration());
-                    mProvisioningManager.registerRcsProvisioningChangedCallback(mExecutorService,
+                    mProvisioningManager.registerRcsProvisioningCallback(mExecutorService,
                             mCallback);
                     mIsRegistered = true;
                 } catch (ImsException e) {
@@ -173,7 +192,7 @@
         });
         mUnRegisterButton.setOnClickListener(view -> {
             if (mProvisioningManager != null) {
-                mProvisioningManager.unregisterRcsProvisioningChangedCallback(mCallback);
+                mProvisioningManager.unregisterRcsProvisioningCallback(mCallback);
                 setClickable(mRegisterButton, false);
                 setClickable(mRegisterButton, true);
                 mIsRegistered = false;
@@ -206,6 +225,44 @@
         return SubscriptionManager.isValidSubscriptionId(mDefaultSmsSubId);
     }
 
+    private void initRcsProfile() {
+        mRcsProfileSpinner = findViewById(R.id.rcs_profile_list);
+        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
+                R.array.rcs_profile, android.R.layout.simple_spinner_item);
+        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+        mRcsProfileSpinner.setAdapter(adapter);
+        mRcsProfileSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+                Log.i(TAG, "rcs profile position:" + position);
+                switch (position) {
+                    case 0:
+                        mRcsProfile = UP_10;
+                        mRcsVersion = V_6;
+                        break;
+                    case 1:
+                        mRcsProfile = UP_23;
+                        mRcsVersion = V_9;
+                        break;
+                    default:
+                        Log.e(TAG, "invalid position:" + position);
+                        return;
+                }
+                mPref.edit().putString(RCS_PROFILE, mRcsProfile)
+                        .putString(RCS_VERSION, mRcsVersion)
+                        .commit();
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+                // TODO Auto-generated method stub
+            }
+        });
+        mRcsProfile = mPref.getString(RCS_PROFILE, UP_10);
+        mRcsVersion = mPref.getString(RCS_VERSION, V_6);
+        mRcsProfileSpinner.setSelection(mRcsProfile.equals(UP_10) ? 0 : 1);
+    }
+
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         if (item.getItemId() == android.R.id.home) {
diff --git a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/UceActivity.java b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/UceActivity.java
index bbecbc2..6835fea 100644
--- a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/UceActivity.java
+++ b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/UceActivity.java
@@ -106,7 +106,7 @@
 
                             public void onComplete() {
                                 Log.i(TAG, "onComplete()");
-                                mCapabilityResult.append("complete");
+                                mCapabilityResult.append("onComplete");
 
                             }
 
diff --git a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/util/ChatManager.java b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/util/ChatManager.java
index 4489349..ec048b8 100644
--- a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/util/ChatManager.java
+++ b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/util/ChatManager.java
@@ -71,7 +71,8 @@
     private ChatManager(Context context, int subId) {
         mContext = context;
         mSubId = subId;
-        mProvisioningController = StaticConfigProvisioningController.createForSubscriptionId(subId);
+        mProvisioningController = StaticConfigProvisioningController.createForSubscriptionId(subId,
+                context);
         ImsManager imsManager = mContext.getSystemService(ImsManager.class);
         mRegistrationController = new RegistrationControllerImpl(subId, mFixedThreadPool,
                 imsManager);
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/provisioning/StaticConfigProvisioningController.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/provisioning/StaticConfigProvisioningController.java
index 350f43c..b8b1f21 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/provisioning/StaticConfigProvisioningController.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/provisioning/StaticConfigProvisioningController.java
@@ -16,6 +16,8 @@
 
 package com.android.libraries.rcs.simpleclient.provisioning;
 
+import android.content.Context;
+import android.content.SharedPreferences;
 import android.os.Build.VERSION_CODES;
 import android.telephony.SubscriptionManager;
 import android.telephony.ims.ImsException;
@@ -24,15 +26,15 @@
 import android.telephony.ims.RcsClientConfiguration;
 import android.util.Log;
 
-import java.util.Optional;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RequiresPermission;
 import androidx.annotation.VisibleForTesting;
 
+import java.util.Optional;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
 /**
  * "Fake" provisioning implementation for supplying a static config when testing ProvisioningManager
  * is unnecessary. State changes are invoked manually.
@@ -45,29 +47,35 @@
     private Optional<RcsProvisioningCallback> storedCallback = Optional.empty();
     private Optional<ProvisioningStateChangeCallback> stateChangeCallback = Optional.empty();
     private Optional<byte[]> configXmlData = Optional.empty();
+    private Context context;
 
-    private StaticConfigProvisioningController(int subId) {
+    private StaticConfigProvisioningController(int subId, Context context) {
         this.provisioningManager = ProvisioningManager.createForSubscriptionId(subId);
+        this.context = context;
     }
 
     @RequiresApi(api = VERSION_CODES.R)
-    public static StaticConfigProvisioningController createWithDefaultSubscriptionId() {
+    public static StaticConfigProvisioningController createWithDefaultSubscriptionId(
+            Context context) {
         return new StaticConfigProvisioningController(
-                SubscriptionManager.getActiveDataSubscriptionId());
+                SubscriptionManager.getActiveDataSubscriptionId(), context);
     }
 
-    public static StaticConfigProvisioningController createForSubscriptionId(int subscriptionId) {
-        return new StaticConfigProvisioningController(subscriptionId);
+    /** Create ProvisioningController */
+    public static StaticConfigProvisioningController createForSubscriptionId(int subscriptionId,
+            Context context) {
+        return new StaticConfigProvisioningController(subscriptionId, context);
     }
 
     // Static configuration.
-    private static RcsClientConfiguration getDefaultClientConfiguration() {
+    private RcsClientConfiguration getDefaultClientConfiguration() {
+        SharedPreferences pref = context.getSharedPreferences("CONFIG", context.MODE_PRIVATE);
 
         return new RcsClientConfiguration(
-                /*rcsVersion=*/ "6.0",
-                /*rcsProfile=*/ "UP_2.3",
+                /*rcsVersion=*/ pref.getString("RCS_VERSION", "6.0"),
+                /*rcsProfile=*/ pref.getString("RCS_PROFILE", "UP_1.0"),
                 /*clientVendor=*/ "Goog",
-                /*clientVersion=*/ "RCSAndrd-1.0");//"RCS fake library 1.0");
+                /*clientVersion=*/ "RCSAndrd-1.0");
     }
 
     @Override
@@ -136,7 +144,7 @@
 
         Log.i(TAG, "Registering the callback.");
         synchronized (this) {
-            provisioningManager.registerRcsProvisioningChangedCallback(executorService, callback);
+            provisioningManager.registerRcsProvisioningCallback(executorService, callback);
             storedCallback = Optional.of(callback);
         }
     }
@@ -147,7 +155,7 @@
             RcsProvisioningCallback callback =
                     storedCallback.orElseThrow(
                             () -> new IllegalStateException("No callback present."));
-            provisioningManager.unregisterRcsProvisioningChangedCallback(callback);
+            provisioningManager.unregisterRcsProvisioningCallback(callback);
             storedCallback = Optional.empty();
         }
     }
diff --git a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
index f77dd55..28c4390 100644
--- a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
+++ b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
@@ -475,13 +475,13 @@
     public void testRegisterThenUnregisterCallback() throws Exception {
         createMonitor(1);
 
-        boolean result = mRcsProvisioningMonitor.registerRcsProvisioningChangedCallback(
+        boolean result = mRcsProvisioningMonitor.registerRcsProvisioningCallback(
                 FAKE_SUB_ID_BASE, mCallback);
 
         assertTrue(result);
         verify(mIImsConfig, times(1)).addRcsConfigCallback(eq(mCallback));
 
-        result = mRcsProvisioningMonitor.unregisterRcsProvisioningChangedCallback(
+        result = mRcsProvisioningMonitor.unregisterRcsProvisioningCallback(
                 FAKE_SUB_ID_BASE, mCallback);
 
         assertTrue(result);
@@ -494,7 +494,7 @@
     public void testCallbackRemovedWhenSubInfoChanged() throws Exception {
         createMonitor(1);
 
-        boolean result = mRcsProvisioningMonitor.registerRcsProvisioningChangedCallback(
+        boolean result = mRcsProvisioningMonitor.registerRcsProvisioningCallback(
                 FAKE_SUB_ID_BASE, mCallback);
         makeFakeActiveSubIds(0);
         mExecutor.execute(() -> mSubChangedListener.onSubscriptionsChanged());
@@ -510,7 +510,7 @@
     public void testCallbackRemovedWhenDmaChanged() throws Exception {
         createMonitor(1);
 
-        boolean result = mRcsProvisioningMonitor.registerRcsProvisioningChangedCallback(
+        boolean result = mRcsProvisioningMonitor.registerRcsProvisioningCallback(
                 FAKE_SUB_ID_BASE, mCallback);
         updateDefaultMessageApplication(DEFAULT_MESSAGING_APP2);
         processAllMessages();
@@ -524,7 +524,7 @@
     @SmallTest
     public void testRcsConnectedAndDisconnected() throws Exception {
         createMonitor(1);
-        mRcsProvisioningMonitor.registerRcsProvisioningChangedCallback(
+        mRcsProvisioningMonitor.registerRcsProvisioningCallback(
                 FAKE_SUB_ID_BASE, mCallback);
 
         verify(mIImsConfig, times(1))