Merge "Make chart time slot not clickable when accessibility servie is enabled" into sc-dev
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
+        }
+    }
 }