diff options
4 files changed, 52 insertions, 1 deletions
diff --git a/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java b/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java index 2ce85ee57205..8c06338560bf 100644 --- a/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java +++ b/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java @@ -136,6 +136,23 @@ public interface AppStandbyInternal { void restrictApp(@NonNull String packageName, int userId, @SystemForcedReasons int restrictReason); + /** + * Put the specified app in the + * {@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_RESTRICTED} + * bucket. If it has been used by the user recently, the restriction will delayed + * until an appropriate time. This should only be used in cases where + * {@link #restrictApp(String, int, int)} is not sufficient. + * + * @param mainReason The main reason for restricting the app. Must be either {@link + * android.app.usage.UsageStatsManager#REASON_MAIN_FORCED_BY_SYSTEM} or + * {@link android.app.usage.UsageStatsManager#REASON_MAIN_FORCED_BY_USER}. + * Calls providing any other value will be ignored. + * @param restrictReason The restrictReason for restricting the app. Should be one of the + * UsageStatsManager.REASON_SUB_FORCED_SYSTEM_FLAG_* reasons. + */ + void restrictApp(@NonNull String packageName, int userId, int mainReason, + @SystemForcedReasons int restrictReason); + void addActiveDeviceAdmin(String adminPkg, int userId); void setActiveAdminApps(Set<String> adminPkgs, int userId); 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 1a808c9b3c33..24f7b37aedac 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -1343,13 +1343,24 @@ public class AppStandbyController @Override public void restrictApp(@NonNull String packageName, int userId, @SystemForcedReasons int restrictReason) { + restrictApp(packageName, userId, REASON_MAIN_FORCED_BY_SYSTEM, restrictReason); + } + + @Override + public void restrictApp(@NonNull String packageName, int userId, int mainReason, + @SystemForcedReasons int restrictReason) { + if (mainReason != REASON_MAIN_FORCED_BY_SYSTEM + && mainReason != REASON_MAIN_FORCED_BY_USER) { + Slog.e(TAG, "Tried to restrict app " + packageName + " for an unsupported reason"); + return; + } // If the package is not installed, don't allow the bucket to be set. if (!mInjector.isPackageInstalled(packageName, 0, userId)) { Slog.e(TAG, "Tried to restrict uninstalled app: " + packageName); return; } - final int reason = REASON_MAIN_FORCED_BY_SYSTEM | (REASON_SUB_MASK & restrictReason); + final int reason = (REASON_MAIN_MASK & mainReason) | (REASON_SUB_MASK & restrictReason); final long nowElapsed = mInjector.elapsedRealtime(); final int bucket = mAllowRestrictedBucket ? STANDBY_BUCKET_RESTRICTED : STANDBY_BUCKET_RARE; setAppStandbyBucket(packageName, userId, bucket, reason, nowElapsed, false); diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java index 31781ec79203..1db7e9da0bcb 100644 --- a/core/java/android/app/usage/UsageStatsManager.java +++ b/core/java/android/app/usage/UsageStatsManager.java @@ -1104,6 +1104,14 @@ public final class UsageStatsManager { break; case REASON_MAIN_FORCED_BY_USER: sb.append("f"); + if (subReason > 0) { + // Although not expected and shouldn't happen, this could potentially have a + // sub-reason if the system tries to give a reason when applying the + // FORCED_BY_USER reason. The sub-reason is undefined (though most likely a + // REASON_SUB_FORCED_SYSTEM_FLAG_ sub-reason), but it's better to note it in the + // log than to exclude it altogether. + sb.append("-").append(Integer.toBinaryString(subReason)); + } break; case REASON_MAIN_PREDICTED: sb.append("p"); diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java index 624c3de650aa..86b162087f61 100644 --- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java @@ -1390,6 +1390,21 @@ public class AppStandbyControllerTests { } @Test + public void testRestrictApp_MainReason() throws Exception { + mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE, + REASON_MAIN_DEFAULT); + mInjector.mElapsedRealtime += 4 * RESTRICTED_THRESHOLD; + + mController.restrictApp(PACKAGE_1, USER_ID, REASON_MAIN_PREDICTED, 0); + // Call should be ignored. + assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController, PACKAGE_1)); + + mController.restrictApp(PACKAGE_1, USER_ID, REASON_MAIN_FORCED_BY_USER, 0); + // Call should go through + assertEquals(STANDBY_BUCKET_RESTRICTED, getStandbyBucket(mController, PACKAGE_1)); + } + + @Test public void testAddActiveDeviceAdmin() throws Exception { assertActiveAdmins(USER_ID, (String[]) null); assertActiveAdmins(USER_ID2, (String[]) null); |