[Settings] Code refactor - NetworkModePreference

Code refactor for improving readibility.

Bug: 223461708
Test: unit test EnabledNetworkModePreferenceControllerTest
Change-Id: I3b3157cbc76f104d63062fda495a7391ecc18ada
This commit is contained in:
Bonian Chen
2022-03-09 09:26:03 +08:00
parent 24548b3a09
commit d5460431e4
5 changed files with 239 additions and 147 deletions

View File

@@ -66,6 +66,7 @@ android_library {
"net-utils-framework-common",
"settings-contextual-card-protos-lite",
"settings-log-bridge-protos-lite",
"settings-telephony-protos-lite",
"contextualcards",
"settings-logtags",
"statslog-settings",

View File

@@ -24,3 +24,12 @@ java_library_static {
},
srcs: ["settings_log_bridge.proto"],
}
java_library_static {
name: "settings-telephony-protos-lite",
host_supported: true,
proto: {
type: "lite",
},
srcs: ["network_mode_choices.proto"],
}

View File

@@ -0,0 +1,112 @@
syntax = "proto2";
package com.android.settings.intelligence;
option java_multiple_files = false;
option java_package = "com.android.settings.network.telephony";
option java_outer_classname = "NetworkModeChoicesProto";
// EnabledNetworks is a list which tries to categorized the entries of popup menu
// based on carrier network types available to the end user.
// Next tag: 13
enum EnabledNetworks {
// No EnabledNetworks specified.
ENABLED_NETWORKS_UNSPECIFIED = 0;
// For the case where either unsupported or unable to categorized properly.
ENABLED_NETWORKS_UNKNOWN = 1;
// For the case where CDMA is supported and LTE is not prioritized over
// CDMA.
ENABLED_NETWORKS_CDMA_CHOICES = 2;
// For the case where CDMA is supported and LTE is not available.
ENABLED_NETWORKS_CDMA_NO_LTE_CHOICES = 3;
// For the case where CDMA is supported and LTE is available.
ENABLED_NETWORKS_CDMA_ONLY_LTE_CHOICES = 4;
// For the case where TDSCDMA is primary network type.
ENABLED_NETWORKS_TDSCDMA_CHOICES = 5;
// For the case where GSM and LTE options are removed from the menu.
ENABLED_NETWORKS_EXCEPT_GSM_LTE_CHOICES = 6;
// For the case where GSM and 4G options are removed from the menu.
ENABLED_NETWORKS_EXCEPT_GSM_4G_CHOICES = 7;
// For the case where GSM is removed from the menu, and both 4G/LTE are not an
// option.
ENABLED_NETWORKS_EXCEPT_GSM_CHOICES = 8;
// For the case where LTE is disabled.
ENABLED_NETWORKS_EXCEPT_LTE_CHOICES = 9;
// For the case where GSM related carrier with 4G/LTE supported.
ENABLED_NETWORKS_4G_CHOICES = 10;
// For the case where GSM related carrier without 4G/LTE supported.
ENABLED_NETWORKS_CHOICES = 11;
// For the case where world mode is enabled.
PREFERRED_NETWORK_MODE_CHOICES_WORLD_MODE = 12;
}
// A request for popup menu.
// Next tag: 4
message UiOptions {
// Mapping to popup menu categories.
required EnabledNetworks type = 1;
// Resource which provides a list of network type values for this popup menu.
required int32 choices = 2;
// Presentation format of a continuous popop menu entries.
// Each format may contains any numbers of popop menu entries.
// Next tag: 12
enum PresentFormat {
// No PresentFormat specified.
PRESENT_FORMAT_UNSPECIFIED = 0;
// Append a CDMA 1x network option into popup menu.
add1xEntry = 1;
// Append a 2G network option into popup menu.
add2gEntry = 2;
// Append a 3G network option into popup menu.
add3gEntry = 3;
// Append a global mode option into popup menu.
addGlobalEntry = 4;
// Append a CDMA/LTE global mode option into popup menu.
addWorldModeCdmaEntry = 5;
// Append a GSM/LTE global mode option into popup menu.
addWorldModeGsmEntry = 6;
// Append a 4G network option into popup menu.
add4gEntry = 7;
// Append a LTE network option into popup menu.
addLteEntry = 8;
// Append a 5G network option into popup menu.
add5gEntry = 9;
// Append both 5G and 4G network options into popup menu.
add5gAnd4gEntry = 10;
// Append both 5G and LTE network options into popup menu.
add5gAndLteEntry = 11;
}
// Format of popup menu entries.
// The length of this entry need to be less than the network type values
// referenced from "choices" field.
repeated PresentFormat format = 3;
}

View File

@@ -39,11 +39,14 @@ import com.android.settings.R;
import com.android.settings.network.AllowedNetworkTypesListener;
import com.android.settings.network.CarrierConfigCache;
import com.android.settings.network.SubscriptionsChangeListener;
import com.android.settings.network.telephony.NetworkModeChoicesProto.EnabledNetworks;
import com.android.settings.network.telephony.NetworkModeChoicesProto.UiOptions;
import com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
@@ -187,21 +190,6 @@ public class EnabledNetworkModePreferenceController extends
}
}
enum EnabledNetworks {
ENABLED_NETWORKS_UNKNOWN,
ENABLED_NETWORKS_CDMA_CHOICES,
ENABLED_NETWORKS_CDMA_NO_LTE_CHOICES,
ENABLED_NETWORKS_CDMA_ONLY_LTE_CHOICES,
ENABLED_NETWORKS_TDSCDMA_CHOICES,
ENABLED_NETWORKS_EXCEPT_GSM_LTE_CHOICES,
ENABLED_NETWORKS_EXCEPT_GSM_4G_CHOICES,
ENABLED_NETWORKS_EXCEPT_GSM_CHOICES,
ENABLED_NETWORKS_EXCEPT_LTE_CHOICES,
ENABLED_NETWORKS_4G_CHOICES,
ENABLED_NETWORKS_CHOICES,
PREFERRED_NETWORK_MODE_CHOICES_WORLD_MODE
}
private final class PreferenceEntriesBuilder {
private CarrierConfigCache mCarrierConfigCache;
private Context mContext;
@@ -256,163 +244,144 @@ public class EnabledNetworkModePreferenceController extends
final boolean display2gOptions = carrierConfig
.getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL);
clearAllEntries();
String[] entryValues;
int[] entryValuesInt;
switch (getEnabledNetworkType()) {
UiOptions.Builder uiOptions = UiOptions.newBuilder();
uiOptions.setType(getEnabledNetworkType());
switch (uiOptions.getType()) {
case ENABLED_NETWORKS_CDMA_CHOICES:
entryValues = getResourcesForSubId().getStringArray(
R.array.enabled_networks_cdma_values);
entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
if (entryValuesInt.length < 4) {
throw new IllegalArgumentException(
"ENABLED_NETWORKS_CDMA_CHOICES index error.");
}
add5gEntry(addNrToLteNetworkType(entryValuesInt[0]));
addLteEntry(entryValuesInt[0]);
add3gEntry(entryValuesInt[1]);
if (display2gOptions) {
add1xEntry(entryValuesInt[2]);
}
addGlobalEntry(entryValuesInt[3]);
uiOptions = uiOptions
.setChoices(R.array.enabled_networks_cdma_values)
.addFormat(UiOptions.PresentFormat.add5gAndLteEntry)
.addFormat(UiOptions.PresentFormat.add3gEntry)
.addFormat(UiOptions.PresentFormat.add1xEntry)
.addFormat(UiOptions.PresentFormat.addGlobalEntry);
break;
case ENABLED_NETWORKS_CDMA_NO_LTE_CHOICES:
entryValues = getResourcesForSubId().getStringArray(
R.array.enabled_networks_cdma_no_lte_values);
entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
if (entryValuesInt.length < 2) {
throw new IllegalArgumentException(
"ENABLED_NETWORKS_CDMA_NO_LTE_CHOICES index error.");
}
add3gEntry(entryValuesInt[0]);
if (display2gOptions) {
add1xEntry(entryValuesInt[1]);
}
uiOptions = uiOptions
.setChoices(R.array.enabled_networks_cdma_no_lte_values)
.addFormat(UiOptions.PresentFormat.add3gEntry)
.addFormat(UiOptions.PresentFormat.add1xEntry);
break;
case ENABLED_NETWORKS_CDMA_ONLY_LTE_CHOICES:
entryValues = getResourcesForSubId().getStringArray(
R.array.enabled_networks_cdma_only_lte_values);
entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
if (entryValuesInt.length < 2) {
throw new IllegalArgumentException(
"ENABLED_NETWORKS_CDMA_ONLY_LTE_CHOICES index error.");
}
addLteEntry(entryValuesInt[0]);
addGlobalEntry(entryValuesInt[1]);
uiOptions = uiOptions
.setChoices(R.array.enabled_networks_cdma_only_lte_values)
.addFormat(UiOptions.PresentFormat.addLteEntry)
.addFormat(UiOptions.PresentFormat.addGlobalEntry);
break;
case ENABLED_NETWORKS_TDSCDMA_CHOICES:
entryValues = getResourcesForSubId().getStringArray(
R.array.enabled_networks_tdscdma_values);
entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
if (entryValuesInt.length < 3) {
throw new IllegalArgumentException(
"ENABLED_NETWORKS_TDSCDMA_CHOICES index error.");
}
add5gEntry(addNrToLteNetworkType(entryValuesInt[0]));
addLteEntry(entryValuesInt[0]);
add3gEntry(entryValuesInt[1]);
if (display2gOptions) {
add2gEntry(entryValuesInt[2]);
}
uiOptions = uiOptions
.setChoices(R.array.enabled_networks_tdscdma_values)
.addFormat(UiOptions.PresentFormat.add5gAndLteEntry)
.addFormat(UiOptions.PresentFormat.add3gEntry)
.addFormat(UiOptions.PresentFormat.add2gEntry);
break;
case ENABLED_NETWORKS_EXCEPT_GSM_LTE_CHOICES:
entryValues = getResourcesForSubId().getStringArray(
R.array.enabled_networks_except_gsm_lte_values);
entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
if (entryValuesInt.length < 1) {
throw new IllegalArgumentException(
"ENABLED_NETWORKS_EXCEPT_GSM_LTE_CHOICES index error.");
}
add3gEntry(entryValuesInt[0]);
uiOptions = uiOptions
.setChoices(R.array.enabled_networks_except_gsm_lte_values)
.addFormat(UiOptions.PresentFormat.add3gEntry);
break;
case ENABLED_NETWORKS_EXCEPT_GSM_4G_CHOICES:
entryValues = getResourcesForSubId().getStringArray(
R.array.enabled_networks_except_gsm_values);
entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
if (entryValuesInt.length < 2) {
throw new IllegalArgumentException(
"ENABLED_NETWORKS_EXCEPT_GSM_4G_CHOICES index error.");
}
add5gEntry(addNrToLteNetworkType(entryValuesInt[0]));
add4gEntry(entryValuesInt[0]);
add3gEntry(entryValuesInt[1]);
uiOptions = uiOptions
.setChoices(R.array.enabled_networks_except_gsm_values)
.addFormat(UiOptions.PresentFormat.add5gAnd4gEntry)
.addFormat(UiOptions.PresentFormat.add3gEntry);
break;
case ENABLED_NETWORKS_EXCEPT_GSM_CHOICES:
entryValues = getResourcesForSubId().getStringArray(
R.array.enabled_networks_except_gsm_values);
entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
if (entryValuesInt.length < 2) {
throw new IllegalArgumentException(
"ENABLED_NETWORKS_EXCEPT_GSM_CHOICES index error.");
}
add5gEntry(addNrToLteNetworkType(entryValuesInt[0]));
addLteEntry(entryValuesInt[0]);
add3gEntry(entryValuesInt[1]);
uiOptions = uiOptions
.setChoices(R.array.enabled_networks_except_gsm_values)
.addFormat(UiOptions.PresentFormat.add5gAndLteEntry)
.addFormat(UiOptions.PresentFormat.add3gEntry);
break;
case ENABLED_NETWORKS_EXCEPT_LTE_CHOICES:
entryValues = getResourcesForSubId().getStringArray(
R.array.enabled_networks_except_lte_values);
entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
if (entryValuesInt.length < 2) {
throw new IllegalArgumentException(
"ENABLED_NETWORKS_EXCEPT_LTE_CHOICES index error.");
}
add3gEntry(entryValuesInt[0]);
if (carrierConfig.getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL)) {
add2gEntry(entryValuesInt[1]);
}
uiOptions = uiOptions
.setChoices(R.array.enabled_networks_except_lte_values)
.addFormat(UiOptions.PresentFormat.add3gEntry)
.addFormat(UiOptions.PresentFormat.add2gEntry);
break;
case ENABLED_NETWORKS_4G_CHOICES:
entryValues = getResourcesForSubId().getStringArray(
R.array.enabled_networks_values);
entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
if (entryValuesInt.length < 3) {
throw new IllegalArgumentException(
"ENABLED_NETWORKS_4G_CHOICES index error.");
}
add5gEntry(addNrToLteNetworkType(
entryValuesInt[0]));
add4gEntry(entryValuesInt[0]);
add3gEntry(entryValuesInt[1]);
if (display2gOptions) {
add2gEntry(entryValuesInt[2]);
}
uiOptions = uiOptions
.setChoices(R.array.enabled_networks_values)
.addFormat(UiOptions.PresentFormat.add5gAnd4gEntry)
.addFormat(UiOptions.PresentFormat.add3gEntry)
.addFormat(UiOptions.PresentFormat.add2gEntry);
break;
case ENABLED_NETWORKS_CHOICES:
entryValues = getResourcesForSubId().getStringArray(
R.array.enabled_networks_values);
entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
if (entryValuesInt.length < 3) {
throw new IllegalArgumentException("ENABLED_NETWORKS_CHOICES index error.");
}
add5gEntry(addNrToLteNetworkType(entryValuesInt[0]));
addLteEntry(entryValuesInt[0]);
add3gEntry(entryValuesInt[1]);
if (display2gOptions) {
add2gEntry(entryValuesInt[2]);
}
uiOptions = uiOptions
.setChoices(R.array.enabled_networks_values)
.addFormat(UiOptions.PresentFormat.add5gAndLteEntry)
.addFormat(UiOptions.PresentFormat.add3gEntry)
.addFormat(UiOptions.PresentFormat.add2gEntry);
break;
case PREFERRED_NETWORK_MODE_CHOICES_WORLD_MODE:
entryValues = getResourcesForSubId().getStringArray(
R.array.preferred_network_mode_values_world_mode);
entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
if (entryValuesInt.length < 3) {
throw new IllegalArgumentException(
"PREFERRED_NETWORK_MODE_CHOICES_WORLD_MODE index error.");
}
addGlobalEntry(entryValuesInt[0]);
addCustomEntry(
getResourcesForSubId().getString(
R.string.network_world_mode_cdma_lte),
entryValuesInt[1]);
addCustomEntry(
getResourcesForSubId().getString(
R.string.network_world_mode_gsm_lte),
entryValuesInt[2]);
uiOptions = uiOptions
.setChoices(R.array.preferred_network_mode_values_world_mode)
.addFormat(UiOptions.PresentFormat.addGlobalEntry)
.addFormat(UiOptions.PresentFormat.addWorldModeCdmaEntry)
.addFormat(UiOptions.PresentFormat.addWorldModeGsmEntry);
break;
default:
throw new IllegalArgumentException("Not supported enabled network types.");
}
String[] entryValues = getResourcesForSubId().getStringArray(uiOptions.getChoices());
final int[] entryValuesInt = Stream.of(entryValues)
.mapToInt(Integer::parseInt).toArray();
final List<UiOptions.PresentFormat> formatList = uiOptions.getFormatList();
if (entryValuesInt.length < formatList.size()) {
throw new IllegalArgumentException(
uiOptions.getType().name() + " index error.");
}
// Compose options based on given values and formats.
IntStream.range(0, formatList.size()).forEach(entryIndex -> {
switch (formatList.get(entryIndex)) {
case add1xEntry:
if (display2gOptions) {
add1xEntry(entryValuesInt[entryIndex]);
}
break;
case add2gEntry:
if (display2gOptions) {
add2gEntry(entryValuesInt[entryIndex]);
}
break;
case add3gEntry:
add3gEntry(entryValuesInt[entryIndex]);
break;
case addGlobalEntry:
addGlobalEntry(entryValuesInt[entryIndex]);
break;
case addWorldModeCdmaEntry:
addCustomEntry(
getResourcesForSubId().getString(
R.string.network_world_mode_cdma_lte),
entryValuesInt[entryIndex]);
break;
case addWorldModeGsmEntry:
addCustomEntry(
getResourcesForSubId().getString(
R.string.network_world_mode_gsm_lte),
entryValuesInt[entryIndex]);
break;
case add4gEntry:
add4gEntry(entryValuesInt[entryIndex]);
break;
case addLteEntry:
addLteEntry(entryValuesInt[entryIndex]);
break;
case add5gEntry:
add5gEntry(addNrToLteNetworkType(entryValuesInt[entryIndex]));
break;
case add5gAnd4gEntry:
add5gEntry(addNrToLteNetworkType(entryValuesInt[entryIndex]));
add4gEntry(entryValuesInt[entryIndex]);
break;
case add5gAndLteEntry:
add5gEntry(addNrToLteNetworkType(entryValuesInt[entryIndex]));
addLteEntry(entryValuesInt[entryIndex]);
break;
default:
throw new IllegalArgumentException("Not supported ui options format.");
}
});
}
private int getPreferredNetworkMode() {

View File

@@ -46,6 +46,7 @@ android_app {
"jsr305",
"settings-contextual-card-protos-lite",
"settings-log-bridge-protos-lite",
"settings-telephony-protos-lite",
"contextualcards",
"settings-logtags",
"zxing-core-1.7",