[Settings] Replace VT and VOLTE provisioning API

Replace isVtProvisionedOnDevice() and isVolteProvisionedOnDevice()
by android.telephony.ims.ProvisioningManager.

Bug: 140542283
Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=Enhanced4gBasePreferenceControllerTest
make RunSettingsRoboTests -j ROBOTEST_FILTER=Enhanced4gLteSliceHelper
make RunSettingsRoboTests -j ROBOTEST_FILTER=VideoCallingPreferenceController

Change-Id: Ie92794b794a6b9f2d9e161ca5f328cd9fa01064a
diff --git a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java
index 25eefdf..869091a 100644
--- a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java
+++ b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java
@@ -23,6 +23,9 @@
 import android.telephony.PhoneStateListener;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.telephony.ims.ProvisioningManager;
+import android.telephony.ims.feature.MmTelFeature;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
@@ -50,6 +53,8 @@
     @VisibleForTesting
     ImsManager mImsManager;
     private PhoneCallStateListener mPhoneStateListener;
+    @VisibleForTesting
+    Integer mCallState;
     private final List<On4gLteUpdateListener> m4gLteListeners;
 
     protected static final int MODE_NONE = -1;
@@ -70,7 +75,8 @@
             return this;
         }
         mSubId = subId;
-        mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId);
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class)
+                .createForSubscriptionId(mSubId);
         mCarrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId);
         if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
             mImsManager = ImsManager.getInstance(mContext, SubscriptionManager.getPhoneId(mSubId));
@@ -86,6 +92,11 @@
         return this;
     }
 
+    @VisibleForTesting
+    ProvisioningManager getProvisioningManager(int subId) {
+        return ProvisioningManager.createForSubscriptionId(subId);
+    }
+
     @Override
     public int getAvailabilityStatus(int subId) {
         init(subId);
@@ -96,7 +107,7 @@
         final boolean isVisible = subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
                 && mImsManager != null && carrierConfig != null
                 && mImsManager.isVolteEnabledByPlatform()
-                && mImsManager.isVolteProvisionedOnDevice()
+                && isVolteProvisionedOnDevice(mSubId)
                 && MobileNetworkUtils.isImsServiceStateReady(mImsManager)
                 && !carrierConfig.getBoolean(CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL);
         return isVisible
@@ -159,13 +170,26 @@
 
     private boolean isPrefEnabled() {
         return mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
-                && mTelephonyManager.getCallState(mSubId) == TelephonyManager.CALL_STATE_IDLE
+                && (mCallState != null) && (mCallState == TelephonyManager.CALL_STATE_IDLE)
                 && mImsManager != null
                 && mImsManager.isNonTtyOrTtyOnVolteEnabled()
                 && mCarrierConfig.getBoolean(
                 CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL);
     }
 
+    private boolean isVolteProvisionedOnDevice(int subId) {
+        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            return true;
+        }
+        final ProvisioningManager provisioningMgr = getProvisioningManager(subId);
+        if (provisioningMgr == null) {
+            return true;
+        }
+        return provisioningMgr.getProvisioningStatusForCapability(
+                MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+                ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
+    }
+
     private class PhoneCallStateListener extends PhoneStateListener {
 
         public PhoneCallStateListener(Looper looper) {
@@ -174,15 +198,17 @@
 
         @Override
         public void onCallStateChanged(int state, String incomingNumber) {
+            mCallState = state;
             updateState(mPreference);
         }
 
         public void register(int subId) {
-            mSubId = subId;
+            Enhanced4gBasePreferenceController.this.mSubId = subId;
             mTelephonyManager.listen(this, PhoneStateListener.LISTEN_CALL_STATE);
         }
 
         public void unregister() {
+            mCallState = null;
             mTelephonyManager.listen(this, PhoneStateListener.LISTEN_NONE);
         }
     }
diff --git a/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelper.java b/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelper.java
index be5d948..c03f942 100644
--- a/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelper.java
+++ b/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelper.java
@@ -27,6 +27,9 @@
 import android.os.PersistableBundle;
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
+import android.telephony.ims.ProvisioningManager;
+import android.telephony.ims.feature.MmTelFeature;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
 import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
@@ -122,7 +125,7 @@
         final ImsManager imsManager = getImsManager(subId);
 
         if (!imsManager.isVolteEnabledByPlatform()
-                || !imsManager.isVolteProvisionedOnDevice()) {
+                || !isVolteProvisionedOnDevice(subId)) {
             Log.d(TAG, "Setting is either not provisioned or not enabled by Platform");
             return null;
         }
@@ -188,6 +191,11 @@
         return ImsManager.getInstance(mContext, SubscriptionManager.getPhoneId(subId));
     }
 
+    @VisibleForTesting
+    ProvisioningManager getProvisioningManager(int subId) {
+        return ProvisioningManager.createForSubscriptionId(subId);
+    }
+
     /**
      * Handles Enhanced 4G LTE mode setting change from Enhanced 4G LTE slice and posts
      * notification. Should be called when intent action is ACTION_ENHANCED_4G_LTE_CHANGED
@@ -199,8 +207,7 @@
 
         if (subId > SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
             final ImsManager imsManager = getImsManager(subId);
-            if (imsManager.isVolteEnabledByPlatform()
-                    && imsManager.isVolteProvisionedOnDevice()) {
+            if (imsManager.isVolteEnabledByPlatform() && isVolteProvisionedOnDevice(subId)) {
                 final boolean currentValue = imsManager.isEnhanced4gLteModeSettingEnabledByUser()
                         && imsManager.isNonTtyOrTtyOnVolteEnabled();
                 final boolean newValue = intent.getBooleanExtra(EXTRA_TOGGLE_STATE,
@@ -278,5 +285,15 @@
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, 0 /* flags */);
     }
+
+    private boolean isVolteProvisionedOnDevice(int subId) {
+        final ProvisioningManager provisioningMgr = getProvisioningManager(subId);
+        if (provisioningMgr == null) {
+            return true;
+        }
+        return provisioningMgr.getProvisioningStatusForCapability(
+                MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+                ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
+    }
 }
 
diff --git a/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java b/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java
index 692a7e1..22a3b7c 100644
--- a/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java
+++ b/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java
@@ -23,6 +23,9 @@
 import android.telephony.PhoneStateListener;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.telephony.ims.ProvisioningManager;
+import android.telephony.ims.feature.MmTelFeature;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
@@ -134,6 +137,24 @@
     }
 
     @VisibleForTesting
+    ProvisioningManager getProvisioningManager(int subId) {
+        return ProvisioningManager.createForSubscriptionId(subId);
+    }
+
+    private boolean isVtProvisionedOnDevice(int subId) {
+        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            return true;
+        }
+        final ProvisioningManager provisioningMgr = getProvisioningManager(subId);
+        if (provisioningMgr == null) {
+            return true;
+        }
+        return provisioningMgr.getProvisioningStatusForCapability(
+                MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO,
+                ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
+    }
+
+    @VisibleForTesting
     boolean isVideoCallEnabled(int subId, ImsManager imsManager) {
         final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId);
         TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
@@ -142,7 +163,7 @@
         }
         return carrierConfig != null && imsManager != null
                 && imsManager.isVtEnabledByPlatform()
-                && imsManager.isVtProvisionedOnDevice()
+                && isVtProvisionedOnDevice(subId)
                 && MobileNetworkUtils.isImsServiceStateReady(imsManager)
                 && (carrierConfig.getBoolean(
                 CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS)
@@ -167,7 +188,7 @@
         }
 
         public void register(int subId) {
-            mSubId = subId;
+            VideoCallingPreferenceController.this.mSubId = subId;
             mTelephonyManager.listen(this, PhoneStateListener.LISTEN_CALL_STATE);
         }
 
diff --git a/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceControllerTest.java
index e4eac68..9c1dc4f 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceControllerTest.java
@@ -26,6 +26,9 @@
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.telephony.ims.ProvisioningManager;
+import android.telephony.ims.feature.MmTelFeature;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
 
 import androidx.preference.SwitchPreference;
 
@@ -55,6 +58,8 @@
     private CarrierConfigManager mCarrierConfigManager;
     @Mock
     private ImsManager mImsManager;
+    @Mock
+    private ProvisioningManager mProvisioningManager;
 
     private Enhanced4gLtePreferenceController mController;
     private SwitchPreference mPreference;
@@ -77,7 +82,12 @@
         doReturn(mCarrierConfig).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
 
         mPreference = new RestrictedSwitchPreference(mContext);
-        mController = new Enhanced4gLtePreferenceController(mContext, "roaming");
+        mController = new Enhanced4gLtePreferenceController(mContext, "roaming") {
+            @Override
+            ProvisioningManager getProvisioningManager(int subId) {
+                return mProvisioningManager;
+            }
+        };
         mController.init(SUB_ID);
         mController.mImsManager = mImsManager;
         mPreference.setKey(mController.getPreferenceKey());
@@ -94,7 +104,9 @@
     @Test
     public void getAvailabilityStatus_volteDisabled_returnUnavailable() {
         doReturn(false).when(mImsManager).isVolteEnabledByPlatform();
-        doReturn(true).when(mImsManager).isVolteProvisionedOnDevice();
+        doReturn(true).when(mProvisioningManager).getProvisioningStatusForCapability(
+                MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+                ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(
                 BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
@@ -104,7 +116,7 @@
     public void updateState_configEnabled_prefEnabled() {
         mPreference.setEnabled(false);
         mCarrierConfig.putInt(CarrierConfigManager.KEY_ENHANCED_4G_LTE_TITLE_VARIANT_INT, 1);
-        doReturn(TelephonyManager.CALL_STATE_IDLE).when(mTelephonyManager).getCallState(SUB_ID);
+        mController.mCallState = TelephonyManager.CALL_STATE_IDLE;
         doReturn(true).when(mImsManager).isNonTtyOrTtyOnVolteEnabled();
         mCarrierConfig.putBoolean(CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL, true);
 
diff --git a/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java b/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java
index a9882d9..b61504a 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java
@@ -31,6 +31,9 @@
 import android.content.Context;
 import android.content.Intent;
 import android.telephony.CarrierConfigManager;
+import android.telephony.ims.ProvisioningManager;
+import android.telephony.ims.feature.MmTelFeature;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
 
 import androidx.slice.Slice;
 import androidx.slice.SliceItem;
@@ -67,6 +70,8 @@
 
     @Mock
     private ImsManager mMockImsManager;
+    @Mock
+    private ProvisioningManager mProvisioningManager;
 
     private Context mContext;
     private FakeEnhanced4gLteSliceHelper mEnhanced4gLteSliceHelper;
@@ -121,7 +126,9 @@
     @Test
     public void test_CreateEnhanced4gLteSlice_success() {
         when(mMockImsManager.isVolteEnabledByPlatform()).thenReturn(true);
-        when(mMockImsManager.isVolteProvisionedOnDevice()).thenReturn(true);
+        when(mProvisioningManager.getProvisioningStatusForCapability(
+                MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+                ImsRegistrationImplBase.REGISTRATION_TECH_LTE)).thenReturn(true);
         when(mMockImsManager.isEnhanced4gLteModeSettingEnabledByUser()).thenReturn(true);
         when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true);
         when(mMockCarrierConfigManager.getConfigForSubId(1)).thenReturn(null);
@@ -136,7 +143,9 @@
     @Test
     public void test_SettingSliceProvider_getsRightSliceEnhanced4gLte() {
         when(mMockImsManager.isVolteEnabledByPlatform()).thenReturn(true);
-        when(mMockImsManager.isVolteProvisionedOnDevice()).thenReturn(true);
+        when(mProvisioningManager.getProvisioningStatusForCapability(
+                MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+                ImsRegistrationImplBase.REGISTRATION_TECH_LTE)).thenReturn(true);
         when(mMockImsManager.isEnhanced4gLteModeSettingEnabledByUser()).thenReturn(true);
         when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true);
         when(mMockCarrierConfigManager.getConfigForSubId(1)).thenReturn(null);
@@ -152,17 +161,19 @@
     @Test
     public void test_SliceBroadcastReceiver_toggleOffEnhanced4gLte() {
         when(mMockImsManager.isVolteEnabledByPlatform()).thenReturn(true);
-        when(mMockImsManager.isVolteProvisionedOnDevice()).thenReturn(true);
+        when(mProvisioningManager.getProvisioningStatusForCapability(
+                MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+                ImsRegistrationImplBase.REGISTRATION_TECH_LTE)).thenReturn(true);
         when(mMockImsManager.isEnhanced4gLteModeSettingEnabledByUser()).thenReturn(false);
         when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true);
         when(mSlicesFeatureProvider.getNewEnhanced4gLteSliceHelper(mContext))
                 .thenReturn(mEnhanced4gLteSliceHelper);
 
-        ArgumentCaptor<Boolean> mEnhanced4gLteSettingCaptor = ArgumentCaptor.forClass(
+        final ArgumentCaptor<Boolean> mEnhanced4gLteSettingCaptor = ArgumentCaptor.forClass(
                 Boolean.class);
 
         // turn on Enhanced4gLte setting
-        Intent intent = new Intent(Enhanced4gLteSliceHelper.ACTION_ENHANCED_4G_LTE_CHANGED);
+        final Intent intent = new Intent(Enhanced4gLteSliceHelper.ACTION_ENHANCED_4G_LTE_CHANGED);
         intent.putExtra(EXTRA_TOGGLE_STATE, true);
 
         // change the setting
@@ -234,7 +245,7 @@
     private void assertTitle(List<SliceItem> sliceItems, String title) {
         boolean hasTitle = false;
         for (SliceItem item : sliceItems) {
-            List<SliceItem> titleItems = SliceQuery.findAll(item, FORMAT_TEXT, HINT_TITLE,
+            final List<SliceItem> titleItems = SliceQuery.findAll(item, FORMAT_TEXT, HINT_TITLE,
                     null /* non-hints */);
             if (titleItems == null) {
                 continue;
@@ -265,6 +276,11 @@
             return mMockImsManager;
         }
 
+        @Override
+        ProvisioningManager getProvisioningManager(int subId) {
+            return mProvisioningManager;
+        }
+
         protected int getDefaultVoiceSubId() {
             return mSubId;
         }
diff --git a/tests/robotests/src/com/android/settings/network/telephony/VideoCallingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/VideoCallingPreferenceControllerTest.java
index 7b71565..7bbca28 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/VideoCallingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/VideoCallingPreferenceControllerTest.java
@@ -18,14 +18,18 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.spy;
 
 import android.content.Context;
 import android.os.PersistableBundle;
 import android.telephony.CarrierConfigManager;
 import android.telephony.TelephonyManager;
+import android.telephony.ims.ProvisioningManager;
 import android.telephony.ims.feature.ImsFeature;
+import android.telephony.ims.feature.MmTelFeature;
 
 import androidx.preference.PreferenceScreen;
 import androidx.preference.SwitchPreference;
@@ -49,6 +53,8 @@
     @Mock
     private ImsManager mImsManager;
     @Mock
+    private ProvisioningManager mProvisioningManager;
+    @Mock
     private CarrierConfigManager mCarrierConfigManager;
     @Mock
     private PreferenceScreen mPreferenceScreen;
@@ -65,7 +71,8 @@
         mContext = spy(RuntimeEnvironment.application);
         doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
         doReturn(mTelephonyManager).when(mContext).getSystemService(TelephonyManager.class);
-        doReturn(mCarrierConfigManager).when(mContext).getSystemService(CarrierConfigManager.class);
+        doReturn(mCarrierConfigManager).when(mContext)
+                .getSystemService(CarrierConfigManager.class);
         doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
 
         mCarrierConfig = new PersistableBundle();
@@ -74,13 +81,20 @@
         doReturn(mCarrierConfig).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
 
         mPreference = new SwitchPreference(mContext);
-        mController = new VideoCallingPreferenceController(mContext, "wifi_calling");
+        mController = new VideoCallingPreferenceController(mContext, "wifi_calling") {
+            @Override
+            ProvisioningManager getProvisioningManager(int subId) {
+                return mProvisioningManager;
+            }
+        };
         mController.init(SUB_ID);
         mController.mImsManager = mImsManager;
         mPreference.setKey(mController.getPreferenceKey());
 
         doReturn(true).when(mImsManager).isVtEnabledByPlatform();
-        doReturn(true).when(mImsManager).isVtProvisionedOnDevice();
+        doReturn(true).when(mProvisioningManager)
+                .getProvisioningStatusForCapability(
+                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO), anyInt());
         doReturn(ImsFeature.STATE_READY).when(mImsManager).getImsServiceState();
         doReturn(true).when(mTelephonyManager).isDataEnabled();
 
@@ -123,7 +137,7 @@
         doReturn(true).when(mImsManager).isVtEnabledByUser();
         doReturn(true).when(mImsManager).isEnhanced4gLteModeSettingEnabledByUser();
         doReturn(true).when(mImsManager).isNonTtyOrTtyOnVolteEnabled();
-        doReturn(TelephonyManager.CALL_STATE_IDLE).when(mTelephonyManager).getCallState(SUB_ID);
+        mController.mCallState = TelephonyManager.CALL_STATE_IDLE;
 
         mController.updateState(mPreference);