Add a config to hide the 3G option at preferred network mode UI

Add a config config_display_network_mode_3g_option to hide the 3G
option at preferred network mode UI

Bug: 261615630
Test: build pass. local test pass.
atest EnabledNetworkModePreferenceControllerTest

Change-Id: I4f94971add1d1eddc9f7c7458b8fc8fdcec3935e
diff --git a/protos/network_mode_choices.proto b/protos/network_mode_choices.proto
index 8c3ec93..9c2b9b4 100644
--- a/protos/network_mode_choices.proto
+++ b/protos/network_mode_choices.proto
@@ -8,7 +8,8 @@
 // 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
+// Next tag: 15
+// TODO(b/268145152): rename the ENABLED_NETWORKS for good readability.
 enum EnabledNetworks {
     // No EnabledNetworks specified.
     ENABLED_NETWORKS_UNSPECIFIED = 0;
@@ -17,39 +18,56 @@
     ENABLED_NETWORKS_UNKNOWN = 1;
 
     // For the case where CDMA is supported and LTE is not prioritized over
-    // CDMA.
+    // CDMA (LTE, 3G, 1x, global).
     ENABLED_NETWORKS_CDMA_CHOICES = 2;
 
     // For the case where CDMA is supported and LTE is not available.
+    // CDMA (3G, 1x)
     ENABLED_NETWORKS_CDMA_NO_LTE_CHOICES = 3;
 
     // For the case where CDMA is supported and LTE is available.
+    // CDMA (LTE, Global)
     ENABLED_NETWORKS_CDMA_ONLY_LTE_CHOICES = 4;
 
     // For the case where TDSCDMA is primary network type.
+    // TDSCDMA (LTE, 3G, 2G)
     ENABLED_NETWORKS_TDSCDMA_CHOICES = 5;
 
     // For the case where GSM and LTE options are removed from the menu.
+    // (3G)
     ENABLED_NETWORKS_EXCEPT_GSM_LTE_CHOICES = 6;
 
-    // For the case where GSM and 4G options are removed from the menu.
+    // For the case where GSM option are removed from the menu. The wording of LTE is '4G'.
+    // (4G, 3G)
     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.
+    // For the case where GSM option are removed from the menu. The wording of LTE is 'LTE'.
+    // (LTE, 3G)
     ENABLED_NETWORKS_EXCEPT_GSM_CHOICES = 8;
 
     // For the case where LTE is disabled.
+    // (3G, 3G)
     ENABLED_NETWORKS_EXCEPT_LTE_CHOICES = 9;
 
-    // For the case where GSM related carrier with 4G/LTE supported.
+    // For the case where GSM related carrier with 4G/LTE supported. The wording of LTE is '4G'.
+    // (2G, 3G, 4G)
     ENABLED_NETWORKS_4G_CHOICES = 10;
 
-    // For the case where GSM related carrier without 4G/LTE supported.
+    // For the case where GSM related carrier with 4G/LTE supported. The wording of LTE is 'LTE'.
+    // (2G, 3G, LTE)
     ENABLED_NETWORKS_CHOICES = 11;
 
     // For the case where world mode is enabled.
+    // ("Global", "LTE / CDMA", "LTE / GSM / UMTS")
     PREFERRED_NETWORK_MODE_CHOICES_WORLD_MODE = 12;
+
+    // For the case where GSM, 3G options are removed from the menu. The wording of LTE is '4G'.
+    // (4G)
+    ENABLED_NETWORKS_4G_CHOICES_EXCEPT_GSM_3G = 13;
+
+    // For the case where GSM and 3G are removed from the menu. The wording of LTE is 'LTE'.
+    // (LTE)
+    ENABLED_NETWORKS_CHOICES_EXCEPT_GSM_3G = 14;
 }
 
 // A request for popup menu.
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 2055442..e4bd550 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1105,6 +1105,10 @@
         <item>"0"</item>
     </string-array>
 
+    <string-array name="enabled_networks_except_gsm_3g_values" translatable="false">
+        <item>"9"</item>
+    </string-array>
+
     <string-array name="enabled_networks_except_lte_values" translatable="false">
         <item>"0"</item>
         <item>"1"</item>
diff --git a/res/values/config.xml b/res/values/config.xml
index 5c5a07f..df2bae3 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -666,6 +666,9 @@
     <!-- Whether the toggle for Auto-rotate with Face Detection should be shown. -->
     <bool name="config_auto_rotate_face_detection_available">true</bool>
 
+    <!-- Whether to display the 3G option at network mode.-->
+    <bool name="config_display_network_mode_3g_option">true</bool>
+
     <!-- The radius of the enrollment progress bar, in dp -->
     <integer name="config_udfpsEnrollProgressBar" translatable="false">
         280
diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
index 1aca6b9..7f94f73 100644
--- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
+++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
@@ -101,6 +101,7 @@
 
         return visible ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
     }
+
     protected boolean isCallStateIdle() {
         return mCallState == TelephonyManager.CALL_STATE_IDLE;
     }
@@ -203,6 +204,9 @@
         private boolean mIs5gEntryDisplayed;
         private boolean mShow4gForLTE;
         private boolean mSupported5gRadioAccessFamily;
+        private boolean mDisplay2gOptions;
+        private boolean mDisplay3gOptions;
+        private boolean mLteEnabled;
         private int mSelectedEntry;
         private int mSubId;
         private String mSummary;
@@ -229,23 +233,32 @@
             mSupported5gRadioAccessFamily = checkSupportedRadioBitmask(
                     mTelephonyManager.getSupportedRadioAccessFamily(),
                     TelephonyManager.NETWORK_TYPE_BITMASK_NR);
-            mIsGlobalCdma = mTelephonyManager.isLteCdmaEvdoGsmWcdmaEnabled()
-                    && carrierConfig != null
-                    && carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_CDMA_CHOICES_BOOL);
-            mShow4gForLTE = carrierConfig != null && carrierConfig.getBoolean(
-                    CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL);
+            if (carrierConfig != null) {
+                mIsGlobalCdma = mTelephonyManager.isLteCdmaEvdoGsmWcdmaEnabled()
+                        && carrierConfig.getBoolean(
+                        CarrierConfigManager.KEY_SHOW_CDMA_CHOICES_BOOL);
+                mShow4gForLTE = carrierConfig.getBoolean(
+                        CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL);
+                mDisplay2gOptions = carrierConfig.getBoolean(
+                        CarrierConfigManager.KEY_PREFER_2G_BOOL);
+                // TODO: Using the carrier config.
+                mDisplay3gOptions = getResourcesForSubId().getBoolean(
+                        R.bool.config_display_network_mode_3g_option);
+                mLteEnabled = carrierConfig.getBoolean(CarrierConfigManager.KEY_LTE_ENABLED_BOOL);
+            }
             Log.d(LOG_TAG, "PreferenceEntriesBuilder: subId" + mSubId
-                    + ",Supported5gRadioAccessFamily :" + mSupported5gRadioAccessFamily
-                    + ",mAllowed5gNetworkType :" + mAllowed5gNetworkType
-                    + ",IsGlobalCdma :" + mIsGlobalCdma
-                    + ",Show4gForLTE :" + mShow4gForLTE);
+                    + " ,Supported5gRadioAccessFamily :" + mSupported5gRadioAccessFamily
+                    + " ,mAllowed5gNetworkType :" + mAllowed5gNetworkType
+                    + " ,IsGlobalCdma :" + mIsGlobalCdma
+                    + " ,Display2gOptions:" + mDisplay2gOptions
+                    + " ,Display3gOptions:" + mDisplay3gOptions
+                    + " ,Display4gOptions" + mLteEnabled
+                    + " ,Show4gForLTE :" + mShow4gForLTE);
         }
 
         void setPreferenceEntries() {
             mTelephonyManager = mTelephonyManager.createForSubscriptionId(mSubId);
-            final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(mSubId);
-            final boolean display2gOptions = carrierConfig != null
-                    && carrierConfig.getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL);
+
             clearAllEntries();
             UiOptions.Builder uiOptions = UiOptions.newBuilder();
             uiOptions.setType(getEnabledNetworkType());
@@ -321,6 +334,16 @@
                             .addFormat(UiOptions.PresentFormat.addWorldModeCdmaEntry)
                             .addFormat(UiOptions.PresentFormat.addWorldModeGsmEntry);
                     break;
+                case ENABLED_NETWORKS_4G_CHOICES_EXCEPT_GSM_3G:
+                    uiOptions = uiOptions
+                            .setChoices(R.array.enabled_networks_except_gsm_3g_values)
+                            .addFormat(UiOptions.PresentFormat.add5gAnd4gEntry);
+                    break;
+                case ENABLED_NETWORKS_CHOICES_EXCEPT_GSM_3G:
+                    uiOptions = uiOptions
+                            .setChoices(R.array.enabled_networks_values)
+                            .addFormat(UiOptions.PresentFormat.add5gAndLteEntry);
+                    break;
                 default:
                     throw new IllegalArgumentException("Not supported enabled network types.");
             }
@@ -336,53 +359,55 @@
             // 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.");
+                    case add1xEntry:
+                        if (mDisplay2gOptions) {
+                            add1xEntry(entryValuesInt[entryIndex]);
+                        }
+                        break;
+                    case add2gEntry:
+                        if (mDisplay2gOptions) {
+                            add2gEntry(entryValuesInt[entryIndex]);
+                        }
+                        break;
+                    case add3gEntry:
+                        if (mDisplay3gOptions) {
+                            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.");
                 }
             });
         }
@@ -402,7 +427,6 @@
         private EnabledNetworks getEnabledNetworkType() {
             EnabledNetworks enabledNetworkType = EnabledNetworks.ENABLED_NETWORKS_UNKNOWN;
             final int phoneType = mTelephonyManager.getPhoneType();
-            final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(mSubId);
 
             if (phoneType == TelephonyManager.PHONE_TYPE_CDMA) {
                 final int lteForced = android.provider.Settings.Global.getInt(
@@ -437,17 +461,17 @@
             } else if (phoneType == TelephonyManager.PHONE_TYPE_GSM) {
                 if (MobileNetworkUtils.isTdscdmaSupported(mContext, mSubId)) {
                     enabledNetworkType = EnabledNetworks.ENABLED_NETWORKS_TDSCDMA_CHOICES;
-                } else if (carrierConfig != null
-                        && !carrierConfig.getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL)
-                        && !carrierConfig.getBoolean(CarrierConfigManager.KEY_LTE_ENABLED_BOOL)) {
+                } else if (!mDisplay2gOptions && !mDisplay3gOptions) {
+                    enabledNetworkType = mShow4gForLTE
+                            ? EnabledNetworks.ENABLED_NETWORKS_4G_CHOICES_EXCEPT_GSM_3G
+                            : EnabledNetworks.ENABLED_NETWORKS_CHOICES_EXCEPT_GSM_3G;
+                } else if (!mDisplay2gOptions && !mLteEnabled) {
                     enabledNetworkType = EnabledNetworks.ENABLED_NETWORKS_EXCEPT_GSM_LTE_CHOICES;
-                } else if (carrierConfig != null
-                        && !carrierConfig.getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL)) {
+                } else if (!mDisplay2gOptions) {
                     enabledNetworkType = mShow4gForLTE
                             ? EnabledNetworks.ENABLED_NETWORKS_EXCEPT_GSM_4G_CHOICES
                             : EnabledNetworks.ENABLED_NETWORKS_EXCEPT_GSM_CHOICES;
-                } else if (carrierConfig != null
-                        && !carrierConfig.getBoolean(CarrierConfigManager.KEY_LTE_ENABLED_BOOL)) {
+                } else if (!mLteEnabled) {
                     enabledNetworkType = EnabledNetworks.ENABLED_NETWORKS_EXCEPT_LTE_CHOICES;
                 } else if (mIsGlobalCdma) {
                     enabledNetworkType = EnabledNetworks.ENABLED_NETWORKS_CDMA_CHOICES;
@@ -462,6 +486,13 @@
                 enabledNetworkType = EnabledNetworks.PREFERRED_NETWORK_MODE_CHOICES_WORLD_MODE;
             }
 
+            if (phoneType == TelephonyManager.PHONE_TYPE_NONE) {
+                Log.d(LOG_TAG, "phoneType: PHONE_TYPE_NONE");
+                enabledNetworkType = mShow4gForLTE
+                        ? EnabledNetworks.ENABLED_NETWORKS_4G_CHOICES_EXCEPT_GSM_3G
+                        : EnabledNetworks.ENABLED_NETWORKS_CHOICES_EXCEPT_GSM_3G;
+            }
+
             Log.d(LOG_TAG, "enabledNetworkType: " + enabledNetworkType);
             return enabledNetworkType;
         }
diff --git a/tests/unit/src/com/android/settings/network/EnabledNetworkModePreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/EnabledNetworkModePreferenceControllerTest.java
index 4b99646..7f170b5 100644
--- a/tests/unit/src/com/android/settings/network/EnabledNetworkModePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/EnabledNetworkModePreferenceControllerTest.java
@@ -497,6 +497,7 @@
             mPersistableBundle.putBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL, true);
             mPersistableBundle.putBoolean(CarrierConfigManager.KEY_LTE_ENABLED_BOOL, true);
         }
+        mController.init(SUB_ID);
     }
 
     private void mockAllowedNetworkTypes(long allowedNetworkType) {