Merge "Keystore 2.0: Update Wifi settings to use mostly public keystore API."
diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
index fd585a1..8a32a95 100644
--- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
+++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
@@ -164,7 +164,22 @@
         }
     }
 
-    private final static class PreferenceEntriesBuilder {
+    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 CarrierConfigManager mCarrierConfigManager;
         private Context mContext;
         private TelephonyManager mTelephonyManager;
@@ -181,21 +196,6 @@
         private List<String> mEntries = new ArrayList<>();
         private List<Integer> mEntriesValue = new ArrayList<>();
 
-        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
-        }
-
         PreferenceEntriesBuilder(Context context, int subId) {
             this.mContext = context;
             this.mSubId = subId;
@@ -226,7 +226,7 @@
             int[] entryValuesInt;
             switch (getEnabledNetworkType()) {
                 case ENABLED_NETWORKS_CDMA_CHOICES:
-                    entryValues = mContext.getResources().getStringArray(
+                    entryValues = getResourcesForSubId().getStringArray(
                             R.array.enabled_networks_cdma_values);
                     entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
                     if (entryValuesInt.length < 4) {
@@ -240,7 +240,7 @@
                     addGlobalEntry(entryValuesInt[3]);
                     break;
                 case ENABLED_NETWORKS_CDMA_NO_LTE_CHOICES:
-                    entryValues = mContext.getResources().getStringArray(
+                    entryValues = getResourcesForSubId().getStringArray(
                             R.array.enabled_networks_cdma_no_lte_values);
                     entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
                     if (entryValuesInt.length < 2) {
@@ -251,7 +251,7 @@
                     add1xEntry(entryValuesInt[1]);
                     break;
                 case ENABLED_NETWORKS_CDMA_ONLY_LTE_CHOICES:
-                    entryValues = mContext.getResources().getStringArray(
+                    entryValues = getResourcesForSubId().getStringArray(
                             R.array.enabled_networks_cdma_only_lte_values);
                     entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
                     if (entryValuesInt.length < 2) {
@@ -262,7 +262,7 @@
                     addGlobalEntry(entryValuesInt[1]);
                     break;
                 case ENABLED_NETWORKS_TDSCDMA_CHOICES:
-                    entryValues = mContext.getResources().getStringArray(
+                    entryValues = getResourcesForSubId().getStringArray(
                             R.array.enabled_networks_tdscdma_values);
                     entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
                     if (entryValuesInt.length < 3) {
@@ -275,7 +275,7 @@
                     add2gEntry(entryValuesInt[2]);
                     break;
                 case ENABLED_NETWORKS_EXCEPT_GSM_LTE_CHOICES:
-                    entryValues = mContext.getResources().getStringArray(
+                    entryValues = getResourcesForSubId().getStringArray(
                             R.array.enabled_networks_except_gsm_lte_values);
                     entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
                     if (entryValuesInt.length < 1) {
@@ -285,7 +285,7 @@
                     add3gEntry(entryValuesInt[0]);
                     break;
                 case ENABLED_NETWORKS_EXCEPT_GSM_4G_CHOICES:
-                    entryValues = mContext.getResources().getStringArray(
+                    entryValues = getResourcesForSubId().getStringArray(
                             R.array.enabled_networks_except_gsm_values);
                     entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
                     if (entryValuesInt.length < 2) {
@@ -297,7 +297,7 @@
                     add3gEntry(entryValuesInt[1]);
                     break;
                 case ENABLED_NETWORKS_EXCEPT_GSM_CHOICES:
-                    entryValues = mContext.getResources().getStringArray(
+                    entryValues = getResourcesForSubId().getStringArray(
                             R.array.enabled_networks_except_gsm_values);
                     entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
                     if (entryValuesInt.length < 2) {
@@ -309,7 +309,7 @@
                     add3gEntry(entryValuesInt[1]);
                     break;
                 case ENABLED_NETWORKS_EXCEPT_LTE_CHOICES:
-                    entryValues = mContext.getResources().getStringArray(
+                    entryValues = getResourcesForSubId().getStringArray(
                             R.array.enabled_networks_except_lte_values);
                     entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
                     if (entryValuesInt.length < 2) {
@@ -320,7 +320,7 @@
                     add2gEntry(entryValuesInt[1]);
                     break;
                 case ENABLED_NETWORKS_4G_CHOICES:
-                    entryValues = mContext.getResources().getStringArray(
+                    entryValues = getResourcesForSubId().getStringArray(
                             R.array.enabled_networks_values);
                     entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
                     if (entryValuesInt.length < 3) {
@@ -334,7 +334,7 @@
                     add2gEntry(entryValuesInt[2]);
                     break;
                 case ENABLED_NETWORKS_CHOICES:
-                    entryValues = mContext.getResources().getStringArray(
+                    entryValues = getResourcesForSubId().getStringArray(
                             R.array.enabled_networks_values);
                     entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
                     if (entryValuesInt.length < 3) {
@@ -346,7 +346,7 @@
                     add2gEntry(entryValuesInt[2]);
                     break;
                 case PREFERRED_NETWORK_MODE_CHOICES_WORLD_MODE:
-                    entryValues = mContext.getResources().getStringArray(
+                    entryValues = getResourcesForSubId().getStringArray(
                             R.array.preferred_network_mode_values_world_mode);
                     entryValuesInt = Stream.of(entryValues).mapToInt(Integer::parseInt).toArray();
                     if (entryValuesInt.length < 3) {
@@ -354,9 +354,14 @@
                                 "PREFERRED_NETWORK_MODE_CHOICES_WORLD_MODE index error.");
                     }
                     addGlobalEntry(entryValuesInt[0]);
-                    addCustomEntry(mContext.getString(R.string.network_world_mode_cdma_lte),
+
+                    addCustomEntry(
+                            getResourcesForSubId().getString(
+                                    R.string.network_world_mode_cdma_lte),
                             entryValuesInt[1]);
-                    addCustomEntry(mContext.getString(R.string.network_world_mode_gsm_lte),
+                    addCustomEntry(
+                            getResourcesForSubId().getString(
+                                    R.string.network_world_mode_gsm_lte),
                             entryValuesInt[2]);
                     break;
                 default:
@@ -571,8 +576,9 @@
                 case TelephonyManagerConstants.NETWORK_MODE_NR_LTE_WCDMA:
                     setSelectedEntry(
                             TelephonyManagerConstants.NETWORK_MODE_NR_LTE_GSM_WCDMA);
-                    setSummary(mContext.getString(R.string.network_5G)
-                            + mContext.getString(R.string.network_recommended));
+                    setSummary(getResourcesForSubId().getString(R.string.network_5G)
+                            + getResourcesForSubId().getString(
+                            R.string.network_recommended));
                     break;
                 case TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA:
                 case TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM:
@@ -581,13 +587,15 @@
                 case TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
                     setSelectedEntry(TelephonyManagerConstants
                             .NETWORK_MODE_NR_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA);
-                    setSummary(mContext.getString(R.string.network_5G)
-                            + mContext.getString(R.string.network_recommended));
+                    setSummary(getResourcesForSubId().getString(R.string.network_5G)
+                            + getResourcesForSubId().getString(
+                            R.string.network_recommended));
                     break;
                 case TelephonyManagerConstants.NETWORK_MODE_NR_LTE_CDMA_EVDO:
                     setSelectedEntry(TelephonyManagerConstants.NETWORK_MODE_NR_LTE_CDMA_EVDO);
-                    setSummary(mContext.getString(R.string.network_5G)
-                            + mContext.getString(R.string.network_recommended));
+                    setSummary(getResourcesForSubId().getString(R.string.network_5G)
+                            + getResourcesForSubId().getString(
+                            R.string.network_recommended));
                     break;
                 case TelephonyManagerConstants.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA:
                     setSelectedEntry(
@@ -597,13 +605,15 @@
                             || MobileNetworkUtils.isWorldMode(mContext, mSubId)) {
                         setSummary(R.string.network_global);
                     } else {
-                        setSummary(mContext.getString(R.string.network_5G)
-                                + mContext.getString(R.string.network_recommended));
+                        setSummary(getResourcesForSubId().getString(R.string.network_5G)
+                                + getResourcesForSubId().getString(
+                                R.string.network_recommended));
                     }
                     break;
                 default:
                     setSummary(
-                            mContext.getString(R.string.mobile_network_mode_error, networkMode));
+                            getResourcesForSubId().getString(
+                                    R.string.mobile_network_mode_error, networkMode));
             }
         }
 
@@ -613,7 +623,7 @@
          * @param networkType an LTE network mode without 5G.
          * @return the corresponding network mode with 5G.
          */
-        private static int addNrToLteNetworkType(int networkType) {
+        private int addNrToLteNetworkType(int networkType) {
             switch(networkType) {
                 case TelephonyManagerConstants.NETWORK_MODE_LTE_ONLY:
                     return TelephonyManagerConstants.NETWORK_MODE_NR_LTE;
@@ -647,7 +657,7 @@
          * @param networkType an 5G network mode.
          * @return the corresponding network mode without 5G.
          */
-        private static int reduceNrToLteNetworkType(int networkType) {
+        private int reduceNrToLteNetworkType(int networkType) {
             switch(networkType) {
                 case TelephonyManagerConstants.NETWORK_MODE_NR_LTE:
                     return TelephonyManagerConstants.NETWORK_MODE_LTE_ONLY;
@@ -689,8 +699,8 @@
         private void add5gEntry(int value) {
             boolean isNRValue = value >= TelephonyManagerConstants.NETWORK_MODE_NR_ONLY;
             if (showNrList() && isNRValue) {
-                mEntries.add(mContext.getString(R.string.network_5G)
-                        + mContext.getString(R.string.network_recommended));
+                mEntries.add(getResourcesForSubId().getString(R.string.network_5G)
+                        + getResourcesForSubId().getString(R.string.network_recommended));
                 mEntriesValue.add(value);
                 mIs5gEntryDisplayed = true;
             } else {
@@ -706,7 +716,7 @@
             Log.d(LOG_TAG, "addGlobalEntry. "
                     + " supported5GRadioAccessFamily: " + mSupported5gRadioAccessFamily
                     + " allowed5GNetworkType: " + mAllowed5gNetworkType);
-            mEntries.add(mContext.getString(R.string.network_global));
+            mEntries.add(getResourcesForSubId().getString(R.string.network_global));
             if (showNrList()) {
                 value = addNrToLteNetworkType(value);
             }
@@ -722,9 +732,9 @@
          */
         private void addLteEntry(int value) {
             if (showNrList()) {
-                mEntries.add(mContext.getString(R.string.network_lte_pure));
+                mEntries.add(getResourcesForSubId().getString(R.string.network_lte_pure));
             } else {
-                mEntries.add(mContext.getString(R.string.network_lte));
+                mEntries.add(getResourcesForSubId().getString(R.string.network_lte));
             }
             mEntriesValue.add(value);
         }
@@ -734,25 +744,25 @@
          */
         private void add4gEntry(int value) {
             if (showNrList()) {
-                mEntries.add(mContext.getString(R.string.network_4G_pure));
+                mEntries.add(getResourcesForSubId().getString(R.string.network_4G_pure));
             } else {
-                mEntries.add(mContext.getString(R.string.network_4G));
+                mEntries.add(getResourcesForSubId().getString(R.string.network_4G));
             }
             mEntriesValue.add(value);
         }
 
         private void add3gEntry(int value) {
-            mEntries.add(mContext.getString(R.string.network_3G));
+            mEntries.add(getResourcesForSubId().getString(R.string.network_3G));
             mEntriesValue.add(value);
         }
 
         private void add2gEntry(int value) {
-            mEntries.add(mContext.getString(R.string.network_2G));
+            mEntries.add(getResourcesForSubId().getString(R.string.network_2G));
             mEntriesValue.add(value);
         }
 
         private void add1xEntry(int value) {
-            mEntries.add(mContext.getString(R.string.network_1x));
+            mEntries.add(getResourcesForSubId().getString(R.string.network_1x));
             mEntriesValue.add(value);
         }
 
@@ -800,7 +810,7 @@
         }
 
         private void setSummary(int summaryResId) {
-            setSummary(mContext.getString(summaryResId));
+            setSummary(getResourcesForSubId().getString(summaryResId));
         }
 
         private void setSummary(String summary) {
diff --git a/src/com/android/settings/network/telephony/TelephonyBasePreferenceController.java b/src/com/android/settings/network/telephony/TelephonyBasePreferenceController.java
index 2bd7de9..3972f39 100644
--- a/src/com/android/settings/network/telephony/TelephonyBasePreferenceController.java
+++ b/src/com/android/settings/network/telephony/TelephonyBasePreferenceController.java
@@ -17,6 +17,7 @@
 package com.android.settings.network.telephony;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.os.PersistableBundle;
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
@@ -74,4 +75,13 @@
                 mContext.getSystemService(CarrierConfigManager.class);
         return carrierConfigMgr.getConfigForSubId(subId);
     }
+
+    /**
+     * Returns the resources associated with Subscription.
+     *
+     * @return Resources associated with Subscription.
+     */
+    public Resources getResourcesForSubId() {
+        return SubscriptionManager.getResourcesForSubId(mContext, mSubId);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java
index e519b9a..ca36f1f 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java
@@ -363,43 +363,43 @@
 
     @Test
     public void checkResource_stringArrayLength() {
-        String[] entryValues = mContext.getResources().getStringArray(
+        String[] entryValues = mController.getResourcesForSubId().getStringArray(
                 R.array.enabled_networks_cdma_values);
         assertEquals(4, entryValues.length);
 
-        entryValues = mContext.getResources().getStringArray(
+        entryValues = mController.getResourcesForSubId().getStringArray(
                 R.array.enabled_networks_cdma_no_lte_values);
         assertEquals(2, entryValues.length);
 
-        entryValues = mContext.getResources().getStringArray(
+        entryValues = mController.getResourcesForSubId().getStringArray(
                 R.array.enabled_networks_cdma_only_lte_values);
         assertEquals(2, entryValues.length);
 
-        entryValues = mContext.getResources().getStringArray(
+        entryValues = mController.getResourcesForSubId().getStringArray(
                 R.array.enabled_networks_tdscdma_values);
         assertEquals(3, entryValues.length);
 
-        entryValues = mContext.getResources().getStringArray(
+        entryValues = mController.getResourcesForSubId().getStringArray(
                 R.array.enabled_networks_except_gsm_lte_values);
         assertEquals(1, entryValues.length);
 
-        entryValues = mContext.getResources().getStringArray(
+        entryValues = mController.getResourcesForSubId().getStringArray(
                 R.array.enabled_networks_except_gsm_values);
         assertEquals(2, entryValues.length);
 
-        entryValues = mContext.getResources().getStringArray(
+        entryValues = mController.getResourcesForSubId().getStringArray(
                 R.array.enabled_networks_except_lte_values);
         assertEquals(2, entryValues.length);
 
-        entryValues = mContext.getResources().getStringArray(
+        entryValues = mController.getResourcesForSubId().getStringArray(
                 R.array.enabled_networks_values);
         assertEquals(3, entryValues.length);
 
-        entryValues = mContext.getResources().getStringArray(
+        entryValues = mController.getResourcesForSubId().getStringArray(
                 R.array.enabled_networks_values);
         assertEquals(3, entryValues.length);
 
-        entryValues = mContext.getResources().getStringArray(
+        entryValues = mController.getResourcesForSubId().getStringArray(
                 R.array.preferred_network_mode_values_world_mode);
         assertEquals(3, entryValues.length);
     }
diff --git a/tests/robotests/src/com/android/settings/network/PreferredNetworkModeContentObserverTest.java b/tests/unit/src/com/android/settings/network/PreferredNetworkModeContentObserverTest.java
similarity index 79%
rename from tests/robotests/src/com/android/settings/network/PreferredNetworkModeContentObserverTest.java
rename to tests/unit/src/com/android/settings/network/PreferredNetworkModeContentObserverTest.java
index 657b8b3..e07a8f1 100644
--- a/tests/robotests/src/com/android/settings/network/PreferredNetworkModeContentObserverTest.java
+++ b/tests/unit/src/com/android/settings/network/PreferredNetworkModeContentObserverTest.java
@@ -16,41 +16,43 @@
 
 package com.android.settings.network;
 
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.content.ContentResolver;
 import android.content.Context;
 import android.provider.Settings;
+import android.test.mock.MockContentResolver;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
 public class PreferredNetworkModeContentObserverTest {
 
     private static final int SUB_ID = 1;
 
-    @Mock
-    private ContentResolver mResolver;
-    @Mock
     private Context mContext;
+    private MockContentResolver mResolver;
+    private PreferredNetworkModeContentObserver mPreferredNetworkModeContentObserver;
+
     @Mock
     private PreferredNetworkModeContentObserver.OnPreferredNetworkModeChangedListener mListener;
 
-    private PreferredNetworkModeContentObserver mPreferredNetworkModeContentObserver;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-		when(mContext.getContentResolver()).thenReturn(mResolver);
+        mContext = spy(ApplicationProvider.getApplicationContext());
+
+        mResolver = spy(new MockContentResolver(mContext));
+        when(mContext.getContentResolver()).thenReturn(mResolver);
         mPreferredNetworkModeContentObserver =
                 spy(new PreferredNetworkModeContentObserver(null));
     }
@@ -68,8 +70,8 @@
         mPreferredNetworkModeContentObserver.register(mContext, SUB_ID);
 
         verify(mResolver).registerContentObserver(
-            Settings.Global.getUriFor(Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID), false,
-            mPreferredNetworkModeContentObserver);
+                Settings.Global.getUriFor(Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID), false,
+                mPreferredNetworkModeContentObserver);
     }
 
     @Test
@@ -78,5 +80,4 @@
 
         verify(mResolver).unregisterContentObserver(mPreferredNetworkModeContentObserver);
     }
-
 }
diff --git a/tests/robotests/src/com/android/settings/network/telephony/DisabledSubscriptionControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/DisabledSubscriptionControllerTest.java
similarity index 79%
rename from tests/robotests/src/com/android/settings/network/telephony/DisabledSubscriptionControllerTest.java
rename to tests/unit/src/com/android/settings/network/telephony/DisabledSubscriptionControllerTest.java
index 38223b8..b269660 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/DisabledSubscriptionControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/DisabledSubscriptionControllerTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2020 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.
@@ -11,7 +11,7 @@
  * 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
+ * limitations under the License.
  */
 
 package com.android.settings.network.telephony;
@@ -20,13 +20,17 @@
 
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.os.Looper;
 import android.telephony.SubscriptionManager;
 
-import androidx.lifecycle.LifecycleOwner;
 import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
@@ -35,10 +39,8 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
 public class DisabledSubscriptionControllerTest {
 
     private static final String KEY = "disabled_subscription_category";
@@ -47,22 +49,28 @@
     @Mock
     private SubscriptionManager mSubscriptionManager;
     @Mock
-    private PreferenceScreen mScreen;
+    private Lifecycle mLifecycle;
 
+    private PreferenceScreen mScreen;
+    private PreferenceManager mPreferenceManager;
     private PreferenceCategory mCategory;
     private Context mContext;
-    private Lifecycle mLifecycle;
     private DisabledSubscriptionController mController;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mContext = spy(RuntimeEnvironment.application);
-        LifecycleOwner lifecycleOwner = () -> mLifecycle;
-        mLifecycle = new Lifecycle(lifecycleOwner);
-        doReturn(mSubscriptionManager).when(mContext).getSystemService(SubscriptionManager.class);
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+        if (Looper.myLooper() == null) {
+            Looper.prepare();
+        }
+        mPreferenceManager = new PreferenceManager(mContext);
+        mScreen = mPreferenceManager.createPreferenceScreen(mContext);
         mCategory = new PreferenceCategory(mContext);
-        doReturn(mCategory).when(mScreen).findPreference(KEY);
+        mCategory.setKey(KEY);
+        mScreen.addPreference(mCategory);
+
         mController = new DisabledSubscriptionController(mContext, KEY);
         mController.init(mLifecycle, SUB_ID);
     }
diff --git a/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java b/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
new file mode 100644
index 0000000..ee8157d
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
@@ -0,0 +1,336 @@
+/*
+ * Copyright (C) 2020 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.
+ */
+
+package com.android.settings.network.telephony;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.PersistableBundle;
+import android.provider.Settings;
+import android.telecom.PhoneAccountHandle;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+@RunWith(AndroidJUnit4.class)
+public class MobileNetworkUtilsTest {
+    private static final String PACKAGE_NAME = "com.android.app";
+    private static final int SUB_ID_1 = 1;
+    private static final int SUB_ID_2 = 2;
+    private static final int SUB_ID_INVALID = -1;
+    private static final String PLMN_FROM_TELEPHONY_MANAGER_API = "testPlmn";
+    private static final String PLMN_FROM_SUB_ID_1 = "testPlmnSub1";
+    private static final String PLMN_FROM_SUB_ID_2 = "testPlmnSub2";
+
+    @Mock
+    private TelephonyManager mTelephonyManager;
+    @Mock
+    private TelephonyManager mTelephonyManager2;
+    @Mock
+    private SubscriptionManager mSubscriptionManager;
+    @Mock
+    private SubscriptionInfo mSubscriptionInfo1;
+    @Mock
+    private SubscriptionInfo mSubscriptionInfo2;
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private ResolveInfo mResolveInfo;
+    @Mock
+    private CarrierConfigManager mCarrierConfigManager;
+
+    private Context mContext;
+    private PersistableBundle mCarrierConfig;
+    private PhoneAccountHandle mPhoneAccountHandle;
+    private ComponentName mComponentName;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+        when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+        when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
+        when(mTelephonyManager.createForSubscriptionId(SUB_ID_1)).thenReturn(mTelephonyManager);
+        when(mTelephonyManager.createForSubscriptionId(SUB_ID_2)).thenReturn(mTelephonyManager2);
+        when(mContext.getPackageManager()).thenReturn(mPackageManager);
+
+        when(mContext.getSystemService(CarrierConfigManager.class)).thenReturn(
+                mCarrierConfigManager);
+
+        mCarrierConfig = new PersistableBundle();
+        when(mCarrierConfigManager.getConfigForSubId(SUB_ID_1)).thenReturn(mCarrierConfig);
+
+        when(mSubscriptionInfo1.getSubscriptionId()).thenReturn(SUB_ID_1);
+        when(mSubscriptionInfo1.getCarrierName()).thenReturn(PLMN_FROM_SUB_ID_1);
+        when(mSubscriptionInfo2.getSubscriptionId()).thenReturn(SUB_ID_2);
+        when(mSubscriptionInfo2.getCarrierName()).thenReturn(PLMN_FROM_SUB_ID_2);
+
+        when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
+                Arrays.asList(mSubscriptionInfo1, mSubscriptionInfo2));
+        when(mSubscriptionManager.getAccessibleSubscriptionInfoList()).thenReturn(
+                Arrays.asList(mSubscriptionInfo1, mSubscriptionInfo2));
+
+        when(mTelephonyManager.getNetworkOperatorName()).thenReturn(
+                PLMN_FROM_TELEPHONY_MANAGER_API);
+    }
+
+    @Test
+    public void setMobileDataEnabled_setEnabled_enabled() {
+        MobileNetworkUtils.setMobileDataEnabled(mContext, SUB_ID_1, true, false);
+
+        verify(mTelephonyManager).setDataEnabled(true);
+        verify(mTelephonyManager2, never()).setDataEnabled(anyBoolean());
+    }
+
+    @Test
+    public void setMobileDataEnabled_setDisabled_disabled() {
+        MobileNetworkUtils.setMobileDataEnabled(mContext, SUB_ID_2, true, false);
+
+        verify(mTelephonyManager2).setDataEnabled(true);
+        verify(mTelephonyManager, never()).setDataEnabled(anyBoolean());
+    }
+
+    @Test
+    public void setMobileDataEnabled_disableOtherSubscriptions() {
+        MobileNetworkUtils.setMobileDataEnabled(mContext, SUB_ID_1, true, true);
+
+        verify(mTelephonyManager).setDataEnabled(true);
+        verify(mTelephonyManager2).setDataEnabled(false);
+    }
+
+    @Test
+    public void buildConfigureIntent_nullHandle_returnNull() {
+        assertThat(MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext, null)).isNull();
+    }
+
+    @Test
+    public void buildConfigureIntent_noActivityHandleIntent_returnNull() {
+        when(mPackageManager.queryIntentActivities(nullable(Intent.class), anyInt()))
+                .thenReturn(new ArrayList<>());
+
+        assertThat(MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext,
+                mPhoneAccountHandle)).isNull();
+    }
+
+    @Test
+    public void buildConfigureIntent_hasActivityHandleIntent_returnIntent() {
+        mComponentName = new ComponentName(PACKAGE_NAME, "testClass");
+        mPhoneAccountHandle = new PhoneAccountHandle(mComponentName, "");
+        when(mPackageManager.queryIntentActivities(nullable(Intent.class), anyInt()))
+                .thenReturn(Arrays.asList(mResolveInfo));
+
+        assertThat(MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext,
+                mPhoneAccountHandle)).isNotNull();
+    }
+
+    @Test
+    public void isCdmaOptions_phoneTypeCdma_returnTrue() {
+        when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_CDMA);
+
+        assertThat(MobileNetworkUtils.isCdmaOptions(mContext, SUB_ID_1)).isTrue();
+    }
+
+    @Test
+    public void isCdmaOptions_worldModeWithGsmWcdma_returnTrue() {
+        when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_GSM);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
+
+        Settings.Global.putInt(mContext.getContentResolver(),
+                android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
+                TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA);
+
+        assertThat(MobileNetworkUtils.isCdmaOptions(mContext, SUB_ID_1)).isTrue();
+    }
+
+    @Test
+    public void isCdmaOptions_carrierWorldModeWithoutHideCarrier_returnTrue() {
+        when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_GSM);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL,
+                false);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL, true);
+
+        assertThat(MobileNetworkUtils.isCdmaOptions(mContext, SUB_ID_1)).isTrue();
+    }
+
+    @Test
+    public void getSearchableSubscriptionId_oneActive_returnValid() {
+        when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
+                Arrays.asList(mSubscriptionInfo1));
+        assertThat(MobileNetworkUtils.getSearchableSubscriptionId(mContext)).isEqualTo(SUB_ID_1);
+    }
+
+    @Test
+    public void getSearchableSubscriptionId_nonActive_returnInvalid() {
+        when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(new ArrayList<>());
+
+        assertThat(MobileNetworkUtils.getSearchableSubscriptionId(mContext))
+                .isEqualTo(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+    }
+
+    @Test
+    public void shouldDisplayNetworkSelectOptions_HideCarrierNetwork_returnFalse() {
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL,
+                true);
+
+        assertThat(MobileNetworkUtils.shouldDisplayNetworkSelectOptions(mContext, SUB_ID_1))
+                .isFalse();
+    }
+
+    @Test
+    public void shouldDisplayNetworkSelectOptions_allCheckPass_returnTrue() {
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL,
+                false);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_OPERATOR_SELECTION_EXPAND_BOOL, true);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_CSP_ENABLED_BOOL, false);
+        when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_GSM);
+
+        assertThat(MobileNetworkUtils.shouldDisplayNetworkSelectOptions(mContext, SUB_ID_1))
+                .isTrue();
+    }
+
+    @Test
+    public void shouldSpeciallyUpdateGsmCdma_notWorldMode_returnFalse() {
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, false);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, false);
+
+        assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isFalse();
+    }
+
+    @Test
+    public void shouldSpeciallyUpdateGsmCdma_supportTdscdma_returnFalse() {
+        when(mCarrierConfigManager.getConfig()).thenReturn(mCarrierConfig);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, true);
+
+        assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isFalse();
+    }
+
+    @Test
+    public void shouldSpeciallyUpdateGsmCdma_ModeLteTdscdmaGsm_returnTrue() {
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, false);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
+                TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_GSM);
+
+        assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isTrue();
+    }
+
+    @Test
+    public void shouldSpeciallyUpdateGsmCdma_ModeLteTdscdmaGsmWcdma_returnTrue() {
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, false);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
+                TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA);
+
+        assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isTrue();
+    }
+
+    @Test
+    public void shouldSpeciallyUpdateGsmCdma_ModeLteTdscdma_returnTrue() {
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, false);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
+                TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA);
+
+        assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isTrue();
+    }
+
+    @Test
+    public void shouldSpeciallyUpdateGsmCdma_ModeLteTdscdmaWcdma_returnTrue() {
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, false);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
+                TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA);
+
+        assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isTrue();
+    }
+
+    @Test
+    public void shouldSpeciallyUpdateGsmCdma_ModeLteTdscdmaCdmaEvdoGsmWcdma_returnTrue() {
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, false);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
+                TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA);
+
+        assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isTrue();
+    }
+
+    @Test
+    public void shouldSpeciallyUpdateGsmCdma_ModeLteCdmaEvdoGsmWcdma_returnTrue() {
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL, false);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
+                TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA);
+
+        assertThat(MobileNetworkUtils.shouldSpeciallyUpdateGsmCdma(mContext, SUB_ID_1)).isTrue();
+    }
+
+    @Test
+    public void getCurrentCarrierNameForDisplay_withoutValidSubId_returnNetworkOperatorName() {
+        assertThat(MobileNetworkUtils.getCurrentCarrierNameForDisplay(
+                mContext, SUB_ID_INVALID)).isEqualTo(PLMN_FROM_TELEPHONY_MANAGER_API);
+    }
+
+    @Test
+    public void getCurrentCarrierNameForDisplay_withValidSubId_returnCurrentCarrierName() {
+        assertThat(MobileNetworkUtils.getCurrentCarrierNameForDisplay(
+                mContext, SUB_ID_1)).isEqualTo(PLMN_FROM_SUB_ID_1);
+        assertThat(MobileNetworkUtils.getCurrentCarrierNameForDisplay(
+                mContext, SUB_ID_2)).isEqualTo(PLMN_FROM_SUB_ID_2);
+    }
+
+    @Test
+    public void getCurrentCarrierNameForDisplay_withoutSubId_returnNotNull() {
+        assertThat(MobileNetworkUtils.getCurrentCarrierNameForDisplay(
+                mContext)).isNotNull();
+    }
+}
diff --git a/tests/unit/src/com/android/settings/network/telephony/cdma/CdmaListPreferenceTest.java b/tests/unit/src/com/android/settings/network/telephony/cdma/CdmaListPreferenceTest.java
new file mode 100644
index 0000000..027a53b
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/telephony/cdma/CdmaListPreferenceTest.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2020 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.
+ */
+
+package com.android.settings.network.telephony.cdma;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.telephony.TelephonyManager;
+
+import androidx.preference.PreferenceManager;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class CdmaListPreferenceTest {
+    private static final int SUB_ID = 2;
+
+    @Mock
+    private TelephonyManager mTelephonyManager;
+    @Mock
+    private PreferenceManager mPreferenceManager;
+
+    private CdmaListPreference mPreference;
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+        when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager);
+        mPreference = spy(new CdmaListPreference(mContext, null));
+        mPreference.setSubId(SUB_ID);
+    }
+
+    @Test
+    public void onClick_inEcm_doNothing() {
+        doReturn(true).when(mTelephonyManager).getEmergencyCallbackMode();
+
+        mPreference.onClick();
+
+        verify(mPreferenceManager, never()).showDialog(mPreference);
+    }
+}
diff --git a/tests/unit/src/com/android/settings/network/telephony/cdma/CdmaSubscriptionPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/cdma/CdmaSubscriptionPreferenceControllerTest.java
new file mode 100644
index 0000000..86488c6
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/telephony/cdma/CdmaSubscriptionPreferenceControllerTest.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2020 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.
+ */
+
+package com.android.settings.network.telephony.cdma;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.SystemProperties;
+import android.provider.Settings;
+import android.telephony.TelephonyManager;
+
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceManager;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class CdmaSubscriptionPreferenceControllerTest {
+    private static final int SUB_ID = 2;
+
+    @Mock
+    private PreferenceManager mPreferenceManager;
+    @Mock
+    private TelephonyManager mTelephonyManager;
+
+    private CdmaSubscriptionPreferenceController mController;
+    private ListPreference mPreference;
+    private Context mContext;
+    private int mCdmaMode;
+    private String mSubscriptionsSupported;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+        doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
+
+        mPreference = new ListPreference(mContext);
+        mController = new CdmaSubscriptionPreferenceController(mContext, "mobile_data");
+        mController.init(mPreferenceManager, SUB_ID);
+        mController.mPreference = mPreference;
+        mPreference.setKey(mController.getPreferenceKey());
+
+        mCdmaMode = Settings.Global.getInt(mContext.getContentResolver(),
+            Settings.Global.CDMA_SUBSCRIPTION_MODE,
+            TelephonyManager.CDMA_SUBSCRIPTION_RUIM_SIM);
+
+        mSubscriptionsSupported = SystemProperties.get("ril.subscription.types");
+    }
+
+    @After
+    public void tearDown() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+            Settings.Global.CDMA_SUBSCRIPTION_MODE, mCdmaMode);
+
+        SystemProperties.set("ril.subscription.types", mSubscriptionsSupported);
+    }
+
+    @Test
+    public void onPreferenceChange_selectNV_returnNVMode() {
+        doReturn(true).when(mTelephonyManager).setCdmaSubscriptionMode(anyInt());
+
+        mController.onPreferenceChange(mPreference, Integer.toString(
+                TelephonyManager.CDMA_SUBSCRIPTION_NV));
+
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.CDMA_SUBSCRIPTION_MODE,
+                TelephonyManager.CDMA_SUBSCRIPTION_RUIM_SIM)).isEqualTo(
+                        TelephonyManager.CDMA_SUBSCRIPTION_NV);
+    }
+
+    @Test
+    public void updateState_stateRUIM_displayRUIM() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.CDMA_SUBSCRIPTION_MODE, TelephonyManager.CDMA_SUBSCRIPTION_NV);
+
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getValue()).isEqualTo(Integer.toString(
+                TelephonyManager.CDMA_SUBSCRIPTION_NV));
+    }
+
+    @Test
+    public void updateState_stateUnknown_doNothing() {
+        mPreference.setValue(Integer.toString(TelephonyManager.CDMA_SUBSCRIPTION_NV));
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.CDMA_SUBSCRIPTION_MODE, TelephonyManager.CDMA_SUBSCRIPTION_UNKNOWN);
+
+        mController.updateState(mPreference);
+
+        // Still NV mode
+        assertThat(mPreference.getValue()).isEqualTo(Integer.toString(
+                TelephonyManager.CDMA_SUBSCRIPTION_NV));
+    }
+
+    @Test
+    public void deviceSupportsNvAndRuim() {
+        SystemProperties.set("ril.subscription.types", "NV,RUIM");
+        assertThat(mController.deviceSupportsNvAndRuim()).isTrue();
+
+        SystemProperties.set("ril.subscription.types", "");
+
+        assertThat(mController.deviceSupportsNvAndRuim()).isFalse();
+    }
+}
diff --git a/tests/unit/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceControllerTest.java
new file mode 100644
index 0000000..4f44a29
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceControllerTest.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2020 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.
+ */
+
+package com.android.settings.network.telephony.cdma;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.telephony.TelephonyManager;
+
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceManager;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class CdmaSystemSelectPreferenceControllerTest {
+    private static final int SUB_ID = 2;
+
+    @Mock
+    private PreferenceManager mPreferenceManager;
+    @Mock
+    private TelephonyManager mTelephonyManager;
+
+    private CdmaSystemSelectPreferenceController mController;
+    private ListPreference mPreference;
+    private Context mContext;
+    private int mCdmaRoamingMode;
+    private int mSettingsNetworkMode;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+        doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
+
+        mPreference = new ListPreference(mContext);
+        mController = new CdmaSystemSelectPreferenceController(mContext, "mobile_data");
+        mController.init(mPreferenceManager, SUB_ID);
+        mController.mPreference = mPreference;
+        mPreference.setKey(mController.getPreferenceKey());
+
+        mCdmaRoamingMode = Settings.Global.getInt(mContext.getContentResolver(),
+            Settings.Global.CDMA_ROAMING_MODE,
+            TelephonyManager.CDMA_ROAMING_MODE_ANY);
+
+        mSettingsNetworkMode = Settings.Global.getInt(
+            mContext.getContentResolver(),
+            Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID,
+            TelephonyManager.DEFAULT_PREFERRED_NETWORK_MODE);
+    }
+
+    @After
+    public void tearDown() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+            Settings.Global.CDMA_ROAMING_MODE, mCdmaRoamingMode);
+
+        Settings.Global.putInt(mContext.getContentResolver(),
+            Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID, mSettingsNetworkMode);
+    }
+
+    @Test
+    public void onPreferenceChange_selectHome_returnHomeMode() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.CDMA_ROAMING_MODE,
+                TelephonyManager.CDMA_ROAMING_MODE_ANY);
+        doReturn(true).when(mTelephonyManager).setCdmaRoamingMode(anyInt());
+
+        mController.onPreferenceChange(mPreference,
+                Integer.toString(TelephonyManager.CDMA_ROAMING_MODE_HOME));
+
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.CDMA_ROAMING_MODE,
+                TelephonyManager.CDMA_ROAMING_MODE_ANY)).isEqualTo(
+                TelephonyManager.CDMA_ROAMING_MODE_HOME);
+    }
+
+    @Test
+    public void updateState_stateHome_displayHome() {
+        doReturn(TelephonyManager.CDMA_ROAMING_MODE_HOME).when(
+                mTelephonyManager).getCdmaRoamingMode();
+
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getValue()).isEqualTo(
+                Integer.toString(TelephonyManager.CDMA_ROAMING_MODE_HOME));
+    }
+
+    @Test
+    public void updateState_LteGSMWcdma_disabled() {
+        doReturn(TelephonyManager.CDMA_ROAMING_MODE_HOME).when(
+                mTelephonyManager).getCdmaRoamingMode();
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID,
+                TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA);
+
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void updateState_stateOther_resetToDefault() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.CDMA_ROAMING_MODE,
+                TelephonyManager.CDMA_ROAMING_MODE_HOME);
+        doReturn(TelephonyManager.CDMA_ROAMING_MODE_AFFILIATED).when(
+                mTelephonyManager).getCdmaRoamingMode();
+
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getValue()).isEqualTo(
+                Integer.toString(TelephonyManager.CDMA_ROAMING_MODE_ANY));
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.CDMA_ROAMING_MODE,
+                TelephonyManager.CDMA_ROAMING_MODE_HOME)).isEqualTo(
+                TelephonyManager.CDMA_ROAMING_MODE_ANY);
+    }
+}