diff --git a/res/values/config.xml b/res/values/config.xml index 8c158e78525..d2ecd2db910 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -545,4 +545,7 @@ 2 3 + + + false diff --git a/src/com/android/settings/network/telephony/CellInfoUtil.java b/src/com/android/settings/network/telephony/CellInfoUtil.java index 63ef159c3dd..8889586edd3 100644 --- a/src/com/android/settings/network/telephony/CellInfoUtil.java +++ b/src/com/android/settings/network/telephony/CellInfoUtil.java @@ -143,28 +143,11 @@ public final class CellInfoUtil { public static String cellInfoToString(CellInfo cellInfo) { final String cellType = cellInfo.getClass().getSimpleName(); final CellIdentity cid = getCellIdentity(cellInfo); - String mcc = null; - String mnc = null; + String mcc = getCellIdentityMcc(cid); + String mnc = getCellIdentityMnc(cid); CharSequence alphaLong = null; CharSequence alphaShort = null; if (cid != null) { - if (cid instanceof CellIdentityGsm) { - mcc = ((CellIdentityGsm) cid).getMccString(); - mnc = ((CellIdentityGsm) cid).getMncString(); - } else if (cid instanceof CellIdentityWcdma) { - mcc = ((CellIdentityWcdma) cid).getMccString(); - mnc = ((CellIdentityWcdma) cid).getMncString(); - } else if (cid instanceof CellIdentityTdscdma) { - mcc = ((CellIdentityTdscdma) cid).getMccString(); - mnc = ((CellIdentityTdscdma) cid).getMncString(); - } else if (cid instanceof CellIdentityLte) { - mcc = ((CellIdentityLte) cid).getMccString(); - mnc = ((CellIdentityLte) cid).getMncString(); - } else if (cid instanceof CellIdentityNr) { - mcc = ((CellIdentityNr) cid).getMccString(); - mnc = ((CellIdentityNr) cid).getMncString(); - } - alphaLong = cid.getOperatorAlphaLong(); alphaShort = cid.getOperatorAlphaShort(); } @@ -173,4 +156,64 @@ public final class CellInfoUtil { cellType, cellInfo.isRegistered(), mcc, mnc, alphaLong, alphaShort); } + + /** + * Returns the MccMnc. + * + * @param cid contains the identity of the network. + * @return MccMnc string. + */ + public static String getCellIdentityMccMnc(CellIdentity cid) { + String mcc = getCellIdentityMcc(cid); + String mnc = getCellIdentityMnc(cid); + return (mcc == null || mnc == null) ? null : mcc + mnc; + } + + /** + * Returns the Mcc. + * + * @param cid contains the identity of the network. + * @return Mcc string. + */ + public static String getCellIdentityMcc(CellIdentity cid) { + String mcc = null; + if (cid != null) { + if (cid instanceof CellIdentityGsm) { + mcc = ((CellIdentityGsm) cid).getMccString(); + } else if (cid instanceof CellIdentityWcdma) { + mcc = ((CellIdentityWcdma) cid).getMccString(); + } else if (cid instanceof CellIdentityTdscdma) { + mcc = ((CellIdentityTdscdma) cid).getMccString(); + } else if (cid instanceof CellIdentityLte) { + mcc = ((CellIdentityLte) cid).getMccString(); + } else if (cid instanceof CellIdentityNr) { + mcc = ((CellIdentityNr) cid).getMccString(); + } + } + return (mcc == null) ? null : mcc; + } + + /** + * Returns the Mnc. + * + * @param cid contains the identity of the network. + * @return Mcc string. + */ + public static String getCellIdentityMnc(CellIdentity cid) { + String mnc = null; + if (cid != null) { + if (cid instanceof CellIdentityGsm) { + mnc = ((CellIdentityGsm) cid).getMncString(); + } else if (cid instanceof CellIdentityWcdma) { + mnc = ((CellIdentityWcdma) cid).getMncString(); + } else if (cid instanceof CellIdentityTdscdma) { + mnc = ((CellIdentityTdscdma) cid).getMncString(); + } else if (cid instanceof CellIdentityLte) { + mnc = ((CellIdentityLte) cid).getMncString(); + } else if (cid instanceof CellIdentityNr) { + mnc = ((CellIdentityNr) cid).getMncString(); + } + } + return (mnc == null) ? null : mnc; + } } diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java index 76b6cbd9564..d1f03d45d93 100644 --- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java +++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java @@ -68,6 +68,7 @@ public class NetworkSelectSettings extends DashboardFragment { private static final int EVENT_NETWORK_SCAN_COMPLETED = 4; private static final String PREF_KEY_NETWORK_OPERATORS = "network_operators_preference"; + private static final int MIN_NUMBER_OF_SCAN_REQUIRED = 2; private PreferenceCategory mPreferenceCategory; @VisibleForTesting @@ -87,8 +88,8 @@ public class NetworkSelectSettings extends DashboardFragment { private long mRequestIdManualNetworkSelect; private long mRequestIdManualNetworkScan; private long mWaitingForNumberOfScanResults; - - private static final int MIN_NUMBER_OF_SCAN_REQUIRED = 2; + @VisibleForTesting + boolean mIsAggregationEnabled = false; @Override public void onCreate(Bundle icicle) { @@ -117,6 +118,9 @@ public class NetworkSelectSettings extends DashboardFragment { } mMetricsFeatureProvider = getMetricsFeatureProvider(getContext()); + mIsAggregationEnabled = enableAggregation(getContext()); + Log.d(TAG, "init: mUseNewApi:" + mUseNewApi + + " ,mIsAggregationEnabled:" + mIsAggregationEnabled); } @Keep @@ -126,6 +130,13 @@ public class NetworkSelectSettings extends DashboardFragment { com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI); } + @Keep + @VisibleForTesting + protected boolean enableAggregation(Context context) { + return context.getResources().getBoolean( + R.bool.config_network_selection_list_aggregation_enabled); + } + @Keep @VisibleForTesting protected PreferenceCategory getPreferenceCategory(String preferenceKey) { @@ -324,6 +335,31 @@ public class NetworkSelectSettings extends DashboardFragment { } }; + @VisibleForTesting + List doAggregation(List cellInfoListInput) { + if (!mIsAggregationEnabled) { + Log.d(TAG, "no aggregation"); + return new ArrayList<>(cellInfoListInput); + } + ArrayList aggregatedList = new ArrayList<>(); + for (CellInfo cellInfo : cellInfoListInput) { + String plmn = CellInfoUtil.getNetworkTitle(cellInfo.getCellIdentity(), + CellInfoUtil.getCellIdentityMccMnc(cellInfo.getCellIdentity())); + Class className = cellInfo.getClass(); + + if (aggregatedList.stream().anyMatch( + i -> { + return (CellInfoUtil.getNetworkTitle(i.getCellIdentity(), + CellInfoUtil.getCellIdentityMccMnc(i.getCellIdentity())) == plmn) + && i.getClass().equals(className); + })) { + continue; + } + aggregatedList.add(cellInfo); + } + return aggregatedList; + } + private final NetworkScanHelper.NetworkScanCallback mCallback = new NetworkScanHelper.NetworkScanCallback() { public void onResults(List results) { @@ -356,7 +392,7 @@ public class NetworkSelectSettings extends DashboardFragment { stopNetworkQuery(); } - mCellInfoList = new ArrayList<>(results); + mCellInfoList = doAggregation(results); Log.d(TAG, "CellInfoList: " + CellInfoUtil.cellInfoListToString(mCellInfoList)); if (mCellInfoList != null && mCellInfoList.size() != 0) { final NetworkOperatorPreference connectedPref = 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 8172e1ab829..697ce9c8c31 100644 --- a/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java @@ -28,7 +28,13 @@ import android.os.PersistableBundle; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.CellIdentity; +import android.telephony.CellIdentityGsm; +import android.telephony.CellIdentityLte; import android.telephony.CellInfo; +import android.telephony.CellInfoGsm; +import android.telephony.CellInfoLte; +import android.telephony.CellSignalStrengthGsm; +import android.telephony.CellSignalStrengthLte; import android.telephony.TelephonyManager; import androidx.preference.PreferenceCategory; @@ -45,6 +51,8 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Arrays; +import java.util.Collections; +import java.util.List; public class NetworkSelectSettingsTest { private static final int SUB_ID = 2; @@ -78,6 +86,7 @@ public class NetworkSelectSettingsTest { public Context mContext; public PreferenceCategory mPreferenceCategory; + public boolean mIsAggregationEnabled = true; private Bundle mInitArguments; private TargetClass mNetworkSelectSettings; @@ -93,10 +102,11 @@ public class NetworkSelectSettingsTest { mPreferenceCategory = spy(new PreferenceCategory(mContext)); doReturn(mPreferenceManager).when(mPreferenceCategory).getPreferenceManager(); - + doReturn(mCellId1).when(mCellInfo1).getCellIdentity(); doReturn(CARRIER_NAME1).when(mCellId1).getOperatorAlphaLong(); + doReturn(mCellId2).when(mCellInfo2).getCellIdentity(); doReturn(CARRIER_NAME2).when(mCellId2).getOperatorAlphaLong(); - + mIsAggregationEnabled = true; mNetworkSelectSettings = spy(new TargetClass(this)); PersistableBundle config = new PersistableBundle(); @@ -169,6 +179,11 @@ public class NetworkSelectSettingsTest { } return pref; } + + @Override + protected boolean enableAggregation(Context context) { + return mTestEnv.mIsAggregationEnabled; + } } @Test @@ -177,7 +192,6 @@ public class NetworkSelectSettingsTest { mNetworkSelectSettings.onCreateInitialization(); mNetworkSelectSettings.enablePreferenceScreen(true); mNetworkSelectSettings.scanResultHandler(Arrays.asList(mCellInfo1, mCellInfo2)); - assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(2); final NetworkOperatorPreference preference = (NetworkOperatorPreference) mPreferenceCategory.getPreference(1); @@ -195,4 +209,90 @@ public class NetworkSelectSettingsTest { // Should not Crash mNetworkSelectSettings.updateForbiddenPlmns(); } + + @Test + public void doAggregation_hasDuplicateItemsDiffCellIdCase1_removeSamePlmnRatItem() { + mNetworkSelectSettings.onCreateInitialization(); + List testList = Arrays.asList( + createLteCellInfo(true, 123, "123", "232", "CarrierA"), + createLteCellInfo(true, 1234, "123", "232", "CarrierA"), + createGsmCellInfo(false, 123, "123", "232", "CarrierB")); + List expected = Arrays.asList( + createLteCellInfo(true, 123, "123", "232", "CarrierA"), + createGsmCellInfo(false, 123, "123", "232", "CarrierB")); + assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected); + } + + @Test + public void doAggregation_hasDuplicateItemsDiffCellIdCase2_removeSamePlmnRatItem() { + mNetworkSelectSettings.onCreateInitialization(); + List testList = Arrays.asList( + createLteCellInfo(true, 123, "123", "232", "CarrierA"), + createGsmCellInfo(false, 123, "123", "232", "CarrierB"), + createLteCellInfo(false, 1234, "123", "232", "CarrierB"), + createGsmCellInfo(false, 1234, "123", "232", "CarrierB")); + List expected = Arrays.asList( + createLteCellInfo(true, 123, "123", "232", "CarrierA"), + createGsmCellInfo(false, 123, "123", "232", "CarrierB"), + createLteCellInfo(false, 1234, "123", "232", "CarrierB")); + assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected); + } + + @Test + public void doAggregation_hasDuplicateItemsDiffMccMncCase1_removeSamePlmnRatItem() { + mNetworkSelectSettings.onCreateInitialization(); + List testList = Arrays.asList( + createLteCellInfo(true, 123, "123", "232", "CarrierA"), + createLteCellInfo(true, 123, "456", "232", "CarrierA"), + createGsmCellInfo(false, 123, "123", "232", "CarrierB")); + List expected = Arrays.asList( + createLteCellInfo(true, 123, "123", "232", "CarrierA"), + createGsmCellInfo(false, 123, "123", "232", "CarrierB")); + assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected); + } + + @Test + public void doAggregation_hasDuplicateItemsDiffMccMncCase2_removeSamePlmnRatItem() { + mNetworkSelectSettings.onCreateInitialization(); + List testList = Arrays.asList( + createLteCellInfo(true, 123, "123", "232", "CarrierA"), + createGsmCellInfo(false, 123, "123", "232", "CarrierB"), + createLteCellInfo(false, 1234, "123", "232", "CarrierB"), + createGsmCellInfo(false, 123, "456", "232", "CarrierB")); + List expected = Arrays.asList( + createLteCellInfo(true, 123, "123", "232", "CarrierA"), + createGsmCellInfo(false, 123, "123", "232", "CarrierB"), + createLteCellInfo(false, 1234, "123", "232", "CarrierB")); + assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected); + } + + private CellInfoLte createLteCellInfo(boolean registered, int cellId, String mcc, String mnc, + String plmnName) { + CellIdentityLte cil = new CellIdentityLte( + cellId, 5, 200, 2000, new int[]{1, 2}, 10000, mcc, + mnc, plmnName, plmnName, + Collections.emptyList(), null); + CellSignalStrengthLte cssl = new CellSignalStrengthLte(15, 16, 17, 18, 19, 20); + + CellInfoLte cellInfoLte = new CellInfoLte(); + cellInfoLte.setRegistered(registered); + cellInfoLte.setTimeStamp(22); + cellInfoLte.setCellIdentity(cil); + cellInfoLte.setCellSignalStrength(cssl); + return cellInfoLte; + } + + private CellInfoGsm createGsmCellInfo(boolean registered, int cellId, String mcc, String mnc, + String plmnName) { + CellIdentityGsm cig = new CellIdentityGsm(1, cellId, 40, 5, mcc, + mnc, plmnName, plmnName, + Collections.emptyList()); + CellSignalStrengthGsm cssg = new CellSignalStrengthGsm(5, 6, 7); + CellInfoGsm cellInfoGsm = new CellInfoGsm(); + cellInfoGsm.setRegistered(registered); + cellInfoGsm.setTimeStamp(9); + cellInfoGsm.setCellIdentity(cig); + cellInfoGsm.setCellSignalStrength(cssg); + return cellInfoGsm; + } }