aggregate the items of network selection list

According to bug comment#44, modem only report one PLMN per RAT
for different cells reported for the same PLMN/RAT combination,
UI affregate those items.
Bug: 173387374
Test: atest NetworkSelectSettingsTest

Change-Id: I8e05b9f6784bad7f0de4e79cc6e707749745f0c1
This commit is contained in:
SongFerngWang
2021-07-22 15:47:49 +08:00
parent 1465b649df
commit 2868b4af7a
4 changed files with 207 additions and 25 deletions

View File

@@ -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;
}
}

View File

@@ -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<CellInfo> doAggregation(List<CellInfo> cellInfoListInput) {
if (!mIsAggregationEnabled) {
Log.d(TAG, "no aggregation");
return new ArrayList<>(cellInfoListInput);
}
ArrayList<CellInfo> 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<CellInfo> 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 =