Merge "Fix ClassCastException at NetworkSelectSettings" into udc-qpr-dev
diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
index ebc3ea6..f20fe1f 100644
--- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java
+++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
@@ -236,37 +236,44 @@
 
     @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 @@
         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 7d86018..404f56c 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.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.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 @@
         cellInfoGsm.setCellSignalStrength(cssg);
         return cellInfoGsm;
     }
+
+    @Test
+    @UiThreadTest
+    public void onPreferenceTreeClick_notNetworkOperatorPreference_noCrash() {
+        mNetworkSelectSettings.onCreateInitialization();
+        mNetworkSelectSettings.enablePreferenceScreen(true);
+
+        mNetworkSelectSettings.onPreferenceTreeClick(new Preference(mContext));
+    }
 }