diff options
| author | 2022-12-02 15:17:14 -0800 | |
|---|---|---|
| committer | 2022-12-09 07:36:01 -0800 | |
| commit | 4225f1ebf73cd0884384bf9c64f48aedc18f762e (patch) | |
| tree | 3b1a23e39f7d1eb388fa743e4597397e7c002948 | |
| parent | d5b9c7ddf526bf7a369bc85a82e9c203dc409046 (diff) | |
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
| -rw-r--r-- | apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java | 43 |
1 files 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 67d711c79b15..efa331afae91 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; @@ -452,6 +453,12 @@ public class AppStandbyController private final Map<String, String> 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<String> mAppsToRestoreToRare = new SparseSetArray<>(); + + /** * List of app-ids of system packages, populated on boot, when system services are ready. */ private final ArrayList<Integer> mSystemPackagesAppIds = new ArrayList<>(); @@ -1612,18 +1619,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); } } @@ -2125,8 +2143,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); + } } } } |