diff --git a/res/values/config.xml b/res/values/config.xml
index 746d3e7..fa4bc93 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -457,9 +457,6 @@
     <!-- Whether nfc detection point preview image is available or not. -->
     <bool name="config_nfc_detection_point">false</bool>
 
-    <!-- Whether to show Enhanced Connectivity switch in Developer Options -->
-    <bool name="config_show_enhanced_connectivity">false</bool>
-
     <!-- Whether to show Smooth Display feature in Settings Options -->
     <bool name="config_show_smooth_display">false</bool>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index dc23c3d..28ab8f8 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -348,6 +348,7 @@
     <dimen name="contextual_half_card_padding_top">12dp</dimen>
     <dimen name="contextual_half_card_padding_bottom">16dp</dimen>
     <dimen name="contextual_half_card_title_margin_top">12dp</dimen>
+    <dimen name="contextual_card_preallocated_height">0dp</dimen>
 
     <!-- Homepage dismissal cards size and padding -->
     <dimen name="contextual_card_dismissal_margin_top">12dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d2cd21c..8c6f9ba 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2753,7 +2753,7 @@
     <!-- Display settings screen, peak refresh rate settings summary [CHAR LIMIT=NONE] -->
     <string name="peak_refresh_rate_summary">Automatically raises the refresh rate from 60 to 90 Hz for some content. Increases battery usage.</string>
     <!-- Display developer settings: Force to the highest refresh rate [CHAR LIMIT=NONE] -->
-    <string name="force_high_refresh_rate_toggle">Smooth Display</string>
+    <string name="force_high_refresh_rate_toggle">Force 90 Hz refresh rate</string>
     <!-- Display developer settings: Force to the highest refresh rate description [CHAR LIMIT=NONE]-->
     <string name="force_high_refresh_rate_desc">Highest refresh rate for improved touch responsiveness &amp; animation quality. Increases battery usage.</string>
     <!-- Display settings screen, setting option name to enable adaptive sleep [CHAR LIMIT=30] -->
@@ -3054,8 +3054,6 @@
     <string name="security_patch">Android security update</string>
     <!-- About phone screen, status item label  [CHAR LIMIT=40] -->
     <string name="model_info">Model</string>
-    <!-- About phone screen, status item summary  [CHAR LIMIT=40] -->
-    <string name="model_summary">Model&#58; %1$s</string>
     <!-- About phone screen, dialog title for showing hardware information such as model, serial number, etc.[CHAR LIMIT=60] -->
     <string name="hardware_info">Model &amp; hardware</string>
     <!-- Label for device's hardware revision value [CHAR LIMIT=40] -->
@@ -4321,6 +4319,20 @@
         result from their use.
     </string>
 
+    <!-- eSIM erase warning dialog. -->
+    <!-- Factory data reset erase eSIM failure title [CHAR LIMIT=50] -->
+    <string name="fdr_esim_failure_title" >There is an issue erasing the downloaded SIMs</string>
+    <!-- Factory data reset erase eSIM failure text [CHAR LIMIT=none] -->
+    <string name="fdr_esim_failure_text">Please reboot the device and try again. If you continue factory reset, the downloaded SIMs may remain on the device.</string>
+    <!-- Factory data reset erase eSIM failure reboot button text [CHAR LIMIT=none] -->
+    <string name="fdr_esim_failure_reboot_btn">Reboot</string>
+    <!-- Factory data reset continue factory data reset title [CHAR LIMIT=35] -->
+    <string name="fdr_continue_title" >Continue factory reset?</string>
+    <!-- Factory data reset continue factory data reset text [CHAR LIMIT=none] -->
+    <string name="fdr_continue_text">Downloaded SIMs will remain on device.</string>
+    <!-- Factory data reset continue factory data reset button text [CHAR LIMIT=none] -->
+    <string name="fdr_continue_btn">Factory reset</string>
+
     <!-- Warning that appears below the unknown sources switch in settings -->
     <string name="install_all_warning" product="device">
         Your device and personal data are more vulnerable
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index 746a51c..6f9405e 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -298,11 +298,6 @@
             android:summary="@string/mobile_data_always_on_summary" />
 
         <SwitchPreference
-            android:key="enhanced_connectivity"
-            android:title="@string/enhanced_connectivity"
-            android:summary="@string/enhanced_connectivity_summary" />
-
-        <SwitchPreference
             android:key="tethering_hardware_offload"
             android:title="@string/tethering_hardware_offload"
             android:summary="@string/tethering_hardware_offload_summary" />
diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml
index 5e5fab3..5db2123 100644
--- a/res/xml/my_device_info.xml
+++ b/res/xml/my_device_info.xml
@@ -100,7 +100,7 @@
     <Preference
         android:key="device_model"
         android:order="31"
-        android:title="@string/hardware_info"
+        android:title="@string/model_info"
         android:summary="@string/summary_placeholder"
         android:fragment="com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFragment"
         settings:enableCopying="true"
diff --git a/src/com/android/settings/MasterClearConfirm.java b/src/com/android/settings/MasterClearConfirm.java
index 3ace436..676789e 100644
--- a/src/com/android/settings/MasterClearConfirm.java
+++ b/src/com/android/settings/MasterClearConfirm.java
@@ -21,20 +21,26 @@
 
 import android.app.ActionBar;
 import android.app.Activity;
+import android.app.AlertDialog;
 import android.app.ProgressDialog;
 import android.app.admin.DevicePolicyManager;
 import android.app.admin.FactoryResetProtectionPolicy;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.graphics.Color;
 import android.os.AsyncTask;
 import android.os.Bundle;
+import android.os.PowerManager;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.service.oemlock.OemLockManager;
 import android.service.persistentdata.PersistentDataBlockManager;
+import android.telephony.TelephonyManager;
+import android.telephony.UiccSlotInfo;
+import android.telephony.euicc.EuiccManager;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -54,6 +60,8 @@
 import com.google.android.setupcompat.util.WizardManagerHelper;
 import com.google.android.setupdesign.GlifLayout;
 
+import java.util.Arrays;
+
 /**
  * Confirm and execute a reset of the device to a clean "just out of the box"
  * state.  Multiple confirmations are required: first, a general "are you sure
@@ -83,6 +91,89 @@
                 return;
             }
 
+            // If the eSIM slot is in an error state, display a dialog to warn users that their eSIM
+            // profiles may not be fully deleted during FDR.
+            if (shouldShowEsimEraseFailureDialog()) {
+                Log.e(TAG, "eUICC card is in an error state. Display a dialog to warn the user.");
+                showEsimErrorDialog();
+                return;
+            }
+
+            performFactoryReset();
+        }
+
+        /**
+         * Returns true if the user choose to erase eSIM profile but the eUICC card is in an error
+         * state.
+         */
+        private boolean shouldShowEsimEraseFailureDialog() {
+            EuiccManager euiccManager = getActivity().getSystemService(EuiccManager.class);
+            TelephonyManager telephonyManager =
+                    getActivity().getSystemService(TelephonyManager.class);
+
+            if (euiccManager == null || !euiccManager.isEnabled()) {
+                Log.i(
+                        TAG,
+                        "eSIM manager is disabled. No need to check eSIM slot before FDR.");
+                return false;
+            }
+            if (!mEraseEsims) {
+                Log.i(
+                        TAG,
+                        "eSIM does not need to be reset. No need to check eSIM slot before FDR.");
+                return false;
+            }
+            UiccSlotInfo[] slotInfos = telephonyManager.getUiccSlotsInfo();
+            if (slotInfos == null) {
+                Log.i(TAG, "Unable to get UICC slots.");
+                return false;
+            }
+            // If getIsEuicc() returns false for an eSIM slot, it means the eSIM is in the error
+            // state.
+            return Arrays.stream(slotInfos).anyMatch(
+                    slot -> slot != null && !slot.isRemovable() && !slot.getIsEuicc());
+        }
+
+        private void showEsimErrorDialog() {
+            new AlertDialog.Builder(getActivity())
+                    .setTitle(R.string.fdr_esim_failure_title)
+                    .setMessage(R.string.fdr_esim_failure_text)
+                    .setNeutralButton(R.string.dlg_cancel,
+                            (DialogInterface.OnClickListener) (dialog, which) -> {
+                                dialog.dismiss();
+                            })
+                    .setNegativeButton(R.string.fdr_esim_failure_reboot_btn,
+                            (DialogInterface.OnClickListener) (dialog, which) -> {
+                                dialog.dismiss();
+                                PowerManager pm = (PowerManager) getActivity()
+                                        .getSystemService(Context.POWER_SERVICE);
+                                pm.reboot(null);
+                            })
+                    .setPositiveButton(R.string.lockpassword_continue_label,
+                            (DialogInterface.OnClickListener) (dialog, which) -> {
+                                dialog.dismiss();
+                                showContinueFdrDialog();
+                            })
+                    .show();
+        }
+
+        private void showContinueFdrDialog() {
+            new AlertDialog.Builder(getActivity())
+                    .setTitle(R.string.fdr_continue_title)
+                    .setMessage(R.string.fdr_continue_text)
+                    .setNegativeButton(R.string.dlg_cancel,
+                            (DialogInterface.OnClickListener) (dialog, which) -> {
+                                dialog.dismiss();
+                            })
+                    .setPositiveButton(R.string.fdr_continue_btn,
+                            (DialogInterface.OnClickListener) (dialog, which) -> {
+                                dialog.dismiss();
+                                performFactoryReset();
+                            })
+                    .show();
+        }
+
+        private void performFactoryReset() {
             final PersistentDataBlockManager pdbManager = (PersistentDataBlockManager)
                     getActivity().getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
 
diff --git a/src/com/android/settings/development/BluetoothAvrcpVersionPreferenceController.java b/src/com/android/settings/development/BluetoothAvrcpVersionPreferenceController.java
index 136ddad..8c307a6 100644
--- a/src/com/android/settings/development/BluetoothAvrcpVersionPreferenceController.java
+++ b/src/com/android/settings/development/BluetoothAvrcpVersionPreferenceController.java
@@ -63,7 +63,7 @@
     public void updateState(Preference preference) {
         final ListPreference listPreference = (ListPreference) preference;
         final String currentValue = SystemProperties.get(BLUETOOTH_AVRCP_VERSION_PROPERTY);
-        int index = 0; // Defaults to AVRCP 1.4
+        int index = 0; // Defaults to AVRCP 1.5
         for (int i = 0; i < mListValues.length; i++) {
             if (TextUtils.equals(currentValue, mListValues[i])) {
                 index = i;
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 945970e..f2d60f1 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -479,7 +479,6 @@
         controllers.add(new BluetoothMapVersionPreferenceController(context));
         controllers.add(new BluetoothA2dpHwOffloadPreferenceController(context, fragment));
         controllers.add(new BluetoothMaxConnectedAudioDevicesPreferenceController(context));
-        controllers.add(new EnhancedConnectivityPreferenceController(context));
         controllers.add(new ShowTapsPreferenceController(context));
         controllers.add(new PointerLocationPreferenceController(context));
         controllers.add(new ShowSurfaceUpdatesPreferenceController(context));
diff --git a/src/com/android/settings/development/EnhancedConnectivityPreferenceController.java b/src/com/android/settings/development/EnhancedConnectivityPreferenceController.java
deleted file mode 100644
index 54cfdc6..0000000
--- a/src/com/android/settings/development/EnhancedConnectivityPreferenceController.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development;
-
-import android.content.Context;
-import android.provider.Settings;
-
-import androidx.preference.Preference;
-import androidx.preference.SwitchPreference;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.settings.R;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.development.DeveloperOptionsPreferenceController;
-
-/**
- * Preference controller for Enhanced Connectivity feature
- */
-public class EnhancedConnectivityPreferenceController extends
-        DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener,
-        PreferenceControllerMixin {
-
-    private static final String ENHANCED_CONNECTIVITY_KEY = "enhanced_connectivity";
-
-    @VisibleForTesting
-    static final int ENHANCED_CONNECTIVITY_ON = 1;
-    // default is enhanced connectivity enabled.
-    @VisibleForTesting
-    static final int ENHANCED_CONNECTIVITY_OFF = 0;
-
-    public EnhancedConnectivityPreferenceController(Context context) {
-        super(context);
-    }
-
-    @Override
-    public boolean onPreferenceChange(Preference preference, Object o) {
-        final boolean isEnabled = (Boolean) o;
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.ENHANCED_CONNECTIVITY_ENABLED,
-                isEnabled
-                        ? ENHANCED_CONNECTIVITY_ON
-                        : ENHANCED_CONNECTIVITY_OFF);
-        return true;
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return ENHANCED_CONNECTIVITY_KEY;
-    }
-
-    @Override
-    public void updateState(Preference preference) {
-        final int enhancedConnectivityEnabled = Settings.Global.getInt(
-                mContext.getContentResolver(), Settings.Global.ENHANCED_CONNECTIVITY_ENABLED,
-                ENHANCED_CONNECTIVITY_ON);
-        ((SwitchPreference) mPreference).setChecked(
-                enhancedConnectivityEnabled == ENHANCED_CONNECTIVITY_ON);
-    }
-
-    @Override
-    public boolean isAvailable() {
-        return mContext.getResources().getBoolean(R.bool.config_show_enhanced_connectivity);
-    }
-
-    @Override
-    protected void onDeveloperOptionsSwitchDisabled() {
-        super.onDeveloperOptionsSwitchDisabled();
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.ENHANCED_CONNECTIVITY_ENABLED,
-                ENHANCED_CONNECTIVITY_ON);
-        ((SwitchPreference) mPreference).setChecked(true);
-    }
-}
diff --git a/src/com/android/settings/deviceinfo/HardwareInfoPreferenceController.java b/src/com/android/settings/deviceinfo/HardwareInfoPreferenceController.java
index 7ee6f89..5f760bf 100644
--- a/src/com/android/settings/deviceinfo/HardwareInfoPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/HardwareInfoPreferenceController.java
@@ -49,7 +49,7 @@
 
     @Override
     public CharSequence getSummary() {
-        return mContext.getResources().getString(R.string.model_summary, getDeviceModel());
+        return getDeviceModel();
     }
 
     public static String getDeviceModel() {
diff --git a/src/com/android/settings/display/WallpaperPreferenceController.java b/src/com/android/settings/display/WallpaperPreferenceController.java
index b6af9bc..b134ee4 100644
--- a/src/com/android/settings/display/WallpaperPreferenceController.java
+++ b/src/com/android/settings/display/WallpaperPreferenceController.java
@@ -92,7 +92,11 @@
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
         if (getPreferenceKey().equals(preference.getKey())) {
-            preference.getContext().startActivity(new Intent().setComponent(getComponentName()));
+            final Intent intent = new Intent().setComponent(getComponentName());
+            if (areStylesAvailable()) {
+                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            }
+            preference.getContext().startActivity(intent);
             return true;
         }
         return super.handlePreferenceTreeClick(preference);
diff --git a/src/com/android/settings/display/darkmode/TimeFormatter.java b/src/com/android/settings/display/darkmode/TimeFormatter.java
index 1032fe1..32ff026 100644
--- a/src/com/android/settings/display/darkmode/TimeFormatter.java
+++ b/src/com/android/settings/display/darkmode/TimeFormatter.java
@@ -18,26 +18,29 @@
 import android.content.Context;
 
 import java.time.LocalTime;
-import java.time.format.DateTimeFormatter;
-import java.util.Locale;
+import java.util.Calendar;
+import java.util.TimeZone;
 
 /**
  * Formats LocalTime to the locale time string format
 */
 public class TimeFormatter {
     private final Context mContext;
-    private final DateTimeFormatter mFormatter;
+    private final java.text.DateFormat mFormatter;
     public TimeFormatter(Context context) {
         mContext = context;
-        Locale locale = mContext.getResources().getConfiguration().locale;
-        if (locale == null) {
-            locale = Locale.getDefault();
-        }
-        mFormatter = DateTimeFormatter.ofPattern("hh:mm a", locale);
+        mFormatter = android.text.format.DateFormat.getTimeFormat(context);
+        mFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
     }
 
     public String of(LocalTime time) {
-        return mFormatter.format(time);
+        final Calendar c = Calendar.getInstance();
+        c.setTimeZone(mFormatter.getTimeZone());
+        c.set(Calendar.HOUR_OF_DAY, time.getHour());
+        c.set(Calendar.MINUTE, time.getMinute());
+        c.set(Calendar.SECOND, 0);
+        c.set(Calendar.MILLISECOND, 0);
+        return mFormatter.format(c.getTime());
     }
 
     public boolean is24HourFormat() {
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java
index 7f29ecb..684e658 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java
@@ -24,6 +24,9 @@
     /** Get contextual cards from the card provider */
     Cursor getContextualCards();
 
+    /** Get the default contextual card to display */
+    ContextualCard getDefaultContextualCard();
+
     /**
      * Mark a specific {@link ContextualCard} as dismissed with dismissal signal in the database
      * to indicate that the card has been dismissed.
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java
index 5059d90..643625b 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java
@@ -55,6 +55,11 @@
     }
 
     @Override
+    public ContextualCard getDefaultContextualCard() {
+        return null;
+    }
+
+    @Override
     public int markCardAsDismissed(Context context, String cardName) {
         final SQLiteDatabase db = CardDatabaseHelper.getInstance(mContext).getWritableDatabase();
         final ContentValues values = new ContentValues();
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
index e4a644c..81ea45a 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
@@ -50,7 +50,7 @@
 public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard>> {
 
     @VisibleForTesting
-    static final int DEFAULT_CARD_COUNT = 3;
+    static final int DEFAULT_CARD_COUNT = 1;
     @VisibleForTesting
     static final String CONTEXTUAL_CARD_COUNT = "contextual_card_count";
     static final int CARD_CONTENT_LOADER_ID = 1;
@@ -131,7 +131,7 @@
         final List<ContextualCard> visibleCards = new ArrayList<>();
         final List<ContextualCard> hiddenCards = new ArrayList<>();
 
-        final int maxCardCount = getCardCount();
+        final int maxCardCount = getCardCount(mContext);
         eligibleCards.forEach(card -> {
             if (card.getCategory() != STICKY_VALUE) {
                 return;
@@ -164,14 +164,23 @@
                     SettingsEnums.ACTION_CONTEXTUAL_CARD_NOT_SHOW,
                     ContextualCardLogUtils.buildCardListLog(hiddenCards));
         }
+
+        // Add a default card if no other visible cards
+        if (visibleCards.isEmpty() && maxCardCount == 1) {
+            final ContextualCard defaultCard = FeatureFactory.getFactory(mContext)
+                    .getContextualCardFeatureProvider(mContext).getDefaultContextualCard();
+            if (defaultCard != null) {
+                Log.i(TAG, "Default card: " + defaultCard.getSliceUri());
+                visibleCards.add(defaultCard);
+            }
+        }
         return visibleCards;
     }
 
-    @VisibleForTesting
-    int getCardCount() {
+    static int getCardCount(Context context) {
         // Return the card count if Settings.Global has KEY_CONTEXTUAL_CARD_COUNT key,
         // otherwise return the default one.
-        return Settings.Global.getInt(mContext.getContentResolver(),
+        return Settings.Global.getInt(context.getContentResolver(),
                 CONTEXTUAL_CARD_COUNT, DEFAULT_CARD_COUNT);
     }
 
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
index ac35017..0075529 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
@@ -122,6 +122,10 @@
             Log.w(TAG, "Legacy suggestion contextual card enabled, skipping contextual cards.");
             return;
         }
+        if (ContextualCardLoader.getCardCount(mContext) <= 0) {
+            Log.w(TAG, "Card count is zero, skipping contextual cards.");
+            return;
+        }
         mStartTime = System.currentTimeMillis();
         final CardContentLoaderCallbacks cardContentLoaderCallbacks =
                 new CardContentLoaderCallbacks(mContext);
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardsAdapter.java b/src/com/android/settings/homepage/contextualcards/ContextualCardsAdapter.java
index b9bc43b..cf6f53c 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardsAdapter.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardsAdapter.java
@@ -16,7 +16,10 @@
 
 package com.android.settings.homepage.contextualcards;
 
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+
 import android.content.Context;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -131,7 +134,22 @@
             diffResult.dispatchUpdatesTo(this);
         }
 
-        if (mRecyclerView != null && previouslyEmpty && !nowEmpty) {
+        if (mRecyclerView == null) {
+            return;
+        }
+
+        // When no card gets displayed either because a card's condition no longer meets
+        // or when it's dismissed, the height should be rearranged.
+        if (mContextualCards.isEmpty()) {
+            final ViewGroup.LayoutParams params = mRecyclerView.getLayoutParams();
+            if (params.height != WRAP_CONTENT) {
+                Log.d(TAG, "mContextualCards is empty. Set the RV to wrap_content");
+                params.height = WRAP_CONTENT;
+                mRecyclerView.setLayoutParams(params);
+            }
+        }
+
+        if (previouslyEmpty && !nowEmpty) {
             // Adding items to empty list, should animate.
             mRecyclerView.scheduleLayoutAnimation();
         }
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
index 9f0023a..290d69a 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.homepage.contextualcards;
 
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+
 import static com.android.settings.homepage.contextualcards.ContextualCardsAdapter.SPAN_COUNT;
 
 import android.app.settings.SettingsEnums;
@@ -34,6 +36,7 @@
 import androidx.loader.app.LoaderManager;
 import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.ItemTouchHelper;
+import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.settings.R;
 import com.android.settings.core.InstrumentedFragment;
@@ -105,8 +108,20 @@
         final View rootView = inflater.inflate(R.layout.settings_homepage, container, false);
         mCardsContainer = rootView.findViewById(R.id.card_container);
         mLayoutManager = new GridLayoutManager(getActivity(), SPAN_COUNT,
-                GridLayoutManager.VERTICAL, false /* reverseLayout */);
+                GridLayoutManager.VERTICAL, false /* reverseLayout */) {
+            @Override
+            public void onLayoutCompleted(RecyclerView.State state) {
+                super.onLayoutCompleted(state);
+                // Once cards finish laying out, make the RV back to wrap content for flexibility.
+                final ViewGroup.LayoutParams params = mCardsContainer.getLayoutParams();
+                if (params.height != WRAP_CONTENT) {
+                    params.height = WRAP_CONTENT;
+                    mCardsContainer.setLayoutParams(params);
+                }
+            }
+        };
         mCardsContainer.setLayoutManager(mLayoutManager);
+        preAllocateHeight(context);
         mContextualCardsAdapter = new ContextualCardsAdapter(context, this /* lifecycleOwner */,
                 mContextualCardManager);
         mCardsContainer.setItemAnimator(null);
@@ -159,6 +174,25 @@
         FeatureFactory.getFactory(context).getSlicesFeatureProvider().newUiSession();
     }
 
+    private void preAllocateHeight(Context context) {
+        final int cardCount = ContextualCardLoader.getCardCount(context);
+        if (cardCount != 1) {
+            // only pre-allocate space when card count is one
+            Log.d(TAG, "Skip height pre-allocating. card count = " + cardCount);
+            return;
+        }
+
+        final int preAllocatedHeight = getResources().getDimensionPixelSize(
+                R.dimen.contextual_card_preallocated_height);
+        if (preAllocatedHeight == 0) {
+            return;
+        }
+
+        final ViewGroup.LayoutParams params = mCardsContainer.getLayoutParams();
+        params.height = preAllocatedHeight;
+        mCardsContainer.setLayoutParams(params);
+    }
+
     /**
      * Receiver for updating UI session when home key or recent app key is pressed.
      */
diff --git a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java
index c9ec5cf..b631102 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java
@@ -47,7 +47,6 @@
 import com.android.settings.homepage.contextualcards.ContextualCard;
 import com.android.settings.homepage.contextualcards.ContextualCardRenderer;
 import com.android.settings.homepage.contextualcards.ControllerRendererPool;
-import com.android.settings.homepage.contextualcards.slices.SliceFullCardRendererHelper.SliceViewHolder;
 import com.android.settingslib.utils.ThreadUtils;
 
 import java.util.Map;
@@ -105,7 +104,7 @@
 
         // Show cached slice first before slice binding completed to avoid jank.
         if (holder.getItemViewType() != VIEW_TYPE_HALF_WIDTH) {
-            ((SliceViewHolder) holder).sliceView.setSlice(card.getSlice());
+            mFullCardHelper.bindView(holder, card, card.getSlice());
         }
 
         LiveData<Slice> sliceLiveData = mSliceLiveDataMap.get(uri);
diff --git a/src/com/android/settings/network/telephony/NetworkOperatorPreference.java b/src/com/android/settings/network/telephony/NetworkOperatorPreference.java
index 97894b1..cfd587a 100644
--- a/src/com/android/settings/network/telephony/NetworkOperatorPreference.java
+++ b/src/com/android/settings/network/telephony/NetworkOperatorPreference.java
@@ -37,6 +37,7 @@
 
 import androidx.preference.Preference;
 
+import com.android.internal.telephony.OperatorInfo;
 import com.android.settings.R;
 
 import java.util.List;
@@ -125,10 +126,8 @@
         final CellSignalStrength signalStrength = getCellSignalStrength(mCellInfo);
         final int level = signalStrength != null ? signalStrength.getLevel() : LEVEL_NONE;
         if (DBG) Log.d(TAG, "refresh level: " + String.valueOf(level));
-        if (mLevel != level) {
-            mLevel = level;
-            updateIcon(mLevel);
-        }
+        mLevel = level;
+        updateIcon(mLevel);
     }
 
     /**
@@ -175,6 +174,15 @@
         return CellInfoUtil.getNetworkTitle(mCellId, getOperatorNumeric());
     }
 
+    /**
+     * Operator info of this cell
+     */
+    public OperatorInfo getOperatorInfo() {
+        return new OperatorInfo(Objects.toString(mCellId.getOperatorAlphaLong(), ""),
+                Objects.toString(mCellId.getOperatorAlphaShort(), ""),
+                getOperatorNumeric());
+    }
+
     private int getIconIdForCell(CellInfo ci) {
         if (ci instanceof CellInfoGsm) {
             return R.drawable.signal_strength_g;
diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
index 525cf9f..ba803e3 100644
--- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java
+++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
@@ -40,6 +40,7 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 
+import com.android.internal.telephony.OperatorInfo;
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.overlay.FeatureFactory;
@@ -185,12 +186,12 @@
 
             mRequestIdManualNetworkSelect = getNewRequestId();
             mWaitingForNumberOfScanResults = MIN_NUMBER_OF_SCAN_REQUIRED;
-            final String operatorNumeric = mSelectedPreference.getOperatorNumeric();
+            final OperatorInfo operator = mSelectedPreference.getOperatorInfo();
             ThreadUtils.postOnBackgroundThread(() -> {
                 final Message msg = mHandler.obtainMessage(
                         EVENT_SET_NETWORK_SELECTION_MANUALLY_DONE);
                 msg.obj = mTelephonyManager.setNetworkSelectionModeManual(
-                        operatorNumeric, true /* persistSelection */);
+                        operator, true /* persistSelection */);
                 msg.sendToTarget();
             });
         }
diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java
index 9e7f3ed..b088fe3 100644
--- a/src/com/android/settings/notification/SoundSettings.java
+++ b/src/com/android/settings/notification/SoundSettings.java
@@ -76,6 +76,7 @@
     private RingtonePreference mRequestPreference;
     private UpdatableListPreferenceDialogFragment mDialogFragment;
     private String mHfpOutputControllerKey;
+    private String mVibrationPreferencesKey = "vibration_preference_screen";
 
     @Override
     public int getMetricsCategory() {
@@ -127,6 +128,10 @@
 
     @Override
     public void onDisplayPreferenceDialog(Preference preference) {
+        if (TextUtils.equals(mVibrationPreferencesKey, preference.getKey())) {
+            super.onDisplayPreferenceDialog(preference);
+            return;
+        }
         final int metricsCategory;
         if (mHfpOutputControllerKey.equals(preference.getKey())) {
             metricsCategory = SettingsEnums.DIALOG_SWITCH_HFP_DEVICES;
@@ -310,4 +315,4 @@
             mDialogFragment.onListPreferenceUpdated(preference);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/widget/SeekBarPreference.java b/src/com/android/settings/widget/SeekBarPreference.java
index bdd1ba9..ac28382 100644
--- a/src/com/android/settings/widget/SeekBarPreference.java
+++ b/src/com/android/settings/widget/SeekBarPreference.java
@@ -51,6 +51,7 @@
     private boolean mShouldBlink;
     private int mAccessibilityRangeInfoType = AccessibilityNodeInfo.RangeInfo.RANGE_TYPE_INT;
     private CharSequence mSeekBarContentDescription;
+    private CharSequence mSeekBarStateDescription;
 
     public SeekBarPreference(
             Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
@@ -124,6 +125,9 @@
         } else if (!TextUtils.isEmpty(title)) {
             mSeekBar.setContentDescription(title);
         }
+        if (!TextUtils.isEmpty(mSeekBarStateDescription)) {
+            mSeekBar.setStateDescription(mSeekBarStateDescription);
+        }
         if (mSeekBar instanceof DefaultIndicatorSeekBar) {
             ((DefaultIndicatorSeekBar) mSeekBar).setDefaultProgress(mDefaultProgress);
         }
@@ -304,6 +308,18 @@
         }
     }
 
+    /**
+     * Specify the state description for this seek bar represents.
+     *
+     * @param stateDescription the state description of seek bar
+     */
+    public void setSeekBarStateDescription(CharSequence stateDescription) {
+        mSeekBarStateDescription = stateDescription;
+        if (mSeekBar != null) {
+            mSeekBar.setStateDescription(stateDescription);
+        }
+    }
+
     @Override
     protected Parcelable onSaveInstanceState() {
         /*
diff --git a/src/com/android/settings/wifi/slice/ContextualWifiSlice.java b/src/com/android/settings/wifi/slice/ContextualWifiSlice.java
index ea9a745..4d3c60b 100644
--- a/src/com/android/settings/wifi/slice/ContextualWifiSlice.java
+++ b/src/com/android/settings/wifi/slice/ContextualWifiSlice.java
@@ -25,6 +25,7 @@
 import android.net.Uri;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
+import android.provider.Settings;
 import android.text.TextUtils;
 
 import androidx.annotation.VisibleForTesting;
@@ -45,6 +46,9 @@
 public class ContextualWifiSlice extends WifiSlice {
 
     @VisibleForTesting
+    static final String CONTEXTUAL_WIFI_EXPANDABLE = "contextual_wifi_expandable";
+
+    @VisibleForTesting
     static final int COLLAPSED_ROW_COUNT = 0;
 
     @VisibleForTesting
@@ -63,13 +67,17 @@
 
     @Override
     public Slice getSlice() {
-        final long currentUiSession = FeatureFactory.getFactory(mContext)
-                .getSlicesFeatureProvider().getUiSessionToken();
-        if (currentUiSession != sActiveUiSession) {
-            sActiveUiSession = currentUiSession;
-            sApRowCollapsed = hasWorkingNetwork();
-        } else if (!mWifiManager.isWifiEnabled()) {
-            sApRowCollapsed = false;
+        if (isExpandable()) {
+            final long currentUiSession = FeatureFactory.getFactory(mContext)
+                    .getSlicesFeatureProvider().getUiSessionToken();
+            if (currentUiSession != sActiveUiSession) {
+                sActiveUiSession = currentUiSession;
+                sApRowCollapsed = hasWorkingNetwork();
+            } else if (!mWifiManager.isWifiEnabled()) {
+                sApRowCollapsed = false;
+            }
+        } else {
+            sApRowCollapsed = true;
         }
         return super.getSlice();
     }
@@ -87,12 +95,18 @@
     protected ListBuilder.RowBuilder getHeaderRow(boolean isWifiEnabled, AccessPoint accessPoint) {
         final ListBuilder.RowBuilder builder = super.getHeaderRow(isWifiEnabled, accessPoint);
         builder.setTitleItem(getHeaderIcon(isWifiEnabled, accessPoint), ListBuilder.ICON_IMAGE);
-        if (sApRowCollapsed) {
+        if (sApRowCollapsed && isWifiEnabled) {
             builder.setSubtitle(getSubtitle(accessPoint));
         }
         return builder;
     }
 
+    private boolean isExpandable() {
+        // Return whether this slice can be expandable.
+        return Settings.Global.getInt(mContext.getContentResolver(), CONTEXTUAL_WIFI_EXPANDABLE, 0)
+                != 0;
+    }
+
     private IconCompat getHeaderIcon(boolean isWifiEnabled, AccessPoint accessPoint) {
         final Drawable drawable;
         final int tint;
diff --git a/tests/robotests/src/com/android/settings/development/EnhancedConnectivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/EnhancedConnectivityPreferenceControllerTest.java
deleted file mode 100644
index db0b0db..0000000
--- a/tests/robotests/src/com/android/settings/development/EnhancedConnectivityPreferenceControllerTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.provider.Settings;
-
-import androidx.preference.PreferenceScreen;
-import androidx.preference.SwitchPreference;
-
-import com.android.settings.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-
-@RunWith(RobolectricTestRunner.class)
-public class EnhancedConnectivityPreferenceControllerTest {
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private Context mContext;
-
-    @Mock
-    private SwitchPreference mPreference;
-    @Mock
-    private PreferenceScreen mPreferenceScreen;
-
-    private EnhancedConnectivityPreferenceController mController;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mController = new EnhancedConnectivityPreferenceController(mContext);
-        when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
-                .thenReturn(mPreference);
-        mController.displayPreference(mPreferenceScreen);
-    }
-
-    @Test
-    public void onPreferenceChanged_enhanceConnectivity_shouldBeOn() {
-        mController.onPreferenceChange(mPreference, true /* new value */);
-
-        assertThat(isSettingEnabled()).isTrue();
-    }
-
-    @Test
-    public void onPreferenceChanged_enhanceConnectivity_shouldBeOff() {
-        mController.onPreferenceChange(mPreference, false /* new value */);
-
-        assertThat(isSettingEnabled()).isFalse();
-    }
-
-    @Test
-    public void updateState_preferenceShouldBeChecked() {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.ENHANCED_CONNECTIVITY_ENABLED, 1 /* enabled */);
-        mController.updateState(mPreference);
-
-        verify(mPreference).setChecked(true);
-    }
-
-    @Test
-    public void updateState_preferenceShouldNotBeChecked() {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.ENHANCED_CONNECTIVITY_ENABLED, 0 /* disabled */);
-        mController.updateState(mPreference);
-
-        verify(mPreference).setChecked(false);
-    }
-
-    @Test
-    public void onDeveloperOptionsDisabled_shouldEnablePreference() {
-        mController.onDeveloperOptionsSwitchDisabled();
-
-        verify(mPreference).setEnabled(false);
-        verify(mPreference).setChecked(true);
-
-        assertThat(isSettingEnabled()).isTrue();
-    }
-
-    @Test
-    public void isAvailable_enhancedConnectivityShown_shouldReturnTrue() {
-        enableEnhancedConnectivityPreference(true);
-
-        boolean availability = mController.isAvailable();
-
-        assertThat(availability).isTrue();
-    }
-
-    @Test
-    public void isAvailable_enhancedConnectivityNotShown_shouldReturnFalse() {
-        enableEnhancedConnectivityPreference(false);
-
-        boolean availability = mController.isAvailable();
-
-        assertThat(availability).isFalse();
-    }
-
-    private void enableEnhancedConnectivityPreference(boolean enable) {
-        when(mContext.getResources().getBoolean(R.bool.config_show_enhanced_connectivity))
-                .thenReturn(enable);
-    }
-
-    private boolean isSettingEnabled() {
-        return Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.ENHANCED_CONNECTIVITY_ENABLED,
-                EnhancedConnectivityPreferenceController.ENHANCED_CONNECTIVITY_ON
-                /* default on */)
-                == EnhancedConnectivityPreferenceController.ENHANCED_CONNECTIVITY_ON;
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/hardwareinfo/HardwareInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/hardwareinfo/HardwareInfoPreferenceControllerTest.java
index 291f6e2..c7c7669 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/hardwareinfo/HardwareInfoPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/hardwareinfo/HardwareInfoPreferenceControllerTest.java
@@ -24,7 +24,6 @@
 import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
 
-import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.deviceinfo.HardwareInfoPreferenceController;
 
@@ -79,8 +78,6 @@
     }
 
     private boolean containBuildModel(CharSequence result) {
-        final String oracle = mContext.getResources().getString(R.string.model_summary,
-                Build.MODEL);
-        return result.toString().contains(oracle);
+        return result.toString().contains(Build.MODEL);
     }
 }
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 fceb79d..7ccf381 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
@@ -71,25 +71,25 @@
     }
 
     @Test
-    public void getDisplayableCards_twoEligibleCards_shouldShowAll() {
+    public void getDisplayableCards_twoEligibleCards_notExceedDefaultCardCount() {
         final List<ContextualCard> cards = getContextualCardList().stream().limit(2)
                 .collect(Collectors.toList());
         doReturn(cards).when(mContextualCardLoader).filterEligibleCards(anyList());
 
         final List<ContextualCard> result = mContextualCardLoader.getDisplayableCards(cards);
 
-        assertThat(result).hasSize(cards.size());
+        assertThat(result).hasSize(Math.min(cards.size(), DEFAULT_CARD_COUNT));
     }
 
     @Test
-    public void getDisplayableCards_fourEligibleCards_shouldShowDefaultCardCount() {
+    public void getDisplayableCards_fourEligibleCards_notExceedDefaultCardCount() {
         final List<ContextualCard> cards = getContextualCardList().stream().limit(4)
                 .collect(Collectors.toList());
         doReturn(cards).when(mContextualCardLoader).filterEligibleCards(anyList());
 
         final List<ContextualCard> result = mContextualCardLoader.getDisplayableCards(cards);
 
-        assertThat(result).hasSize(DEFAULT_CARD_COUNT);
+        assertThat(result).hasSize(Math.min(cards.size(), DEFAULT_CARD_COUNT));
     }
 
     @Test
@@ -139,7 +139,7 @@
 
     @Test
     public void getCardCount_noConfiguredCardCount_returnDefaultCardCount() {
-        assertThat(mContextualCardLoader.getCardCount()).isEqualTo(DEFAULT_CARD_COUNT);
+        assertThat(mContextualCardLoader.getCardCount(mContext)).isEqualTo(DEFAULT_CARD_COUNT);
     }
 
     @Test
@@ -148,7 +148,7 @@
         Settings.Global.putLong(mContext.getContentResolver(),
                 ContextualCardLoader.CONTEXTUAL_CARD_COUNT, configCount);
 
-        assertThat(mContextualCardLoader.getCardCount()).isEqualTo(configCount);
+        assertThat(mContextualCardLoader.getCardCount(mContext)).isEqualTo(configCount);
     }
 
     private List<ContextualCard> getContextualCardList() {
diff --git a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
index f7dea22..42ed074 100644
--- a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
@@ -110,6 +111,13 @@
         assertThat(seekBarPreference.isSelectable()).isTrue();
     }
 
+    @Test
+    public void testSetSeekBarStateDescription() {
+        mSeekBarPreference.setSeekBarStateDescription("test");
+
+        verify(mSeekBarPreference).setSeekBarStateDescription("test");
+    }
+
     public static class TestFragment extends PreferenceFragmentCompat {
         @Override
         public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
diff --git a/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java b/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java
index 54b7c2d..fe1bb11 100644
--- a/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java
@@ -30,6 +30,7 @@
 import android.net.NetworkCapabilities;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
+import android.provider.Settings;
 
 import androidx.core.graphics.drawable.IconCompat;
 import androidx.slice.Slice;
@@ -77,6 +78,9 @@
         SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
         mWifiManager.setWifiEnabled(true);
 
+        // Set WifiSlice expandable
+        Settings.Global.putInt(mContext.getContentResolver(),
+                ContextualWifiSlice.CONTEXTUAL_WIFI_EXPANDABLE, 1);
         mWifiSlice = new ContextualWifiSlice(mContext);
     }
 
@@ -127,6 +131,18 @@
     }
 
     @Test
+    public void getWifiSlice_notExpandable_shouldCollapseSlice() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                ContextualWifiSlice.CONTEXTUAL_WIFI_EXPANDABLE, 0);
+        mWifiSlice.sApRowCollapsed = false;
+
+        final Slice wifiSlice = mWifiSlice.getSlice();
+
+        assertWifiHeader(wifiSlice);
+        assertThat(ContextualWifiSlice.getApRowCount()).isEqualTo(COLLAPSED_ROW_COUNT);
+    }
+
+    @Test
     public void getWifiSlice_contextualWifiSlice_shouldReturnContextualWifiSliceUri() {
         mWifiSlice.sActiveUiSession = mFeatureFactory.slicesFeatureProvider.getUiSessionToken();
 
