Making the auto restricted delay configurable.

Make the delay from last user usage to force apps into the restricted
bucket configurable.

Bug: 145551233
Test: atest FrameworksServicesTests:AppStandbyControllerTests
Change-Id: I561fe6e16f62268c07cee06b34bab0d7bbcad201
This commit is contained in:
Kweku Adams
2020-02-11 11:10:52 -08:00
parent 004e36da64
commit 109cd9cd03
2 changed files with 45 additions and 9 deletions

View File

@@ -665,7 +665,7 @@ public class AppStandbyController implements AppStandbyInternal {
if (app.lastRestrictAttemptElapsedTime > app.lastUsedByUserElapsedTime
&& elapsedTimeAdjusted - app.lastUsedByUserElapsedTime
>= mInjector.getRestrictedBucketDelayMs()) {
>= mInjector.getAutoRestrictedBucketDelayMs()) {
newBucket = STANDBY_BUCKET_RESTRICTED;
reason = app.lastRestrictReason;
if (DEBUG) {
@@ -1219,7 +1219,7 @@ public class AppStandbyController implements AppStandbyInternal {
}
} else {
final long timeUntilRestrictPossibleMs = app.lastUsedByUserElapsedTime
+ mInjector.getRestrictedBucketDelayMs() - elapsedRealtime;
+ mInjector.getAutoRestrictedBucketDelayMs() - elapsedRealtime;
if (timeUntilRestrictPossibleMs > 0) {
Slog.w(TAG, "Tried to restrict recently used app: " + packageName
+ " due to " + reason);
@@ -1566,10 +1566,9 @@ public class AppStandbyController implements AppStandbyInternal {
int mBootPhase;
/**
* The minimum amount of time required since the last user interaction before an app can be
* placed in the RESTRICTED bucket.
* automatically placed in the RESTRICTED bucket.
*/
// TODO: make configurable via DeviceConfig
private long mRestrictedBucketDelayMs = ONE_DAY;
long mAutoRestrictedBucketDelayMs = ONE_DAY;
Injector(Context context, Looper looper) {
mContext = context;
@@ -1598,7 +1597,7 @@ public class AppStandbyController implements AppStandbyInternal {
final ActivityManager activityManager =
(ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
if (activityManager.isLowRamDevice() || ActivityManager.isSmallBatteryDevice()) {
mRestrictedBucketDelayMs = 12 * ONE_HOUR;
mAutoRestrictedBucketDelayMs = 12 * ONE_HOUR;
}
}
mBootPhase = phase;
@@ -1639,8 +1638,13 @@ public class AppStandbyController implements AppStandbyInternal {
return Environment.getDataSystemDirectory();
}
long getRestrictedBucketDelayMs() {
return mRestrictedBucketDelayMs;
/**
* Return the minimum amount of time that must have passed since the last user usage before
* an app can be automatically put into the
* {@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_RESTRICTED} bucket.
*/
long getAutoRestrictedBucketDelayMs() {
return mAutoRestrictedBucketDelayMs;
}
void noteEvent(int event, String packageName, int uid) throws RemoteException {
@@ -1816,6 +1820,8 @@ public class AppStandbyController implements AppStandbyInternal {
"system_interaction_duration";
private static final String KEY_INITIAL_FOREGROUND_SERVICE_START_HOLD_DURATION =
"initial_foreground_service_start_duration";
private static final String KEY_AUTO_RESTRICTED_BUCKET_DELAY_MS =
"auto_restricted_bucket_delay_ms";
public static final long DEFAULT_STRONG_USAGE_TIMEOUT = 1 * ONE_HOUR;
public static final long DEFAULT_NOTIFICATION_TIMEOUT = 12 * ONE_HOUR;
public static final long DEFAULT_SYSTEM_UPDATE_TIMEOUT = 2 * ONE_HOUR;
@@ -1826,6 +1832,7 @@ public class AppStandbyController implements AppStandbyInternal {
public static final long DEFAULT_EXEMPTED_SYNC_START_TIMEOUT = 10 * ONE_MINUTE;
public static final long DEFAULT_UNEXEMPTED_SYNC_SCHEDULED_TIMEOUT = 10 * ONE_MINUTE;
public static final long DEFAULT_INITIAL_FOREGROUND_SERVICE_START_TIMEOUT = 30 * ONE_MINUTE;
public static final long DEFAULT_AUTO_RESTRICTED_BUCKET_DELAY_MS = ONE_DAY;
private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -1925,6 +1932,12 @@ public class AppStandbyController implements AppStandbyInternal {
KEY_INITIAL_FOREGROUND_SERVICE_START_HOLD_DURATION,
COMPRESS_TIME ? ONE_MINUTE :
DEFAULT_INITIAL_FOREGROUND_SERVICE_START_TIMEOUT);
mInjector.mAutoRestrictedBucketDelayMs = Math.max(
COMPRESS_TIME ? ONE_MINUTE : 2 * ONE_HOUR,
mParser.getDurationMillis(KEY_AUTO_RESTRICTED_BUCKET_DELAY_MS,
COMPRESS_TIME
? ONE_MINUTE : DEFAULT_AUTO_RESTRICTED_BUCKET_DELAY_MS));
}
// Check if app_idle_enabled has changed. Do this after getting the rest of the settings

View File

@@ -685,7 +685,30 @@ public class AppStandbyControllerTests {
reportEvent(mController, USER_INTERACTION, 0, PACKAGE_1);
assertBucket(STANDBY_BUCKET_ACTIVE);
mInjector.mElapsedRealtime += mInjector.getRestrictedBucketDelayMs() - 5000;
mInjector.mElapsedRealtime += mInjector.getAutoRestrictedBucketDelayMs() - 5000;
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RESTRICTED,
REASON_MAIN_FORCED_BY_SYSTEM);
// Bucket shouldn't change
assertBucket(STANDBY_BUCKET_ACTIVE);
// bucketing works after timeout
mInjector.mElapsedRealtime += 6000;
Thread.sleep(6000);
// Enough time has passed. The app should automatically be put into the RESTRICTED bucket.
assertBucket(STANDBY_BUCKET_RESTRICTED);
}
/**
* Test that an app is put into the RESTRICTED bucket after enough time has passed.
*/
@Test
public void testRestrictedDelay_DelayChange() throws Exception {
reportEvent(mController, USER_INTERACTION, 0, PACKAGE_1);
assertBucket(STANDBY_BUCKET_ACTIVE);
mInjector.mAutoRestrictedBucketDelayMs = 2 * HOUR_MS;
mInjector.mElapsedRealtime += 2 * HOUR_MS - 5000;
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RESTRICTED,
REASON_MAIN_FORCED_BY_SYSTEM);
// Bucket shouldn't change