From 7f62ae77dc274193a0683872ebd26162f26e0303 Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Mon, 28 Aug 2023 17:58:03 +0800 Subject: [PATCH] Fix ClassCastException at NetworkSelectSettings Bug: 296172317 Test: atest NetworkSelectSettingsTest Change-Id: I811ef95f679bb1b0235a335320654c2acd68110c --- .../telephony/NetworkSelectSettings.java | 70 ++++++++++--------- .../telephony/NetworkSelectSettingsTest.java | 11 ++- 2 files changed, 48 insertions(+), 33 deletions(-) diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java index ebc3ea6e226..f20fe1f0782 100644 --- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java +++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java @@ -236,37 +236,44 @@ public class NetworkSelectSettings extends DashboardFragment { @Override public boolean onPreferenceTreeClick(Preference preference) { - if (preference != mSelectedPreference) { - stopNetworkQuery(); - - // Refresh the last selected item in case users reselect network. - clearPreferenceSummary(); - if (mSelectedPreference != null) { - // Set summary as "Disconnected" to the previously connected network - mSelectedPreference.setSummary(R.string.network_disconnected); - } - - mSelectedPreference = (NetworkOperatorPreference) preference; - mSelectedPreference.setSummary(R.string.network_connecting); - - mMetricsFeatureProvider.action(getContext(), - SettingsEnums.ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK); - - setProgressBarVisible(true); - // Disable the screen until network is manually set - enablePreferenceScreen(false); - - mRequestIdManualNetworkSelect = getNewRequestId(); - mWaitingForNumberOfScanResults = MIN_NUMBER_OF_SCAN_REQUIRED; - final OperatorInfo operator = mSelectedPreference.getOperatorInfo(); - ThreadUtils.postOnBackgroundThread(() -> { - final Message msg = mHandler.obtainMessage( - EVENT_SET_NETWORK_SELECTION_MANUALLY_DONE); - msg.obj = mTelephonyManager.setNetworkSelectionModeManual( - operator, true /* persistSelection */); - msg.sendToTarget(); - }); + if (preference == mSelectedPreference) { + Log.d(TAG, "onPreferenceTreeClick: preference is mSelectedPreference. Do nothing."); + return true; } + if (!(preference instanceof NetworkOperatorPreference)) { + Log.d(TAG, "onPreferenceTreeClick: preference is not the NetworkOperatorPreference."); + return false; + } + + stopNetworkQuery(); + + // Refresh the last selected item in case users reselect network. + clearPreferenceSummary(); + if (mSelectedPreference != null) { + // Set summary as "Disconnected" to the previously connected network + mSelectedPreference.setSummary(R.string.network_disconnected); + } + + mSelectedPreference = (NetworkOperatorPreference) preference; + mSelectedPreference.setSummary(R.string.network_connecting); + + mMetricsFeatureProvider.action(getContext(), + SettingsEnums.ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK); + + setProgressBarVisible(true); + // Disable the screen until network is manually set + enablePreferenceScreen(false); + + mRequestIdManualNetworkSelect = getNewRequestId(); + mWaitingForNumberOfScanResults = MIN_NUMBER_OF_SCAN_REQUIRED; + final OperatorInfo operator = mSelectedPreference.getOperatorInfo(); + ThreadUtils.postOnBackgroundThread(() -> { + final Message msg = mHandler.obtainMessage( + EVENT_SET_NETWORK_SELECTION_MANUALLY_DONE); + msg.obj = mTelephonyManager.setNetworkSelectionModeManual( + operator, true /* persistSelection */); + msg.sendToTarget(); + }); return true; } @@ -563,8 +570,7 @@ public class NetworkSelectSettings extends DashboardFragment { int idxPreference = mPreferenceCategory.getPreferenceCount(); while (idxPreference > 0) { idxPreference--; - final NetworkOperatorPreference networkOperator = (NetworkOperatorPreference) - (mPreferenceCategory.getPreference(idxPreference)); + final Preference networkOperator = mPreferenceCategory.getPreference(idxPreference); networkOperator.setSummary(null); } } diff --git a/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java b/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java index 7d860185a31..404f56cdddc 100644 --- a/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java @@ -25,7 +25,6 @@ import android.content.Context; import android.content.res.Resources; import android.os.Bundle; import android.os.PersistableBundle; -import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.CellIdentity; import android.telephony.CellIdentityGsm; @@ -37,6 +36,7 @@ import android.telephony.CellSignalStrengthGsm; import android.telephony.CellSignalStrengthLte; import android.telephony.TelephonyManager; +import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; @@ -310,4 +310,13 @@ public class NetworkSelectSettingsTest { cellInfoGsm.setCellSignalStrength(cssg); return cellInfoGsm; } + + @Test + @UiThreadTest + public void onPreferenceTreeClick_notNetworkOperatorPreference_noCrash() { + mNetworkSelectSettings.onCreateInitialization(); + mNetworkSelectSettings.enablePreferenceScreen(true); + + mNetworkSelectSettings.onPreferenceTreeClick(new Preference(mContext)); + } }