Merge "Add ACL state listener for bt devices"
diff --git a/res/layout/fingerprint_rename_dialog.xml b/res/layout/fingerprint_rename_dialog.xml
index 99cfa71..2da84ca 100644
--- a/res/layout/fingerprint_rename_dialog.xml
+++ b/res/layout/fingerprint_rename_dialog.xml
@@ -35,7 +35,7 @@
         android:clipChildren="false"
         android:clipToPadding="false" />
 
-    <EditText
+    <com.android.settings.widget.ImeAwareEditText
         android:id="@+id/fingerprint_rename_field"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index f2661bd..56dbc6b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -8920,6 +8920,10 @@
     <string name="display_summary">Sleep after <xliff:g id="timeout_description" example="10 minutes">%1$s</xliff:g> of inactivity</string>
     <!-- Summary for Display settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
     <string name="display_dashboard_summary">Wallpaper, sleep, font size</string>
+
+    <!-- Summary for Display settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
+    <string name="display_dashboard_nowallpaper_summary">Sleep, font size</string>
+
     <!-- Example summary of display used in Setup Wizard preview screen [CHAR LIMIT=NONE] -->
     <string name="display_summary_example">Sleep after 10 minutes of inactivity</string>
 
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index db4e7d8..b0e362c 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -52,7 +52,7 @@
         android:title="@string/wallpaper_settings_title"
         settings:keywords="@string/keywords_display_wallpaper"
         settings:useAdminDisabledSummary="true"
-        settings:searchable="false">
+        settings:controller="com.android.settings.display.WallpaperPreferenceController">
         <intent
             android:targetPackage="@string/config_wallpaper_picker_package"
             android:targetClass="@string/config_wallpaper_picker_class" />
diff --git a/res/xml/top_level_settings.xml b/res/xml/top_level_settings.xml
index dbb106e..889761b 100644
--- a/res/xml/top_level_settings.xml
+++ b/res/xml/top_level_settings.xml
@@ -59,10 +59,11 @@
     <Preference
         android:key="top_level_display"
         android:title="@string/display_settings"
-        android:summary="@string/display_dashboard_summary"
+        android:summary="@string/summary_placeholder"
         android:icon="@drawable/ic_homepage_display"
         android:order="-70"
-        android:fragment="com.android.settings.DisplaySettings"/>
+        android:fragment="com.android.settings.DisplaySettings"
+        settings:controller="com.android.settings.display.TopLevelDisplayPreferenceController"/>
 
     <Preference
         android:key="top_level_sound"
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index 75f13aa..6557aee 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -85,7 +85,6 @@
         controllers.add(new TimeoutPreferenceController(context, KEY_SCREEN_TIMEOUT));
         controllers.add(new VrDisplayPreferenceController(context));
         controllers.add(new ShowOperatorNamePreferenceController(context));
-        controllers.add(new WallpaperPreferenceController(context));
         controllers.add(new ThemePreferenceController(context));
         controllers.add(new BrightnessLevelPreferenceController(context, lifecycle));
         return controllers;
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index c3bd043..2e67ec3 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -55,6 +55,7 @@
 import com.android.settings.password.ChooseLockGeneric;
 import com.android.settings.password.ChooseLockSettingsHelper;
 import com.android.settings.utils.AnnotationSpan;
+import com.android.settings.widget.ImeAwareEditText;
 import com.android.settingslib.HelpUtils;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
@@ -708,11 +709,7 @@
         public static class RenameDialog extends InstrumentedDialogFragment {
 
             private Fingerprint mFp;
-            private EditText mDialogTextField;
-            private String mFingerName;
-            private Boolean mTextHadFocus;
-            private int mTextSelectionStart;
-            private int mTextSelectionEnd;
+            private ImeAwareEditText mDialogTextField;
             private AlertDialog mAlertDialog;
             private boolean mDeleteInProgress;
 
@@ -723,11 +720,17 @@
             @Override
             public Dialog onCreateDialog(Bundle savedInstanceState) {
                 mFp = getArguments().getParcelable("fingerprint");
+                final String fingerName;
+                final int textSelectionStart;
+                final int textSelectionEnd;
                 if (savedInstanceState != null) {
-                    mFingerName = savedInstanceState.getString("fingerName");
-                    mTextHadFocus = savedInstanceState.getBoolean("textHadFocus");
-                    mTextSelectionStart = savedInstanceState.getInt("startSelection");
-                    mTextSelectionEnd = savedInstanceState.getInt("endSelection");
+                    fingerName = savedInstanceState.getString("fingerName");
+                    textSelectionStart = savedInstanceState.getInt("startSelection", -1);
+                    textSelectionEnd = savedInstanceState.getInt("endSelection", -1);
+                } else {
+                    fingerName = null;
+                    textSelectionStart = -1;
+                    textSelectionEnd = -1;
                 }
                 mAlertDialog = new AlertDialog.Builder(getActivity())
                         .setView(R.layout.fingerprint_rename_dialog)
@@ -756,26 +759,21 @@
                 mAlertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
                     @Override
                     public void onShow(DialogInterface dialog) {
-                        mDialogTextField = (EditText) mAlertDialog.findViewById(
-                                R.id.fingerprint_rename_field);
-                        CharSequence name = mFingerName == null ? mFp.getName() : mFingerName;
+                        mDialogTextField = mAlertDialog.findViewById(R.id.fingerprint_rename_field);
+                        CharSequence name = fingerName == null ? mFp.getName() : fingerName;
                         mDialogTextField.setText(name);
-                        if (mTextHadFocus == null) {
-                            mDialogTextField.selectAll();
+                        if (textSelectionStart != -1 && textSelectionEnd != -1) {
+                            mDialogTextField.setSelection(textSelectionStart, textSelectionEnd);
                         } else {
-                            mDialogTextField.setSelection(mTextSelectionStart, mTextSelectionEnd);
+                            mDialogTextField.selectAll();
                         }
                         if (mDeleteInProgress) {
                             mAlertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
                         }
                         mDialogTextField.requestFocus();
+                        mDialogTextField.scheduleShowSoftInput();
                     }
                 });
-                if (mTextHadFocus == null || mTextHadFocus) {
-                    // Request the IME
-                    mAlertDialog.getWindow().setSoftInputMode(
-                            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
-                }
                 return mAlertDialog;
             }
 
@@ -791,7 +789,6 @@
                 super.onSaveInstanceState(outState);
                 if (mDialogTextField != null) {
                     outState.putString("fingerName", mDialogTextField.getText().toString());
-                    outState.putBoolean("textHadFocus", mDialogTextField.hasFocus());
                     outState.putInt("startSelection", mDialogTextField.getSelectionStart());
                     outState.putInt("endSelection", mDialogTextField.getSelectionEnd());
                 }
diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java
index 4dddeab..78aa6c2 100644
--- a/src/com/android/settings/datausage/AppDataUsage.java
+++ b/src/com/android/settings/datausage/AppDataUsage.java
@@ -190,7 +190,8 @@
 
             if (mPackages.size() > 1) {
                 mAppList = (PreferenceCategory) findPreference(KEY_APP_LIST);
-                getLoaderManager().initLoader(LOADER_APP_PREF, Bundle.EMPTY, mAppPrefCallbacks);
+                LoaderManager.getInstance(this).restartLoader(LOADER_APP_PREF, Bundle.EMPTY,
+                        mAppPrefCallbacks);
             } else {
                 removePreference(KEY_APP_LIST);
             }
@@ -221,7 +222,7 @@
             mDataSaverBackend.addListener(this);
         }
         mPolicy = services.mPolicyEditor.getPolicy(mTemplate);
-        getLoaderManager().restartLoader(LOADER_CHART_DATA,
+        LoaderManager.getInstance(this).restartLoader(LOADER_CHART_DATA,
                 ChartDataLoaderCompat.buildArgs(mTemplate, mAppItem), mChartDataCallbacks);
         updatePrefs();
     }
diff --git a/src/com/android/settings/datausage/AppDataUsageV2.java b/src/com/android/settings/datausage/AppDataUsageV2.java
index 7515c51..6a31726 100644
--- a/src/com/android/settings/datausage/AppDataUsageV2.java
+++ b/src/com/android/settings/datausage/AppDataUsageV2.java
@@ -177,7 +177,8 @@
 
             if (mPackages.size() > 1) {
                 mAppList = (PreferenceCategory) findPreference(KEY_APP_LIST);
-                getLoaderManager().initLoader(LOADER_APP_PREF, Bundle.EMPTY, mAppPrefCallbacks);
+                LoaderManager.getInstance(this).restartLoader(LOADER_APP_PREF, Bundle.EMPTY,
+                        mAppPrefCallbacks);
             } else {
                 removePreference(KEY_APP_LIST);
             }
@@ -201,7 +202,8 @@
         if (mDataSaverBackend != null) {
             mDataSaverBackend.addListener(this);
         }
-        getLoaderManager().restartLoader(LOADER_APP_USAGE_DATA, null /* args */, mUidDataCallbacks);
+        LoaderManager.getInstance(this).restartLoader(LOADER_APP_USAGE_DATA, null /* args */,
+                mUidDataCallbacks);
         updatePrefs();
     }
 
diff --git a/src/com/android/settings/display/TopLevelDisplayPreferenceController.java b/src/com/android/settings/display/TopLevelDisplayPreferenceController.java
new file mode 100644
index 0000000..88b87e0
--- /dev/null
+++ b/src/com/android/settings/display/TopLevelDisplayPreferenceController.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2018 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.display;
+
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+public class TopLevelDisplayPreferenceController extends BasePreferenceController {
+
+    public TopLevelDisplayPreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public CharSequence getSummary() {
+        if (new WallpaperPreferenceController(mContext, "dummy_key").isAvailable()) {
+            return mContext.getText(R.string.display_dashboard_summary);
+        } else {
+            return mContext.getText(R.string.display_dashboard_nowallpaper_summary);
+        }
+    }
+
+}
diff --git a/src/com/android/settings/display/WallpaperPreferenceController.java b/src/com/android/settings/display/WallpaperPreferenceController.java
index ff3be12..0b09124 100644
--- a/src/com/android/settings/display/WallpaperPreferenceController.java
+++ b/src/com/android/settings/display/WallpaperPreferenceController.java
@@ -27,34 +27,30 @@
 import androidx.preference.Preference;
 
 import com.android.settings.R;
-import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.BasePreferenceController;
 import com.android.settingslib.RestrictedLockUtilsInternal;
 import com.android.settingslib.RestrictedPreference;
-import com.android.settingslib.core.AbstractPreferenceController;
 
 import java.util.List;
 
-public class WallpaperPreferenceController extends AbstractPreferenceController implements
-        PreferenceControllerMixin {
+public class WallpaperPreferenceController extends BasePreferenceController {
 
     private static final String TAG = "WallpaperPrefController";
 
-    public static final String KEY_WALLPAPER = "wallpaper";
-
     private final String mWallpaperPackage;
     private final String mWallpaperClass;
 
-    public WallpaperPreferenceController(Context context) {
-        super(context);
+    public WallpaperPreferenceController(Context context, String key) {
+        super(context, key);
         mWallpaperPackage = mContext.getString(R.string.config_wallpaper_picker_package);
         mWallpaperClass = mContext.getString(R.string.config_wallpaper_picker_class);
     }
 
     @Override
-    public boolean isAvailable() {
+    public int getAvailabilityStatus() {
         if (TextUtils.isEmpty(mWallpaperPackage) || TextUtils.isEmpty(mWallpaperClass)) {
             Log.e(TAG, "No Wallpaper picker specified!");
-            return false;
+            return UNSUPPORTED_ON_DEVICE;
         }
         final ComponentName componentName =
                 new ComponentName(mWallpaperPackage, mWallpaperClass);
@@ -63,12 +59,8 @@
         intent.setComponent(componentName);
         final List<ResolveInfo> resolveInfos =
                 pm.queryIntentActivities(intent, 0 /* flags */);
-        return resolveInfos != null && resolveInfos.size() != 0;
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return KEY_WALLPAPER;
+        return resolveInfos != null && !resolveInfos.isEmpty()
+                ? AVAILABLE_UNSEARCHABLE : CONDITIONALLY_UNAVAILABLE;
     }
 
     @Override
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
index bc1d0fa..f3fbf06 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
@@ -33,8 +33,6 @@
 import androidx.slice.Slice;
 
 import com.android.settings.homepage.contextualcards.deviceinfo.BatterySlice;
-import com.android.settings.homepage.contextualcards.deviceinfo.DataUsageSlice;
-import com.android.settings.homepage.contextualcards.deviceinfo.DeviceInfoSlice;
 import com.android.settingslib.utils.AsyncLoaderCompat;
 
 import java.util.ArrayList;
@@ -94,15 +92,6 @@
         final double rankingScore = 0.0;
         final List<ContextualCard> result = new ArrayList();
         result.add(new ContextualCard.Builder()
-                .setSliceUri(DataUsageSlice.DATA_USAGE_CARD_URI)
-                .setName(DataUsageSlice.PATH_DATA_USAGE)
-                .setPackageName(packageName)
-                .setRankingScore(rankingScore)
-                .setAppVersion(appVersionCode)
-                .setCardType(ContextualCard.CardType.SLICE)
-                .setIsHalfWidth(false)
-                .build());
-        result.add(new ContextualCard.Builder()
                 .setSliceUri(BatterySlice.BATTERY_CARD_URI)
                 .setName(BatterySlice.PATH_BATTERY_INFO)
                 .setPackageName(packageName)
@@ -111,15 +100,6 @@
                 .setCardType(ContextualCard.CardType.SLICE)
                 .setIsHalfWidth(false)
                 .build());
-        result.add(new ContextualCard.Builder()
-                .setSliceUri(DeviceInfoSlice.DEVICE_INFO_CARD_URI)
-                .setName(DeviceInfoSlice.PATH_DEVICE_INFO)
-                .setPackageName(packageName)
-                .setRankingScore(rankingScore)
-                .setAppVersion(appVersionCode)
-                .setCardType(ContextualCard.CardType.SLICE)
-                .setIsHalfWidth(false)
-                .build());
         return result;
     }
 
diff --git a/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java b/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java
index 36c0a11..e394c03 100644
--- a/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java
+++ b/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java
@@ -21,10 +21,6 @@
 import android.annotation.Nullable;
 
 import com.android.settings.homepage.contextualcards.deviceinfo.BatterySlice;
-import com.android.settings.homepage.contextualcards.deviceinfo.DataUsageSlice;
-import com.android.settings.homepage.contextualcards.deviceinfo.DeviceInfoSlice;
-import com.android.settings.homepage.contextualcards.deviceinfo.EmergencyInfoSlice;
-import com.android.settings.homepage.contextualcards.deviceinfo.StorageSlice;
 import com.android.settings.homepage.contextualcards.slices.ConnectedDeviceSlice;
 import com.android.settings.intelligence.ContextualCardProto.ContextualCard;
 import com.android.settings.intelligence.ContextualCardProto.ContextualCardList;
@@ -45,26 +41,6 @@
                         .setSliceUri(WifiSlice.WIFI_URI.toString())
                         .setCardName(KEY_WIFI)
                         .build();
-        final ContextualCard dataUsageCard =
-                ContextualCard.newBuilder()
-                        .setSliceUri(DataUsageSlice.DATA_USAGE_CARD_URI.toString())
-                        .setCardName(DataUsageSlice.PATH_DATA_USAGE)
-                        .build();
-        final ContextualCard deviceInfoCard =
-                ContextualCard.newBuilder()
-                        .setSliceUri(DeviceInfoSlice.DEVICE_INFO_CARD_URI.toString())
-                        .setCardName(DeviceInfoSlice.PATH_DEVICE_INFO)
-                        .build();
-        final ContextualCard storageInfoCard =
-                ContextualCard.newBuilder()
-                        .setSliceUri(StorageSlice.STORAGE_CARD_URI.toString())
-                        .setCardName(StorageSlice.PATH_STORAGE_INFO)
-                        .build();
-        final ContextualCard emergencyInfoCard =
-                ContextualCard.newBuilder()
-                        .setSliceUri(EmergencyInfoSlice.EMERGENCY_INFO_CARD_URI.toString())
-                        .setCardName(EmergencyInfoSlice.PATH_EMERGENCY_INFO_CARD)
-                        .build();
         final ContextualCard batteryInfoCard =
                 ContextualCard.newBuilder()
                         .setSliceUri(BatterySlice.BATTERY_CARD_URI.toSafeString())
@@ -77,10 +53,6 @@
                         .build();
         final ContextualCardList cards = ContextualCardList.newBuilder()
                 .addCard(wifiCard)
-                .addCard(dataUsageCard)
-                .addCard(deviceInfoCard)
-                .addCard(storageInfoCard)
-                .addCard(emergencyInfoCard)
                 .addCard(batteryInfoCard)
                 .addCard(connectedDeviceCard)
                 .build();
diff --git a/src/com/android/settings/network/telephony/MobileNetworkFragment.java b/src/com/android/settings/network/telephony/MobileNetworkFragment.java
index df6c7ab..e6db51c 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkFragment.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkFragment.java
@@ -22,6 +22,7 @@
 import android.os.Bundle;
 import android.os.UserManager;
 import android.provider.SearchIndexableResource;
+import android.provider.Settings;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
@@ -106,7 +107,7 @@
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
-        mSubId = getArguments().getInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID,
+        mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID,
                 SubscriptionManager.INVALID_SUBSCRIPTION_ID);
 
         use(MobileDataPreferenceController.class).init(getFragmentManager(), mSubId);
diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
index b43cd3a..f397382 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
@@ -30,7 +30,6 @@
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telephony.CarrierConfigManager;
-import android.telephony.ServiceState;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
@@ -213,11 +212,6 @@
                 || (!esimIgnoredDevice && enabledEsimUiByDefault && inEsimSupportedCountries));
     }
 
-    public static PersistableBundle getCarrierConfigBySubId(int mSubId) {
-        //TODO(b/114749736): get carrier config from subId
-        return new PersistableBundle();
-    }
-
     /**
      * Set whether to enable data for {@code subId}, also whether to disable data for other
      * subscription
@@ -253,9 +247,17 @@
         }
         final TelephonyManager telephonyManager = TelephonyManager.from(context)
                 .createForSubscriptionId(subId);
+        final PersistableBundle carrierConfig = context.getSystemService(
+                CarrierConfigManager.class).getConfigForSubId(subId);
+
 
         if (telephonyManager.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
             return true;
+        } else if (carrierConfig != null
+                && !carrierConfig.getBoolean(
+                CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL)
+                && carrierConfig.getBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL)) {
+            return true;
         }
 
         if (isWorldMode(context, subId)) {
@@ -312,7 +314,10 @@
 
         if (telephonyManager.getPhoneType() == PhoneConstants.PHONE_TYPE_GSM) {
             return true;
-        } else if (carrierConfig.getBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL)) {
+        } else if (carrierConfig != null
+                && !carrierConfig.getBoolean(
+                CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL)
+                && carrierConfig.getBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL)) {
             return true;
         }
 
diff --git a/src/com/android/settings/network/telephony/MobileSettingsActivity.java b/src/com/android/settings/network/telephony/MobileSettingsActivity.java
index d712515..b2bceb9 100644
--- a/src/com/android/settings/network/telephony/MobileSettingsActivity.java
+++ b/src/com/android/settings/network/telephony/MobileSettingsActivity.java
@@ -17,10 +17,15 @@
 package com.android.settings.network.telephony;
 
 import android.app.ActionBar;
+import android.content.BroadcastReceiver;
+import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.os.Bundle;
+import android.provider.Settings;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
+import android.util.Log;
 import android.view.Menu;
 import android.view.View;
 
@@ -30,62 +35,61 @@
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
 
+import com.android.internal.telephony.TelephonyIntents;
 import com.android.internal.util.CollectionUtils;
 import com.android.settings.R;
 import com.android.settings.core.SettingsBaseActivity;
 
 import com.google.android.material.bottomnavigation.BottomNavigationView;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
+import java.util.Objects;
 
 public class MobileSettingsActivity extends SettingsBaseActivity {
 
+    private static final String TAG = "MobileSettingsActivity";
     @VisibleForTesting
     static final String MOBILE_SETTINGS_TAG = "mobile_settings:";
-    public static final String KEY_SUBSCRIPTION_ID = "key_subscription_id";
-    public static final String KEY_CUR_SUBSCRIPTION_ID = "key_cur_subscription_id";
+    @VisibleForTesting
+    static final int SUB_ID_NULL = Integer.MIN_VALUE;
 
-    private SubscriptionManager mSubscriptionManager;
     @VisibleForTesting
-    Integer mCurSubscriptionId;
+    SubscriptionManager mSubscriptionManager;
     @VisibleForTesting
-    List<SubscriptionInfo> mSubscriptionInfos;
+    int mCurSubscriptionId;
+    @VisibleForTesting
+    List<SubscriptionInfo> mSubscriptionInfos = new ArrayList<>();
+    private PhoneChangeReceiver mPhoneChangeReceiver;
 
     private final SubscriptionManager.OnSubscriptionsChangedListener
             mOnSubscriptionsChangeListener
             = new SubscriptionManager.OnSubscriptionsChangedListener() {
         @Override
         public void onSubscriptionsChanged() {
-            updateSubscriptions(null);
+            if (!Objects.equals(mSubscriptionInfos,
+                    mSubscriptionManager.getActiveSubscriptionInfoList())) {
+                updateSubscriptions(null);
+            }
         }
     };
 
     @Override
-    protected void onNewIntent(Intent intent) {
-        super.onNewIntent(intent);
-        //TODO(b/114749736): update fragment by new intent, or at least make sure this page shows
-        // current tab for sim card
-    }
-
-    @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-
-        //TODO(b/114749736): add phone change receiver here: ACTION_RADIO_TECHNOLOGY_CHANGED
-
         setContentView(R.layout.mobile_settings_container);
         setActionBar(findViewById(R.id.mobile_action_bar));
+        mPhoneChangeReceiver = new PhoneChangeReceiver();
         mSubscriptionManager = getSystemService(SubscriptionManager.class);
         mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList();
         mCurSubscriptionId = savedInstanceState != null
-                ? savedInstanceState.getInt(KEY_CUR_SUBSCRIPTION_ID)
-                : null;
-
-        mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
+                ? savedInstanceState.getInt(Settings.EXTRA_SUB_ID, SUB_ID_NULL)
+                : SUB_ID_NULL;
 
         final ActionBar actionBar = getActionBar();
         if (actionBar != null) {
-            // android.R.id.home will be triggered in onOptionsItemSelected()
             actionBar.setDisplayHomeAsUpEnabled(true);
         }
 
@@ -93,6 +97,22 @@
     }
 
     @Override
+    protected void onStart() {
+        super.onStart();
+        final IntentFilter intentFilter = new IntentFilter(
+                TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
+        registerReceiver(mPhoneChangeReceiver, intentFilter);
+        mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        unregisterReceiver(mPhoneChangeReceiver);
+        mSubscriptionManager.removeOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
+    }
+
+    @Override
     protected void onSaveInstanceState(@NonNull Bundle outState) {
         super.onSaveInstanceState(outState);
         saveInstanceState(outState);
@@ -100,24 +120,42 @@
 
     @VisibleForTesting
     void saveInstanceState(@NonNull Bundle outState) {
-        outState.putInt(KEY_CUR_SUBSCRIPTION_ID, mCurSubscriptionId);
+        outState.putInt(Settings.EXTRA_SUB_ID, mCurSubscriptionId);
     }
 
     @VisibleForTesting
     void updateSubscriptions(Bundle savedInstanceState) {
-        //TODO(b/114749736): Sort it by phoneId
         mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList();
-        final int subId = CollectionUtils.isEmpty(mSubscriptionInfos)
-                ? SubscriptionManager.INVALID_SUBSCRIPTION_ID
-                : mSubscriptionInfos.get(0).getSubscriptionId();
 
         updateBottomNavigationView();
 
         if (savedInstanceState == null) {
-            switchFragment(new MobileNetworkFragment(), subId);
+            switchFragment(new MobileNetworkFragment(), getSubscriptionId());
         }
     }
 
+    /**
+     * Get the current subId to display. First check whether intent has {@link
+     * Settings#EXTRA_SUB_ID}. If not, just display first one in list
+     * since it is already sorted by sim slot.
+     */
+    @VisibleForTesting
+    int getSubscriptionId() {
+        final Intent intent = getIntent();
+        if (intent != null) {
+            final int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL);
+            if (subId != SUB_ID_NULL && mSubscriptionManager.isActiveSubscriptionId(subId)) {
+                return subId;
+            }
+        }
+
+        if (CollectionUtils.isEmpty(mSubscriptionInfos)) {
+            return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+        }
+
+        return mSubscriptionInfos.get(0).getSubscriptionId();
+    }
+
     @VisibleForTesting
     void updateBottomNavigationView() {
         final BottomNavigationView navigation = findViewById(R.id.bottom_nav);
@@ -130,7 +168,8 @@
             for (int i = 0, size = mSubscriptionInfos.size(); i < size; i++) {
                 final SubscriptionInfo subscriptionInfo = mSubscriptionInfos.get(i);
                 menu.add(0, subscriptionInfo.getSubscriptionId(), i,
-                        subscriptionInfo.getDisplayName());
+                        subscriptionInfo.getDisplayName())
+                        .setIcon(R.drawable.ic_settings_sim);
             }
             navigation.setOnNavigationItemSelectedListener(item -> {
                 switchFragment(new MobileNetworkFragment(), item.getItemId());
@@ -141,30 +180,23 @@
 
     @VisibleForTesting
     void switchFragment(Fragment fragment, int subscriptionId) {
-        if (mCurSubscriptionId != null && subscriptionId == mCurSubscriptionId) {
+        switchFragment(fragment, subscriptionId, false /* forceUpdate */);
+    }
+
+    @VisibleForTesting
+    void switchFragment(Fragment fragment, int subscriptionId, boolean forceUpdate) {
+        if (mCurSubscriptionId != SUB_ID_NULL && subscriptionId == mCurSubscriptionId
+                && !forceUpdate) {
             return;
         }
         final FragmentManager fragmentManager = getSupportFragmentManager();
         final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
         final Bundle bundle = new Bundle();
-        bundle.putInt(KEY_SUBSCRIPTION_ID, subscriptionId);
+        bundle.putInt(Settings.EXTRA_SUB_ID, subscriptionId);
 
-        if (mCurSubscriptionId != null) {
-            final Fragment hideFragment = fragmentManager.findFragmentByTag(
-                    buildFragmentTag(mCurSubscriptionId));
-            if (hideFragment != null) {
-                fragmentTransaction.hide(hideFragment);
-            }
-        }
-
-        Fragment showFragment = fragmentManager.findFragmentByTag(buildFragmentTag(subscriptionId));
-        if (showFragment == null) {
-            fragment.setArguments(bundle);
-            fragmentTransaction.add(R.id.main_content, fragment, buildFragmentTag(subscriptionId));
-        } else {
-            showFragment.setArguments(bundle);
-            fragmentTransaction.show(showFragment);
-        }
+        fragment.setArguments(bundle);
+        fragmentTransaction.replace(R.id.main_content, fragment,
+                buildFragmentTag(subscriptionId));
         fragmentTransaction.commit();
         mCurSubscriptionId = subscriptionId;
     }
@@ -172,4 +204,16 @@
     private String buildFragmentTag(int subscriptionId) {
         return MOBILE_SETTINGS_TAG + subscriptionId;
     }
+
+    private class PhoneChangeReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            // When the radio changes (ex: CDMA->GSM), refresh the fragment.
+            // This is very rare to happen.
+            if (mCurSubscriptionId != SUB_ID_NULL) {
+                switchFragment(new MobileNetworkFragment(), mCurSubscriptionId,
+                        true /* forceUpdate */);
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
index 3e42c70..dbab674 100644
--- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java
+++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
@@ -23,6 +23,7 @@
 import android.os.Handler;
 import android.os.Message;
 import android.os.PersistableBundle;
+import android.provider.Settings;
 import android.telephony.AccessNetworkConstants;
 import android.telephony.CarrierConfigManager;
 import android.telephony.CellIdentity;
@@ -93,7 +94,7 @@
 
         mUseNewApi = getContext().getResources().getBoolean(
                 com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI);
-        mSubId = getArguments().getInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID);
+        mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID);
 
         mConnectedPreferenceCategory =
                 (PreferenceCategory) findPreference(PREF_KEY_CONNECTED_NETWORK_OPERATOR);
diff --git a/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java b/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
index 4119c64..5f259f8 100644
--- a/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
+++ b/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
@@ -23,6 +23,8 @@
 import androidx.preference.ListPreference;
 import androidx.preference.Preference;
 
+import com.android.internal.telephony.Phone;
+
 /**
  * Preference controller for "System Select"
  */
@@ -47,6 +49,12 @@
                 resetCdmaRoamingModeToDefault();
             }
         }
+        final int settingsNetworkMode = Settings.Global.getInt(
+                mContext.getContentResolver(),
+                Settings.Global.PREFERRED_NETWORK_MODE + mSubId,
+                Phone.PREFERRED_NT_MODE);
+        listPreference.setEnabled(
+                settingsNetworkMode != TelephonyManager.NETWORK_MODE_LTE_GSM_WCDMA);
     }
 
     @Override
diff --git a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
index 72f69cd..d5c704a 100644
--- a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
+++ b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.os.Bundle;
 import android.os.PersistableBundle;
+import android.provider.Settings;
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
@@ -96,7 +97,7 @@
                     == TelephonyManager.NETWORK_SELECTION_MODE_AUTO;
         } else {
             final Bundle bundle = new Bundle();
-            bundle.putInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID, mSubId);
+            bundle.putInt(Settings.EXTRA_SUB_ID, mSubId);
             new SubSettingLauncher(mContext)
                     .setDestination(NetworkSelectSettings.class.getName())
                     .setSourceMetricsCategory(MetricsProto.MetricsEvent.MOBILE_NETWORK_SELECT)
diff --git a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java
index 9ea977c..df5e151 100644
--- a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java
+++ b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.os.Bundle;
+import android.provider.Settings;
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
@@ -84,7 +85,7 @@
     public boolean handlePreferenceTreeClick(Preference preference) {
         if (TextUtils.equals(preference.getKey(), getPreferenceKey())) {
             final Bundle bundle = new Bundle();
-            bundle.putInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID, mSubId);
+            bundle.putInt(Settings.EXTRA_SUB_ID, mSubId);
             new SubSettingLauncher(mContext)
                     .setDestination(NetworkSelectSettings.class.getName())
                     .setSourceMetricsCategory(MetricsProto.MetricsEvent.MOBILE_NETWORK_SELECT)
diff --git a/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java
new file mode 100644
index 0000000..fe4fcc8
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2018 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.display;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+
+import com.android.settings.R;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+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.List;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class TopLevelDisplayPreferenceControllerTest {
+    @Mock
+    private Context mContext;
+    @Mock
+    private PackageManager mPackageManager;
+
+    private TopLevelDisplayPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        when(mContext.getPackageManager()).thenReturn(mPackageManager);
+        when(mContext.getString(R.string.config_wallpaper_picker_package))
+                .thenReturn("pkg");
+        when(mContext.getString(R.string.config_wallpaper_picker_class))
+                .thenReturn("cls");
+
+        mController = new TopLevelDisplayPreferenceController(mContext, "test_key");
+    }
+
+    @Test
+    public void getAvailability_alwaysAvailable() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getSummary_hasWallpaper_shouldReturnWallpaperSummary() {
+        final List<ResolveInfo> resolveInfos = new ArrayList<>();
+        resolveInfos.add(mock(ResolveInfo.class));
+        when(mPackageManager.queryIntentActivities(any(Intent.class), anyInt()))
+                .thenReturn(resolveInfos);
+
+        assertThat(mController.getSummary())
+                .isEqualTo(mContext.getText(R.string.display_dashboard_summary));
+    }
+
+    @Test
+    public void getSummary_hasWallpaper_shouldReturnNoWallpaperSummary() {
+        final List<ResolveInfo> resolveInfos = new ArrayList<>();
+        when(mPackageManager.queryIntentActivities(any(Intent.class), anyInt()))
+                .thenReturn(resolveInfos);
+
+        assertThat(mController.getSummary())
+                .isEqualTo(mContext.getText(R.string.display_dashboard_nowallpaper_summary));
+    }
+
+}
diff --git a/tests/robotests/src/com/android/settings/display/WallpaperPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/WallpaperPreferenceControllerTest.java
index 8a24241..b4305b6 100644
--- a/tests/robotests/src/com/android/settings/display/WallpaperPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/WallpaperPreferenceControllerTest.java
@@ -45,6 +45,7 @@
 
     private static final String WALLPAPER_PACKAGE = "TestPkg";
     private static final String WALLPAPER_CLASS = "TestCls";
+    private static final String TEST_KEY = "test_key";
 
     @Mock
     private Context mContext;
@@ -54,7 +55,7 @@
     private WallpaperPreferenceController mController;
 
     @Before
-    public void setUp() throws PackageManager.NameNotFoundException {
+    public void setUp() {
         MockitoAnnotations.initMocks(this);
         when(mContext.getString(R.string.config_wallpaper_picker_package))
                 .thenReturn(WALLPAPER_PACKAGE);
@@ -62,11 +63,11 @@
                 .thenReturn(WALLPAPER_CLASS);
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
 
-        mController = new WallpaperPreferenceController(mContext);
+        mController = new WallpaperPreferenceController(mContext, TEST_KEY);
     }
 
     @Test
-    public void isAvailable_wallpaerPickerEnabled_shouldReturnTrue() {
+    public void isAvailable_wallpaperPickerEnabled_shouldReturnTrue() {
         final List<ResolveInfo> resolveInfos = new ArrayList<>();
         resolveInfos.add(mock(ResolveInfo.class));
         when(mPackageManager.queryIntentActivities(any(Intent.class), anyInt()))
@@ -76,7 +77,7 @@
     }
 
     @Test
-    public void isAvailable_wallpaerPickerDisbled_shouldReturnFalseAndNoCrash() {
+    public void isAvailable_wallpaperPickerDisabled_shouldReturnFalse() {
         when(mPackageManager.queryIntentActivities(any(Intent.class), anyInt())).thenReturn(null);
 
         assertThat(mController.isAvailable()).isFalse();
@@ -86,6 +87,5 @@
                 .thenReturn(resolveInfos);
 
         assertThat(mController.isAvailable()).isFalse();
-        // should not crash
     }
 }
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
index 6aeb5c0..e98e36f 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
@@ -22,8 +22,6 @@
 import android.net.Uri;
 
 import com.android.settings.homepage.contextualcards.deviceinfo.BatterySlice;
-import com.android.settings.homepage.contextualcards.deviceinfo.DataUsageSlice;
-import com.android.settings.homepage.contextualcards.deviceinfo.DeviceInfoSlice;
 import com.android.settings.slices.SettingsSliceProvider;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
@@ -54,18 +52,9 @@
     }
 
     @Test
-    public void createStaticCards_shouldReturnFourCards() {
-        final List<ContextualCard> defaultData = mContextualCardLoader.createStaticCards();
-
-        assertThat(defaultData).hasSize(3);
-    }
-
-    @Test
     public void createStaticCards_shouldContainCorrectCards() {
-        final Uri dataUsage = DataUsageSlice.DATA_USAGE_CARD_URI;
-        final Uri deviceInfo = DeviceInfoSlice.DEVICE_INFO_CARD_URI;
         final Uri batteryInfo = BatterySlice.BATTERY_CARD_URI;
-        final List<Uri> expectedUris = Arrays.asList(dataUsage, deviceInfo, batteryInfo);
+        final List<Uri> expectedUris = Arrays.asList(batteryInfo);
 
         final List<Uri> actualCardUris = mContextualCardLoader.createStaticCards().stream().map(
                 ContextualCard::getSliceUri).collect(Collectors.toList());
@@ -90,7 +79,8 @@
         final String sliceUri = "contet://com.android.settings.slices/action/flashlight";
 
         assertThat(
-                mContextualCardLoader.isCardEligibleToDisplay(getContextualCard(sliceUri))).isFalse();
+                mContextualCardLoader.isCardEligibleToDisplay(
+                        getContextualCard(sliceUri))).isFalse();
     }
 
     @Test
@@ -98,7 +88,8 @@
         final String sliceUri = "content://com.android.settings.test.slices/action/flashlight";
 
         assertThat(
-                mContextualCardLoader.isCardEligibleToDisplay(getContextualCard(sliceUri))).isFalse();
+                mContextualCardLoader.isCardEligibleToDisplay(
+                        getContextualCard(sliceUri))).isFalse();
     }
 
     private ContextualCard getContextualCard(String sliceUri) {
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java
index 2c42379..1932ab9 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java
@@ -20,7 +20,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.ContentResolver;
-import android.content.Context;
 import android.net.Uri;
 import android.os.Bundle;
 
@@ -38,15 +37,13 @@
 @RunWith(SettingsRobolectricTestRunner.class)
 public class SettingsContextualCardProviderTest {
 
-    private Context mContext;
     private ContentResolver mResolver;
     private Uri mUri;
     private SettingsContextualCardProvider mProvider;
 
     @Before
     public void setUp() {
-        mContext = RuntimeEnvironment.application;
-        mResolver = mContext.getContentResolver();
+        mResolver = RuntimeEnvironment.application.getContentResolver();
         mUri = new Uri.Builder()
                 .scheme(ContentResolver.SCHEME_CONTENT)
                 .authority(SettingsContextualCardProvider.CARD_AUTHORITY)
diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
index c03fb71..676c9f4 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
@@ -21,18 +21,20 @@
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.nullable;
-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.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;
@@ -75,27 +77,35 @@
     private ComponentName mComponentName;
     @Mock
     private ResolveInfo mResolveInfo;
+    @Mock
+    private CarrierConfigManager mCarrierConfigManager;
 
     private Context mContext;
+    private PersistableBundle mCarrierConfig;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
         mContext = spy(RuntimeEnvironment.application);
-        doReturn(mSubscriptionManager).when(mContext).getSystemService(SubscriptionManager.class);
-        doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
-        doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID_1);
-        doReturn(mTelephonyManager2).when(mTelephonyManager).createForSubscriptionId(SUB_ID_2);
-        doReturn(mPackageManager).when(mContext).getPackageManager();
-        doReturn(mComponentName).when(mPhoneAccountHandle).getComponentName();
-        doReturn(PACKAGE_NAME).when(mComponentName).getPackageName();
+        when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+        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(mPhoneAccountHandle.getComponentName()).thenReturn(mComponentName);
+        when(mComponentName.getPackageName()).thenReturn(PACKAGE_NAME);
+        when(mContext.getSystemService(CarrierConfigManager.class)).thenReturn(
+                mCarrierConfigManager);
 
-        doReturn(SUB_ID_1).when(mSubscriptionInfo1).getSubscriptionId();
-        doReturn(SUB_ID_2).when(mSubscriptionInfo2).getSubscriptionId();
+        mCarrierConfig = new PersistableBundle();
+        when(mCarrierConfigManager.getConfigForSubId(SUB_ID_1)).thenReturn(mCarrierConfig);
 
-        doReturn(Arrays.asList(mSubscriptionInfo1, mSubscriptionInfo2)).when(
-                mSubscriptionManager).getActiveSubscriptionInfoList();
+        when(mSubscriptionInfo1.getSubscriptionId()).thenReturn(SUB_ID_1);
+        when(mSubscriptionInfo2.getSubscriptionId()).thenReturn(SUB_ID_2);
+
+        when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
+                Arrays.asList(mSubscriptionInfo1, mSubscriptionInfo2));
     }
 
     @Test
@@ -129,8 +139,8 @@
 
     @Test
     public void buildConfigureIntent_noActivityHandleIntent_returnNull() {
-        doReturn(new ArrayList<ResolveInfo>()).when(mPackageManager).queryIntentActivities(
-                nullable(Intent.class), anyInt());
+        when(mPackageManager.queryIntentActivities(nullable(Intent.class), anyInt()))
+                .thenReturn(new ArrayList<>());
 
         assertThat(MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext,
                 mPhoneAccountHandle)).isNull();
@@ -138,8 +148,8 @@
 
     @Test
     public void buildConfigureIntent_hasActivityHandleIntent_returnIntent() {
-        doReturn(Arrays.asList(mResolveInfo)).when(mPackageManager).queryIntentActivities(
-                nullable(Intent.class), anyInt());
+        when(mPackageManager.queryIntentActivities(nullable(Intent.class), anyInt()))
+                .thenReturn(Arrays.asList(mResolveInfo));
 
         assertThat(MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext,
                 mPhoneAccountHandle)).isNotNull();
@@ -147,19 +157,29 @@
 
     @Test
     public void isCdmaOptions_phoneTypeCdma_returnTrue() {
-        doReturn(PhoneConstants.PHONE_TYPE_CDMA).when(mTelephonyManager).getPhoneType();
+        when(mTelephonyManager.getPhoneType()).thenReturn(PhoneConstants.PHONE_TYPE_CDMA);
 
         assertThat(MobileNetworkUtils.isCdmaOptions(mContext, SUB_ID_1)).isTrue();
     }
 
     @Test
     public void isCdmaOptions_worldModeWithGsmWcdma_returnTrue() {
-        doReturn(PhoneConstants.PHONE_TYPE_GSM).when(mTelephonyManager).getPhoneType();
-        doReturn("true").when(mContext).getString(R.string.config_world_mode);
+        when(mTelephonyManager.getPhoneType()).thenReturn(PhoneConstants.PHONE_TYPE_GSM);
+        when(mContext.getString(R.string.config_world_mode)).thenReturn("true");
         Settings.Global.putInt(mContext.getContentResolver(),
                 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + SUB_ID_1,
                 TelephonyManager.NETWORK_MODE_LTE_GSM_WCDMA);
 
         assertThat(MobileNetworkUtils.isCdmaOptions(mContext, SUB_ID_1)).isTrue();
     }
+
+    @Test
+    public void isCdmaOptions_carrierWorldModeWithoutHideCarrier_returnTrue() {
+        when(mTelephonyManager.getPhoneType()).thenReturn(PhoneConstants.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();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileSettingsActivityTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileSettingsActivityTest.java
index c5ca427..ea184fd 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/MobileSettingsActivityTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/MobileSettingsActivityTest.java
@@ -23,9 +23,12 @@
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.Intent;
 import android.os.Bundle;
+import android.provider.Settings;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.view.Menu;
@@ -69,6 +72,8 @@
     @Mock
     private SubscriptionInfo mSubscriptionInfo;
     @Mock
+    private SubscriptionInfo mSubscriptionInfo2;
+    @Mock
     private FragmentManager mFragmentManager;
     @Mock
     private FragmentTransaction mFragmentTransaction;
@@ -85,6 +90,9 @@
         mShowFragment = new Fragment();
         mHideFragment = new Fragment();
         mMobileSettingsActivity.mSubscriptionInfos = mSubscriptionInfos;
+        mMobileSettingsActivity.mSubscriptionManager = mSubscriptionManager;
+        when(mSubscriptionInfo.getSubscriptionId()).thenReturn(PREV_SUB_ID);
+        when(mSubscriptionInfo2.getSubscriptionId()).thenReturn(CURRENT_SUB_ID);
 
         doReturn(mSubscriptionManager).when(mMobileSettingsActivity).getSystemService(
                 SubscriptionManager.class);
@@ -121,23 +129,32 @@
     }
 
     @Test
-    public void switchFragment_hidePreviousFragment() {
+    public void switchFragment_newFragment_replaceIt() {
         mMobileSettingsActivity.mCurSubscriptionId = PREV_SUB_ID;
 
         mMobileSettingsActivity.switchFragment(mShowFragment, CURRENT_SUB_ID);
 
-        verify(mFragmentTransaction).hide(mHideFragment);
+        verify(mFragmentTransaction).replace(R.id.main_content, mShowFragment,
+                MOBILE_SETTINGS_TAG + CURRENT_SUB_ID);
     }
 
     @Test
-    public void switchFragment_fragmentExist_showItWithArguments() {
-        mMobileSettingsActivity.mCurSubscriptionId = PREV_SUB_ID;
+    public void getSubscriptionId_hasIntent_getIdFromIntent() {
+        final Intent intent = new Intent();
+        intent.putExtra(Settings.EXTRA_SUB_ID, CURRENT_SUB_ID);
+        doReturn(intent).when(mMobileSettingsActivity).getIntent();
+        doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(CURRENT_SUB_ID);
 
-        mMobileSettingsActivity.switchFragment(mShowFragment, CURRENT_SUB_ID);
+        assertThat(mMobileSettingsActivity.getSubscriptionId()).isEqualTo(CURRENT_SUB_ID);
+    }
 
-        assertThat(mShowFragment.getArguments().getInt(
-                MobileSettingsActivity.KEY_SUBSCRIPTION_ID)).isEqualTo(CURRENT_SUB_ID);
-        verify(mFragmentTransaction).show(mShowFragment);
+    @Test
+    public void getSubscriptionId_noIntent_firstIdInList() {
+        doReturn(null).when(mMobileSettingsActivity).getIntent();
+        mSubscriptionInfos.add(mSubscriptionInfo);
+        mSubscriptionInfos.add(mSubscriptionInfo2);
+
+        assertThat(mMobileSettingsActivity.getSubscriptionId()).isEqualTo(PREV_SUB_ID);
     }
 
     @Test
@@ -149,7 +166,7 @@
 
         mMobileSettingsActivity.saveInstanceState(bundle);
 
-        assertThat(bundle.getInt(MobileSettingsActivity.KEY_CUR_SUBSCRIPTION_ID)).isEqualTo(
+        assertThat(bundle.getInt(Settings.EXTRA_SUB_ID)).isEqualTo(
                 PREV_SUB_ID);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaSubscriptionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaSubscriptionPreferenceControllerTest.java
index c938948..4044b6c 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaSubscriptionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaSubscriptionPreferenceControllerTest.java
@@ -21,10 +21,13 @@
 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.PersistableBundle;
 import android.os.SystemProperties;
 import android.provider.Settings;
+import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 
@@ -53,9 +56,12 @@
     private TelephonyManager mInvalidTelephonyManager;
     @Mock
     private SubscriptionManager mSubscriptionManager;
+    @Mock
+    private CarrierConfigManager mCarrierConfigManager;
 
     private CdmaSubscriptionPreferenceController mController;
     private ListPreference mPreference;
+    private PersistableBundle mCarrierConfig;
     private Context mContext;
 
     @Before
@@ -68,6 +74,10 @@
         doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
         doReturn(mInvalidTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
                 SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        doReturn(mCarrierConfigManager).when(mContext).getSystemService(CarrierConfigManager.class);
+
+        mCarrierConfig = new PersistableBundle();
+        when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(mCarrierConfig);
 
         mPreference = new ListPreference(mContext);
         mController = new CdmaSubscriptionPreferenceController(mContext, "mobile_data");
diff --git a/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceControllerTest.java
index 2046237..f00afc9 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceControllerTest.java
@@ -21,9 +21,12 @@
 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.PersistableBundle;
 import android.provider.Settings;
+import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 
@@ -51,9 +54,12 @@
     private TelephonyManager mInvalidTelephonyManager;
     @Mock
     private SubscriptionManager mSubscriptionManager;
+    @Mock
+    private CarrierConfigManager mCarrierConfigManager;
 
     private CdmaSystemSelectPreferenceController mController;
     private ListPreference mPreference;
+    private PersistableBundle mCarrierConfig;
     private Context mContext;
 
     @Before
@@ -67,6 +73,12 @@
         doReturn(mInvalidTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
                 SubscriptionManager.INVALID_SUBSCRIPTION_ID);
 
+        doReturn(mCarrierConfigManager).when(mContext).getSystemService(CarrierConfigManager.class);
+
+        mCarrierConfig = new PersistableBundle();
+        when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(mCarrierConfig);
+
+
         mPreference = new ListPreference(mContext);
         mController = new CdmaSystemSelectPreferenceController(mContext, "mobile_data");
         mController.init(mPreferenceManager, SUB_ID);
@@ -102,6 +114,20 @@
     }
 
     @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,
+                TelephonyManager.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,