Merge cherrypicks of ['googleplex-android-review.googlesource.com/28906069'] into sparse-12301355-L56800030006212796.
SPARSE_CHANGE: I413a7406ce57799059e791a51e9b09a0a6eeafb6

Change-Id: Ida93a4b8a01533c208f72a7127cca50bad534ef7
diff --git a/src/com/android/phone/settings/RadioInfo.java b/src/com/android/phone/settings/RadioInfo.java
index 005c0fa..8331155 100644
--- a/src/com/android/phone/settings/RadioInfo.java
+++ b/src/com/android/phone/settings/RadioInfo.java
@@ -108,6 +108,7 @@
 
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.RILConstants;
 import com.android.internal.telephony.euicc.EuiccConnector;
 import com.android.internal.telephony.util.TelephonyUtils;
 import com.android.phone.R;
@@ -116,6 +117,7 @@
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
@@ -347,8 +349,7 @@
     private boolean mCfiValue = false;
 
     private final PersistableBundle[] mCarrierSatelliteOriginalBundle = new PersistableBundle[2];
-    private final ForceSatelliteChannelBundle[] mOriginalSystemChannels =
-            new ForceSatelliteChannelBundle[2];
+    private final PersistableBundle[] mOriginalSystemChannels = new PersistableBundle[2];
     private List<CellInfo> mCellInfoResult = null;
     private final boolean[] mSimulateOos = new boolean[2];
     private int[] mSelectedSignalStrengthIndex = new int[2];
@@ -893,7 +894,7 @@
         mSimulateOutOfServiceSwitch.setOnCheckedChangeListener(mSimulateOosOnChangeListener);
         mMockSatellite.setChecked(mCarrierSatelliteOriginalBundle[mPhone.getPhoneId()] != null);
         mMockSatellite.setOnCheckedChangeListener(mMockSatelliteListener);
-        mEnforceSatelliteChannel.setChecked(mOriginalSystemChannels[mPhone.getPhoneId()] != null);
+        updateSatelliteChannelDisplay(mPhone.getPhoneId());
         mEnforceSatelliteChannel.setOnCheckedChangeListener(mForceSatelliteChannelOnChangeListener);
         mImsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
         mImsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
@@ -1006,6 +1007,7 @@
 
     @Override
     protected void onDestroy() {
+        log("onDestroy");
         clearOverride();
         super.onDestroy();
         if (mQueuedWork != null) {
@@ -1914,15 +1916,19 @@
         }
     };
 
-    private record ForceSatelliteChannelBundle(PersistableBundle bundle,
-                                               List<RadioAccessSpecifier> specifiers) {}
-
+    private static final int SATELLITE_CHANNEL = 8665;
     private final OnCheckedChangeListener mForceSatelliteChannelOnChangeListener =
             (buttonView, isChecked) -> {
-                if (mPhone == null || mPhone.getSubId() < 1) return;
+                if (mPhone == null || mPhone.getSubId() < 1) {
+                    loge("Force satellite channel mPhone.getSubId() < 1");
+                    return;
+                }
                 CarrierConfigManager cm = mPhone.getContext()
                         .getSystemService(CarrierConfigManager.class);
-                if (cm == null) return;
+                if (cm == null) {
+                    loge("Force satellite channel cm == null");
+                    return;
+                }
                 TelephonyManager tm = mTelephonyManager.createForSubscriptionId(mPhone.getSubId());
                 // To be used in thread in case mPhone changes.
                 int subId = mPhone.getSubId();
@@ -1943,28 +1949,24 @@
                         overrideBundle.putBoolean(CarrierConfigManager
                                 .KEY_EMERGENCY_MESSAGING_SUPPORTED_BOOL, true);
 
-                        // Force channel selection
-                        List<RadioAccessSpecifier> originalChannels;
+                        // Set only allow LTE network type
                         try {
-                            originalChannels = tm.getSystemSelectionChannels();
+                            tm.setAllowedNetworkTypesForReason(
+                                    TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_TEST,
+                                    RadioAccessFamily.getRafFromNetworkType(
+                                            RILConstants.NETWORK_MODE_LTE_ONLY));
+                            log("Force satellite channel set to LTE only");
                         } catch (Exception e) {
-                            loge("Force satellite channel failed to get channels " + e);
+                            loge("Force satellite channel failed to set network type to LTE " + e);
                             return;
                         }
+
+                        // Set force channel selection
                         List<RadioAccessSpecifier> mock = List.of(
                                 new RadioAccessSpecifier(
                                         AccessNetworkConstants.AccessNetworkType.EUTRAN,
                                         new int[]{AccessNetworkConstants.EutranBand.BAND_25},
-                                        new int[]{8665}),
-                                new RadioAccessSpecifier(
-                                        AccessNetworkConstants.AccessNetworkType.NGRAN,
-                                        new int[0],  new int[0]),
-                                new RadioAccessSpecifier(
-                                        AccessNetworkConstants.AccessNetworkType.UTRAN,
-                                        new int[0],  new int[0]),
-                                new RadioAccessSpecifier(
-                                        AccessNetworkConstants.AccessNetworkType.GERAN,
-                                        new int[0],  new int[0]));
+                                        new int[]{SATELLITE_CHANNEL}));
                         try {
                             log("Force satellite channel new channels " + mock);
                             tm.setSystemSelectionChannels(mock);
@@ -1974,25 +1976,28 @@
                         }
                         log("Force satellite channel new config " + overrideBundle);
                         cm.overrideConfig(subId, overrideBundle, false);
-                        ForceSatelliteChannelBundle original =
-                                new ForceSatelliteChannelBundle(originalBundle, originalChannels);
-                        mOriginalSystemChannels[phoneId] = original;
-                        log("Force satellite channel old " + original);
+
+                        mOriginalSystemChannels[phoneId] = originalBundle;
+                        log("Force satellite channel old " + mock  + originalBundle);
                     })).start();
                 } else {
-                    ForceSatelliteChannelBundle original;
-                    original = mOriginalSystemChannels[phoneId];
-                    if (original == null) return;
-                    log("Force satellite channel restoring to " + original);
                     (new Thread(() -> {
                         try {
-                            tm.setSystemSelectionChannels(original.specifiers);
-                            log("Force satellite channel successfully restored channels to "
-                                    + original.specifiers);
-                            cm.overrideConfig(subId, original.bundle, false);
-                            log("Force satellite channel successfully restored config to "
-                                    + original.bundle);
-                            mOriginalSystemChannels[phoneId] = null;
+                            tm.setSystemSelectionChannels(
+                                    Collections.emptyList() /* isSpecifyChannels false */);
+                            log("Force satellite channel successfully cleared channels ");
+                            tm.setAllowedNetworkTypesForReason(
+                                    TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_TEST,
+                                    TelephonyManager.getAllNetworkTypesBitmask());
+                            log("Force satellite channel successfully reset network type to "
+                                    + TelephonyManager.getAllNetworkTypesBitmask());
+                            PersistableBundle original = mOriginalSystemChannels[phoneId];
+                            if (original != null) {
+                                cm.overrideConfig(subId, original, false);
+                                log("Force satellite channel successfully restored config to "
+                                        + original);
+                                mOriginalSystemChannels[phoneId] = null;
+                            }
                         } catch (Exception e) {
                             loge("Force satellite channel: Can't clear mock " + e);
                         }
@@ -2000,6 +2005,37 @@
                 }
     };
 
+    private void updateSatelliteChannelDisplay(int phoneId) {
+        if (mEnforceSatelliteChannel.isChecked()) return;
+        // Assume in testing mode
+        (new Thread(() -> {
+            TelephonyManager tm = mTelephonyManager.createForSubscriptionId(
+                    SubscriptionManager.getSubscriptionId(phoneId));
+            try {
+                List<RadioAccessSpecifier> channels = tm.getSystemSelectionChannels();
+                long networkTypeBitMask = tm.getAllowedNetworkTypesForReason(
+                        TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_TEST);
+                long lteNetworkBitMask = RadioAccessFamily.getRafFromNetworkType(
+                        RILConstants.NETWORK_MODE_LTE_ONLY);
+                mHandler.post(() -> {
+                    log("Force satellite get channel " + channels
+                            + " get networkTypeBitMask " + networkTypeBitMask
+                            + " lte " + lteNetworkBitMask);
+                    // if SATELLITE_CHANNEL is the current channel
+                    mEnforceSatelliteChannel.setChecked(channels.stream().filter(specifier ->
+                                    specifier.getRadioAccessNetwork()
+                                            == AccessNetworkConstants.AccessNetworkType.EUTRAN)
+                            .flatMapToInt(specifier -> Arrays.stream(specifier.getChannels()))
+                            .anyMatch(channel -> channel == SATELLITE_CHANNEL)
+                            // OR ALLOWED_NETWORK_TYPES_REASON_TEST is LTE only.
+                            || (networkTypeBitMask & lteNetworkBitMask) == networkTypeBitMask);
+                });
+            } catch (Exception e) {
+                loge("updateSatelliteChannelDisplay " + e);
+            }
+        })).start();
+    }
+
     private final OnCheckedChangeListener mMockSatelliteListener =
             (buttonView, isChecked) -> {
                 if (mPhone != null) {