From 5ce87cb03da6b60adefd4e1a7f2717b083f606b8 Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Mon, 23 Oct 2023 16:27:06 +0800 Subject: [PATCH] Add try-catch for set/get wifiCalling mode The APIs can throw IllegalArgumentExceptionm, the UI need the try-catch. Bug: 299239773 Bug: 287946939 Test: build pass Change-Id: I4b413abc985dfa871d3c2d39798b51dc1a686313 --- .../WifiCallingPreferenceController.java | 17 +++- .../calling/WifiCallingSettingsForSub.java | 88 ++++++++++++++----- .../wifi/calling/WifiCallingSliceHelper.java | 29 +++++- 3 files changed, 104 insertions(+), 30 deletions(-) diff --git a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java index 03cc23f606f..0a0b41f9e2a 100644 --- a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java +++ b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java @@ -61,6 +61,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont PhoneAccountHandle mSimCallManager; private PhoneTelephonyCallback mTelephonyCallback; private Preference mPreference; + private boolean mHasException; public WifiCallingPreferenceController(Context context, String key) { super(context, key); @@ -103,6 +104,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont Log.d(TAG, "Skip update under mCallState=" + mCallState); return; } + mHasException = false; CharSequence summaryText = null; if (mSimCallManager != null) { final Intent intent = MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext, @@ -122,7 +124,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont summaryText = getResourceIdForWfcMode(mSubId); } preference.setSummary(summaryText); - preference.setEnabled(mCallState == TelephonyManager.CALL_STATE_IDLE); + preference.setEnabled(mCallState == TelephonyManager.CALL_STATE_IDLE && !mHasException); } private CharSequence getResourceIdForWfcMode(int subId) { @@ -140,9 +142,16 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont } final boolean isRoaming = getTelephonyManager(mContext, subId) .isNetworkRoaming(); - final int wfcMode = (isRoaming && !useWfcHomeModeForRoaming) - ? mImsMmTelManager.getVoWiFiRoamingModeSetting() : - mImsMmTelManager.getVoWiFiModeSetting(); + int wfcMode = ImsMmTelManager.WIFI_MODE_UNKNOWN; + try { + wfcMode = (isRoaming && !useWfcHomeModeForRoaming) + ? mImsMmTelManager.getVoWiFiRoamingModeSetting() : + mImsMmTelManager.getVoWiFiModeSetting(); + } catch (IllegalArgumentException e) { + mHasException = true; + Log.e(TAG, "getResourceIdForWfcMode: Exception", e); + } + switch (wfcMode) { case ImsMmTelManager.WIFI_MODE_WIFI_ONLY: resId = com.android.internal.R.string.wfc_mode_wifi_only_summary; diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java index 098787cdf35..650536e52e6 100644 --- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java +++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java @@ -409,11 +409,19 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment final boolean wfcEnabled = queryIms.isEnabledByUser() && queryIms.isAllowUserControl(); mSwitchBar.setChecked(wfcEnabled); - final int wfcMode = mImsMmTelManager.getVoWiFiModeSetting(); - final int wfcRoamingMode = mImsMmTelManager.getVoWiFiRoamingModeSetting(); + int wfcMode = ImsMmTelManager.WIFI_MODE_UNKNOWN; + int wfcRoamingMode = ImsMmTelManager.WIFI_MODE_UNKNOWN; + boolean hasException = false; + try { + wfcMode = mImsMmTelManager.getVoWiFiModeSetting(); + wfcRoamingMode = mImsMmTelManager.getVoWiFiRoamingModeSetting(); + } catch (IllegalArgumentException e) { + hasException = true; + Log.e(TAG, "getResourceIdForWfcMode: Exception", e); + } mButtonWfcMode.setValue(Integer.toString(wfcMode)); mButtonWfcRoamingMode.setValue(Integer.toString(wfcRoamingMode)); - updateButtonWfcMode(wfcEnabled, wfcMode, wfcRoamingMode); + updateButtonWfcMode(wfcEnabled && !hasException, wfcMode, wfcRoamingMode); } @Override @@ -508,11 +516,26 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment */ private void updateWfcMode(boolean wfcEnabled) { Log.i(TAG, "updateWfcMode(" + wfcEnabled + ")"); - mImsMmTelManager.setVoWiFiSettingEnabled(wfcEnabled); + boolean hasException = false; + try { + mImsMmTelManager.setVoWiFiSettingEnabled(wfcEnabled); + } catch (IllegalArgumentException e) { + Log.e(TAG, "updateWfcMode: Exception", e); + hasException = true; + } - final int wfcMode = mImsMmTelManager.getVoWiFiModeSetting(); - final int wfcRoamingMode = mImsMmTelManager.getVoWiFiRoamingModeSetting(); - updateButtonWfcMode(wfcEnabled, wfcMode, wfcRoamingMode); + int wfcMode = ImsMmTelManager.WIFI_MODE_UNKNOWN; + int wfcRoamingMode = ImsMmTelManager.WIFI_MODE_UNKNOWN; + if (!hasException) { + try { + wfcMode = mImsMmTelManager.getVoWiFiModeSetting(); + wfcRoamingMode = mImsMmTelManager.getVoWiFiRoamingModeSetting(); + } catch (IllegalArgumentException e) { + hasException = true; + Log.e(TAG, "updateWfcMode: Exception", e); + } + } + updateButtonWfcMode(wfcEnabled && !hasException, wfcMode, wfcRoamingMode); if (wfcEnabled) { mMetricsFeatureProvider.action(getActivity(), getMetricsCategory(), wfcMode); } else { @@ -523,9 +546,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - Log.d(TAG, "WFC activity request = " + requestCode + " result = " + resultCode); - switch (requestCode) { case REQUEST_CHECK_WFC_EMERGENCY_ADDRESS: if (resultCode == Activity.RESULT_OK) { @@ -594,29 +615,52 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment @Override public boolean onPreferenceChange(Preference preference, Object newValue) { + boolean hasException = false; + if (preference == mButtonWfcMode) { Log.d(TAG, "onPreferenceChange mButtonWfcMode " + newValue); mButtonWfcMode.setValue((String) newValue); final int buttonMode = Integer.valueOf((String) newValue); - final int currentWfcMode = mImsMmTelManager.getVoWiFiModeSetting(); - if (buttonMode != currentWfcMode) { - mImsMmTelManager.setVoWiFiModeSetting(buttonMode); - mButtonWfcMode.setSummary(getWfcModeSummary(buttonMode)); - mMetricsFeatureProvider.action(getActivity(), getMetricsCategory(), buttonMode); + int currentWfcMode = ImsMmTelManager.WIFI_MODE_UNKNOWN; + try { + currentWfcMode = mImsMmTelManager.getVoWiFiModeSetting(); + } catch (IllegalArgumentException e) { + hasException = true; + Log.e(TAG, "onPreferenceChange: Exception", e); + } + if (buttonMode != currentWfcMode && !hasException) { + try { + mImsMmTelManager.setVoWiFiModeSetting(buttonMode); + mButtonWfcMode.setSummary(getWfcModeSummary(buttonMode)); + mMetricsFeatureProvider.action(getActivity(), getMetricsCategory(), buttonMode); - if (mUseWfcHomeModeForRoaming) { - mImsMmTelManager.setVoWiFiRoamingModeSetting(buttonMode); - // mButtonWfcRoamingMode.setSummary is not needed; summary is selected value + if (mUseWfcHomeModeForRoaming) { + mImsMmTelManager.setVoWiFiRoamingModeSetting(buttonMode); + // mButtonWfcRoamingMode.setSummary is not needed; summary is selected value + } + } catch (IllegalArgumentException e) { + Log.e(TAG, "onPreferenceChange: Exception", e); } } } else if (preference == mButtonWfcRoamingMode) { mButtonWfcRoamingMode.setValue((String) newValue); final int buttonMode = Integer.valueOf((String) newValue); - final int currentMode = mImsMmTelManager.getVoWiFiRoamingModeSetting(); - if (buttonMode != currentMode) { - mImsMmTelManager.setVoWiFiRoamingModeSetting(buttonMode); - // mButtonWfcRoamingMode.setSummary is not needed; summary is just selected value. - mMetricsFeatureProvider.action(getActivity(), getMetricsCategory(), buttonMode); + int currentMode = ImsMmTelManager.WIFI_MODE_UNKNOWN; + try { + currentMode = mImsMmTelManager.getVoWiFiRoamingModeSetting(); + } catch (IllegalArgumentException e) { + hasException = true; + Log.e(TAG, "updateWfcMode: Exception", e); + } + if (buttonMode != currentMode && !hasException) { + try { + mImsMmTelManager.setVoWiFiRoamingModeSetting(buttonMode); + // mButtonWfcRoamingMode.setSummary is not needed; summary is just selected + // value. + mMetricsFeatureProvider.action(getActivity(), getMetricsCategory(), buttonMode); + } catch (IllegalArgumentException e) { + Log.e(TAG, "onPreferenceChange: Exception", e); + } } } return true; diff --git a/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java b/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java index bc472d9895a..4272ab7dd8f 100644 --- a/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java +++ b/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java @@ -349,7 +349,13 @@ public class WifiCallingSliceHelper { final FutureTask wfcModeTask = new FutureTask<>(new Callable() { @Override public Integer call() { - return imsMmTelManager.getVoWiFiModeSetting(); + int wfcMode = ImsMmTelManager.WIFI_MODE_UNKNOWN; + try { + wfcMode = imsMmTelManager.getVoWiFiModeSetting(); + } catch (IllegalArgumentException e) { + Log.e(TAG, "getResourceIdForWfcMode: Exception", e); + } + return wfcMode; } }); final ExecutorService executor = Executors.newSingleThreadExecutor(); @@ -381,7 +387,11 @@ public class WifiCallingSliceHelper { // If either the action is to turn off wifi calling setting // or there is no activation involved - Update the setting final ImsMmTelManager imsMmTelManager = getImsMmTelManager(subId); - imsMmTelManager.setVoWiFiSettingEnabled(newValue); + try { + imsMmTelManager.setVoWiFiSettingEnabled(newValue); + } catch (IllegalArgumentException e) { + Log.e(TAG, "handleWifiCallingChanged: Exception", e); + } } else { Log.w(TAG, "action not taken: subId " + subId + " from " + currentValue + " to " + newValue); @@ -425,7 +435,14 @@ public class WifiCallingSliceHelper { // Change the preference only when wifi calling is enabled // And when wifi calling preference is editable for the current carrier final ImsMmTelManager imsMmTelManager = getImsMmTelManager(subId); - final int currentValue = imsMmTelManager.getVoWiFiModeSetting(); + int currentValue = ImsMmTelManager.WIFI_MODE_UNKNOWN; + try { + currentValue = imsMmTelManager.getVoWiFiModeSetting(); + } catch (IllegalArgumentException e) { + Log.e(TAG, "handleWifiCallingPreferenceChanged: Exception", e); + return; + } + int newValue = errorValue; switch (intent.getAction()) { case ACTION_WIFI_CALLING_PREFERENCE_WIFI_ONLY: @@ -443,7 +460,11 @@ public class WifiCallingSliceHelper { } if (newValue != errorValue && newValue != currentValue) { // Update the setting only when there is a valid update - imsMmTelManager.setVoWiFiModeSetting(newValue); + try { + imsMmTelManager.setVoWiFiModeSetting(newValue); + } catch (IllegalArgumentException e) { + Log.e(TAG, "handleWifiCallingPreferenceChanged: Exception", e); + } } } }