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",
