Merge "[Panlingual] Unit test for onLocaleSelected" into tm-dev
diff --git a/res/layout/icon_discrete_slider.xml b/res/layout/icon_discrete_slider.xml
index 47be5ef..1319987 100644
--- a/res/layout/icon_discrete_slider.xml
+++ b/res/layout/icon_discrete_slider.xml
@@ -20,14 +20,13 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:clipChildren="false"
-    android:background="?android:colorBackground"
     android:gravity="center_vertical">
 
     <FrameLayout
         android:id="@+id/icon_start_frame"
         android:layout_width="48dp"
         android:layout_height="48dp"
-        android:background="?android:attr/selectableItemBackgroundBorderless"
+        android:clipChildren="false"
         android:focusable="true"
         android:visibility="gone">
 
@@ -36,6 +35,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="start|center_vertical"
+            android:background="?android:attr/selectableItemBackgroundBorderless"
             android:adjustViewBounds="true"
             android:focusable="false"
             android:tint="?android:attr/textColorPrimary"
@@ -56,7 +56,7 @@
         android:id="@+id/icon_end_frame"
         android:layout_width="48dp"
         android:layout_height="48dp"
-        android:background="?android:attr/selectableItemBackgroundBorderless"
+        android:clipChildren="false"
         android:focusable="true"
         android:visibility="gone">
 
@@ -65,6 +65,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="end|center_vertical"
+            android:background="?android:attr/selectableItemBackgroundBorderless"
             android:adjustViewBounds="true"
             android:focusable="false"
             android:tint="?android:attr/textColorPrimary"
diff --git a/res/layout/le_audio_bt_entity_header.xml b/res/layout/le_audio_bt_entity_header.xml
index 6e2a1e8..a05d707 100644
--- a/res/layout/le_audio_bt_entity_header.xml
+++ b/res/layout/le_audio_bt_entity_header.xml
@@ -61,75 +61,91 @@
         android:layout_height="wrap_content"
         android:layout_gravity="center_horizontal"
         android:gravity="center_vertical"
-        android:orientation="horizontal">
+        android:orientation="vertical">
         <LinearLayout
-            android:layout_width="wrap_content"
+            android:id="@+id/bt_battery_case"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginStart="@dimen/le_bluetooth_battery_start_margin"
-            android:orientation="vertical">
+            android:layout_marginTop="@dimen/le_bluetooth_battery_top_margin"
+            android:orientation="horizontal"
+            android:visibility="gone"
+            android:focusable="true">
             <TextView
-                android:id="@+id/bt_battery_case_title"
                 style="@style/TextAppearance.EntityHeaderTitle"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="@dimen/le_bluetooth_battery_top_margin"
+                android:layout_weight="1"
                 android:gravity="start|center_vertical"
                 android:ellipsize="end"
                 android:textDirection="locale"
                 android:text="@string/bluetooth_middle_name"
-                android:textSize="@dimen/advanced_bluetooth_header_title_text_size"
-                android:visibility="gone"/>
+                android:textSize="@dimen/advanced_bluetooth_header_title_text_size"/>
             <TextView
-                android:id="@+id/bt_battery_left_title"
+                android:id="@+id/bt_battery_case_summary"
+                style="@style/TextAppearance.EntityHeaderSummary"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/le_bluetooth_summary_start_margin"
+                android:minWidth="@dimen/le_bluetooth_summary_min_width"
+                android:padding="@dimen/le_bluetooth_summary_padding"
+                android:drawablePadding="@dimen/le_bluetooth_summary_drawable_padding"/>
+        </LinearLayout>
+        <LinearLayout
+            android:id="@+id/bt_battery_left"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/le_bluetooth_battery_start_margin"
+            android:layout_marginTop="@dimen/le_bluetooth_battery_top_margin"
+            android:orientation="horizontal"
+            android:visibility="gone"
+            android:focusable="true">
+            <TextView
                 style="@style/TextAppearance.EntityHeaderTitle"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="@dimen/le_bluetooth_battery_top_margin"
+                android:layout_weight="1"
                 android:gravity="start|center_vertical"
                 android:ellipsize="end"
                 android:textDirection="locale"
                 android:text="@string/bluetooth_left_name"
                 android:textSize="@dimen/advanced_bluetooth_header_title_text_size"/>
             <TextView
-                android:id="@+id/bt_battery_right_title"
+                android:id="@+id/bt_battery_left_summary"
+                style="@style/TextAppearance.EntityHeaderSummary"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/le_bluetooth_summary_start_margin"
+                android:minWidth="@dimen/le_bluetooth_summary_min_width"
+                android:padding="@dimen/le_bluetooth_summary_padding"
+                android:drawablePadding="@dimen/le_bluetooth_summary_drawable_padding"/>
+        </LinearLayout>
+        <LinearLayout
+            android:id="@+id/bt_battery_right"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/le_bluetooth_battery_start_margin"
+            android:layout_marginTop="@dimen/le_bluetooth_battery_top_margin"
+            android:orientation="horizontal"
+            android:visibility="gone"
+            android:focusable="true">
+            <TextView
                 style="@style/TextAppearance.EntityHeaderTitle"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="@dimen/le_bluetooth_battery_top_margin"
+                android:layout_weight="1"
                 android:gravity="start|center_vertical"
                 android:ellipsize="end"
                 android:textDirection="locale"
                 android:text="@string/bluetooth_right_name"
                 android:textSize="@dimen/advanced_bluetooth_header_title_text_size"/>
-        </LinearLayout>
-        <LinearLayout
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="@dimen/le_bluetooth_summary_start_margin"
-            android:orientation="vertical">
-            <TextView
-                android:id="@+id/bt_battery_case_summary"
-                style="@style/TextAppearance.EntityHeaderSummary"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="@dimen/le_bluetooth_battery_top_margin"
-                android:padding="@dimen/le_bluetooth_summary_padding"
-                android:drawablePadding="@dimen/le_bluetooth_summary_drawable_padding"
-                android:visibility="gone"/>
-            <TextView
-                android:id="@+id/bt_battery_left_summary"
-                style="@style/TextAppearance.EntityHeaderSummary"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="@dimen/le_bluetooth_battery_top_margin"
-                android:padding="@dimen/le_bluetooth_summary_padding"
-                android:drawablePadding="@dimen/le_bluetooth_summary_drawable_padding"/>
             <TextView
                 android:id="@+id/bt_battery_right_summary"
                 style="@style/TextAppearance.EntityHeaderSummary"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="@dimen/le_bluetooth_battery_top_margin"
+                android:layout_marginStart="@dimen/le_bluetooth_summary_start_margin"
+                android:minWidth="@dimen/le_bluetooth_summary_min_width"
                 android:padding="@dimen/le_bluetooth_summary_padding"
                 android:drawablePadding="@dimen/le_bluetooth_summary_drawable_padding"/>
         </LinearLayout>
diff --git a/res/layout/sim_confirm_dialog_multiple_enabled_profiles_supported.xml b/res/layout/sim_confirm_dialog_multiple_enabled_profiles_supported.xml
index 081efb3..74c8226 100644
--- a/res/layout/sim_confirm_dialog_multiple_enabled_profiles_supported.xml
+++ b/res/layout/sim_confirm_dialog_multiple_enabled_profiles_supported.xml
@@ -38,6 +38,8 @@
             android:background="@drawable/sim_confirm_dialog_rounded_bg"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/sims_select_margin_top"
+            android:layout_marginBottom="@dimen/sims_select_margin_bottom"
             android:visibility="gone"/>
 
         <LinearLayout
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 867fecb..0632f72 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1646,4 +1646,8 @@
         <item>1875000</item> <!-- 15Mbps == 1875000/s -->
     </string-array>
 
+    <!-- An allowlist which packages won't show summary in battery usage screen.
+         [CHAR LIMIT=NONE] -->
+    <string-array name="allowlist_hide_summary_in_battery_usage" translatable="false">
+    </string-array>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index f11cee5..1582d21 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -415,6 +415,7 @@
     <dimen name="le_bluetooth_summary_drawable_padding">6dp</dimen>
     <dimen name="le_bluetooth_summary_start_margin">20dp</dimen>
     <dimen name="le_bluetooth_summary_padding">1.5dp</dimen>
+    <dimen name="le_bluetooth_summary_min_width">64dp</dimen>
 
     <!-- Header layout of bluetooth find broadcast page -->
     <dimen name="bluetooth_find_broadcast_button_one_size">220dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2d4a544..63db309 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3347,8 +3347,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, 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] -->
     <string name="hardware_revision">Hardware version</string>
     <!-- About phone screen, fcc equipment id label  [CHAR LIMIT=40] -->
diff --git a/res/xml/hardware_info.xml b/res/xml/hardware_info.xml
index 10de299..641f707 100644
--- a/res/xml/hardware_info.xml
+++ b/res/xml/hardware_info.xml
@@ -18,7 +18,7 @@
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:settings="http://schemas.android.com/apk/res-auto"
-    android:title="@string/hardware_info"
+    android:title="@string/model_info"
     settings:keywords="@string/keywords_model_and_hardware">
 
     <!-- Model -->
diff --git a/src/com/android/settings/MainClear.java b/src/com/android/settings/MainClear.java
index 62462b3..2b0f010 100644
--- a/src/com/android/settings/MainClear.java
+++ b/src/com/android/settings/MainClear.java
@@ -494,6 +494,8 @@
 
             if (profilesSize > 1) {
                 View titleView = Utils.inflateCategoryHeader(inflater, contents);
+                titleView.setPadding(0 /* left */, titleView.getPaddingTop(),
+                        0 /* right */, titleView.getPaddingBottom());
                 final TextView titleText = (TextView) titleView.findViewById(android.R.id.title);
 
                 DevicePolicyManager devicePolicyManager =
diff --git a/src/com/android/settings/PointerSpeedPreference.java b/src/com/android/settings/PointerSpeedPreference.java
index 6a93477..fa56635 100644
--- a/src/com/android/settings/PointerSpeedPreference.java
+++ b/src/com/android/settings/PointerSpeedPreference.java
@@ -18,6 +18,8 @@
 
 import static android.view.HapticFeedbackConstants.CLOCK_TICK;
 
+import static com.android.internal.jank.InteractionJankMonitor.CUJ_SETTINGS_SLIDER;
+
 import android.content.ContentResolver;
 import android.content.Context;
 import android.database.ContentObserver;
@@ -30,9 +32,12 @@
 import android.view.View;
 import android.widget.SeekBar;
 
+import com.android.internal.jank.InteractionJankMonitor;
+
 public class PointerSpeedPreference extends SeekBarDialogPreference implements
         SeekBar.OnSeekBarChangeListener {
     private final InputManager mIm;
+    private final InteractionJankMonitor mJankMonitor = InteractionJankMonitor.getInstance();
     private SeekBar mSeekBar;
 
     private int mOldSpeed;
@@ -88,11 +93,15 @@
 
     public void onStartTrackingTouch(SeekBar seekBar) {
         mTouchInProgress = true;
+        mJankMonitor.begin(InteractionJankMonitor.Configuration.Builder
+                .withView(CUJ_SETTINGS_SLIDER, seekBar)
+                .setTag(getKey()));
     }
 
     public void onStopTrackingTouch(SeekBar seekBar) {
         mTouchInProgress = false;
         mIm.tryPointerSpeed(seekBar.getProgress() + InputManager.MIN_POINTER_SPEED);
+        mJankMonitor.end(CUJ_SETTINGS_SLIDER);
     }
 
     private void onSpeedChanged() {
diff --git a/src/com/android/settings/accessibility/MagnificationModePreferenceController.java b/src/com/android/settings/accessibility/MagnificationModePreferenceController.java
index 91eb2e9..df49a22 100644
--- a/src/com/android/settings/accessibility/MagnificationModePreferenceController.java
+++ b/src/com/android/settings/accessibility/MagnificationModePreferenceController.java
@@ -268,6 +268,7 @@
         final TextView messageView = contentView.findViewById(R.id.message);
         // TODO(b/225682559): Need to remove performClick() after refactoring accessibility dialog.
         final View.OnClickListener linkListener = view -> {
+            updateCapabilitiesAndSummary(mModeCache);
             mLinkPreference.performClick();
             dialog.dismiss();
         };
diff --git a/src/com/android/settings/bluetooth/LeAudioBluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/LeAudioBluetoothDetailsHeaderController.java
index 7b74f77..188770b 100644
--- a/src/com/android/settings/bluetooth/LeAudioBluetoothDetailsHeaderController.java
+++ b/src/com/android/settings/bluetooth/LeAudioBluetoothDetailsHeaderController.java
@@ -198,38 +198,25 @@
         return drawable;
     }
 
-    private int getBatteryTitleResource(int deviceId) {
-        if (deviceId == LEFT_DEVICE_ID) {
-            return R.id.bt_battery_left_title;
-        }
-        if (deviceId == RIGHT_DEVICE_ID) {
-            return R.id.bt_battery_right_title;
-        }
-        Log.d(TAG, "No resource id. The deviceId is " + deviceId);
-        return INVALID_RESOURCE_ID;
-    }
-
-    private int getBatterySummaryResource(int deviceId) {
-        if (deviceId == LEFT_DEVICE_ID) {
+    private int getBatterySummaryResource(int containerId) {
+        if (containerId == R.id.bt_battery_case) {
+            return R.id.bt_battery_case_summary;
+        } else if (containerId == R.id.bt_battery_left) {
             return R.id.bt_battery_left_summary;
-        }
-        if (deviceId == RIGHT_DEVICE_ID) {
+        } else if (containerId == R.id.bt_battery_right) {
             return R.id.bt_battery_right_summary;
         }
-        Log.d(TAG, "No resource id. The deviceId is " + deviceId);
+        Log.d(TAG, "No summary resource id. The containerId is " + containerId);
         return INVALID_RESOURCE_ID;
     }
 
     private void hideAllOfBatteryLayouts() {
         // hide the case
-        updateBatteryLayout(R.id.bt_battery_case_title, R.id.bt_battery_case_summary,
-                BluetoothUtils.META_INT_ERROR);
+        updateBatteryLayout(R.id.bt_battery_case, BluetoothUtils.META_INT_ERROR);
         // hide the left
-        updateBatteryLayout(R.id.bt_battery_left_title, R.id.bt_battery_left_summary,
-                BluetoothUtils.META_INT_ERROR);
+        updateBatteryLayout(R.id.bt_battery_left, BluetoothUtils.META_INT_ERROR);
         // hide the right
-        updateBatteryLayout(R.id.bt_battery_right_title, R.id.bt_battery_right_summary,
-                BluetoothUtils.META_INT_ERROR);
+        updateBatteryLayout(R.id.bt_battery_right, BluetoothUtils.META_INT_ERROR);
     }
 
     private List<CachedBluetoothDevice> getAllOfLeAudioDevices() {
@@ -285,36 +272,36 @@
                     summary.setText(mCachedDevice.getConnectionSummary());
                 }
             } else if (isLeft) {
-                updateBatteryLayout(getBatteryTitleResource(LEFT_DEVICE_ID),
-                        getBatterySummaryResource(LEFT_DEVICE_ID), cachedDevice.getBatteryLevel());
+                updateBatteryLayout(R.id.bt_battery_left, cachedDevice.getBatteryLevel());
             } else if (isRight) {
-                updateBatteryLayout(getBatteryTitleResource(RIGHT_DEVICE_ID),
-                        getBatterySummaryResource(RIGHT_DEVICE_ID), cachedDevice.getBatteryLevel());
+                updateBatteryLayout(R.id.bt_battery_right, cachedDevice.getBatteryLevel());
             } else {
                 Log.d(TAG, "The device id is other Audio Location. Do nothing.");
             }
         }
     }
 
-    private void updateBatteryLayout(int titleResId, int summaryResId, int batteryLevel) {
-        final TextView batteryTitleView = mLayoutPreference.findViewById(titleResId);
-        final TextView batterySummaryView = mLayoutPreference.findViewById(summaryResId);
-        if (batteryTitleView == null || batterySummaryView == null) {
-            Log.e(TAG, "updateBatteryLayout: No TextView");
+    private void updateBatteryLayout(int resId, int batteryLevel) {
+        final View batteryView = mLayoutPreference.findViewById(resId);
+        if (batteryView == null) {
+            Log.e(TAG, "updateBatteryLayout: No View");
             return;
         }
         if (batteryLevel != BluetoothUtils.META_INT_ERROR) {
-            batteryTitleView.setVisibility(View.VISIBLE);
-            batterySummaryView.setVisibility(View.VISIBLE);
-            batterySummaryView.setText(
-                    com.android.settings.Utils.formatPercentage(batteryLevel));
+            batteryView.setVisibility(View.VISIBLE);
+            final TextView batterySummaryView =
+                    batteryView.requireViewById(getBatterySummaryResource(resId));
+            final String batteryLevelPercentageString =
+                    com.android.settings.Utils.formatPercentage(batteryLevel);
+            batterySummaryView.setText(batteryLevelPercentageString);
+            batterySummaryView.setContentDescription(mContext.getString(
+                    R.string.bluetooth_battery_level, batteryLevelPercentageString));
             batterySummaryView.setCompoundDrawablesRelativeWithIntrinsicBounds(
                     createBtBatteryIcon(mContext, batteryLevel), /* top */ null,
                     /* end */ null, /* bottom */ null);
         } else {
             Log.d(TAG, "updateBatteryLayout: Hide it if it doesn't have battery information.");
-            batteryTitleView.setVisibility(View.GONE);
-            batterySummaryView.setVisibility(View.GONE);
+            batteryView.setVisibility(View.GONE);
         }
     }
 
diff --git a/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java b/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
index dc73ee0..54d0392 100644
--- a/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
+++ b/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
@@ -55,7 +55,7 @@
 
     @VisibleForTesting
     UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener =
-            (connected, functions, powerRole, dataRole) -> {
+            (connected, functions, powerRole, dataRole, isUsbConfigured) -> {
                 if (connected) {
                     mUsbPreference.setSummary(getSummary(dataRole == DATA_ROLE_DEVICE
                                     ? functions : UsbManager.FUNCTION_NONE, powerRole));
diff --git a/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java b/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java
index c73c957..1a1f8ba 100644
--- a/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java
+++ b/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java
@@ -61,6 +61,8 @@
         if (DEBUG) {
             Log.d(TAG, "onReceive() action : " + intent.getAction());
         }
+        boolean isUsbConfigured = intent.getExtras() != null
+                ? intent.getExtras().getBoolean(UsbManager.USB_CONFIGURED) : false;
         if (UsbManager.ACTION_USB_STATE.equals(intent.getAction())) {
             mConnected = intent.getExtras().getBoolean(UsbManager.USB_CONNECTED)
                     || intent.getExtras().getBoolean(UsbManager.USB_HOST_CONNECTED);
@@ -98,7 +100,7 @@
         }
         if (mUsbConnectionListener != null) {
             mUsbConnectionListener.onUsbConnectionChanged(mConnected, mFunctions, mPowerRole,
-                    mDataRole);
+                    mDataRole, isUsbConfigured);
         }
     }
 
@@ -142,6 +144,7 @@
      * Interface definition for a callback to be invoked when usb connection is changed.
      */
     interface UsbConnectionListener {
-        void onUsbConnectionChanged(boolean connected, long functions, int powerRole, int dataRole);
+        void onUsbConnectionChanged(boolean connected, long functions, int powerRole, int dataRole,
+                boolean isUsbConfigured);
     }
 }
diff --git a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java
index d58e97b..b5a9e5a 100644
--- a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java
+++ b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java
@@ -69,22 +69,23 @@
 
     @VisibleForTesting
     UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener =
-            (connected, functions, powerRole, dataRole) -> {
+            (connected, functions, powerRole, dataRole, isUsbConfigured) -> {
                 final long defaultFunctions = mUsbBackend.getDefaultUsbFunctions();
                 Log.d(TAG, "UsbConnectionListener() connected : " + connected + ", functions : "
                         + functions + ", defaultFunctions : " + defaultFunctions
-                        + ", mIsStartTethering : " + mIsStartTethering);
-                if (connected && !mIsConnected && (defaultFunctions == UsbManager.FUNCTION_RNDIS
+                        + ", mIsStartTethering : " + mIsStartTethering
+                        + ", isUsbConfigured : " + isUsbConfigured);
+                if (connected && !mIsConnected && ((defaultFunctions == UsbManager.FUNCTION_RNDIS
                         || defaultFunctions == UsbManager.FUNCTION_NCM)
+                        && defaultFunctions == functions)
                         && !mIsStartTethering) {
                     mCurrentFunctions = defaultFunctions;
                     startTethering();
                 }
 
-                if (mIsStartTethering && connected) {
+                if ((mIsStartTethering || isUsbConfigured) && connected) {
                     mCurrentFunctions = functions;
                     refresh(functions);
-                    mUsbBackend.setDefaultUsbFunctions(functions);
                     mIsStartTethering = false;
                 }
                 mIsConnected = connected;
diff --git a/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java
index 8850acd..0c94d19 100644
--- a/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java
+++ b/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java
@@ -50,7 +50,7 @@
     UsbConnectionBroadcastReceiver mUsbReceiver;
 
     private UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener =
-            (connected, functions, powerRole, dataRole) -> {
+            (connected, functions, powerRole, dataRole, isUsbFigured) -> {
                 for (UsbDetailsController controller : mControllers) {
                     controller.refresh(connected, functions, powerRole, dataRole);
                 }
diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
index db4cc53..1ecde44 100644
--- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
@@ -59,6 +59,7 @@
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Set;
 
 /**
  * Controller that update the battery header view
@@ -72,7 +73,6 @@
     private static final int MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP = 10;
     private static final String MEDIASERVER_PACKAGE_NAME = "mediaserver";
 
-    private final String mPreferenceKey;
     @VisibleForTesting
     PreferenceGroup mAppListGroup;
     private BatteryUsageStats mBatteryUsageStats;
@@ -83,6 +83,9 @@
     private final PackageManager mPackageManager;
     private final SettingsActivity mActivity;
     private final InstrumentedPreferenceFragment mFragment;
+    private final Set<CharSequence> mNotAllowShowSummaryPackages;
+    private final String mPreferenceKey;
+
     private Context mPrefContext;
 
     /**
@@ -159,6 +162,10 @@
         mPackageManager = context.getPackageManager();
         mActivity = activity;
         mFragment = fragment;
+        mNotAllowShowSummaryPackages = Set.of(
+                FeatureFactory.getFactory(context)
+                        .getPowerUsageFeatureProvider(context)
+                        .getHideApplicationSummary(context));
     }
 
     @Override
@@ -425,7 +432,13 @@
     @VisibleForTesting
     void setUsageSummary(Preference preference, BatteryEntry entry) {
         if (entry.getUid() == Process.SYSTEM_UID) {
-          return;
+            return;
+        }
+        String packageName = entry.getDefaultPackageName();
+        if (packageName != null
+                && mNotAllowShowSummaryPackages != null
+                && mNotAllowShowSummaryPackages.contains(packageName)) {
+            return;
         }
         // Only show summary when usage time is longer than one minute
         final long usageTimeMs = entry.getTimeInForegroundMs();
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
index 45b4886..bc25381 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
@@ -25,6 +25,7 @@
 import android.util.SparseIntArray;
 
 import com.android.internal.util.ArrayUtils;
+import com.android.settings.R;
 import com.android.settingslib.fuelgauge.Estimate;
 
 import java.util.Map;
@@ -179,6 +180,7 @@
 
     @Override
     public CharSequence[] getHideApplicationSummary(Context context) {
-        return new CharSequence[0];
+        return context.getResources().getTextArray(
+                R.array.allowlist_hide_summary_in_battery_usage);
     }
 }
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index ae030f4..de4d127 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -49,6 +49,7 @@
 import android.view.View;
 import android.widget.Toast;
 
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
@@ -87,6 +88,7 @@
 import com.android.settingslib.utils.ThreadUtils;
 import com.android.settingslib.widget.FooterPreference;
 import com.android.settingslib.widget.LayoutPreference;
+import com.android.settingslib.wifi.WifiEnterpriseRestrictionUtils;
 import com.android.settingslib.wifi.WifiSavedConfigUtils;
 import com.android.wifitrackerlib.WifiEntry;
 import com.android.wifitrackerlib.WifiEntry.ConnectCallback;
@@ -127,6 +129,8 @@
 
     private static final String PREF_KEY_AIRPLANE_MODE_MSG = "airplane_mode_message";
     private static final String PREF_KEY_EMPTY_WIFI_LIST = "wifi_empty_list";
+    @VisibleForTesting
+    static final String PREF_KEY_WIFI_TOGGLE = "main_toggle_wifi";
     // TODO(b/70983952): Rename these to use WifiEntry instead of AccessPoint.
     @VisibleForTesting
     static final String PREF_KEY_CONNECTED_ACCESS_POINTS = "connected_access_point";
@@ -1236,26 +1240,54 @@
         }
     };
 
-    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider(R.xml.network_provider_settings) {
+    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new SearchIndexProvider(R.xml.network_provider_settings);
 
-                @Override
-                public List<String> getNonIndexableKeys(Context context) {
-                    final List<String> keys = super.getNonIndexableKeys(context);
+    @VisibleForTesting
+    static class SearchIndexProvider extends BaseSearchIndexProvider {
 
-                    final WifiManager wifiManager = context.getSystemService(WifiManager.class);
-                    if (wifiManager == null) return keys;
+        private final WifiRestriction mWifiRestriction;
 
-                    if (WifiSavedConfigUtils.getAllConfigsCount(context, wifiManager) == 0) {
-                        keys.add(PREF_KEY_SAVED_NETWORKS);
-                    }
+        SearchIndexProvider(int xmlRes) {
+            super(xmlRes);
+            mWifiRestriction = new WifiRestriction();
+        }
 
-                    if (!DataUsageUtils.hasWifiRadio(context)) {
-                        keys.add(PREF_KEY_DATA_USAGE);
-                    }
-                    return keys;
-                }
-            };
+        @VisibleForTesting
+        SearchIndexProvider(int xmlRes, WifiRestriction wifiRestriction) {
+            super(xmlRes);
+            mWifiRestriction = wifiRestriction;
+        }
+
+        @Override
+        public List<String> getNonIndexableKeys(Context context) {
+            final List<String> keys = super.getNonIndexableKeys(context);
+
+            if (!mWifiRestriction.isChangeWifiStateAllowed(context)) {
+                keys.add(PREF_KEY_WIFI_TOGGLE);
+            }
+
+            final WifiManager wifiManager = context.getSystemService(WifiManager.class);
+            if (wifiManager == null) return keys;
+
+            if (WifiSavedConfigUtils.getAllConfigsCount(context, wifiManager) == 0) {
+                keys.add(PREF_KEY_SAVED_NETWORKS);
+            }
+
+            if (!DataUsageUtils.hasWifiRadio(context)) {
+                keys.add(PREF_KEY_DATA_USAGE);
+            }
+            return keys;
+        }
+    }
+
+    @VisibleForTesting
+    static class WifiRestriction {
+        public boolean isChangeWifiStateAllowed(@Nullable Context context) {
+            if (context == null) return true;
+            return WifiEnterpriseRestrictionUtils.isChangeWifiStateAllowed(context);
+        }
+    }
 
     private class WifiEntryConnectCallback implements ConnectCallback {
         final WifiEntry mConnectWifiEntry;
diff --git a/src/com/android/settings/notification/VolumeSeekBarPreference.java b/src/com/android/settings/notification/VolumeSeekBarPreference.java
index 36a4d8a..14955c4 100644
--- a/src/com/android/settings/notification/VolumeSeekBarPreference.java
+++ b/src/com/android/settings/notification/VolumeSeekBarPreference.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.notification;
 
+import static com.android.internal.jank.InteractionJankMonitor.CUJ_SETTINGS_SLIDER;
+
 import android.content.ContentResolver;
 import android.content.Context;
 import android.media.AudioManager;
@@ -31,6 +33,7 @@
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.PreferenceViewHolder;
 
+import com.android.internal.jank.InteractionJankMonitor;
 import com.android.settings.R;
 import com.android.settings.widget.SeekBarPreference;
 
@@ -40,6 +43,8 @@
 public class VolumeSeekBarPreference extends SeekBarPreference {
     private static final String TAG = "VolumeSeekBarPreference";
 
+    private final InteractionJankMonitor mJankMonitor = InteractionJankMonitor.getInstance();
+
     protected SeekBar mSeekBar;
     private int mStream;
     private SeekBarVolumizer mVolumizer;
@@ -143,6 +148,13 @@
                 if (mCallback != null) {
                     mCallback.onStartTrackingTouch(sbv);
                 }
+                mJankMonitor.begin(InteractionJankMonitor.Configuration.Builder
+                        .withView(CUJ_SETTINGS_SLIDER, mSeekBar)
+                        .setTag(getKey()));
+            }
+            @Override
+            public void onStopTrackingTouch(SeekBarVolumizer sbv) {
+                mJankMonitor.end(CUJ_SETTINGS_SLIDER);
             }
         };
         final Uri sampleUri = mStream == AudioManager.STREAM_MUSIC ? getMediaVolumeUri() : null;
diff --git a/src/com/android/settings/sim/SimListDialogFragment.java b/src/com/android/settings/sim/SimListDialogFragment.java
index 166d00a..06b116c 100644
--- a/src/com/android/settings/sim/SimListDialogFragment.java
+++ b/src/com/android/settings/sim/SimListDialogFragment.java
@@ -216,16 +216,6 @@
             final TextView title = convertView.findViewById(R.id.title);
             final TextView summary = convertView.findViewById(R.id.summary);
 
-            ViewGroup.MarginLayoutParams lp =
-                    (ViewGroup.MarginLayoutParams) parent.getLayoutParams();
-            if (lp != null) {
-                lp.setMargins(0, mContext.getResources().getDimensionPixelSize(
-                        R.dimen.sims_select_margin_top), 0,
-                        mContext.getResources().getDimensionPixelSize(
-                                R.dimen.sims_select_margin_bottom));
-                convertView.setLayoutParams(lp);
-            }
-
             if (sub == null) {
                 if (position == 0) {
                     title.setText(R.string.sim_calls_ask_first_prefs_title);
diff --git a/src/com/android/settings/widget/SeekBarPreference.java b/src/com/android/settings/widget/SeekBarPreference.java
index 62a19b9..9f9bc9f 100644
--- a/src/com/android/settings/widget/SeekBarPreference.java
+++ b/src/com/android/settings/widget/SeekBarPreference.java
@@ -18,6 +18,8 @@
 
 import static android.view.HapticFeedbackConstants.CLOCK_TICK;
 
+import static com.android.internal.jank.InteractionJankMonitor.CUJ_SETTINGS_SLIDER;
+
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.os.Parcel;
@@ -33,6 +35,7 @@
 import androidx.core.content.res.TypedArrayUtils;
 import androidx.preference.PreferenceViewHolder;
 
+import com.android.internal.jank.InteractionJankMonitor;
 import com.android.settingslib.RestrictedPreference;
 
 /**
@@ -45,6 +48,7 @@
     public static final int HAPTIC_FEEDBACK_MODE_ON_TICKS = 1;
     public static final int HAPTIC_FEEDBACK_MODE_ON_ENDS = 2;
 
+    private final InteractionJankMonitor mJankMonitor = InteractionJankMonitor.getInstance();
     private int mProgress;
     private int mMax;
     private int mMin;
@@ -312,6 +316,9 @@
     @Override
     public void onStartTrackingTouch(SeekBar seekBar) {
         mTrackingTouch = true;
+        mJankMonitor.begin(InteractionJankMonitor.Configuration.Builder
+                .withView(CUJ_SETTINGS_SLIDER, seekBar)
+                .setTag(getKey()));
     }
 
     @Override
@@ -320,6 +327,7 @@
         if (seekBar.getProgress() != mProgress) {
             syncProgress(seekBar);
         }
+        mJankMonitor.end(CUJ_SETTINGS_SLIDER);
     }
 
     /**
diff --git a/src/com/android/settings/wifi/slice/WifiSlice.java b/src/com/android/settings/wifi/slice/WifiSlice.java
index f59dc60..7b2eae9 100644
--- a/src/com/android/settings/wifi/slice/WifiSlice.java
+++ b/src/com/android/settings/wifi/slice/WifiSlice.java
@@ -37,6 +37,7 @@
 import android.text.TextUtils;
 import android.util.Log;
 
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.core.graphics.drawable.IconCompat;
 import androidx.slice.Slice;
@@ -56,6 +57,7 @@
 import com.android.settings.wifi.WifiDialogActivity;
 import com.android.settings.wifi.WifiUtils;
 import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
+import com.android.settingslib.wifi.WifiEnterpriseRestrictionUtils;
 import com.android.wifitrackerlib.WifiEntry;
 
 import java.util.Arrays;
@@ -74,10 +76,17 @@
 
     protected final Context mContext;
     protected final WifiManager mWifiManager;
+    protected final WifiRestriction mWifiRestriction;
 
     public WifiSlice(Context context) {
+        this(context, new WifiRestriction());
+    }
+
+    @VisibleForTesting
+    WifiSlice(Context context, WifiRestriction wifiRestriction) {
         mContext = context;
         mWifiManager = mContext.getSystemService(WifiManager.class);
+        mWifiRestriction = wifiRestriction;
     }
 
     @Override
@@ -167,20 +176,26 @@
         final SliceAction primarySliceAction = SliceAction.createDeeplink(primaryAction, icon,
                 ListBuilder.ICON_IMAGE, title);
 
-        return new ListBuilder.RowBuilder()
+        final ListBuilder.RowBuilder builder = new ListBuilder.RowBuilder()
                 .setTitle(title)
                 .setPrimaryAction(primarySliceAction);
+
+        if (!mWifiRestriction.isChangeWifiStateAllowed(mContext)) {
+            builder.setSubtitle(mContext.getString(R.string.not_allowed_by_ent));
+        }
+        return builder;
     }
 
     private ListBuilder getListBuilder(boolean isWifiEnabled, WifiSliceItem wifiSliceItem) {
-        final PendingIntent toggleAction = getBroadcastIntent(mContext);
-        final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction,
-                null /* actionTitle */, isWifiEnabled);
         final ListBuilder builder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
                 .setAccentColor(COLOR_NOT_TINTED)
                 .setKeywords(getKeywords())
-                .addRow(getHeaderRow(isWifiEnabled, wifiSliceItem))
-                .addAction(toggleSliceAction);
+                .addRow(getHeaderRow(isWifiEnabled, wifiSliceItem));
+
+        if (mWifiRestriction.isChangeWifiStateAllowed(mContext)) {
+            builder.addAction(SliceAction.createToggle(
+                    getBroadcastIntent(mContext), null /* actionTitle */, isWifiEnabled));
+        }
         return builder;
     }
 
@@ -349,4 +364,12 @@
     public Class getBackgroundWorkerClass() {
         return WifiScanWorker.class;
     }
+
+    @VisibleForTesting
+    static class WifiRestriction {
+        public boolean isChangeWifiStateAllowed(@Nullable Context context) {
+            if (context == null) return true;
+            return WifiEnterpriseRestrictionUtils.isChangeWifiStateAllowed(context);
+        }
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/PointerSpeedPreferenceTest.java b/tests/robotests/src/com/android/settings/PointerSpeedPreferenceTest.java
index 0925344..ea05f4a 100644
--- a/tests/robotests/src/com/android/settings/PointerSpeedPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/PointerSpeedPreferenceTest.java
@@ -27,13 +27,17 @@
 import android.util.AttributeSet;
 import android.widget.SeekBar;
 
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
 
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowInteractionJankMonitor.class})
 public class PointerSpeedPreferenceTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/settings/accessibility/AlarmVibrationIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AlarmVibrationIntensityPreferenceControllerTest.java
index 44d2e86..4a791e3 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AlarmVibrationIntensityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AlarmVibrationIntensityPreferenceControllerTest.java
@@ -31,6 +31,7 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
 import com.android.settings.widget.SeekBarPreference;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
@@ -40,8 +41,10 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
 
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowInteractionJankMonitor.class})
 public class AlarmVibrationIntensityPreferenceControllerTest {
 
     private static final String PREFERENCE_KEY = "preference_key";
diff --git a/tests/robotests/src/com/android/settings/accessibility/BalanceSeekBarPreferenceTest.java b/tests/robotests/src/com/android/settings/accessibility/BalanceSeekBarPreferenceTest.java
index ba7bd2c..251698c 100644
--- a/tests/robotests/src/com/android/settings/accessibility/BalanceSeekBarPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/BalanceSeekBarPreferenceTest.java
@@ -26,13 +26,17 @@
 
 import androidx.preference.PreferenceViewHolder;
 
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
 
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowInteractionJankMonitor.class})
 public class BalanceSeekBarPreferenceTest {
     private static final int BALANCE_CENTER_VALUE = 100;
     private static final int BALANCE_MAX_VALUE = 200;
diff --git a/tests/robotests/src/com/android/settings/accessibility/FloatingMenuTransparencyPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/FloatingMenuTransparencyPreferenceControllerTest.java
index eceb185..343d56a 100644
--- a/tests/robotests/src/com/android/settings/accessibility/FloatingMenuTransparencyPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/FloatingMenuTransparencyPreferenceControllerTest.java
@@ -38,6 +38,7 @@
 import androidx.preference.PreferenceScreen;
 import androidx.test.core.app.ApplicationProvider;
 
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
 import com.android.settings.widget.SeekBarPreference;
 
 import org.junit.Before;
@@ -49,9 +50,11 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
 
 /** Tests for {@link FloatingMenuTransparencyPreferenceController}. */
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowInteractionJankMonitor.class})
 public class FloatingMenuTransparencyPreferenceControllerTest {
 
     @Rule
diff --git a/tests/robotests/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceControllerTest.java
index 344a25f..8c2be52 100644
--- a/tests/robotests/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceControllerTest.java
@@ -31,6 +31,7 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
 import com.android.settings.widget.SeekBarPreference;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
@@ -41,8 +42,10 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
 
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowInteractionJankMonitor.class})
 public class HapticFeedbackIntensityPreferenceControllerTest {
 
     private static final String PREFERENCE_KEY = "preference_key";
diff --git a/tests/robotests/src/com/android/settings/accessibility/MediaVibrationIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/MediaVibrationIntensityPreferenceControllerTest.java
index 3a4b43a..e0eff0e 100644
--- a/tests/robotests/src/com/android/settings/accessibility/MediaVibrationIntensityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/MediaVibrationIntensityPreferenceControllerTest.java
@@ -31,6 +31,7 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
 import com.android.settings.widget.SeekBarPreference;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
@@ -40,9 +41,11 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
 
 /** Test for {@link MediaVibrationIntensityPreferenceController}. */
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowInteractionJankMonitor.class})
 public class MediaVibrationIntensityPreferenceControllerTest {
 
     private static final String PREFERENCE_KEY = "preference_key";
diff --git a/tests/robotests/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceControllerTest.java
index 9533c53..0638af9 100644
--- a/tests/robotests/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceControllerTest.java
@@ -31,6 +31,7 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
 import com.android.settings.widget.SeekBarPreference;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
@@ -41,8 +42,10 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
 
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowInteractionJankMonitor.class})
 public class NotificationVibrationIntensityPreferenceControllerTest {
 
     private static final String PREFERENCE_KEY = "preference_key";
diff --git a/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java
index d33d80e..fae61d6 100644
--- a/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java
@@ -28,6 +28,7 @@
 import androidx.preference.PreferenceScreen;
 import androidx.test.core.app.ApplicationProvider;
 
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
 import com.android.settings.widget.LabeledSeekBarPreference;
 
 import org.junit.Before;
@@ -36,11 +37,13 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
 
 /**
  * Tests for {@link PreviewSizeSeekBarController}.
  */
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowInteractionJankMonitor.class})
 public class PreviewSizeSeekBarControllerTest {
     private static final String FONT_SIZE_KEY = "font_size";
     private final Context mContext = ApplicationProvider.getApplicationContext();
diff --git a/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java
index fa3f3bf..2ff5d71 100644
--- a/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java
@@ -31,6 +31,7 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
 import com.android.settings.widget.SeekBarPreference;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
@@ -41,9 +42,11 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
 
 /** Tests for {@link RingVibrationIntensityPreferenceController}. */
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowInteractionJankMonitor.class})
 public class RingVibrationIntensityPreferenceControllerTest {
 
     private static final String PREFERENCE_KEY = "preference_key";
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java
index b630509..f768e42 100644
--- a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java
@@ -27,6 +27,7 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.display.PreviewPagerAdapter;
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
 import com.android.settings.widget.LabeledSeekBarPreference;
 
 import org.junit.Before;
@@ -45,7 +46,7 @@
  * Tests for {@link TextReadingPreviewController}.
  */
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowChoreographer.class)
+@Config(shadows = {ShadowChoreographer.class, ShadowInteractionJankMonitor.class})
 public class TextReadingPreviewControllerTest {
     private static final String PREVIEW_KEY = "preview";
     private static final String FONT_SIZE_KEY = "font_size";
diff --git a/tests/robotests/src/com/android/settings/accessibility/VibrationIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/VibrationIntensityPreferenceControllerTest.java
index 048bce4..2508345 100644
--- a/tests/robotests/src/com/android/settings/accessibility/VibrationIntensityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/VibrationIntensityPreferenceControllerTest.java
@@ -28,6 +28,7 @@
 import androidx.preference.PreferenceScreen;
 import androidx.test.core.app.ApplicationProvider;
 
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
 import com.android.settings.widget.SeekBarPreference;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
@@ -37,9 +38,11 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
 
 /** Tests for {@link VibrationIntensityPreferenceController}. */
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowInteractionJankMonitor.class})
 public class VibrationIntensityPreferenceControllerTest {
 
     private static final String SETTING_KEY = Settings.System.NOTIFICATION_VIBRATION_INTENSITY;
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdaterTest.java
index 5c66db7..1b2ef9a 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdaterTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdaterTest.java
@@ -97,7 +97,8 @@
     public void initUsbPreference_usbConnected_preferenceAdded() {
         mDeviceUpdater.initUsbPreference(mContext);
         mDeviceUpdater.mUsbConnectionListener.onUsbConnectionChanged(true /* connected */,
-                UsbManager.FUNCTION_NONE, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                UsbManager.FUNCTION_NONE, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
 
         verify(mDevicePreferenceCallback).onDeviceAdded(mDeviceUpdater.mUsbPreference);
     }
@@ -106,7 +107,8 @@
     public void initUsbPreference_usbDisconnected_preferenceRemoved() {
         mDeviceUpdater.initUsbPreference(mContext);
         mDeviceUpdater.mUsbConnectionListener.onUsbConnectionChanged(false /* connected */,
-                UsbManager.FUNCTION_NONE, POWER_ROLE_NONE, DATA_ROLE_NONE);
+                UsbManager.FUNCTION_NONE, POWER_ROLE_NONE, DATA_ROLE_NONE,
+                /* isUsbConfigured= */ true);
 
         verify(mDevicePreferenceCallback).onDeviceRemoved(mDeviceUpdater.mUsbPreference);
     }
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiverTest.java
index 21ec48e..7cd7dcc 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiverTest.java
@@ -65,11 +65,12 @@
         final Intent intent = new Intent();
         intent.setAction(UsbManager.ACTION_USB_STATE);
         intent.putExtra(UsbManager.USB_CONNECTED, true);
+        intent.putExtra(UsbManager.USB_CONFIGURED, true);
 
         mReceiver.onReceive(mContext, intent);
 
         verify(mListener).onUsbConnectionChanged(true /* connected */, UsbManager.FUNCTION_NONE,
-                POWER_ROLE_NONE, DATA_ROLE_NONE);
+                POWER_ROLE_NONE, DATA_ROLE_NONE, /* isUsbConfigured= */ true);
     }
 
     @Test
@@ -77,11 +78,12 @@
         final Intent intent = new Intent();
         intent.setAction(UsbManager.ACTION_USB_STATE);
         intent.putExtra(UsbManager.USB_CONNECTED, false);
+        intent.putExtra(UsbManager.USB_CONFIGURED, true);
 
         mReceiver.onReceive(mContext, intent);
 
         verify(mListener).onUsbConnectionChanged(false /* connected */, UsbManager.FUNCTION_NONE,
-                POWER_ROLE_NONE, DATA_ROLE_NONE);
+                POWER_ROLE_NONE, DATA_ROLE_NONE, /* isUsbConfigured= */ true);
     }
 
     @Test
@@ -91,11 +93,12 @@
         intent.putExtra(UsbManager.USB_CONNECTED, true);
         intent.putExtra(UsbManager.USB_FUNCTION_MTP, true);
         intent.putExtra(UsbManager.USB_DATA_UNLOCKED, true);
+        intent.putExtra(UsbManager.USB_CONFIGURED, true);
 
         mReceiver.onReceive(mContext, intent);
 
         verify(mListener).onUsbConnectionChanged(true /* connected */, UsbManager.FUNCTION_MTP,
-                POWER_ROLE_NONE, DATA_ROLE_NONE);
+                POWER_ROLE_NONE, DATA_ROLE_NONE, /* isUsbConfigured= */ true);
     }
 
     @Test
@@ -105,26 +108,41 @@
         intent.putExtra(UsbManager.USB_CONNECTED, true);
         intent.putExtra(UsbManager.USB_FUNCTION_NCM, true);
         intent.putExtra(UsbManager.USB_DATA_UNLOCKED, true);
+        intent.putExtra(UsbManager.USB_CONFIGURED, true);
 
         mReceiver.onReceive(mContext, intent);
 
         verify(mListener).onUsbConnectionChanged(/* connected */ true, UsbManager.FUNCTION_NCM,
-                POWER_ROLE_NONE, DATA_ROLE_NONE);
+                POWER_ROLE_NONE, DATA_ROLE_NONE, /* isUsbConfigured= */ true);
     }
 
     @Test
-    public void onReceive_usbPortStatus_invokeCallback() {
+    public void onReceive_usbPortStatus_invokesCallback() {
         final Intent intent = new Intent();
         intent.setAction(UsbManager.ACTION_USB_PORT_CHANGED);
         final UsbPortStatus status = new UsbPortStatus(0, POWER_ROLE_SINK,
                 DATA_ROLE_DEVICE, 0, CONTAMINANT_PROTECTION_NONE,
                 CONTAMINANT_DETECTION_NOT_SUPPORTED);
         intent.putExtra(UsbManager.EXTRA_PORT_STATUS, status);
+        intent.putExtra(UsbManager.USB_CONFIGURED, true);
 
         mReceiver.onReceive(mContext, intent);
 
         verify(mListener).onUsbConnectionChanged(false /* connected */, UsbManager.FUNCTION_NONE,
-                POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                POWER_ROLE_SINK, DATA_ROLE_DEVICE, /* isUsbConfigured= */ true);
+    }
+
+    @Test
+    public void onReceive_usbConfiguredIsFalse_invokesCallback() {
+        final Intent intent = new Intent();
+        intent.setAction(UsbManager.ACTION_USB_STATE);
+        intent.putExtra(UsbManager.USB_CONNECTED, true);
+        intent.putExtra(UsbManager.USB_CONFIGURED, false);
+
+        mReceiver.onReceive(mContext, intent);
+
+        verify(mListener).onUsbConnectionChanged(true /* connected */, UsbManager.FUNCTION_NONE,
+                POWER_ROLE_NONE, DATA_ROLE_NONE, /* isUsbConfigured= */ false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java
index 9afc677..71bbff2 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java
@@ -27,7 +27,6 @@
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -204,12 +203,13 @@
     public void onPause_receivedRndis_shouldSetRndis() {
         mFragment.mIsStartTethering = true;
         mFragment.mUsbConnectionListener.onUsbConnectionChanged(true /* connected */,
-                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
         when(mUsbBackend.getCurrentFunctions()).thenReturn(UsbManager.FUNCTION_RNDIS);
 
         mFragment.onPause();
 
-        verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS);
+        verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS);
         assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_RNDIS);
     }
 
@@ -217,11 +217,12 @@
     public void onPause_receivedNone_shouldSetNone() {
         mFragment.mIsStartTethering = true;
         mFragment.mUsbConnectionListener.onUsbConnectionChanged(true /* connected */,
-                UsbManager.FUNCTION_NONE, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                UsbManager.FUNCTION_NONE, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
 
         mFragment.onPause();
 
-        verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_NONE);
+        verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_NONE);
         assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_NONE);
     }
 
@@ -229,12 +230,13 @@
     public void onPause_receivedMtp_shouldSetMtp() {
         mFragment.mIsStartTethering = true;
         mFragment.mUsbConnectionListener.onUsbConnectionChanged(true /* connected */,
-                UsbManager.FUNCTION_MTP, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                UsbManager.FUNCTION_MTP, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
         when(mUsbBackend.getCurrentFunctions()).thenReturn(UsbManager.FUNCTION_MTP);
 
         mFragment.onPause();
 
-        verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_MTP);
+        verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_MTP);
         assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_MTP);
     }
 
@@ -242,12 +244,13 @@
     public void onPause_receivedPtp_shouldSetPtp() {
         mFragment.mIsStartTethering = true;
         mFragment.mUsbConnectionListener.onUsbConnectionChanged(true /* connected */,
-                UsbManager.FUNCTION_PTP, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                UsbManager.FUNCTION_PTP, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
         when(mUsbBackend.getCurrentFunctions()).thenReturn(UsbManager.FUNCTION_PTP);
 
         mFragment.onPause();
 
-        verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_PTP);
+        verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_PTP);
         assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_PTP);
     }
 
@@ -255,12 +258,13 @@
     public void onPause_receivedMidi_shouldSetMidi() {
         mFragment.mIsStartTethering = true;
         mFragment.mUsbConnectionListener.onUsbConnectionChanged(true /* connected */,
-                UsbManager.FUNCTION_MIDI, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                UsbManager.FUNCTION_MIDI, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
         when(mUsbBackend.getCurrentFunctions()).thenReturn(UsbManager.FUNCTION_MIDI);
 
         mFragment.onPause();
 
-        verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_MIDI);
+        verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_MIDI);
         assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_MIDI);
     }
 
@@ -268,12 +272,13 @@
     public void onPause_receivedNcm_setsNcm() {
         mFragment.mIsStartTethering = true;
         mFragment.mUsbConnectionListener.onUsbConnectionChanged(/* connected */ true,
-                UsbManager.FUNCTION_NCM, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                UsbManager.FUNCTION_NCM, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
         when(mUsbBackend.getCurrentFunctions()).thenReturn(UsbManager.FUNCTION_NCM);
 
         mFragment.onPause();
 
-        verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_NCM);
+        verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_NCM);
         assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_NCM);
     }
 
@@ -282,9 +287,11 @@
         when(mUsbBackend.getDefaultUsbFunctions()).thenReturn(UsbManager.FUNCTION_RNDIS);
 
         mFragment.mUsbConnectionListener.onUsbConnectionChanged(false /* connected */,
-                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
         mFragment.mUsbConnectionListener.onUsbConnectionChanged(true /* connected */,
-                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
 
         verify(mTetheringManager).startTethering(eq(TetheringManager.TETHERING_USB),
                 any(),
@@ -296,9 +303,11 @@
         when(mUsbBackend.getDefaultUsbFunctions()).thenReturn(UsbManager.FUNCTION_NCM);
 
         mFragment.mUsbConnectionListener.onUsbConnectionChanged(/* connected */ false,
-                UsbManager.FUNCTION_NCM, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                UsbManager.FUNCTION_NCM, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
         mFragment.mUsbConnectionListener.onUsbConnectionChanged(/* connected */ true,
-                UsbManager.FUNCTION_NCM, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                UsbManager.FUNCTION_NCM, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
 
         verify(mTetheringManager).startTethering(eq(TetheringManager.TETHERING_USB),
                 any(),
@@ -310,7 +319,8 @@
         when(mUsbBackend.getDefaultUsbFunctions()).thenReturn(UsbManager.FUNCTION_RNDIS);
 
         mFragment.mUsbConnectionListener.onUsbConnectionChanged(false /* connected */,
-                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
 
         verify(mTetheringManager, never()).startTethering(eq(TetheringManager.TETHERING_USB),
                 any(),
@@ -323,15 +333,36 @@
         when(mUsbBackend.getDefaultUsbFunctions()).thenReturn(UsbManager.FUNCTION_RNDIS);
 
         mFragment.mUsbConnectionListener.onUsbConnectionChanged(false /* connected */,
-                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
         mFragment.mUsbConnectionListener.onUsbConnectionChanged(true /* connected */,
-                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
 
         verify(mTetheringManager, never()).startTethering(eq(TetheringManager.TETHERING_USB),
                 any(),
                 eq(mFragment.mOnStartTetheringCallback));
     }
 
+    @Test
+    public void onUsbConnectionChanged_usbConfiguredIsTrue_updatesCurrentFunctions() {
+        mFragment.mCurrentFunctions = UsbManager.FUNCTION_NONE;
+        mFragment.mUsbConnectionListener.onUsbConnectionChanged(/* connected= */ true,
+                UsbManager.FUNCTION_NCM, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ true);
+        assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_NCM);
+    }
+
+    @Test
+    public void onUsbConnectionChanged_usbConfiguredIsFalse_doesNotUpdateCurrentFunctions() {
+        mFragment.mCurrentFunctions = UsbManager.FUNCTION_NONE;
+        mFragment.mUsbConnectionListener.onUsbConnectionChanged(/* connected= */ true,
+                UsbManager.FUNCTION_NCM, POWER_ROLE_SINK, DATA_ROLE_DEVICE,
+                /* isUsbConfigured= */ false);
+        assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_NONE);
+    }
+
+
     public static class TestFragment extends UsbDefaultFragment {
         public final PreferenceScreen mScreen;
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarControllerTest.java
index 9b57593..b05d06d 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarControllerTest.java
@@ -15,6 +15,8 @@
 
 import androidx.preference.PreferenceScreen;
 
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -22,8 +24,10 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
 
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowInteractionJankMonitor.class})
 public class BatterySaverScheduleSeekBarControllerTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettingsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettingsTest.java
index bb36c8a..78e19c3 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettingsTest.java
@@ -10,6 +10,7 @@
 import android.provider.Settings;
 
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 import org.junit.Before;
@@ -17,8 +18,10 @@
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
 
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowInteractionJankMonitor.class})
 public final class BatterySaverScheduleSettingsTest {
 
     private Context mContext;
diff --git a/tests/robotests/src/com/android/settings/gestures/LabeledSeekBarPreferenceTest.java b/tests/robotests/src/com/android/settings/gestures/LabeledSeekBarPreferenceTest.java
index d00e905..6302f80 100644
--- a/tests/robotests/src/com/android/settings/gestures/LabeledSeekBarPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/LabeledSeekBarPreferenceTest.java
@@ -37,6 +37,7 @@
 import androidx.preference.PreferenceViewHolder;
 
 import com.android.settings.R;
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
 import com.android.settings.testutils.shadow.ShadowUserManager;
 import com.android.settings.widget.LabeledSeekBarPreference;
 
@@ -56,7 +57,8 @@
  */
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {
-        ShadowUserManager.class
+        ShadowUserManager.class,
+        ShadowInteractionJankMonitor.class,
 })
 public class LabeledSeekBarPreferenceTest {
 
diff --git a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
index 5ee9676..1424d0e 100644
--- a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
@@ -60,6 +60,7 @@
 import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
 import androidx.recyclerview.widget.RecyclerView;
+import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.AirplaneModeEnabler;
 import com.android.settings.R;
@@ -77,24 +78,33 @@
 import com.android.wifitrackerlib.WifiPickerTracker;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.shadows.ShadowToast;
 
+import java.util.List;
+
 @RunWith(RobolectricTestRunner.class)
 public class NetworkProviderSettingsTest {
 
+    private static final int XML_RES = R.xml.wifi_tether_settings;
     private static final int NUM_NETWORKS = 4;
     private static final String FAKE_URI_STRING = "fakeuri";
 
+    @Rule
+    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+    @Spy
+    Context mContext = ApplicationProvider.getApplicationContext();
     @Mock
     private PowerManager mPowerManager;
     @Mock
@@ -107,7 +117,6 @@
     private AirplaneModeEnabler mAirplaneModeEnabler;
     @Mock
     private DataUsagePreference mDataUsagePreference;
-    private Context mContext;
     private NetworkProviderSettings mNetworkProviderSettings;
     @Mock
     private WifiPickerTracker mMockWifiPickerTracker;
@@ -131,12 +140,11 @@
     PreferenceCategory mConnectedWifiEntryPreferenceCategory;
     @Mock
     PreferenceCategory mFirstWifiEntryPreferenceCategory;
+    @Mock
+    NetworkProviderSettings.WifiRestriction mWifiRestriction;
 
     @Before
     public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mContext = spy(RuntimeEnvironment.application);
-
         mNetworkProviderSettings = spy(new NetworkProviderSettings());
         doReturn(mContext).when(mNetworkProviderSettings).getContext();
         doReturn(mPreferenceManager).when(mNetworkProviderSettings).getPreferenceManager();
@@ -721,6 +729,28 @@
         verify(mContextMenu, never()).add(anyInt(), eq(MENU_ID_FORGET), anyInt(), anyInt());
     }
 
+    @Test
+    public void getNonIndexableKeys_allowedChangeWifiState_keyNotReturned() {
+        when(mWifiRestriction.isChangeWifiStateAllowed(mContext)).thenReturn(true);
+        NetworkProviderSettings.SearchIndexProvider searchIndexProvider =
+                new NetworkProviderSettings.SearchIndexProvider(XML_RES, mWifiRestriction);
+
+        final List<String> keys = searchIndexProvider.getNonIndexableKeys(mContext);
+
+        assertThat(keys).doesNotContain(NetworkProviderSettings.PREF_KEY_WIFI_TOGGLE);
+    }
+
+    @Test
+    public void getNonIndexableKeys_disallowedChangeWifiState_keyReturned() {
+        when(mWifiRestriction.isChangeWifiStateAllowed(mContext)).thenReturn(false);
+        NetworkProviderSettings.SearchIndexProvider searchIndexProvider =
+                new NetworkProviderSettings.SearchIndexProvider(XML_RES, mWifiRestriction);
+
+        final List<String> keys = searchIndexProvider.getNonIndexableKeys(mContext);
+
+        assertThat(keys).contains(NetworkProviderSettings.PREF_KEY_WIFI_TOGGLE);
+    }
+
     @Implements(PreferenceFragmentCompat.class)
     public static class ShadowPreferenceFragmentCompat {
 
diff --git a/tests/robotests/src/com/android/settings/notification/RemoteVolumeGroupControllerTest.java b/tests/robotests/src/com/android/settings/notification/RemoteVolumeGroupControllerTest.java
index 8b46374..e713963 100644
--- a/tests/robotests/src/com/android/settings/notification/RemoteVolumeGroupControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/RemoteVolumeGroupControllerTest.java
@@ -43,6 +43,7 @@
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
 import com.android.settings.widget.SeekBarPreference;
 import com.android.settingslib.media.LocalMediaManager;
 
@@ -61,7 +62,7 @@
 import java.util.List;
 
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowBluetoothAdapter.class})
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowInteractionJankMonitor.class})
 public class RemoteVolumeGroupControllerTest {
 
     private static final String KEY_REMOTE_VOLUME_GROUP = "remote_media_group";
diff --git a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
index 451b84b..770559d 100644
--- a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
@@ -34,6 +34,7 @@
 
 import androidx.preference.PreferenceFragmentCompat;
 
+import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
 import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal;
 
 import org.junit.Before;
@@ -46,7 +47,7 @@
 import org.robolectric.shadows.androidx.fragment.FragmentController;
 
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowRestrictedLockUtilsInternal.class)
+@Config(shadows = {ShadowRestrictedLockUtilsInternal.class, ShadowInteractionJankMonitor.class})
 public class SeekBarPreferenceTest {
 
     private static final int MAX = 75;
diff --git a/tests/robotests/src/com/android/settings/wifi/slice/WifiSliceTest.java b/tests/robotests/src/com/android/settings/wifi/slice/WifiSliceTest.java
index 5b7a7d6..d8151d0 100644
--- a/tests/robotests/src/com/android/settings/wifi/slice/WifiSliceTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/slice/WifiSliceTest.java
@@ -25,7 +25,6 @@
 
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 import android.content.ContentResolver;
@@ -37,9 +36,12 @@
 
 import androidx.slice.Slice;
 import androidx.slice.SliceItem;
+import androidx.slice.SliceMetadata;
 import androidx.slice.SliceProvider;
 import androidx.slice.core.SliceQuery;
+import androidx.slice.widget.ListContent;
 import androidx.slice.widget.SliceLiveData;
+import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.R;
 import com.android.settings.slices.SliceBackgroundWorker;
@@ -49,12 +51,14 @@
 import com.android.wifitrackerlib.WifiEntry.ConnectedState;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
@@ -74,26 +78,29 @@
     private static final String AP3_NAME = "ap3";
     private static final int USER_ID = 1;
 
+    @Rule
+    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+    @Spy
+    Context mContext = ApplicationProvider.getApplicationContext();
     @Mock
     private WifiManager mWifiManager;
     @Mock
     private PackageManager mPackageManager;
-
-
-    private Context mContext;
+    @Mock
     private ContentResolver mResolver;
+    @Mock
+    private WifiSlice.WifiRestriction mWifiRestriction;
+
     private WifiSlice mWifiSlice;
     private String mSIPackageName;
 
     @Before
     public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mContext = spy(RuntimeEnvironment.application);
-        mResolver = mock(ContentResolver.class);
         doReturn(mResolver).when(mContext).getContentResolver();
         doReturn(mWifiManager).when(mContext).getSystemService(WifiManager.class);
         doReturn(WifiManager.WIFI_STATE_ENABLED).when(mWifiManager).getWifiState();
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
+        when(mWifiRestriction.isChangeWifiStateAllowed(mContext)).thenReturn(true);
 
         // Set-up specs for SliceMetadata.
         SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
@@ -102,7 +109,7 @@
         ShadowBinder.setCallingUid(USER_ID);
         when(mPackageManager.getPackagesForUid(USER_ID)).thenReturn(new String[]{mSIPackageName});
         ShadowWifiSlice.setWifiPermissible(true);
-        mWifiSlice = new WifiSlice(mContext);
+        mWifiSlice = new WifiSlice(mContext, mWifiRestriction);
     }
 
     @Test
@@ -242,6 +249,30 @@
     }
 
     @Test
+    public void getWifiSlice_disallowedChangeWifiState_addSubtitleAndNoToggle() {
+        when(mWifiRestriction.isChangeWifiStateAllowed(mContext)).thenReturn(false);
+
+        final Slice slice = mWifiSlice.getSlice();
+
+        final ListContent listContent = SliceMetadata.from(mContext, slice).getListContent();
+        assertThat(slice).isNotNull();
+        assertThat(listContent.getHeader().getSubtitleItem()).isNotNull();
+        assertThat(listContent.getSliceActions()).isNull();
+    }
+
+    @Test
+    public void getWifiSlice_allowedChangeWifiState_noSubtitleAndAddToggle() {
+        when(mWifiRestriction.isChangeWifiStateAllowed(mContext)).thenReturn(true);
+
+        final Slice slice = mWifiSlice.getSlice();
+
+        final ListContent listContent = SliceMetadata.from(mContext, slice).getListContent();
+        assertThat(slice).isNotNull();
+        assertThat(listContent.getHeader().getSubtitleItem()).isNull();
+        assertThat(listContent.getSliceActions()).isNotNull();
+    }
+
+    @Test
     public void handleUriChange_updatesWifi() {
         final Intent intent = mWifiSlice.getIntent();
         intent.putExtra(android.app.slice.Slice.EXTRA_TOGGLE_STATE, true);