DO NOT MERGE - Merge qt-dev-plus-aosp-without-vendor (5699924) into stage-aosp-master

Bug: 134405016
Change-Id: If4c2c7f5464bf4e4cfe3e86ac3709b8d821746f3
diff --git a/Android.bp b/Android.bp
index 782ccd4..efca57a 100644
--- a/Android.bp
+++ b/Android.bp
@@ -10,4 +10,5 @@
     optimize: {
         proguard_flags_files: ["proguard.flags"],
     },
+    aaptflags: ["--keep-raw-values"],
 }
diff --git a/assets/carrier_config_carrierid_1403_Rogers.xml b/assets/carrier_config_carrierid_1403_Rogers.xml
index 865c817..e0ad141 100644
--- a/assets/carrier_config_carrierid_1403_Rogers.xml
+++ b/assets/carrier_config_carrierid_1403_Rogers.xml
@@ -14,6 +14,7 @@
     <int name="maxMessageSize" value="1048576"/>
     <int name="maxImageWidth" value="2592"/>
     <string name="carrier_name_string">Rogers</string>
+    <string name="gps.lpp_profile">2</string>
     <string-array name="read_only_apn_types_string_array" num="1">
         <item value="*"/>
     </string-array>
diff --git a/assets/carrier_config_carrierid_1404_TELUS-Mobility.xml b/assets/carrier_config_carrierid_1404_TELUS-Mobility.xml
index 9c040f1..aab79ed 100644
--- a/assets/carrier_config_carrierid_1404_TELUS-Mobility.xml
+++ b/assets/carrier_config_carrierid_1404_TELUS-Mobility.xml
@@ -3,15 +3,16 @@
     <boolean name="carrier_supports_ss_over_ut_bool" value="true"/>
     <boolean name="always_play_remote_hold_tone_bool" value="true"/>
     <boolean name="hide_lte_plus_data_icon_bool" value="false"/>
+    <boolean name="show_4g_for_lte_data_icon_bool" value="true"/>
+    <boolean name="voicemail_notification_persistent_bool" value="true"/>
     <int name="maxImageHeight" value="1944"/>
     <int name="maxImageWidth" value="2592"/>
     <int name="maxMessageSize" value="1048576"/>
     <int name="maxSubjectLength" value="80"/>
+    <int name="recipientLimit" value="10"/>
+    <int name="smsToMmsTextThreshold" value="5"/>
+    <string name="gps.lpp_profile">3</string>
     <string-array name="read_only_apn_types_string_array" num="1">
         <item value="*"/>
     </string-array>
-    <int name="recipientLimit" value="10"/>
-    <boolean name="show_4g_for_lte_data_icon_bool" value="true"/>
-    <int name="smsToMmsTextThreshold" value="5"/>
-    <boolean name="voicemail_notification_persistent_bool" value="true"/>
 </carrier_config>
diff --git a/assets/carrier_config_carrierid_1839_Verizon-Wireless.xml b/assets/carrier_config_carrierid_1839_Verizon-Wireless.xml
index 865b640..ad9e497 100644
--- a/assets/carrier_config_carrierid_1839_Verizon-Wireless.xml
+++ b/assets/carrier_config_carrierid_1839_Verizon-Wireless.xml
@@ -34,6 +34,7 @@
     <boolean name="notify_handover_video_from_wifi_to_lte_bool" value="true"/>
     <boolean name="notify_vt_handover_to_wifi_failure_bool" value="true"/>
     <boolean name="operator_selection_expand_bool" value="true"/>
+    <boolean name="gps.persist_lpp_mode_bool" value="true"/>
     <boolean name="prefer_2g_bool" value="false"/>
     <boolean name="rtt_supported_bool" value="true"/>
     <boolean name="show_apn_setting_cdma_bool" value="true"/>
diff --git a/assets/carrier_config_carrierid_1952_US-Cellular.xml b/assets/carrier_config_carrierid_1952_US-Cellular.xml
index c36e50d..09e3605 100644
--- a/assets/carrier_config_carrierid_1952_US-Cellular.xml
+++ b/assets/carrier_config_carrierid_1952_US-Cellular.xml
@@ -9,6 +9,7 @@
     <boolean name="show_apn_setting_cdma_bool" value="true"/>
     <boolean name="show_cdma_choices_bool" value="true"/>
     <boolean name="support_swap_after_merge_bool" value="false"/>
+    <boolean name="support_wps_over_ims_bool" value="false"/>
     <boolean name="use_otasp_for_provisioning_bool" value="true"/>
     <int name="cdma_3waycall_flash_delay_int" value="300"/>
     <int name="maxImageHeight" value="1944"/>
diff --git a/assets/carrier_config_carrierid_1961_Airtel.xml b/assets/carrier_config_carrierid_1961_Airtel.xml
index ad99f6e..3ad24ba 100644
--- a/assets/carrier_config_carrierid_1961_Airtel.xml
+++ b/assets/carrier_config_carrierid_1961_Airtel.xml
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <carrier_config>
-    <boolean name="carrier_default_wfc_ims_roaming_enabled_bool" value="true" />
+    <boolean name="carrier_default_wfc_ims_roaming_enabled_bool" value="true"/>
     <boolean name="carrier_name_override_bool" value="true"/>
     <string name="carrier_name_string">airtel</string>
+    <int name="httpSocketTimeout" value="300000"/>
     <string-array name="roaming_operator_string_array" num="2">
         <item value="404"/>
         <item value="405"/>
diff --git a/assets/carrier_config_carrierid_1962_Fido.xml b/assets/carrier_config_carrierid_1962_Fido.xml
index 873849f..7a3bcc4 100644
--- a/assets/carrier_config_carrierid_1962_Fido.xml
+++ b/assets/carrier_config_carrierid_1962_Fido.xml
@@ -12,6 +12,7 @@
     <int name="maxMessageSize" value="1048576"/>
     <int name="maxImageWidth" value="2592"/>
     <string name="carrier_name_string">Fido</string>
+    <string name="gps.lpp_profile">2</string>
     <string-array name="read_only_apn_types_string_array" num="1">
         <item value="*"/>
     </string-array>
diff --git a/assets/carrier_config_carrierid_1_T-Mobile-US.xml b/assets/carrier_config_carrierid_1_T-Mobile-US.xml
index a0c82c8..48ce51c 100644
--- a/assets/carrier_config_carrierid_1_T-Mobile-US.xml
+++ b/assets/carrier_config_carrierid_1_T-Mobile-US.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <carrier_config>
     <boolean name="carrier_default_wfc_ims_roaming_enabled_bool" value="true" />
+    <boolean name="carrier_supports_ss_over_ut_bool" value="true"/>
     <boolean name="carrier_ims_gba_required_bool" value="true"/>
     <boolean name="carrier_name_override_bool" value="true"/>
     <boolean name="carrier_volte_available_bool" value="true"/>
diff --git a/assets/carrier_config_carrierid_2018_Reliance-Jio.xml b/assets/carrier_config_carrierid_2018_Reliance-Jio.xml
index e2cb9b3..37ceede 100644
--- a/assets/carrier_config_carrierid_2018_Reliance-Jio.xml
+++ b/assets/carrier_config_carrierid_2018_Reliance-Jio.xml
@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <carrier_config>
-    <boolean name="carrier_default_wfc_ims_roaming_enabled_bool" value="true" />
+    <boolean name="carrier_default_wfc_ims_roaming_enabled_bool" value="true"/>
     <boolean name="carrier_supports_ss_over_ut_bool" value="true"/>
     <boolean name="carrier_name_override_bool" value="true"/>
     <boolean name="carrier_volte_available_bool" value="true"/>
     <boolean name="hide_ims_apn_bool" value="true"/>
+    <int name="httpSocketTimeout" value="300000"/>
     <int name="volte_replacement_rat_int" value="3"/>
     <string name="carrier_name_string">JIO</string>
     <string-array name="roaming_operator_string_array" num="2">
diff --git a/assets/carrier_config_carrierid_2032_XFINIY-Mobile.xml b/assets/carrier_config_carrierid_2032_XFINIY-Mobile.xml
index 06997d3..e9bbf03 100644
--- a/assets/carrier_config_carrierid_2032_XFINIY-Mobile.xml
+++ b/assets/carrier_config_carrierid_2032_XFINIY-Mobile.xml
@@ -27,6 +27,7 @@
     <boolean name="enableMultipartSMS" value="true"/>
     <boolean name="enabledNotifyWapMMSC" value="true"/>
     <boolean name="enabledTransID" value="true"/>
+    <boolean name="gps.persist_lpp_mode_bool" value="true"/>
     <boolean name="is_ims_conference_size_enforced_bool" value="true"/>
     <boolean name="mdn_is_additional_voicemail_number_bool" value="true"/>
     <boolean name="mmsCloseConnection" value="true"/>
diff --git a/assets/carrier_config_carrierid_25_Vodafone.xml b/assets/carrier_config_carrierid_25_Vodafone.xml
index 0d1991b..da0c1bb 100644
--- a/assets/carrier_config_carrierid_25_Vodafone.xml
+++ b/assets/carrier_config_carrierid_25_Vodafone.xml
@@ -6,5 +6,7 @@
     <boolean name="carrier_volte_available_bool" value="true"/>
     <boolean name="play_call_recording_tone_bool" value="true"/>
     <int name="volte_replacement_rat_int" value="3"/>
+    <!-- wfcSpnFormat is "%s WiFi Calling" -->
+    <int name="wfc_spn_format_idx_int" value="11"/>
     <string name="default_vm_number_string">5500</string>
 </carrier_config>
diff --git a/assets/carrier_config_carrierid_576_Bell-Mobility.xml b/assets/carrier_config_carrierid_576_Bell-Mobility.xml
index 11ea421..bb606d1 100644
--- a/assets/carrier_config_carrierid_576_Bell-Mobility.xml
+++ b/assets/carrier_config_carrierid_576_Bell-Mobility.xml
@@ -12,6 +12,7 @@
     <int name="recipientLimit" value="20"/>
     <int name="smsToMmsTextThreshold" value="8"/>
     <string name="emailGatewayNumber">6245</string>
+    <string name="gps.lpp_profile">2</string>
     <string-array name="non_roaming_operator_string_array" num="1">
         <item value="302"/>
     </string-array>
diff --git a/assets/carrier_config_mccmnc_311480.xml b/assets/carrier_config_mccmnc_311480.xml
index b962330..1c2f22e 100644
--- a/assets/carrier_config_mccmnc_311480.xml
+++ b/assets/carrier_config_mccmnc_311480.xml
@@ -1,157 +1,5 @@
 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
 <carrier_config_list>
-    <carrier_config>
-        <boolean name="rtt_supported_bool" value="true" />
-        <boolean name="carrier_volte_provisioned_bool" value="true" />
-        <boolean name="allow_hold_in_ims_call" value="false" />
-        <boolean name="world_mode_enabled_bool" value="true" />
-        <boolean name="sms_requires_destination_number_conversion_bool" value="true" />
-        <boolean name="mdn_is_additional_voicemail_number_bool" value="true" />
-        <boolean name="carrier_vt_available_bool" value="true" />
-        <boolean name="support_downgrade_vt_to_audio_bool" value="false" />
-        <boolean name="notify_handover_video_from_wifi_to_lte_bool" value="true" />
-        <boolean name="notify_handover_video_from_lte_to_wifi_bool" value="true" />
-        <boolean name="carrier_allow_turnoff_ims_bool" value="false" />
-        <boolean name="carrier_volte_provisioning_required_bool" value="true" />
-        <boolean name="treat_downgraded_video_calls_as_video_calls_bool" value="true" />
-        <boolean name="drop_video_call_when_answering_audio_call_bool" value="true" />
-        <boolean name="operator_selection_expand_bool" value="true" />
-        <int name="aliasMinChars" value="2" />
-        <boolean name="dtmf_type_enabled_bool" value="true" />
-        <int name="smsToMmsTextThreshold" value="7" />
-        <boolean name="enabledTransID" value="true" />
-        <boolean name="aliasEnabled" value="true" />
-        <boolean name="voicemail_notification_persistent_bool" value="true" />
-        <boolean name="allowAttachAudio" value="false" />
-        <boolean name="support_swap_after_merge_bool" value="false" />
-        <int name="recipientLimit" value="20" />
-        <string name="uaProfTagName">Profile</string>
-        <int name="aliasMaxChars" value="48" />
-        <int name="maxImageHeight" value="1944" />
-        <int name="lte_earfcns_rsrp_boost_int" value="6" />
-        <string-array name="boosted_lte_earfcns_string_array" num="2">
-            <item value="600-1199" />
-            <item value="1950-2399" />
-        </string-array>
-        <boolean name="carrier_volte_available_bool" value="true" />
-        <boolean name="support_pause_ims_video_calls_bool" value="true" />
-        <int name="maxSubjectLength" value="80" />
-        <string name="httpParams">x-up-calling-line-id: 1##LINE1NOCOUNTRYCODE##|X-VzW-MDN: 1##LINE1NOCOUNTRYCODE##</string>
-        <string name="emailGatewayNumber">6245</string>
-        <int name="maxMessageSize" value="1258291" />
-        <boolean name="enableMMSReadReports" value="false" />
-        <boolean name="prefer_2g_bool" value="false" />
-        <int name="maxImageWidth" value="2592" />
-        <int name="volte_replacement_rat_int" value="6" />
-        <boolean name="enabledNotifyWapMMSC" value="true" />
-        <boolean name="enableMultipartSMS" value="true" />
-        <boolean name="allow_adding_apns_bool" value="false" />
-        <boolean name="broadcast_emergency_call_state_changes_bool" value="true" />
-        <string name="carrier_eri_file_name_string">eri_311480.xml</string>
-        <boolean name="carrier_wfc_ims_available_bool" value="true" />
-        <int name="carrier_default_wfc_ims_mode_int" value="1"/>
-        <boolean name="treat_downgraded_video_calls_as_video_calls_bool" value="true" />
-        <boolean name="drop_video_call_when_answering_audio_call_bool" value="true" />
-        <boolean name="editable_wfc_mode_bool" value="false"/>
-        <boolean name="editable_wfc_roaming_mode_bool" value="true"/>
-        <boolean name="allow_merge_wifi_calls_when_vowifi_off_bool" value="false" />
-        <boolean name="wifi_calls_can_be_hd_audio" value="false" />
-        <boolean name="video_calls_can_be_hd_audio" value="false" />
-        <boolean name="allow_add_call_during_video_call" value="false" />
-        <boolean name="persist_lpp_mode_bool" value="true" />
-        <string name="default_vm_number_string">*86</string>
-        <string-array name="dial_string_replace_string_array" num="2">
-            <item value="*611:+19085594899" />
-            <item value="*86:+1MDN" />
-        </string-array>
-        <string-array name="carrier_data_call_permanent_failure_strings" num="14">
-            <item value="OPERATOR_BARRED" />
-            <item value="MISSING_UNKNOWN_APN" />
-            <item value="UNKNOWN_PDP_ADDRESS_TYPE" />
-            <item value="USER_AUTHENTICATION" />
-            <item value="SERVICE_OPTION_NOT_SUPPORTED" />
-            <item value="SERVICE_OPTION_NOT_SUBSCRIBED" />
-            <item value="NSAPI_IN_USE" />
-            <item value="ONLY_IPV4_ALLOWED" />
-            <item value="ONLY_IPV6_ALLOWED" />
-            <item value="RADIO_POWER_OFF" />
-            <item value="TETHERED_CALL_ACTIVE" />
-            <item value="RADIO_NOT_AVAILABLE" />
-            <item value="UNACCEPTABLE_NETWORK_PARAMETER" />
-            <item value="SIGNAL_LOST" />
-        </string-array>
-        <boolean name="carrier_promote_wfc_on_call_fail_bool" value="true" />
-        <string-array name="ims_reasoninfo_mapping_string_array" num="10">
-            <item value="332|simultaneous call limit has already been reached|1403" />
-            <item value="332|Forbidden: Simultaneous Call Limit Has Already Been Reached|1403" />
-            <item value="338|another device sent all devices busy response|1404" />
-            <item value="501|call completion elsewhere|1014" />
-            <item value="501|call has been pulled by another device|1016" />
-            <item value="510|call has been pulled by another device|1016" />
-            <item value="501|another device sent all devices busy response|1404" />
-            <item value="510|another device sent all devices busy response|1404" />
-            <item value="1014|call has been pulled by another device|1016" />
-            <item value="*|Call is dropped due to Wi-Fi signal is degraded|1407" />
-        </string-array>
-        <boolean name="disable_severe_when_extreme_disabled_bool" value="false" />
-        <boolean name="mmsCloseConnection" value="true"/>
-        <boolean name="notify_vt_handover_to_wifi_failure_bool" value="true" />
-        <int name="wfc_spn_format_idx_int" value="1" />
-        <string-array name="filtered_cnap_names_string_array" num="2">
-            <item value="WIRELESS CALLER" />
-            <item value="UNKNOWN NAME" />
-        </string-array>
-        <string-array name="read_only_apn_fields_string_array" num="20">
-            <item value="name" />
-            <item value="proxy" />
-            <item value="port" />
-            <item value="user" />
-            <item value="password" />
-            <item value="server" />
-            <item value="mmsc" />
-            <item value="mmsproxy" />
-            <item value="mmsport" />
-            <item value="mcc" />
-            <item value="mnc" />
-            <item value="authtype" />
-            <item value="type" />
-            <item value="protocol" />
-            <item value="roaming_protocol" />
-            <item value="bearer" />
-            <item value="bearer_bitmask" />
-            <item value="carrier_enabled" />
-            <item value="mvno_type" />
-            <item value="mvno_match_data" />
-        </string-array>
-        <string-array name="carrier_metered_apn_types_strings" num="3">
-            <item value="default" />
-            <item value="dun" />
-            <item value="supl" />
-        </string-array>
-        <string-array name="carrier_metered_roaming_apn_types_strings" num="4">
-            <item value="default" />
-            <item value="dun" />
-            <item value="mms" />
-            <item value="supl" />
-        </string-array>
-        <boolean name="is_ims_conference_size_enforced_bool" value="true"/>
-        <int name="ims_conference_size_limit_int" value="5" />
-        <boolean name="support_3gpp_call_forwarding_while_roaming_bool" value="false" />
-        <string-array name="call_forwarding_blocks_while_roaming_string_array" num="2">
-            <item value="*71" />
-            <item value="*72" />
-        </string-array>
-        <boolean name="disable_voice_barring_notification_bool" value="true" />
-        <boolean name="carrier_name_override_bool" value="true" />
-        <string name="carrier_name_string">Verizon</string>
-        <int-array name="lte_rsrp_thresholds_int_array" num="4">
-            <item value="-115" />  <!-- SIGNAL_STRENGTH_POOR -->
-            <item value="-105" />  <!-- SIGNAL_STRENGTH_MODERATE -->
-            <item value="-95" />  <!-- SIGNAL_STRENGTH_GOOD -->
-            <item value="-85" />  <!-- SIGNAL_STRENGTH_GREAT -->
-        </int-array>
-        <boolean name="show_apn_setting_cdma_bool" value="true" />
-    </carrier_config>
     <!-- Tracfone Vzw shows empty string as SPN -->
     <carrier_config gid1="BA01270000000000">
         <boolean name="carrier_name_override_bool" value="true" />
diff --git a/tests/src/com/android/carrierconfig/CarrierConfigTest.java b/tests/src/com/android/carrierconfig/CarrierConfigTest.java
index b1be375..4b78fd6 100644
--- a/tests/src/com/android/carrierconfig/CarrierConfigTest.java
+++ b/tests/src/com/android/carrierconfig/CarrierConfigTest.java
@@ -1,11 +1,16 @@
 package com.android.carrierconfig;
 
+import android.Manifest;
+import android.annotation.NonNull;
 import android.content.Context;
 import android.content.res.AssetManager;
 import android.content.res.Resources;
+import android.database.Cursor;
 import android.os.PersistableBundle;
+import android.provider.Telephony;
 import android.service.carrier.CarrierIdentifier;
 import android.telephony.CarrierConfigManager;
+import android.telephony.TelephonyManager;
 import android.test.InstrumentationTestCase;
 import android.util.Log;
 
@@ -13,7 +18,9 @@
 import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import junit.framework.AssertionFailedError;
@@ -23,13 +30,15 @@
 import org.xmlpull.v1.XmlPullParserFactory;
 
 public class CarrierConfigTest extends InstrumentationTestCase {
+    private static final String TAG = "CarrierConfigTest";
 
     /**
      * Iterate over all XML files in assets/ and ensure they parse without error.
      */
     public void testAllFilesParse() {
         forEachConfigXml(new ParserChecker() {
-            public void check(XmlPullParser parser) throws XmlPullParserException, IOException {
+            public void check(XmlPullParser parser, String mccmnc) throws XmlPullParserException,
+                    IOException {
                 PersistableBundle b = DefaultCarrierConfigService.readConfigFromXml(parser,
                         new CarrierIdentifier("001", "001", "Test", "001001123456789", "", ""));
                 assertNotNull("got null bundle", b);
@@ -43,7 +52,8 @@
      */
     public void testFilterValidAttributes() {
         forEachConfigXml(new ParserChecker() {
-            public void check(XmlPullParser parser) throws XmlPullParserException, IOException {
+            public void check(XmlPullParser parser, String mccmnc) throws XmlPullParserException,
+                    IOException {
                 int event;
                 while (((event = parser.next()) != XmlPullParser.END_DOCUMENT)) {
                     if (event == XmlPullParser.START_TAG
@@ -74,13 +84,79 @@
     }
 
     /**
+     * Check that XML files named after mccmnc are those without matching carrier id.
+     * If there is a matching carrier id, all configurations should move to carrierid.xml which
+     * has a higher matching priority than mccmnc.xml
+     */
+    public void testCarrierConfigFileNaming() {
+        forEachConfigXml(new ParserChecker() {
+            public void check(XmlPullParser parser, String mccmnc) throws XmlPullParserException,
+                    IOException {
+                if (mccmnc == null) {
+                    // only check file named after mccmnc
+                    return;
+                }
+                int event;
+                while (((event = parser.next()) != XmlPullParser.END_DOCUMENT)) {
+                    if (event == XmlPullParser.START_TAG
+                            && "carrier_config".equals(parser.getName())) {
+                        String mcc = null;
+                        String mnc = null;
+                        String spn = null;
+                        String gid1 = null;
+                        String gid2 = null;
+                        String imsi = null;
+                        for (int i = 0; i < parser.getAttributeCount(); ++i) {
+                            String attribute = parser.getAttributeName(i);
+                            switch (attribute) {
+                                case "mcc":
+                                    mcc = parser.getAttributeValue(i);
+                                    break;
+                                case "mnc":
+                                    mnc = parser.getAttributeValue(i);
+                                    break;
+                                case "gid1":
+                                    gid1 = parser.getAttributeValue(i);
+                                    break;
+                                case "gid2":
+                                    gid2 = parser.getAttributeValue(i);
+                                    break;
+                                case "spn":
+                                    spn = parser.getAttributeValue(i);
+                                    break;
+                                case "imsi":
+                                    imsi = parser.getAttributeValue(i);
+                                    break;
+                                default:
+                                    fail("Unknown attribute '" + attribute
+                                            + "' at " + parser.getPositionDescription());
+                                    break;
+                            }
+                        }
+                        mcc = (mcc != null) ? mcc : mccmnc.substring(0, 3);
+                        mnc = (mnc != null) ? mnc : mccmnc.substring(3);
+                        // check if there is a valid carrier id
+                        int carrierId = getCarrierId(getInstrumentation().getTargetContext(),
+                                new CarrierIdentifier(mcc, mnc, spn, imsi, gid1, gid2));
+                        if (carrierId != TelephonyManager.UNKNOWN_CARRIER_ID) {
+                            fail("unexpected carrier_config_mccmnc.xml with matching carrier id: "
+                                    + carrierId + ", please move to carrier_config_carrierid.xml");
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+    /**
      * Tests that the variable names in each XML file match actual keys in CarrierConfigManager.
      */
     public void testVariableNames() {
         final Set<String> varXmlNames = getCarrierConfigXmlNames();
         // organize them into sets by type or unknown
         forEachConfigXml(new ParserChecker() {
-            public void check(XmlPullParser parser) throws XmlPullParserException, IOException {
+            public void check(XmlPullParser parser, String mccmnc) throws XmlPullParserException,
+                    IOException {
                 int event;
                 while (((event = parser.next()) != XmlPullParser.END_DOCUMENT)) {
                     if (event == XmlPullParser.START_TAG) {
@@ -128,7 +204,7 @@
      * {@link #check} should {@link #fail} if the test does not pass.
      */
     private interface ParserChecker {
-        void check(XmlPullParser parser) throws XmlPullParserException, IOException;
+        void check(XmlPullParser parser, String mccmnc) throws XmlPullParserException, IOException;
     }
 
     /**
@@ -136,6 +212,7 @@
      */
     private void forEachConfigXml(ParserChecker checker) {
         AssetManager assetMgr = getInstrumentation().getTargetContext().getAssets();
+        String mccmnc = null;
         try {
             String[] files = assetMgr.list("");
             assertNotNull("failed to list files", files);
@@ -143,12 +220,16 @@
             for (String fileName : files) {
                 try {
                     if (!fileName.startsWith("carrier_config_")) continue;
+                    if (fileName.startsWith("carrier_config_mccmnc_")) {
+                        mccmnc = fileName.substring("carrier_config_mccmnc_".length(),
+                                fileName.indexOf(".xml"));
 
+                    }
                     XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                     XmlPullParser parser = factory.newPullParser();
                     parser.setInput(assetMgr.open(fileName), "utf-8");
 
-                    checker.check(parser);
+                    checker.check(parser, mccmnc);
 
                 } catch (Throwable e) {
                     throw new AssertionError("Problem in " + fileName + ": " + e.getMessage(), e);
@@ -157,7 +238,7 @@
             // Check vendor.xml too
             try {
                 Resources res = getInstrumentation().getTargetContext().getResources();
-                checker.check(res.getXml(R.xml.vendor));
+                checker.check(res.getXml(R.xml.vendor), mccmnc);
             } catch (Throwable e) {
                 throw new AssertionError("Problem in vendor.xml: " + e.getMessage(), e);
             }
@@ -170,13 +251,26 @@
      * Get the set of config variable names, as used in XML files.
      */
     private Set<String> getCarrierConfigXmlNames() {
-        // get values of all KEY_ members of CarrierConfigManager
-        Field[] fields = CarrierConfigManager.class.getDeclaredFields();
+        Set<String> names = new HashSet<>();
+        // get values of all KEY_ members of CarrierConfigManager as well as its nested classes.
+        names.addAll(getCarrierConfigXmlNames(CarrierConfigManager.class));
+        for (Class nested : CarrierConfigManager.class.getDeclaredClasses()) {
+            Log.i("CarrierConfigTest", nested.toString());
+            if (Modifier.isStatic(nested.getModifiers())) {
+                names.addAll(getCarrierConfigXmlNames(nested));
+            }
+        }
+        return names;
+    }
+
+    private Set<String> getCarrierConfigXmlNames(Class clazz) {
+        // get values of all KEY_ members of clazz
+        Field[] fields = clazz.getDeclaredFields();
         HashSet<String> varXmlNames = new HashSet<>();
         for (Field f : fields) {
             if (!f.getName().startsWith("KEY_")) continue;
-            if ((f.getModifiers() & Modifier.STATIC) == 0) {
-                fail("non-static key in CarrierConfigManager: " + f.toString());
+            if (!Modifier.isStatic(f.getModifiers())) {
+                fail("non-static key in " + clazz.getName() + ":" + f.toString());
             }
             try {
                 String value = (String) f.get(null);
@@ -189,4 +283,51 @@
         assertTrue("Found zero keys", varXmlNames.size() > 0);
         return varXmlNames;
     }
+
+    // helper function to get carrier id from carrierIdentifier
+    private int getCarrierId(@NonNull Context context,
+                             @NonNull CarrierIdentifier carrierIdentifier) {
+        try {
+            getInstrumentation().getUiAutomation().adoptShellPermissionIdentity(
+                    Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
+            List<String> args = new ArrayList<>();
+            args.add(carrierIdentifier.getMcc() + carrierIdentifier.getMnc());
+            if (carrierIdentifier.getGid1() != null) {
+                args.add(carrierIdentifier.getGid1());
+            }
+            if (carrierIdentifier.getGid2() != null) {
+                args.add(carrierIdentifier.getGid2());
+            }
+            if (carrierIdentifier.getImsi() != null) {
+                args.add(carrierIdentifier.getImsi());
+            }
+            if (carrierIdentifier.getSpn() != null) {
+                args.add(carrierIdentifier.getSpn());
+            }
+            try (Cursor cursor = context.getContentResolver().query(
+                    Telephony.CarrierId.All.CONTENT_URI,
+                    /* projection */ null,
+                    /* selection */ Telephony.CarrierId.All.MCCMNC + "=? AND "
+                            + Telephony.CarrierId.All.GID1
+                            + ((carrierIdentifier.getGid1() == null) ? " is NULL" : "=?") + " AND "
+                            + Telephony.CarrierId.All.GID2
+                            + ((carrierIdentifier.getGid2() == null) ? " is NULL" : "=?") + " AND "
+                            + Telephony.CarrierId.All.IMSI_PREFIX_XPATTERN
+                            + ((carrierIdentifier.getImsi() == null) ? " is NULL" : "=?") + " AND "
+                            + Telephony.CarrierId.All.SPN
+                            + ((carrierIdentifier.getSpn() == null) ? " is NULL" : "=?"),
+                /* selectionArgs */ args.toArray(new String[args.size()]), null)) {
+                if (cursor != null) {
+                    while (cursor.moveToNext()) {
+                        return cursor.getInt(cursor.getColumnIndex(Telephony.CarrierId.CARRIER_ID));
+                    }
+                }
+            }
+        } catch (SecurityException e) {
+            fail("Should be able to access APIs protected by a permission apps cannot get");
+        } finally {
+            getInstrumentation().getUiAutomation().dropShellPermissionIdentity();
+        }
+        return TelephonyManager.UNKNOWN_CARRIER_ID;
+    }
 }