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) {