diff --git a/Android.bp b/Android.bp index 0940b0b7f5c..dd26dda15f5 100644 --- a/Android.bp +++ b/Android.bp @@ -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", diff --git a/protos/Android.bp b/protos/Android.bp index e09b941924d..fbcf645307b 100644 --- a/protos/Android.bp +++ b/protos/Android.bp @@ -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"], +} diff --git a/protos/network_mode_choices.proto b/protos/network_mode_choices.proto new file mode 100644 index 00000000000..8c3ec931dec --- /dev/null +++ b/protos/network_mode_choices.proto @@ -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; +} diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java index 6246b9178fe..cb5b5d0fe68 100644 --- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java +++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java @@ -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 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() { diff --git a/tests/robotests/Android.bp b/tests/robotests/Android.bp index 2945bef1dda..ee0a7d85518 100644 --- a/tests/robotests/Android.bp +++ b/tests/robotests/Android.bp @@ -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",