diff options
| author | 2022-12-02 15:17:14 -0800 | |
|---|---|---|
| committer | 2022-12-09 18:45:50 +0000 | |
| commit | b5e796bb7446f2e7130200bb2896b3558dcf5df5 (patch) | |
| tree | 563c2f74012d9e72c8a2f53d6a3c1f535ee1d4fe | |
| parent | 37e943894d3e434543aa8fcfcf7df3154aa3c3d5 (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
(cherry picked from commit 4225f1ebf73cd0884384bf9c64f48aedc18f762e)
| -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 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; @@ -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<>(); @@ -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); + } } } } |