From 37d4fb736eb865a0312cf0d29fc0d547a226aedc Mon Sep 17 00:00:00 2001 From: joonhunshin Date: Fri, 1 Dec 2023 08:25:58 +0000 Subject: [PATCH] Data only device(without FEATURE_TELEPHON_CALLING) : Add try/catch to handle UnsupportedOperationException If the device does not have Telephony feature calling, the some of interfaces in TelephonyManager throw UnsupportedOperationException. Bug: 297989574 Test: oriole with ATT SIM, boot completed APM/data/wifi on/off, browse setting menu Change-Id: Ifa9092cd8d9a00039e9d93d5fd9fc4dabed633c8 --- .../android/settings/AirplaneModeEnabler.java | 30 ++++++++++++++++--- ...gAidCompatibilityPreferenceController.java | 15 ++++++++-- ...nabledNetworkModePreferenceController.java | 13 ++++++-- .../Enhanced4gBasePreferenceController.java | 12 +++++++- ...NrAdvancedCallingPreferenceController.java | 12 +++++++- .../VideoCallingPreferenceController.java | 12 +++++++- 6 files changed, 83 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/AirplaneModeEnabler.java b/src/com/android/settings/AirplaneModeEnabler.java index f3fd3a0d8f5..c233ddab3c2 100644 --- a/src/com/android/settings/AirplaneModeEnabler.java +++ b/src/com/android/settings/AirplaneModeEnabler.java @@ -29,6 +29,7 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; +import com.android.internal.telephony.flags.Flags; import com.android.settings.network.GlobalSettingsChangeListener; import com.android.settings.network.ProxySubscriptionManager; import com.android.settings.overlay.FeatureFactory; @@ -146,8 +147,19 @@ public class AirplaneModeEnabler extends GlobalSettingsChangeListener { * @return any subscription within device is under ECM mode */ public boolean isInEcmMode() { - if (mTelephonyManager.getEmergencyCallbackMode()) { - return true; + if (Flags.enforceTelephonyFeatureMappingForPublicApis()) { + try { + if (mTelephonyManager.getEmergencyCallbackMode()) { + return true; + } + } catch (UnsupportedOperationException e) { + // Device doesn't support FEATURE_TELEPHONY_CALLING + // Ignore exception, device is not in ECM mode. + } + } else { + if (mTelephonyManager.getEmergencyCallbackMode()) { + return true; + } } final List subInfoList = ProxySubscriptionManager.getInstance(mContext).getActiveSubscriptionsInfo(); @@ -158,8 +170,18 @@ public class AirplaneModeEnabler extends GlobalSettingsChangeListener { final TelephonyManager telephonyManager = mTelephonyManager.createForSubscriptionId(subInfo.getSubscriptionId()); if (telephonyManager != null) { - if (telephonyManager.getEmergencyCallbackMode()) { - return true; + if (!Flags.enforceTelephonyFeatureMappingForPublicApis()) { + if (telephonyManager.getEmergencyCallbackMode()) { + return true; + } + } else { + try { + if (telephonyManager.getEmergencyCallbackMode()) { + return true; + } + } catch (UnsupportedOperationException e) { + // Ignore exception, device is not in ECM mode. + } } } } diff --git a/src/com/android/settings/accessibility/HearingAidCompatibilityPreferenceController.java b/src/com/android/settings/accessibility/HearingAidCompatibilityPreferenceController.java index cd2f6f002d8..727cdd53d57 100644 --- a/src/com/android/settings/accessibility/HearingAidCompatibilityPreferenceController.java +++ b/src/com/android/settings/accessibility/HearingAidCompatibilityPreferenceController.java @@ -22,6 +22,7 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.telephony.flags.Flags; import com.android.settings.R; import com.android.settings.core.TogglePreferenceController; @@ -49,8 +50,18 @@ public class HearingAidCompatibilityPreferenceController extends TogglePreferenc @Override public int getAvailabilityStatus() { - return mTelephonyManager.isHearingAidCompatibilitySupported() ? AVAILABLE - : UNSUPPORTED_ON_DEVICE; + if (Flags.enforceTelephonyFeatureMappingForPublicApis()) { + try { + return mTelephonyManager.isHearingAidCompatibilitySupported() ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; + } catch (UnsupportedOperationException e) { + // Device doesn't support FEATURE_TELEPHONY_CALLING + return UNSUPPORTED_ON_DEVICE; + } + } else { + return mTelephonyManager.isHearingAidCompatibilitySupported() ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; + } } @Override diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java index 5e1d56e2684..56fbcde359e 100644 --- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java +++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java @@ -38,8 +38,8 @@ import androidx.preference.ListPreferenceDialogFragmentCompat; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; -import com.android.settings.R; import com.android.internal.telephony.flags.Flags; +import com.android.settings.R; import com.android.settings.network.AllowedNetworkTypesListener; import com.android.settings.network.CarrierConfigCache; import com.android.settings.network.SubscriptionsChangeListener; @@ -924,7 +924,16 @@ public class EnabledNetworkModePreferenceController extends // assign current call state so that it helps to show correct preference state even // before first onCallStateChanged() by initial registration. - mCallState = mTelephonyManager.getCallState(subId); + if (Flags.enforceTelephonyFeatureMappingForPublicApis()) { + try { + mCallState = mTelephonyManager.getCallState(subId); + } catch (UnsupportedOperationException e) { + // Device doesn't support FEATURE_TELEPHONY_CALLING + mCallState = TelephonyManager.CALL_STATE_IDLE; + } + } else { + mCallState = mTelephonyManager.getCallState(subId); + } mTelephonyManager.registerTelephonyCallback( mContext.getMainExecutor(), mTelephonyCallback); } diff --git a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java index 1b6f516b258..1a71e5aad45 100644 --- a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java +++ b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java @@ -33,6 +33,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import androidx.preference.TwoStatePreference; +import com.android.internal.telephony.flags.Flags; import com.android.internal.telephony.util.ArrayUtils; import com.android.settings.R; import com.android.settings.network.ims.VolteQueryImsState; @@ -234,7 +235,16 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc } // assign current call state so that it helps to show correct preference state even // before first onCallStateChanged() by initial registration. - mCallState = mTelephonyManager.getCallState(subId); + if (Flags.enforceTelephonyFeatureMappingForPublicApis()) { + try { + mCallState = mTelephonyManager.getCallState(subId); + } catch (UnsupportedOperationException e) { + // Device doesn't support FEATURE_TELEPHONY_CALLING + mCallState = TelephonyManager.CALL_STATE_IDLE; + } + } else { + mCallState = mTelephonyManager.getCallState(subId); + } mTelephonyManager.registerTelephonyCallback( mContext.getMainExecutor(), mTelephonyCallback); diff --git a/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.java b/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.java index dc1c03fe68c..ecf01cb9484 100644 --- a/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.java +++ b/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.java @@ -31,6 +31,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import androidx.preference.TwoStatePreference; +import com.android.internal.telephony.flags.Flags; import com.android.internal.telephony.util.ArrayUtils; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; @@ -211,7 +212,16 @@ public class NrAdvancedCallingPreferenceController extends TelephonyTogglePrefer // assign current call state so that it helps to show correct preference state even // before first onCallStateChanged() by initial registration. - mCallState = mLocalTelephonyManager.getCallState(); + if (Flags.enforceTelephonyFeatureMappingForPublicApis()) { + try { + mCallState = mLocalTelephonyManager.getCallState(); + } catch (UnsupportedOperationException e) { + // Device doesn't support FEATURE_TELEPHONY_CALLING + mCallState = TelephonyManager.CALL_STATE_IDLE; + } + } else { + mCallState = mLocalTelephonyManager.getCallState(); + } mLocalTelephonyManager.registerTelephonyCallback( mContext.getMainExecutor(), mTelephonyCallback); } diff --git a/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java b/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java index 5810510a8b1..f803efdc1b0 100644 --- a/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java +++ b/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java @@ -31,6 +31,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import androidx.preference.TwoStatePreference; +import com.android.internal.telephony.flags.Flags; import com.android.settings.network.CarrierConfigCache; import com.android.settings.network.MobileDataEnabledListener; import com.android.settings.network.ims.VolteQueryImsState; @@ -195,7 +196,16 @@ public class VideoCallingPreferenceController extends TelephonyTogglePreferenceC } // assign current call state so that it helps to show correct preference state even // before first onCallStateChanged() by initial registration. - mCallState = mTelephonyManager.getCallState(subId); + if (Flags.enforceTelephonyFeatureMappingForPublicApis()) { + try { + mCallState = mTelephonyManager.getCallState(subId); + } catch (UnsupportedOperationException e) { + // Device doesn't support FEATURE_TELEPHONY_CALLING + mCallState = TelephonyManager.CALL_STATE_IDLE; + } + } else { + mCallState = mTelephonyManager.getCallState(subId); + } mTelephonyManager.registerTelephonyCallback(context.getMainExecutor(), this); }