Merge "Filter out satellite plmn when in SAT mode" into main
This commit is contained in:
@@ -455,6 +455,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" />
|
||||||
|
|||||||
@@ -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 =
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user