Filter out satellite plmn when in SAT mode

[SAT-070] : PLMNs associated with SAT MODE, as specified in SAT-008, should not be displayed or selectable in Manual Selection/Network Operator Menu

Bug: 316264277
Test: Manual test with pixel in live network
Test: atest NetworkSelectSettingsTest

Change-Id: Ic100772c97fa1ab18d7e63b654e397d8a80eda8a
This commit is contained in:
Hakjun Choi
2023-12-18 17:47:49 +00:00
parent 306df3beaa
commit 197a10a0a9
3 changed files with 174 additions and 12 deletions

View File

@@ -454,6 +454,7 @@
<activity <activity
android:name="Settings$NetworkSelectActivity" android:name="Settings$NetworkSelectActivity"
android:label="@string/choose_network_title" android:label="@string/choose_network_title"
android:permission="android.permission.SATELLITE_COMMUNICATION"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|smallestScreenSize"> android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|smallestScreenSize">
<meta-data android:name="com.android.settings.FRAGMENT_CLASS" <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.network.telephony.NetworkSelectSettings" /> android:value="com.android.settings.network.telephony.NetworkSelectSettings" />

View File

@@ -34,6 +34,7 @@ import android.telephony.ServiceState;
import android.telephony.SignalStrength; import android.telephony.SignalStrength;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.telephony.satellite.SatelliteManager;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
@@ -43,6 +44,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceCategory;
import com.android.internal.annotations.Initializer;
import com.android.internal.telephony.OperatorInfo; import com.android.internal.telephony.OperatorInfo;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
@@ -56,6 +58,8 @@ import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
/** /**
* "Choose network" settings UI for the Settings app. * "Choose network" settings UI for the Settings app.
@@ -82,6 +86,8 @@ public class NetworkSelectSettings extends DashboardFragment {
List<CellInfo> mCellInfoList; List<CellInfo> mCellInfoList;
private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
private TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;
private SatelliteManager mSatelliteManager;
private CarrierConfigManager mCarrierConfigManager;
private List<String> mForbiddenPlmns; private List<String> mForbiddenPlmns;
private boolean mShow4GForLTE = false; private boolean mShow4GForLTE = false;
private NetworkScanHelper mNetworkScanHelper; private NetworkScanHelper mNetworkScanHelper;
@@ -93,6 +99,8 @@ public class NetworkSelectSettings extends DashboardFragment {
private long mWaitingForNumberOfScanResults; private long mWaitingForNumberOfScanResults;
@VisibleForTesting @VisibleForTesting
boolean mIsAggregationEnabled = false; boolean mIsAggregationEnabled = false;
private CarrierConfigManager.CarrierConfigChangeListener mCarrierConfigChangeListener;
private AtomicBoolean mShouldFilterOutSatellitePlmn = new AtomicBoolean();
@Override @Override
public void onCreate(Bundle icicle) { public void onCreate(Bundle icicle) {
@@ -102,28 +110,41 @@ public class NetworkSelectSettings extends DashboardFragment {
@Keep @Keep
@VisibleForTesting @VisibleForTesting
@Initializer
protected void onCreateInitialization() { protected void onCreateInitialization() {
mUseNewApi = enableNewAutoSelectNetworkUI(getContext()); Context context = getContext();
mUseNewApi = enableNewAutoSelectNetworkUI(context);
mSubId = getSubId(); mSubId = getSubId();
mPreferenceCategory = getPreferenceCategory(PREF_KEY_NETWORK_OPERATORS); mPreferenceCategory = getPreferenceCategory(PREF_KEY_NETWORK_OPERATORS);
mStatusMessagePreference = new Preference(getContext()); mStatusMessagePreference = new Preference(context);
mStatusMessagePreference.setSelectable(false); mStatusMessagePreference.setSelectable(false);
mSelectedPreference = null; mSelectedPreference = null;
mTelephonyManager = getTelephonyManager(getContext(), mSubId); mTelephonyManager = getTelephonyManager(context, mSubId);
mSatelliteManager = getSatelliteManager(context);
mCarrierConfigManager = getCarrierConfigManager(context);
mNetworkScanHelper = new NetworkScanHelper( mNetworkScanHelper = new NetworkScanHelper(
mTelephonyManager, mCallback, mNetworkScanExecutor); mTelephonyManager, mCallback, mNetworkScanExecutor);
PersistableBundle bundle = getCarrierConfigManager(getContext()) PersistableBundle bundle = mCarrierConfigManager.getConfigForSubId(mSubId,
.getConfigForSubId(mSubId); CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL,
if (bundle != null) { CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL);
mShow4GForLTE = bundle.getBoolean( mShow4GForLTE = bundle.getBoolean(CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL,
CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL); false);
} mShouldFilterOutSatellitePlmn.set(bundle.getBoolean(
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL,
true));
mMetricsFeatureProvider = getMetricsFeatureProvider(getContext()); mMetricsFeatureProvider = getMetricsFeatureProvider(context);
mIsAggregationEnabled = enableAggregation(getContext()); mIsAggregationEnabled = enableAggregation(context);
Log.d(TAG, "init: mUseNewApi:" + mUseNewApi Log.d(TAG, "init: mUseNewApi:" + mUseNewApi
+ " ,mIsAggregationEnabled:" + mIsAggregationEnabled + " ,mSubId:" + mSubId); + " ,mIsAggregationEnabled:" + mIsAggregationEnabled + " ,mSubId:" + mSubId);
mCarrierConfigChangeListener =
(slotIndex, subId, carrierId, specificCarrierId) -> handleCarrierConfigChanged(
subId);
mCarrierConfigManager.registerCarrierConfigChangeListener(mNetworkScanExecutor,
mCarrierConfigChangeListener);
} }
@Keep @Keep
@@ -165,6 +186,12 @@ public class NetworkSelectSettings extends DashboardFragment {
return FeatureFactory.getFeatureFactory().getMetricsFeatureProvider(); return FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
} }
@Keep
@VisibleForTesting
protected SatelliteManager getSatelliteManager(Context context) {
return context.getSystemService(SatelliteManager.class);
}
@Keep @Keep
@VisibleForTesting @VisibleForTesting
protected boolean isPreferenceScreenEnabled() { protected boolean isPreferenceScreenEnabled() {
@@ -385,7 +412,43 @@ public class NetworkSelectSettings extends DashboardFragment {
} }
aggregatedList.add(cellInfo); aggregatedList.add(cellInfo);
} }
return aggregatedList;
return filterOutSatellitePlmn(aggregatedList);
}
/* We do not want to expose carrier satellite plmns to the user when manually scan the
cellular network. Therefore, it is needed to filter out satellite plmns from current cell
info list */
private List<CellInfo> filterOutSatellitePlmn(List<CellInfo> cellInfoList) {
List<String> aggregatedSatellitePlmn = getAllSatellitePlmnsForCarrierWrapper();
if (!mShouldFilterOutSatellitePlmn.get() || aggregatedSatellitePlmn.isEmpty()) {
return cellInfoList;
}
return cellInfoList.stream()
.filter(cellInfo -> !aggregatedSatellitePlmn.contains(
CellInfoUtil.getOperatorNumeric(cellInfo.getCellIdentity())))
.collect(Collectors.toList());
}
/**
* Serves as a wrapper method for {@link SatelliteManager#getAllSatellitePlmnsForCarrier(int)}.
* Since SatelliteManager is final, this wrapper enables mocking or spying of
* {@link SatelliteManager#getAllSatellitePlmnsForCarrier(int)} for unit testing purposes.
*/
@VisibleForTesting
protected List<String> getAllSatellitePlmnsForCarrierWrapper() {
return mSatelliteManager.getAllSatellitePlmnsForCarrier(mSubId);
}
private void handleCarrierConfigChanged(int subId) {
PersistableBundle config = mCarrierConfigManager.getConfigForSubId(subId,
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL);
boolean shouldFilterSatellitePlmn = config.getBoolean(
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL,
true);
if (shouldFilterSatellitePlmn != mShouldFilterOutSatellitePlmn.get()) {
mShouldFilterOutSatellitePlmn.set(shouldFilterSatellitePlmn);
}
} }
private final NetworkScanHelper.NetworkScanCallback mCallback = private final NetworkScanHelper.NetworkScanCallback mCallback =

View File

@@ -17,6 +17,7 @@ package com.android.settings.network.telephony;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
@@ -50,6 +51,7 @@ import org.junit.Test;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -277,6 +279,102 @@ public class NetworkSelectSettingsTest {
assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected); assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected);
} }
@Test
public void doAggregation_filterOutSatellitePlmn_whenKeyIsTrue() {
PersistableBundle config = new PersistableBundle();
config.putBoolean(
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL, true);
doReturn(config).when(mCarrierConfigManager).getConfigForSubId(eq(SUB_ID),
eq(CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL),
eq(CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL));
List<String> testSatellitePlmn = new ArrayList<>(Arrays.asList("123232", "123235"));
doReturn(testSatellitePlmn).when(
mNetworkSelectSettings).getAllSatellitePlmnsForCarrierWrapper();
/* Expect filter out satellite plmns when
KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL is true, and there is available
satellite plmns. */
mNetworkSelectSettings.onCreateInitialization();
List<CellInfo> testList = Arrays.asList(
createLteCellInfo(true, 123, "123", "232", "CarrierA"),
createGsmCellInfo(false, 123, "123", "233", "CarrierB"),
createLteCellInfo(false, 1234, "123", "234", "CarrierC"),
createGsmCellInfo(false, 1234, "123", "235", "CarrierD"));
List<CellInfo> expected = Arrays.asList(
createGsmCellInfo(false, 123, "123", "233", "CarrierB"),
createLteCellInfo(false, 1234, "123", "234", "CarrierC"));
assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected);
}
@Test
public void doAggregation_filterOutSatellitePlmn_whenNoSatellitePlmnIsAvailable() {
PersistableBundle config = new PersistableBundle();
config.putBoolean(
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL, true);
doReturn(config).when(mCarrierConfigManager).getConfigForSubId(eq(SUB_ID),
eq(CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL),
eq(CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL));
List<String> testSatellitePlmn = new ArrayList<>(Arrays.asList("123232", "123235"));
doReturn(testSatellitePlmn).when(
mNetworkSelectSettings).getAllSatellitePlmnsForCarrierWrapper();
// Expect no filter out when there is no available satellite plmns.
mNetworkSelectSettings.onCreateInitialization();
testSatellitePlmn = new ArrayList<>();
doReturn(testSatellitePlmn).when(
mNetworkSelectSettings).getAllSatellitePlmnsForCarrierWrapper();
mNetworkSelectSettings.onCreateInitialization();
List<CellInfo> testList = Arrays.asList(
createLteCellInfo(true, 123, "123", "232", "CarrierA"),
createGsmCellInfo(false, 123, "123", "233", "CarrierB"),
createLteCellInfo(false, 1234, "123", "234", "CarrierC"),
createGsmCellInfo(false, 12345, "123", "235", "CarrierD"));
List<CellInfo> expected = Arrays.asList(
createLteCellInfo(true, 123, "123", "232", "CarrierA"),
createGsmCellInfo(false, 123, "123", "233", "CarrierB"),
createLteCellInfo(false, 1234, "123", "234", "CarrierC"),
createGsmCellInfo(false, 12345, "123", "235", "CarrierD"));
assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected);
// Expect no filter out when KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL is false.
config.putBoolean(
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL, false);
mNetworkSelectSettings.onCreateInitialization();
assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected);
}
@Test
public void doAggregation_filterOutSatellitePlmn_whenKeyIsFalse() {
PersistableBundle config = new PersistableBundle();
config.putBoolean(
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL, true);
doReturn(config).when(mCarrierConfigManager).getConfigForSubId(eq(SUB_ID),
eq(CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL),
eq(CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL));
List<String> testSatellitePlmn = new ArrayList<>(Arrays.asList("123232", "123235"));
doReturn(testSatellitePlmn).when(
mNetworkSelectSettings).getAllSatellitePlmnsForCarrierWrapper();
// Expect no filter out when KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL is false.
config.putBoolean(
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL, false);
mNetworkSelectSettings.onCreateInitialization();
List<CellInfo> testList = Arrays.asList(
createLteCellInfo(true, 123, "123", "232", "CarrierA"),
createGsmCellInfo(false, 123, "123", "233", "CarrierB"),
createLteCellInfo(false, 1234, "123", "234", "CarrierC"),
createGsmCellInfo(false, 12345, "123", "235", "CarrierD"));
List<CellInfo> expected = Arrays.asList(
createLteCellInfo(true, 123, "123", "232", "CarrierA"),
createGsmCellInfo(false, 123, "123", "233", "CarrierB"),
createLteCellInfo(false, 1234, "123", "234", "CarrierC"),
createGsmCellInfo(false, 12345, "123", "235", "CarrierD"));
assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected);
}
private CellInfoLte createLteCellInfo(boolean registered, int cellId, String mcc, String mnc, private CellInfoLte createLteCellInfo(boolean registered, int cellId, String mcc, String mnc,
String plmnName) { String plmnName) {
CellIdentityLte cil = new CellIdentityLte( CellIdentityLte cil = new CellIdentityLte(