From b5e796bb7446f2e7130200bb2896b3558dcf5df5 Mon Sep 17 00:00:00 2001 From: Varun Shah Date: Fri, 2 Dec 2022 15:17:14 -0800 Subject: Update logic for adjusting standby buckets for restored apps. Instead of skipping over not yet installed apps, add them to a list and update the PackageReceiver to handle freshly installed apps separately. When an app is installed within the first 8 hours after a device is restored, if the app is on the list, adjust its standby bucket to rare. Bug: 214580000 Test: atest UsageStatsDatabaseTest Test: manually verify buckets are restored Change-Id: I79a0bb08fd383420aa72266e1d80c89e666bb981 (cherry picked from commit 4225f1ebf73cd0884384bf9c64f48aedc18f762e) --- .../android/server/usage/AppStandbyController.java | 43 +++++++++++++++++----- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java index 5d9f3357125a..3e4dc3904118 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -109,6 +109,7 @@ import android.util.Slog; import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseLongArray; +import android.util.SparseSetArray; import android.util.TimeUtils; import android.view.Display; import android.widget.Toast; @@ -451,6 +452,12 @@ public class AppStandbyController */ private final Map mAppStandbyProperties = new ArrayMap<>(); + /** + * Set of apps that were restored via backup & restore, per user, that need their + * standby buckets to be adjusted when installed. + */ + private final SparseSetArray mAppsToRestoreToRare = new SparseSetArray<>(); + /** * List of app-ids of system packages, populated on boot, when system services are ready. */ @@ -1610,18 +1617,29 @@ public class AppStandbyController final int reason = REASON_MAIN_DEFAULT | REASON_SUB_DEFAULT_APP_RESTORED; final long nowElapsed = mInjector.elapsedRealtime(); for (String packageName : restoredApps) { - // If the package is not installed, don't allow the bucket to be set. + // If the package is not installed, don't allow the bucket to be set. Instead, add it + // to a list of all packages whose buckets need to be adjusted when installed. if (!mInjector.isPackageInstalled(packageName, 0, userId)) { - Slog.e(TAG, "Tried to restore bucket for uninstalled app: " + packageName); + Slog.i(TAG, "Tried to restore bucket for uninstalled app: " + packageName); + mAppsToRestoreToRare.add(userId, packageName); continue; } - final int standbyBucket = getAppStandbyBucket(packageName, userId, nowElapsed, false); - // Only update the standby bucket to RARE if the app is still in the NEVER bucket. - if (standbyBucket == STANDBY_BUCKET_NEVER) { - setAppStandbyBucket(packageName, userId, STANDBY_BUCKET_RARE, reason, - nowElapsed, false); - } + restoreAppToRare(packageName, userId, nowElapsed, reason); + } + // Clear out the list of restored apps that need to have their standby buckets adjusted + // if they still haven't been installed eight hours after restore. + // Note: if the device reboots within these first 8 hours, this list will be lost since it's + // not persisted - this is the expected behavior for now and may be updated in the future. + mHandler.postDelayed(() -> mAppsToRestoreToRare.remove(userId), 8 * ONE_HOUR); + } + + /** Adjust the standby bucket of the given package for the user to RARE. */ + private void restoreAppToRare(String pkgName, int userId, long nowElapsed, int reason) { + final int standbyBucket = getAppStandbyBucket(pkgName, userId, nowElapsed, false); + // Only update the standby bucket to RARE if the app is still in the NEVER bucket. + if (standbyBucket == STANDBY_BUCKET_NEVER) { + setAppStandbyBucket(pkgName, userId, STANDBY_BUCKET_RARE, reason, nowElapsed, false); } } @@ -2123,8 +2141,15 @@ public class AppStandbyController Intent.ACTION_PACKAGE_ADDED.equals(action))) { if (intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) { maybeUnrestrictBuggyApp(pkgName, userId); - } else { + } else if (!Intent.ACTION_PACKAGE_ADDED.equals(action)) { clearAppIdleForPackage(pkgName, userId); + } else { + // Package was just added and it's not being replaced. + if (mAppsToRestoreToRare.contains(userId, pkgName)) { + restoreAppToRare(pkgName, userId, mInjector.elapsedRealtime(), + REASON_MAIN_DEFAULT | REASON_SUB_DEFAULT_APP_RESTORED); + mAppsToRestoreToRare.remove(userId, pkgName); + } } } } -- cgit v1.2.3-59-g8ed1b