Add IMS_WFC configs to sim-specific settings Backup/Restore.

Test: make, atest, manual tests
Bug: 179933909
Change-Id: I49a9b49ba662a2361f5f5644b5456670a5961ee2
diff --git a/res/values/config.xml b/res/values/config.xml
index 23c08b8..e4be55f 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -14,4 +14,11 @@
          If this value is empty or unparsable, we will apply APNs from the APN
          conf xml file.  -->
     <string name="apn_source_service" translatable="false"></string>
+
+    <!-- Countries, in iso country code format, where wfc entitlement is
+         required-->
+    <string-array name="wfc_entitlement_required_countries">
+        <item>us</item>
+        <item>ca</item>
+    </string-array>
 </resources>
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index 7d4bc6f..e9740c4 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -394,6 +394,12 @@
                 Telephony.SimInfo.COLUMN_VT_IMS_ENABLED, Cursor.FIELD_TYPE_INTEGER);
         SIM_INFO_COLUMNS_TO_BACKUP.put(
                 Telephony.SimInfo.COLUMN_D2D_STATUS_SHARING, Cursor.FIELD_TYPE_INTEGER);
+        SIM_INFO_COLUMNS_TO_BACKUP.put(
+                Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED, Cursor.FIELD_TYPE_INTEGER);
+        SIM_INFO_COLUMNS_TO_BACKUP.put(
+                Telephony.SimInfo.COLUMN_WFC_IMS_MODE, Cursor.FIELD_TYPE_INTEGER);
+        SIM_INFO_COLUMNS_TO_BACKUP.put(
+                Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE, Cursor.FIELD_TYPE_INTEGER);
     }
 
     @VisibleForTesting
@@ -3179,7 +3185,8 @@
                         Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID,
                         Telephony.SimInfo.COLUMN_ICC_ID,
                         Telephony.SimInfo.COLUMN_NUMBER,
-                        Telephony.SimInfo.COLUMN_CARRIER_ID},
+                        Telephony.SimInfo.COLUMN_CARRIER_ID,
+                        Telephony.SimInfo.COLUMN_ISO_COUNTRY_CODE},
                 selection,
                 selectionArgs,
                 ORDER_BY_SUB_ID)) {
@@ -3198,6 +3205,10 @@
         int backupDataFormatVersion = backedUpDataBundle
                 .getInt(KEY_BACKUP_DATA_FORMAT_VERSION, -1);
 
+        Resources r = getContext().getResources();
+        List<String> wfcEntitlementRequiredCountries = Arrays.asList(r.getStringArray(
+                    R.array.wfc_entitlement_required_countries));
+
         while (cursor != null && cursor.moveToNext()) {
             // Get all the possible matching criteria.
             int subIdColumnIndex = cursor.getColumnIndex(
@@ -3218,6 +3229,11 @@
             int carrierIdColumnIndex = cursor.getColumnIndex(Telephony.SimInfo.COLUMN_CARRIER_ID);
             int currCarrierIdFromDb = cursor.getInt(carrierIdColumnIndex);
 
+            int isoCountryCodeColumnIndex= cursor.getColumnIndex(
+                    Telephony.SimInfo.COLUMN_ISO_COUNTRY_CODE);
+            String isoCountryCodeFromDb = cursor.getString(isoCountryCodeColumnIndex);
+
+
             // Find the best match from backed up data.
             SimRestoreMatch bestRestoreMatch = null;
             for (int rowNum = 0; true; rowNum++) {
@@ -3228,7 +3244,8 @@
                 }
 
                 SimRestoreMatch currSimRestoreMatch = new SimRestoreMatch(
-                        currIccIdFromDb, currCarrierIdFromDb, currPhoneNumberFromDb, currRow,
+                        currIccIdFromDb, currCarrierIdFromDb, currPhoneNumberFromDb,
+                        isoCountryCodeFromDb, wfcEntitlementRequiredCountries, currRow,
                         backupDataFormatVersion);
 
                 if (currSimRestoreMatch == null) {
@@ -3315,8 +3332,9 @@
         private static final int CARRIER_ID_MATCH = 3;
 
         public SimRestoreMatch(String iccIdFromDb, int carrierIdFromDb,
-                String phoneNumberFromDb, PersistableBundle backedUpSimInfoEntry,
-                int backupDataFormatVersion) {
+                String phoneNumberFromDb, String isoCountryCodeFromDb,
+                List<String> wfcEntitlementRequiredCountries,
+                PersistableBundle backedUpSimInfoEntry, int backupDataFormatVersion) {
             subId = backedUpSimInfoEntry.getInt(
                 Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID,
                 DEFAULT_INT_COLUMN_VALUE);
@@ -3344,7 +3362,8 @@
             }
 
             contentValues = convertBackedUpDataToContentValues(
-                    backedUpSimInfoEntry, backupDataFormatVersion);
+                    backedUpSimInfoEntry, backupDataFormatVersion, isoCountryCodeFromDb,
+                    wfcEntitlementRequiredCountries);
             matchScore = calculateMatchScore();
             matchingCriteria = calculateMatchingCriteria();
         }
@@ -3398,7 +3417,9 @@
         }
 
         private ContentValues convertBackedUpDataToContentValues(
-                PersistableBundle backedUpSimInfoEntry, int backupDataFormatVersion) {
+                PersistableBundle backedUpSimInfoEntry, int backupDataFormatVersion,
+                String isoCountryCodeFromDb,
+                List<String> wfcEntitlementRequiredCountries) {
             if (DATABASE_VERSION != 50 << 16) {
                 throw new AssertionError("The database schema has been updated which might make "
                     + "the format of #BACKED_UP_SIM_SPECIFIC_SETTINGS_FILE outdated. Make sure to "
@@ -3435,6 +3456,7 @@
              *     contentValues.put(Telephony.SimInfo.COLUMN_VT_IMS_ENABLED,
              *               backedUpSimInfoEntry.getString(Telephony.SimInfo.COLUMN_VT_IMS_ENABLED,
              *               ""));
+             *     ...
              *   }
              *
              * Also make sure to add necessary removal of sensitive settings in
@@ -3456,6 +3478,24 @@
                     backedUpSimInfoEntry.getInt(
                             Telephony.SimInfo.COLUMN_D2D_STATUS_SHARING,
                             DEFAULT_INT_COLUMN_VALUE));
+            if (isoCountryCodeFromDb != null
+                    && !wfcEntitlementRequiredCountries
+                            .contains(isoCountryCodeFromDb.toLowerCase())) {
+                // Don't restore COLUMN_WFC_IMS_ENABLED if the sim is from one of the countries that
+                // requires WFC entitlement.
+                contentValues.put(Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED,
+                        backedUpSimInfoEntry.getInt(
+                                Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED,
+                                DEFAULT_INT_COLUMN_VALUE));
+            }
+            contentValues.put(Telephony.SimInfo.COLUMN_WFC_IMS_MODE,
+                    backedUpSimInfoEntry.getInt(
+                            Telephony.SimInfo.COLUMN_WFC_IMS_MODE,
+                            DEFAULT_INT_COLUMN_VALUE));
+            contentValues.put(Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE,
+                    backedUpSimInfoEntry.getInt(
+                            Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE,
+                            DEFAULT_INT_COLUMN_VALUE));
 
             return polishContentValues(contentValues);
         }
diff --git a/tests/src/com/android/providers/telephony/TelephonyProviderTest.java b/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
index 826f51a..4adf0bc 100644
--- a/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
+++ b/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
@@ -45,6 +45,7 @@
 import android.telephony.TelephonyManager;
 import android.test.mock.MockContentResolver;
 import android.test.mock.MockContext;
+import android.test.mock.MockResources;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.text.TextUtils;
 import android.util.Log;
@@ -55,6 +56,8 @@
 
 import org.junit.Test;
 import org.mockito.MockitoAnnotations;
+import org.mockito.Mock;
+import static org.mockito.Mockito.when;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -81,6 +84,8 @@
     private MockContextWithProvider mContext;
     private MockContentResolver mContentResolver;
     private TelephonyProviderTestable mTelephonyProviderTestable;
+    @Mock
+    private Resources mockContextResources;
 
     private int notifyChangeCount;
     private int notifyChangeRestoreCount;
@@ -119,120 +124,96 @@
     private static final String ENFORCED_KEY = "enforced";
 
 
-    private static final int MATCHING_SUB_ID = 987654321;
     private static final String MATCHING_ICCID = "MATCHING_ICCID";
     private static final String MATCHING_PHONE_NUMBER = "MATCHING_PHONE_NUMBER";
     private static final int MATCHING_CARRIER_ID = 123456789;
 
     // Represents an entry in the SimInfoDb
-    private static final ContentValues TEST_SIM_INFO_VALUES = new ContentValues();
+    private static final ContentValues TEST_SIM_INFO_VALUES_US;
+    private static final ContentValues TEST_SIM_INFO_VALUES_FR;
     private static final int ARBITRARY_SIMINFO_DB_TEST_INT_VALUE = 999999;
     private static final String ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE
             = "ARBITRARY_TEST_STRING_VALUE";
 
-    private static final ContentValues BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID
-            = new ContentValues();
+    private static final ContentValues BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID;
     private static final int ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1 = 111111;
     private static final String ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_1
             = "ARBITRARY_TEST_STRING_VALUE_1";
 
-    private static final ContentValues BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID
-            = new ContentValues();
+    private static final ContentValues BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID;
     private static final int ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2 = 222222;
     private static final String ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_2
             = "ARBITRARY_TEST_STRING_VALUE_2";
 
-    private static final ContentValues BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID
-            = new ContentValues();
+    private static final ContentValues BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID;
     private static final int ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3 = 333333;
     private static final String ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_3
             = "ARBITRARY_TEST_STRING_VALUE_3";
 
     static {
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID,
-                MATCHING_SUB_ID);
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_ICC_ID, MATCHING_ICCID);
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_NUMBER, MATCHING_PHONE_NUMBER);
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_CARD_ID,
+        TEST_SIM_INFO_VALUES_US = populateContentValues(
+                MATCHING_ICCID,
+                MATCHING_PHONE_NUMBER,
+                MATCHING_CARRIER_ID,
+                "us",
+                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE,
                 ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE);
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_CARRIER_ID, MATCHING_CARRIER_ID);
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED,
-            ARBITRARY_SIMINFO_DB_TEST_INT_VALUE);
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_VT_IMS_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE);
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE);
-        TEST_SIM_INFO_VALUES.put(SimInfo.COLUMN_D2D_STATUS_SHARING,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE);
 
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_ICC_ID, MATCHING_ICCID);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_NUMBER, ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_1);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_CARD_ID, ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_1);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_CARRIER_ID, ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_VT_IMS_ENABLED, ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                SimInfo.COLUMN_D2D_STATUS_SHARING,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE);
-
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_ICC_ID, ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_2);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_NUMBER, MATCHING_PHONE_NUMBER);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_CARD_ID, ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_2);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_CARRIER_ID, MATCHING_CARRIER_ID);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_VT_IMS_ENABLED, ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                SimInfo.COLUMN_D2D_STATUS_SHARING,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2);
-
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(
-                Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(Telephony.SimInfo.COLUMN_ICC_ID,
-                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_3);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(Telephony.SimInfo.COLUMN_NUMBER,
-                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_3);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(Telephony.SimInfo.COLUMN_CARD_ID,
+        TEST_SIM_INFO_VALUES_FR = populateContentValues(
+                MATCHING_ICCID,
+                MATCHING_PHONE_NUMBER,
+                MATCHING_CARRIER_ID,
+                "fr",
+                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE,
                 ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(Telephony.SimInfo.COLUMN_CARRIER_ID,
-                MATCHING_CARRIER_ID);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(
-                Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(Telephony.SimInfo.COLUMN_VT_IMS_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(
-                Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(
-                SimInfo.COLUMN_D2D_STATUS_SHARING,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3);
+
+        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID = populateContentValues(
+                MATCHING_ICCID,
+                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_1,
+                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                null,
+                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_1);
+
+        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID = populateContentValues(
+                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_2,
+                MATCHING_PHONE_NUMBER,
+                MATCHING_CARRIER_ID,
+                null,
+                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2,
+                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_2);
+
+        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID = populateContentValues(
+                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_3,
+                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_3,
+                MATCHING_CARRIER_ID,
+                null,
+                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3,
+                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_3);
+    }
+
+    private static ContentValues populateContentValues(
+            String iccId, String phoneNumber, int carrierId, String isoCountryCode,
+            int arbitraryIntVal, String arbitraryStringVal) {
+            ContentValues contentValues = new ContentValues();
+
+        contentValues.put(Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_ICC_ID, iccId);
+        contentValues.put(Telephony.SimInfo.COLUMN_NUMBER, phoneNumber);
+        contentValues.put(Telephony.SimInfo.COLUMN_CARD_ID, arbitraryStringVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_CARRIER_ID, carrierId);
+        contentValues.put(Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_VT_IMS_ENABLED, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_WFC_IMS_MODE, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_D2D_STATUS_SHARING, arbitraryIntVal);
+        if (isoCountryCode != null) {
+            contentValues.put(Telephony.SimInfo.COLUMN_ISO_COUNTRY_CODE, isoCountryCode);
+        }
+
+        return contentValues;
     }
 
     /**
@@ -317,8 +298,7 @@
 
         @Override
         public Resources getResources() {
-            Log.d(TAG, "getResources: returning null");
-            return null;
+            return mockContextResources;
         }
 
         @Override
@@ -365,6 +345,7 @@
         super.setUp();
         MockitoAnnotations.initMocks(this);
         mTelephonyProviderTestable = new TelephonyProviderTestable();
+        when(mockContextResources.getStringArray(anyInt())).thenReturn(new String[]{"ca", "us"});
         notifyChangeCount = 0;
         notifyChangeRestoreCount = 0;
     }
@@ -775,23 +756,23 @@
                         BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID,
                         BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID});
         createInternalBackupFile(simSpecificSettingsData);
-        mContentResolver.insert(SubscriptionManager.CONTENT_URI, TEST_SIM_INFO_VALUES);
+        mContentResolver.insert(SubscriptionManager.CONTENT_URI, TEST_SIM_INFO_VALUES_US);
 
         mContext.getContentResolver().call(
-            SubscriptionManager.SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
-            SubscriptionManager.RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
-            MATCHING_ICCID, null);
+                SubscriptionManager.SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
+                SubscriptionManager.RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
+                MATCHING_ICCID, null);
 
         Cursor cursor = mContentResolver.query(SubscriptionManager.CONTENT_URI,
-            null, null, null, null);
+                null, null, null, null);
         assertEquals(1, cursor.getCount());
         cursor.moveToFirst();
 
         // Make sure SubId didn't get overridden.
         assertEquals(
-            (int)TEST_SIM_INFO_VALUES.getAsInteger(
-                    Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID),
-            getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
+                (int)TEST_SIM_INFO_VALUES_US.getAsInteger(
+                        Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID),
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
         // Ensure all other values got updated.
         assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED));
@@ -799,6 +780,12 @@
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_VT_IMS_ENABLED));
         assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_MODE));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE));
 
         assertRestoredSubIdIsRemembered();
     }
@@ -807,26 +794,26 @@
     public void testFullRestoreOnMatchingNumberAndCid() {
         byte[] simSpecificSettingsData = getBackupData(
                 new ContentValues[]{
-                    BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID,
-                    BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID});
+                        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID,
+                        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID});
         createInternalBackupFile(simSpecificSettingsData);
-        mContentResolver.insert(SubscriptionManager.CONTENT_URI, TEST_SIM_INFO_VALUES);
+        mContentResolver.insert(SubscriptionManager.CONTENT_URI, TEST_SIM_INFO_VALUES_US);
 
         mContext.getContentResolver().call(
-            SubscriptionManager.SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
-            SubscriptionManager.RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
-            MATCHING_ICCID, null);
+                SubscriptionManager.SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
+                SubscriptionManager.RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
+                MATCHING_ICCID, null);
 
         Cursor cursor = mContentResolver.query(SubscriptionManager.CONTENT_URI,
-            null, null, null, null);
+                null, null, null, null);
         assertEquals(1, cursor.getCount());
         cursor.moveToFirst();
 
         // Make sure SubId didn't get overridden.
         assertEquals(
-            (int) TEST_SIM_INFO_VALUES.getAsInteger(
-                    Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID),
-            getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
+                (int) TEST_SIM_INFO_VALUES_US.getAsInteger(
+                        Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID),
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
         // Ensure all other values got updated.
         assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2,
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED));
@@ -834,6 +821,12 @@
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_VT_IMS_ENABLED));
         assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2,
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_MODE));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE));
 
         assertRestoredSubIdIsRemembered();
     }
@@ -841,26 +834,26 @@
     @Test
     public void testFullRestoreOnMatchingCidOnly() {
         byte[] simSpecificSettingsData = getBackupData(
-            new ContentValues[]{
-                BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID});
+                new ContentValues[]{
+                        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID});
         createInternalBackupFile(simSpecificSettingsData);
-        mContentResolver.insert(SubscriptionManager.CONTENT_URI, TEST_SIM_INFO_VALUES);
+        mContentResolver.insert(SubscriptionManager.CONTENT_URI, TEST_SIM_INFO_VALUES_US);
 
         mContext.getContentResolver().call(
-            SubscriptionManager.SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
-            SubscriptionManager.RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
-            MATCHING_ICCID, null);
+                SubscriptionManager.SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
+                SubscriptionManager.RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
+                MATCHING_ICCID, null);
 
         Cursor cursor = mContentResolver.query(SubscriptionManager.CONTENT_URI,
-            null, null, null, null);
+                null, null, null, null);
         assertEquals(1, cursor.getCount());
         cursor.moveToFirst();
 
         // Make sure SubId didn't get overridden.
         assertEquals(
-            (int) TEST_SIM_INFO_VALUES.getAsInteger(
-                    Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID),
-            getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
+                (int) TEST_SIM_INFO_VALUES_US.getAsInteger(
+                        Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID),
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
         // Ensure sensitive settings did not get updated.
         assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE,
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED));
@@ -869,6 +862,54 @@
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED));
         assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3,
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_VT_IMS_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_MODE));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE));
+
+        assertRestoredSubIdIsRemembered();
+    }
+
+    @Test
+    public void testFullRestoreOnMatchingIccIdWithFranceISO() {
+        byte[] simSpecificSettingsData = getBackupData(
+                new ContentValues[]{
+                        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID,
+                        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID,
+                        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID});
+        createInternalBackupFile(simSpecificSettingsData);
+        mContentResolver.insert(SubscriptionManager.CONTENT_URI, TEST_SIM_INFO_VALUES_FR);
+
+        mContext.getContentResolver().call(
+                SubscriptionManager.SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
+                SubscriptionManager.RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
+                MATCHING_ICCID, null);
+
+        Cursor cursor = mContentResolver.query(SubscriptionManager.CONTENT_URI,
+                null, null, null, null);
+        assertEquals(1, cursor.getCount());
+        cursor.moveToFirst();
+
+        // Make sure SubId didn't get overridden.
+        assertEquals(
+                (int) TEST_SIM_INFO_VALUES_FR.getAsInteger(
+                        Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID),
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
+        // Ensure all other values got updated.
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_VT_IMS_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_MODE));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE));
 
         assertRestoredSubIdIsRemembered();
     }
@@ -878,7 +919,7 @@
         int[] previouslyRestoredSubIds =
                 bundle.getIntArray(TelephonyProvider.KEY_PREVIOUSLY_RESTORED_SUB_IDS);
         assertNotNull(previouslyRestoredSubIds);
-        assertEquals(MATCHING_SUB_ID, previouslyRestoredSubIds[0]);
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE, previouslyRestoredSubIds[0]);
     }
 
     private PersistableBundle getPersistableBundleFromInternalStorageFile() {