diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0d032aa..f427d53 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -731,13 +731,7 @@
     <!-- In the security screen, the header title for security statuses -->
     <string name="security_status_title">Security status</string>
     <!-- Summary for Security settings, explaining a few important settings under it [CHAR LIMIT=NONE] -->
-    <string name="security_dashboard_summary_face">Screen lock, face unlock</string>
-    <!-- Summary for Security settings, explaining a few important settings under it [CHAR LIMIT=NONE] -->
-    <string name="security_dashboard_summary">Screen lock, fingerprint</string>
-    <!-- Summary for Security settings when fingerprint is not supported [CHAR LIMIT=NONE]-->
-    <string name="security_dashboard_summary_no_fingerprint">Screen lock</string>
-    <!-- Summary for Security settings when biometric unlock is supported [CHAR LIMIT=NONE] -->
-    <string name="security_dashboard_summary_biometric">Screen lock, biometric unlock, app security</string>
+    <string name="security_dashboard_summary">Screen lock, Find My Device, app security</string>
 
     <!-- Face enrollment and settings --><skip />
     <!-- Message shown in summary field when face unlock is set up. [CHAR LIMIT=40] -->
@@ -10791,16 +10785,7 @@
     <!-- Summary of display with screen sleep timeout [CHAR LIMIT=NONE] -->
     <string name="display_summary">Sleep after <xliff:g id="timeout_description" example="10 minutes">%1$s</xliff:g> of inactivity</string>
     <!-- Summary for Display settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
-    <string name="display_dashboard_summary">Wallpaper, sleep, font size</string>
-
-    <!-- Summary for Display settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
-    <string name="display_dashboard_summary_with_style">Styles, wallpapers, screen timeout, font size</string>
-
-    <!-- Summary for the top level Display Settings [CHAR LIMIT=NONE]-->
-    <string name="display_dashboard_summary_2">Screen timeout, font size</string>
-
-    <!-- Summary for Display settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
-    <string name="display_dashboard_nowallpaper_summary">Sleep, font size</string>
+    <string name="display_dashboard_summary">Screen timeout, font size</string>
 
     <!-- Example summary of display used in Setup Wizard preview screen [CHAR LIMIT=NONE] -->
     <string name="display_summary_example">Sleep after 10 minutes of inactivity</string>
diff --git a/res/xml/top_level_settings_grouped.xml b/res/xml/top_level_settings_grouped.xml
index 6c03380..7b4f8a1 100644
--- a/res/xml/top_level_settings_grouped.xml
+++ b/res/xml/top_level_settings_grouped.xml
@@ -86,7 +86,7 @@
         android:key="top_level_display"
         android:order="-80"
         android:title="@string/display_settings"
-        android:summary="@string/summary_placeholder"
+        android:summary="@string/display_dashboard_summary"
         settings:controller="com.android.settings.display.TopLevelDisplayPreferenceController"/>
 
     <com.android.settingslib.RestrictedTopLevelPreference
@@ -112,7 +112,7 @@
         android:key="top_level_security"
         android:order="-50"
         android:title="@string/security_settings_title"
-        android:summary="@string/security_dashboard_summary_biometric"
+        android:summary="@string/security_dashboard_summary"
         settings:controller="com.android.settings.security.TopLevelSecurityEntryPreferenceController"/>
 
     <Preference
diff --git a/src/com/android/settings/deviceinfo/storage/StorageUsageProgressBarPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageUsageProgressBarPreferenceController.java
index 6b06daf..cfee6a4 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageUsageProgressBarPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageUsageProgressBarPreferenceController.java
@@ -47,6 +47,7 @@
     long mTotalBytes;
     private UsageProgressBarPreference mUsageProgressBarPreference;
     private StorageEntry mStorageEntry;
+    boolean mIsUpdateStateFromSelectedStorageEntry;
 
     public StorageUsageProgressBarPreferenceController(Context context, String key) {
         super(context, key);
@@ -68,7 +69,6 @@
     @Override
     public void displayPreference(PreferenceScreen screen) {
         mUsageProgressBarPreference = screen.findPreference(getPreferenceKey());
-        getStorageStatsAndUpdateUi();
     }
 
     private void getStorageStatsAndUpdateUi() {
@@ -101,12 +101,18 @@
             if (mUsageProgressBarPreference == null) {
                 return;
             }
+            mIsUpdateStateFromSelectedStorageEntry = true;
             ThreadUtils.postOnMainThread(() -> updateState(mUsageProgressBarPreference));
         });
     }
 
     @Override
     public void updateState(Preference preference) {
+        if (!mIsUpdateStateFromSelectedStorageEntry) {
+            // Returns here to avoid jank by unnecessary UI update.
+            return;
+        }
+        mIsUpdateStateFromSelectedStorageEntry = false;
         mUsageProgressBarPreference.setUsageSummary(
                 getStorageSummary(R.string.storage_usage_summary, mUsedBytes));
         mUsageProgressBarPreference.setTotalSummary(
diff --git a/src/com/android/settings/display/TopLevelDisplayPreferenceController.java b/src/com/android/settings/display/TopLevelDisplayPreferenceController.java
index 73aafe5..5fda13e 100644
--- a/src/com/android/settings/display/TopLevelDisplayPreferenceController.java
+++ b/src/com/android/settings/display/TopLevelDisplayPreferenceController.java
@@ -33,18 +33,4 @@
         ? AVAILABLE
         : UNSUPPORTED_ON_DEVICE;
     }
-
-    @Override
-    public CharSequence getSummary() {
-        final WallpaperPreferenceController controller =
-                new WallpaperPreferenceController(mContext, "unused_key");
-        if (controller.isAvailable()) {
-            return mContext.getText(
-                    controller.areStylesAvailable()
-                    ? R.string.display_dashboard_summary_with_style
-                    : R.string.display_dashboard_summary);
-        } else {
-            return mContext.getText(R.string.display_dashboard_nowallpaper_summary);
-        }
-    }
 }
diff --git a/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java
index d16a6d2..a5149b9 100644
--- a/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java
@@ -21,47 +21,27 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
 
 import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-
-import com.android.settings.R;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-import java.util.ArrayList;
-import java.util.List;
-
 @RunWith(RobolectricTestRunner.class)
 public class TopLevelDisplayPreferenceControllerTest {
     private Context mContext;
-    @Mock
-    private PackageManager mPackageManager;
-
     private TopLevelDisplayPreferenceController mController;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = spy(RuntimeEnvironment.application);
-        when(mContext.getPackageManager()).thenReturn(mPackageManager);
-        when(mContext.getString(R.string.config_wallpaper_picker_package)).thenReturn("pkg");
-        when(mContext.getString(R.string.config_wallpaper_picker_class)).thenReturn("cls");
-
         mController = new TopLevelDisplayPreferenceController(mContext, "test_key");
     }
 
@@ -75,38 +55,4 @@
     public void getAvailabilityStatus_unsupportedWhenSet() {
         assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
     }
-
-    @Test
-    public void getSummary_hasWallpaper_shouldReturnWallpaperSummary() {
-        final List<ResolveInfo> resolveInfos = new ArrayList<>();
-        resolveInfos.add(mock(ResolveInfo.class));
-        when(mPackageManager.queryIntentActivities(any(Intent.class), anyInt()))
-                .thenReturn(resolveInfos);
-
-        assertThat(mController.getSummary())
-                .isEqualTo(mContext.getText(R.string.display_dashboard_summary));
-    }
-
-    @Test
-    public void getSummary_hasWallpaperWithStyles_shouldReturnWallpaperSummary() {
-        when(mContext.getString(R.string.config_styles_and_wallpaper_picker_class))
-                .thenReturn("any.nonempty.class");
-        final List<ResolveInfo> resolveInfos = new ArrayList<>();
-        resolveInfos.add(mock(ResolveInfo.class));
-        when(mPackageManager.queryIntentActivities(any(Intent.class), anyInt()))
-                .thenReturn(resolveInfos);
-
-        assertThat(mController.getSummary())
-                .isEqualTo(mContext.getText(R.string.display_dashboard_summary_with_style));
-    }
-
-    @Test
-    public void getSummary_hasWallpaper_shouldReturnNoWallpaperSummary() {
-        final List<ResolveInfo> resolveInfos = new ArrayList<>();
-        when(mPackageManager.queryIntentActivities(any(Intent.class), anyInt()))
-                .thenReturn(resolveInfos);
-
-        assertThat(mController.getSummary())
-                .isEqualTo(mContext.getText(R.string.display_dashboard_nowallpaper_summary));
-    }
 }
diff --git a/tests/unit/src/com/android/settings/applications/HibernatedAppsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/applications/HibernatedAppsPreferenceControllerTest.java
index a34e634..39c966d 100644
--- a/tests/unit/src/com/android/settings/applications/HibernatedAppsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/applications/HibernatedAppsPreferenceControllerTest.java
@@ -24,17 +24,24 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.usage.IUsageStatsManager;
+import android.app.usage.UsageStats;
+import android.app.usage.UsageStatsManager;
 import android.apphibernation.AppHibernationManager;
 import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ParceledListSlice;
 import android.content.res.Resources;
+import android.os.RemoteException;
 import android.provider.DeviceConfig;
 
 import androidx.test.core.app.ApplicationProvider;
@@ -58,11 +65,11 @@
     PackageManager mPackageManager;
     @Mock
     AppHibernationManager mAppHibernationManager;
+    @Mock
+    IUsageStatsManager mIUsageStatsManager;
     private static final String KEY = "key";
     private Context mContext;
     private HibernatedAppsPreferenceController mController;
-    private PackageInfo mHibernatedPackage;
-    private PackageInfo mAutoRevokedPackage;
 
     @Before
     public void setUp() {
@@ -73,10 +80,9 @@
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
         when(mContext.getSystemService(AppHibernationManager.class))
                 .thenReturn(mAppHibernationManager);
+        when(mContext.getSystemService(UsageStatsManager.class)).thenReturn(
+                new UsageStatsManager(mContext, mIUsageStatsManager));
         mController = new HibernatedAppsPreferenceController(mContext, KEY);
-        mHibernatedPackage =
-                getHibernatedPackage(mAppHibernationManager, mPackageManager, mContext);
-        mAutoRevokedPackage = getAutoRevokedPackage(mPackageManager, mContext);
     }
 
     @Test
@@ -88,36 +94,71 @@
     }
 
     @Test
-    public void getSummary_shouldReturnCorrectly() {
+    public void getSummary_getsRightCountForHibernatedPackage() {
+        final PackageInfo hibernatedPkg = getHibernatedPackage();
         when(mPackageManager.getInstalledPackages(anyInt())).thenReturn(
-                Arrays.asList(mHibernatedPackage, mAutoRevokedPackage, new PackageInfo()));
+                Arrays.asList(hibernatedPkg, new PackageInfo()));
         when(mContext.getResources()).thenReturn(mock(Resources.class));
-        final int totalHibernated = 2;
 
         mController.getSummary();
-        verify(mContext.getResources()).getQuantityString(
-                anyInt(), eq(totalHibernated), eq(totalHibernated));
+        verify(mContext.getResources()).getQuantityString(anyInt(), eq(1), eq(1));
     }
 
-    private static PackageInfo getHibernatedPackage(
-            AppHibernationManager apm, PackageManager pm, Context context) {
+    @Test
+    public void getSummary_getsRightCountForUnusedAutoRevokedPackage() {
+        final PackageInfo autoRevokedPkg = getAutoRevokedPackage();
+        when(mPackageManager.getInstalledPackages(anyInt())).thenReturn(
+                Arrays.asList(autoRevokedPkg, new PackageInfo()));
+        when(mContext.getResources()).thenReturn(mock(Resources.class));
+
+        mController.getSummary();
+        verify(mContext.getResources()).getQuantityString(anyInt(), eq(1), eq(1));
+    }
+
+    @Test
+    public void getSummary_getsRightCountForUsedAutoRevokedPackage() {
+        final PackageInfo usedAutoRevokedPkg = getAutoRevokedPackage();
+        setAutoRevokedPackageUsageStats();
+        when(mPackageManager.getInstalledPackages(anyInt())).thenReturn(
+                Arrays.asList(usedAutoRevokedPkg, new PackageInfo()));
+        when(mContext.getResources()).thenReturn(mock(Resources.class));
+
+        mController.getSummary();
+        verify(mContext.getResources()).getQuantityString(anyInt(), eq(0), eq(0));
+    }
+
+    private PackageInfo getHibernatedPackage() {
         final PackageInfo pi = new PackageInfo();
         pi.packageName = HIBERNATED_PACKAGE_NAME;
         pi.requestedPermissions = new String[] {PERMISSION};
-        when(apm.getHibernatingPackagesForUser()).thenReturn(Arrays.asList(pi.packageName));
-        when(pm.getPermissionFlags(
-                pi.requestedPermissions[0], pi.packageName, context.getUser()))
+        when(mAppHibernationManager.getHibernatingPackagesForUser())
+                .thenReturn(Arrays.asList(pi.packageName));
+        when(mPackageManager.getPermissionFlags(
+                pi.requestedPermissions[0], pi.packageName, mContext.getUser()))
                 .thenReturn(PackageManager.FLAG_PERMISSION_AUTO_REVOKED);
         return pi;
     }
 
-    private static PackageInfo getAutoRevokedPackage(PackageManager pm, Context context) {
+    private PackageInfo getAutoRevokedPackage() {
         final PackageInfo pi = new PackageInfo();
         pi.packageName = AUTO_REVOKED_PACKAGE_NAME;
         pi.requestedPermissions = new String[] {PERMISSION};
-        when(pm.getPermissionFlags(
-                pi.requestedPermissions[0], pi.packageName, context.getUser()))
+        when(mPackageManager.getPermissionFlags(
+                pi.requestedPermissions[0], pi.packageName, mContext.getUser()))
                 .thenReturn(PackageManager.FLAG_PERMISSION_AUTO_REVOKED);
         return pi;
     }
+
+    private void setAutoRevokedPackageUsageStats() {
+        final UsageStats us = new UsageStats();
+        us.mPackageName = AUTO_REVOKED_PACKAGE_NAME;
+        us.mLastTimeVisible = System.currentTimeMillis();
+        try {
+            when(mIUsageStatsManager.queryUsageStats(
+                    anyInt(), anyLong(), anyLong(), anyString(), anyInt()))
+                    .thenReturn(new ParceledListSlice(Arrays.asList(us)));
+        } catch (RemoteException e) {
+            // no-op
+        }
+    }
 }
