diff --git a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java index 25eefdf1b26..869091a8650 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.CarrierConfigManager; 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 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc @VisibleForTesting ImsManager mImsManager; private PhoneCallStateListener mPhoneStateListener; + @VisibleForTesting + Integer mCallState; private final List m4gLteListeners; protected static final int MODE_NONE = -1; @@ -70,7 +75,8 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc 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 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc return this; } + @VisibleForTesting + ProvisioningManager getProvisioningManager(int subId) { + return ProvisioningManager.createForSubscriptionId(subId); + } + @Override public int getAvailabilityStatus(int subId) { init(subId); @@ -96,7 +107,7 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc 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 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc 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 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc @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 be5d94866e2..c03f942ee34 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.net.Uri; 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 @@ public class Enhanced4gLteSliceHelper { 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 @@ public class Enhanced4gLteSliceHelper { 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 @@ public class Enhanced4gLteSliceHelper { 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 @@ public class Enhanced4gLteSliceHelper { 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 692a7e13666..22a3b7c4c57 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.CarrierConfigManager; 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; @@ -133,6 +136,24 @@ public class VideoCallingPreferenceController extends TelephonyTogglePreferenceC return isVideoCallEnabled(subId, imsManager); } + @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); @@ -142,7 +163,7 @@ public class VideoCallingPreferenceController extends TelephonyTogglePreferenceC } 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 class VideoCallingPreferenceController extends TelephonyTogglePreferenceC } 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 e4eac68166c..9c1dc4f1b1c 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.os.PersistableBundle; 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 @@ public class Enhanced4gBasePreferenceControllerTest { private CarrierConfigManager mCarrierConfigManager; @Mock private ImsManager mImsManager; + @Mock + private ProvisioningManager mProvisioningManager; private Enhanced4gLtePreferenceController mController; private SwitchPreference mPreference; @@ -77,7 +82,12 @@ public class Enhanced4gBasePreferenceControllerTest { 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 @@ public class Enhanced4gBasePreferenceControllerTest { @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 class Enhanced4gBasePreferenceControllerTest { 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 a9882d9537e..b61504a7a3f 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.app.PendingIntent; 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 @@ public class Enhanced4gLteSliceHelperTest { @Mock private ImsManager mMockImsManager; + @Mock + private ProvisioningManager mProvisioningManager; private Context mContext; private FakeEnhanced4gLteSliceHelper mEnhanced4gLteSliceHelper; @@ -121,7 +126,9 @@ public class Enhanced4gLteSliceHelperTest { @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 @@ public class Enhanced4gLteSliceHelperTest { @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 @@ public class Enhanced4gLteSliceHelperTest { @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 mEnhanced4gLteSettingCaptor = ArgumentCaptor.forClass( + final ArgumentCaptor 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 @@ public class Enhanced4gLteSliceHelperTest { private void assertTitle(List sliceItems, String title) { boolean hasTitle = false; for (SliceItem item : sliceItems) { - List titleItems = SliceQuery.findAll(item, FORMAT_TEXT, HINT_TITLE, + final List titleItems = SliceQuery.findAll(item, FORMAT_TEXT, HINT_TITLE, null /* non-hints */); if (titleItems == null) { continue; @@ -265,6 +276,11 @@ public class Enhanced4gLteSliceHelperTest { 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 7b715655058..7bbca280eb2 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 @@ package com.android.settings.network.telephony; 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 @@ public class VideoCallingPreferenceControllerTest { @Mock private ImsManager mImsManager; @Mock + private ProvisioningManager mProvisioningManager; + @Mock private CarrierConfigManager mCarrierConfigManager; @Mock private PreferenceScreen mPreferenceScreen; @@ -65,7 +71,8 @@ public class VideoCallingPreferenceControllerTest { 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 @@ public class VideoCallingPreferenceControllerTest { 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 @@ public class VideoCallingPreferenceControllerTest { 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);