[Settings] Code refactor - NetworkModePreference

Code refactor for improving readibility.

Bug: 223461708
Test: unit test EnabledNetworkModePreferenceControllerTest
Change-Id: I3b3157cbc76f104d63062fda495a7391ecc18ada
diff --git a/Android.bp b/Android.bp
index 0940b0b..dd26dda 100644
--- a/Android.bp
+++ b/Android.bp
@@ -66,6 +66,7 @@
         "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 e09b941..fbcf645 100644
--- a/protos/Android.bp
+++ b/protos/Android.bp
@@ -24,3 +24,12 @@
     },
     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 0000000..8c3ec93
--- /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 6246b91..cb5b5d0 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.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 @@
         }
     }
 
-    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 @@
             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() {
diff --git a/tests/robotests/Android.bp b/tests/robotests/Android.bp
index 2945bef..ee0a7d8 100644
--- a/tests/robotests/Android.bp
+++ b/tests/robotests/Android.bp
@@ -46,6 +46,7 @@
         "jsr305",
         "settings-contextual-card-protos-lite",
         "settings-log-bridge-protos-lite",
+	"settings-telephony-protos-lite",
         "contextualcards",
         "settings-logtags",
         "zxing-core-1.7",