diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java index 89f286c368a..f86f7aeefc3 100644 --- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java +++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java @@ -450,8 +450,16 @@ public class SimStatusDialogController implements DefaultLifecycleObserver { String dataNetworkTypeName = null; String voiceNetworkTypeName = null; final int subId = mSubscriptionInfo.getSubscriptionId(); - final int actualDataNetworkType = getTelephonyManager().getDataNetworkType(); - final int actualVoiceNetworkType = getTelephonyManager().getVoiceNetworkType(); + int actualDataNetworkType = TelephonyManager.NETWORK_TYPE_UNKNOWN; + int actualVoiceNetworkType = TelephonyManager.NETWORK_TYPE_UNKNOWN; + PackageManager pm = mContext.getPackageManager(); + if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_RADIO_ACCESS)) { + actualDataNetworkType = getTelephonyManager().getDataNetworkType(); + } + if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING)) { + actualVoiceNetworkType = getTelephonyManager().getVoiceNetworkType(); + } + final int overrideNetworkType = mTelephonyDisplayInfo == null ? TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE : mTelephonyDisplayInfo.getOverrideNetworkType(); diff --git a/src/com/android/settings/network/ims/ImsQueryEnhanced4gLteModeUserSetting.java b/src/com/android/settings/network/ims/ImsQueryEnhanced4gLteModeUserSetting.java index c6c5ad3e924..a3e0f69c7a6 100644 --- a/src/com/android/settings/network/ims/ImsQueryEnhanced4gLteModeUserSetting.java +++ b/src/com/android/settings/network/ims/ImsQueryEnhanced4gLteModeUserSetting.java @@ -47,6 +47,8 @@ public class ImsQueryEnhanced4gLteModeUserSetting implements ImsQuery { return imsMmTelManager.isAdvancedCallingSettingEnabled(); } catch (IllegalArgumentException exception) { Log.w(LOG_TAG, "fail to get VoLte settings. subId=" + mSubId, exception); + } catch (UnsupportedOperationException ex) { + // expected on devices without IMS } return false; } diff --git a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java index d1988c4a3b7..3886c3beeab 100644 --- a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java +++ b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java @@ -112,8 +112,12 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc return CONDITIONALLY_UNAVAILABLE; } - if (!queryState.isReadyToVoLte()) { - return CONDITIONALLY_UNAVAILABLE; + try { + if (!queryState.isReadyToVoLte()) { + return CONDITIONALLY_UNAVAILABLE; + } + } catch (UnsupportedOperationException ex) { + return UNSUPPORTED_ON_DEVICE; } return (isUserControlAllowed(carrierConfig) && queryState.isAllowUserControl()) ? AVAILABLE : AVAILABLE_UNSEARCHABLE; diff --git a/tests/unit/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java b/tests/unit/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java index 776261a126e..eb03ee581c9 100644 --- a/tests/unit/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java +++ b/tests/unit/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java @@ -40,6 +40,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.content.pm.PackageManager; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.ServiceState; @@ -67,9 +68,9 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.HashMap; +import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.Executor; @RunWith(AndroidJUnit4.class) public class SimStatusDialogControllerTest { @@ -95,6 +96,7 @@ public class SimStatusDialogControllerTest { private SimStatusDialogController mController; private Context mContext; + private PackageManager mPackageManager; @Mock private LifecycleOwner mLifecycleOwner; private Lifecycle mLifecycle; @@ -112,6 +114,12 @@ public class SimStatusDialogControllerTest { MockitoAnnotations.initMocks(this); mContext = spy(ApplicationProvider.getApplicationContext()); when(mDialog.getContext()).thenReturn(mContext); + mPackageManager = spy(mContext.getPackageManager()); + when(mContext.getPackageManager()).thenReturn(mPackageManager); + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_RADIO_ACCESS)) + .thenReturn(true); + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING)) + .thenReturn(true); mLifecycle = new Lifecycle(mLifecycleOwner); mTelephonyManager = spy(mContext.getSystemService(TelephonyManager.class));