Snap for 5363709 from 99564aaf0417c9ddf7d6aeb10d326e5b24fa8f55 to pi-qpr3-b-release

Change-Id: I28f5e65d0f573db51b71f724a9b7cd654a8fc6f9
diff --git a/res/values-mcc204-mnc04/strings.xml b/res/values-mcc204-mnc04/strings.xml
index fec694f..9708836 100644
--- a/res/values-mcc204-mnc04/strings.xml
+++ b/res/values-mcc204-mnc04/strings.xml
@@ -16,4 +16,6 @@
 
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string translatable="false" name="config_world_mode">true;BAE0000000000000</string>
+    <string translatable="false" name="config_world_mode_spn">true;U.S. CELLULAR</string>
+    <string translatable="false" name="config_show_gsm_option">true;U.S. CELLULAR</string>
 </resources>
diff --git a/res/values-mcc311-mnc220/strings.xml b/res/values-mcc311-mnc220/strings.xml
new file mode 100644
index 0000000..52ba286
--- /dev/null
+++ b/res/values-mcc311-mnc220/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string translatable="false" name="config_world_mode">true</string>
+    <string translatable="false" name="config_show_gsm_option">true</string>
+</resources>
diff --git a/res/values-mcc311-mnc225/strings.xml b/res/values-mcc311-mnc225/strings.xml
new file mode 100644
index 0000000..52ba286
--- /dev/null
+++ b/res/values-mcc311-mnc225/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string translatable="false" name="config_world_mode">true</string>
+    <string translatable="false" name="config_show_gsm_option">true</string>
+</resources>
diff --git a/res/values-mcc311-mnc580/strings.xml b/res/values-mcc311-mnc580/strings.xml
new file mode 100644
index 0000000..52ba286
--- /dev/null
+++ b/res/values-mcc311-mnc580/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string translatable="false" name="config_world_mode">true</string>
+    <string translatable="false" name="config_show_gsm_option">true</string>
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9053520..62c03ca 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1797,4 +1797,8 @@
     <!-- Message displayed to the user to indicate that a held call has been released /
          disconnected. -->
     <string name="supp_service_held_call_released">Held call has been released.</string>
+    <!-- Configuration setting for world mode Format is <true;SPN if any to be checked>-->
+    <string translatable="false" name="config_world_mode_spn">false</string>
+    <!-- Configuration setting for mobile network settings show network option by phoneType. Format is <true;SPN if any to be checked>-->
+    <string translatable="false" name="config_show_gsm_option">false</string>
 </resources>
diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java
index f128f9a..745a7ff 100644
--- a/src/com/android/phone/MobileNetworkSettings.java
+++ b/src/com/android/phone/MobileNetworkSettings.java
@@ -1708,7 +1708,12 @@
                     } else {
                         if (isWorldMode()) {
                             controlCdmaOptions(true);
-                            controlGsmOptions(false);
+                            if (showNetworkOptionByPhoneType()
+                                    && mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_GSM) {
+                                controlGsmOptions(true);
+                            } else {
+                                controlGsmOptions(false);
+                            }
                         }
                         mButtonEnabledNetworks.setValue(
                                 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA));
@@ -1931,20 +1936,59 @@
             return super.onOptionsItemSelected(item);
         }
 
-        private boolean isWorldMode() {
-            boolean worldModeOn = false;
-            final String configString = getResources().getString(R.string.config_world_mode);
+        private boolean showNetworkOptionByPhoneType() {
+            boolean showByPhoneType = false;
+            final String configString = getResources().getString(
+                    R.string.config_show_gsm_option);
 
             if (!TextUtils.isEmpty(configString)) {
                 String[] configArray = configString.split(";");
-                // Check if we have World mode configuration set to True only or config is set to True
-                // and SIM GID value is also set and matches to the current SIM GID.
+                // Check if we have showNetworkOptionByPhoneType configuration set to True only
+                // or config is set to True and SIM SPN value is also set and matches to the
+                // current SIM SPN.
+                if (configArray != null && (
+                        (configArray.length == 1 && configArray[0].equalsIgnoreCase("true"))
+                                || (configArray.length == 2 && !TextUtils.isEmpty(configArray[1])
+                                && mTelephonyManager != null
+                                && configArray[1].equalsIgnoreCase(
+                                mTelephonyManager.getSimOperatorName())))) {
+                    showByPhoneType = true;
+                }
+            }
+            Log.d(LOG_TAG, "showNetworkOptionByPhoneType=" + showByPhoneType);
+
+            return showByPhoneType;
+        }
+
+        private boolean isWorldMode() {
+            boolean worldModeOn = false;
+            final String configString = getResources().getString(R.string.config_world_mode);
+            final String configStringSpn = getResources().getString(R.string.config_world_mode_spn);
+
+            if (!TextUtils.isEmpty(configString)) {
+                String[] configArray = configString.split(";");
+                // Check if we have World mode configuration set to True only or config is set to
+                // True and SIM GID value is also set and matches to the current SIM GID.
                 if (configArray != null &&
                         ((configArray.length == 1 && configArray[0].equalsIgnoreCase("true"))
                                 || (configArray.length == 2 && !TextUtils.isEmpty(configArray[1])
                                 && mTelephonyManager != null
                                 && configArray[1].equalsIgnoreCase(
-                                        mTelephonyManager.getGroupIdLevel1())))) {
+                                mTelephonyManager.getGroupIdLevel1())))) {
+                    worldModeOn = true;
+                }
+            }
+            if (!worldModeOn && !TextUtils.isEmpty(configStringSpn)) {
+                String[] configArray = configStringSpn.split(";");
+                // Check if we have World mode configuration set to True only or config is set to
+                // True and SIM SPN value is also set and matches to the current SIM SPN.
+                if (configArray != null
+                        && configArray.length == 2 && !TextUtils.isEmpty(configArray[0])
+                        && !TextUtils.isEmpty(configArray[1])
+                        && configArray[0].equalsIgnoreCase("true")
+                        && mTelephonyManager != null
+                        && configArray[1].equalsIgnoreCase(
+                        mTelephonyManager.getSimOperatorName())) {
                     worldModeOn = true;
                 }
             }