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,
