Merge "Integrate IMS single registration feature into APIs" am: a271c76c47

Original change: https://android-review.googlesource.com/c/platform/packages/services/Telephony/+/1564733

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I63df15ff0d2b0bc6bd6c65d6f6d6d14571fc25cd
diff --git a/res/values/config.xml b/res/values/config.xml
index 0fd9b4b..7ce141e 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -304,9 +304,6 @@
         positive n - release in n milliseconds -->
     <integer name="config_gba_release_time">0</integer>
 
-    <!-- Whether or not to support RCS VoLTE single registration  -->
-    <bool name="config_rcsVolteSingleRegistrationEnabled">true</bool>
-
     <!-- Whether or not to support RCS User Capability Exchange -->
     <bool name="config_rcs_user_capability_exchange_enabled">true</bool>
 
diff --git a/src/com/android/phone/ImsRcsController.java b/src/com/android/phone/ImsRcsController.java
index 2c87f7c..c91cc3b 100644
--- a/src/com/android/phone/ImsRcsController.java
+++ b/src/com/android/phone/ImsRcsController.java
@@ -67,6 +67,8 @@
     private PhoneGlobals mApp;
     private TelephonyRcsService mRcsService;
     private ImsResolver mImsResolver;
+    // set by shell cmd phone src set-device-enabled true/false
+    private Boolean mSingleRegistrationOverride;
 
     /**
      * Initialize the singleton ImsRcsController instance.
@@ -386,6 +388,9 @@
     @Override
     public boolean isSipDelegateSupported(int subId) {
         enforceReadPrivilegedPermission("isSipDelegateSupported");
+        if (!isImsSingleRegistrationSupportedOnDevice()) {
+            return false;
+        }
         final long token = Binder.clearCallingIdentity();
         try {
             SipTransportController transport = getRcsFeatureController(subId).getFeature(
@@ -411,6 +416,11 @@
             ISipDelegateConnectionStateCallback delegateState,
             ISipDelegateMessageCallback delegateMessage) {
         enforceModifyPermission();
+        if (!isImsSingleRegistrationSupportedOnDevice()) {
+            throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
+                    "SipDelegate creation is only supported for devices supporting IMS single "
+                            + "registration");
+        }
         if (!UserHandle.getUserHandleForUid(Binder.getCallingUid()).isSystem()) {
             throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
                     "SipDelegate creation is only available to primary user.");
@@ -586,7 +596,21 @@
         return c;
     }
 
+    private boolean isImsSingleRegistrationSupportedOnDevice() {
+        return mSingleRegistrationOverride != null ? mSingleRegistrationOverride
+                : mApp.getPackageManager().hasSystemFeature(
+                        PackageManager.FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION);
+    }
+
     void setRcsService(TelephonyRcsService rcsService) {
         mRcsService = rcsService;
     }
+
+    /**
+     * Override device RCS single registration support check for CTS testing or remove override
+     * if the Boolean is set to null.
+     */
+    void setDeviceSingleRegistrationSupportOverride(Boolean deviceOverrideValue) {
+        mSingleRegistrationOverride = deviceOverrideValue;
+    }
 }
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 486021d..f1be951 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -9757,6 +9757,7 @@
         Boolean enabled = "NULL".equalsIgnoreCase(enabledStr) ? null
                 : Boolean.parseBoolean(enabledStr);
         RcsProvisioningMonitor.getInstance().overrideDeviceSingleRegistrationEnabled(enabled);
+        mApp.imsRcsController.setDeviceSingleRegistrationSupportOverride(enabled);
     }
 
     /**
diff --git a/src/com/android/phone/RcsProvisioningMonitor.java b/src/com/android/phone/RcsProvisioningMonitor.java
index 7b51eeb..79310ef 100644
--- a/src/com/android/phone/RcsProvisioningMonitor.java
+++ b/src/com/android/phone/RcsProvisioningMonitor.java
@@ -22,6 +22,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Handler;
 import android.os.HandlerThread;
@@ -543,7 +544,8 @@
         boolean isSingleRegistrationEnabledOnDevice =
                 mDeviceSingleRegistrationEnabledOverride != null
                 ? mDeviceSingleRegistrationEnabledOverride
-                : mPhone.getResources().getBoolean(R.bool.config_rcsVolteSingleRegistrationEnabled);
+                : mPhone.getPackageManager().hasSystemFeature(
+                        PackageManager.FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION);
 
         int value = (isSingleRegistrationEnabledOnDevice ? 0
                 : ProvisioningManager.STATUS_DEVICE_NOT_CAPABLE) | (
diff --git a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
index 02d2f8a..6c36c2c 100644
--- a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
+++ b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
@@ -38,6 +38,7 @@
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.net.Uri;
@@ -138,6 +139,8 @@
     private PhoneGlobals mPhone;
     @Mock
     private IRcsConfigCallback mCallback;
+    @Mock
+    private PackageManager mPackageManager;
 
     private Executor mExecutor = new Executor() {
         @Override
@@ -181,8 +184,9 @@
         MockitoAnnotations.initMocks(this);
 
         when(mPhone.getResources()).thenReturn(mResources);
-        when(mResources.getBoolean(
-                eq(R.bool.config_rcsVolteSingleRegistrationEnabled))).thenReturn(true);
+        when(mPhone.getPackageManager()).thenReturn(mPackageManager);
+        when(mPackageManager.hasSystemFeature(
+                eq(PackageManager.FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION))).thenReturn(true);
         when(mPhone.getMainExecutor()).thenReturn(mExecutor);
         when(mPhone.getSystemServiceName(eq(CarrierConfigManager.class)))
                 .thenReturn(Context.CARRIER_CONFIG_SERVICE);
@@ -361,8 +365,8 @@
     @SmallTest
     public void testCarrierConfigChanged() throws Exception {
         createMonitor(1);
-        when(mResources.getBoolean(
-                eq(R.bool.config_rcsVolteSingleRegistrationEnabled))).thenReturn(true);
+        when(mPackageManager.hasSystemFeature(
+                eq(PackageManager.FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION))).thenReturn(true);
         ArgumentCaptor<Intent> captorIntent = ArgumentCaptor.forClass(Intent.class);
         mBundle.putBoolean(
                 CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
@@ -391,8 +395,8 @@
                 capturedIntent.getIntExtra(ProvisioningManager.EXTRA_STATUS, -1));
 
 
-        when(mResources.getBoolean(
-                eq(R.bool.config_rcsVolteSingleRegistrationEnabled))).thenReturn(false);
+        when(mPackageManager.hasSystemFeature(
+                eq(PackageManager.FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION))).thenReturn(false);
         broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);
         processAllMessages();
         verify(mPhone, atLeastOnce()).sendBroadcast(captorIntent.capture());
@@ -441,8 +445,8 @@
     public void testIsRcsVolteSingleRegistrationEnabled() throws Exception {
         createMonitor(1);
 
-        when(mResources.getBoolean(
-                eq(R.bool.config_rcsVolteSingleRegistrationEnabled))).thenReturn(true);
+        when(mPackageManager.hasSystemFeature(
+                eq(PackageManager.FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION))).thenReturn(true);
         mBundle.putBoolean(
                 CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
         broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);
@@ -456,8 +460,8 @@
         assertFalse(mRcsProvisioningMonitor.isRcsVolteSingleRegistrationEnabled(FAKE_SUB_ID_BASE));
 
 
-        when(mResources.getBoolean(
-                eq(R.bool.config_rcsVolteSingleRegistrationEnabled))).thenReturn(false);
+        when(mPackageManager.hasSystemFeature(
+                eq(PackageManager.FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION))).thenReturn(false);
         mBundle.putBoolean(
                 CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
         broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);