summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Amith Yamasani <yamasani@google.com> 2018-03-25 21:55:50 -0700
committer Amith Yamasani <yamasani@google.com> 2018-03-25 21:55:50 -0700
commit7f53c7bc975041cb3ba1be7a1e33d305abaf1ddf (patch)
tree4d4f2285f0d538135ab36bac454f293941fe2d59
parent6da53af9c55ba2231cd2f47c7dffb150f2c22a89 (diff)
Shorter bucket elevation for system_interaction and sync_adapter
Don't keep the app in ACTIVE for too long after an indirect use of the app. Also don't mark as used, so bucketing algorithm can override quickly. Bug: 74340258 Test: atest AppStandbyControllerTests Change-Id: I3b8014873aaf881de07304b64039da211a63a525
-rw-r--r--services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java26
-rw-r--r--services/usage/java/com/android/server/usage/AppStandbyController.java34
2 files changed, 54 insertions, 6 deletions
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 552c915f8480..601999dde84b 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
@@ -19,6 +19,7 @@ package com.android.server.usage;
import static android.app.usage.UsageEvents.Event.NOTIFICATION_SEEN;
import static android.app.usage.UsageEvents.Event.SLICE_PINNED;
import static android.app.usage.UsageEvents.Event.SLICE_PINNED_PRIV;
+import static android.app.usage.UsageEvents.Event.SYSTEM_INTERACTION;
import static android.app.usage.UsageEvents.Event.USER_INTERACTION;
import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT;
import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED;
@@ -569,6 +570,31 @@ public class AppStandbyControllerTests {
}
@Test
+ public void testSystemInteractionTimeout() throws Exception {
+ setChargingState(mController, false);
+
+ reportEvent(mController, USER_INTERACTION, 0);
+ // Fast forward to RARE
+ mInjector.mElapsedRealtime = RARE_THRESHOLD + 100;
+ mController.checkIdleStates(USER_ID);
+ assertBucket(STANDBY_BUCKET_RARE);
+
+ // Trigger a SYSTEM_INTERACTION and verify bucket
+ reportEvent(mController, SYSTEM_INTERACTION, mInjector.mElapsedRealtime);
+ assertBucket(STANDBY_BUCKET_ACTIVE);
+
+ // Verify it's still in ACTIVE close to end of timeout
+ mInjector.mElapsedRealtime += mController.mSystemInteractionTimeoutMillis - 100;
+ mController.checkIdleStates(USER_ID);
+ assertBucket(STANDBY_BUCKET_ACTIVE);
+
+ // Verify bucket moves to RARE after timeout
+ mInjector.mElapsedRealtime += 200;
+ mController.checkIdleStates(USER_ID);
+ assertBucket(STANDBY_BUCKET_RARE);
+ }
+
+ @Test
public void testPredictionNotOverridden() throws Exception {
setChargingState(mController, false);
diff --git a/services/usage/java/com/android/server/usage/AppStandbyController.java b/services/usage/java/com/android/server/usage/AppStandbyController.java
index 1af5f469c0f0..9139a4cd7c1a 100644
--- a/services/usage/java/com/android/server/usage/AppStandbyController.java
+++ b/services/usage/java/com/android/server/usage/AppStandbyController.java
@@ -198,6 +198,10 @@ public class AppStandbyController {
long mSystemUpdateUsageTimeoutMillis;
/** Maximum time to wait for a prediction before using simple timeouts to downgrade buckets. */
long mPredictionTimeoutMillis;
+ /** Maximum time a sync adapter associated with a CP should keep the buckets elevated. */
+ long mSyncAdapterTimeoutMillis;
+ /** Maximum time a system interaction should keep the buckets elevated. */
+ long mSystemInteractionTimeoutMillis;
volatile boolean mAppIdleEnabled;
boolean mAppIdleTempParoled;
@@ -357,8 +361,8 @@ public class AppStandbyController {
synchronized (mAppIdleLock) {
AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId,
STANDBY_BUCKET_ACTIVE, REASON_SUB_USAGE_SYNC_ADAPTER,
- elapsedRealtime,
- elapsedRealtime + mStrongUsageTimeoutMillis);
+ 0,
+ elapsedRealtime + mSyncAdapterTimeoutMillis);
maybeInformListeners(packageName, userId, elapsedRealtime,
appUsage.currentBucket, appUsage.bucketingReason, false);
}
@@ -708,7 +712,11 @@ public class AppStandbyController {
STANDBY_BUCKET_WORKING_SET, subReason,
0, elapsedRealtime + mNotificationSeenTimeoutMillis);
nextCheckTime = mNotificationSeenTimeoutMillis;
-
+ } else if (event.mEventType == UsageEvents.Event.SYSTEM_INTERACTION) {
+ mAppIdleHistory.reportUsage(appHistory, event.mPackage,
+ STANDBY_BUCKET_ACTIVE, subReason,
+ 0, elapsedRealtime + mSystemInteractionTimeoutMillis);
+ nextCheckTime = mSystemInteractionTimeoutMillis;
} else {
mAppIdleHistory.reportUsage(appHistory, event.mPackage,
STANDBY_BUCKET_ACTIVE, subReason,
@@ -1523,6 +1531,14 @@ public class AppStandbyController {
private static final String KEY_SYSTEM_UPDATE_HOLD_DURATION =
"system_update_usage_duration";
private static final String KEY_PREDICTION_TIMEOUT = "prediction_timeout";
+ private static final String KEY_SYNC_ADAPTER_HOLD_DURATION = "sync_adapter_duration";
+ private static final String KEY_SYSTEM_INTERACTION_HOLD_DURATION =
+ "system_interaction_duration";
+ 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;
+ public static final long DEFAULT_SYSTEM_INTERACTION_TIMEOUT = 10 * ONE_MINUTE;
+ public static final long DEFAULT_SYNC_ADAPTER_TIMEOUT = 10 * ONE_MINUTE;
private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -1585,16 +1601,22 @@ public class AppStandbyController {
COMPRESS_TIME ? ONE_MINUTE : 4 * 60 * ONE_MINUTE); // 4 hours
mStrongUsageTimeoutMillis = mParser.getDurationMillis
(KEY_STRONG_USAGE_HOLD_DURATION,
- COMPRESS_TIME ? ONE_MINUTE : 1 * ONE_HOUR);
+ COMPRESS_TIME ? ONE_MINUTE : DEFAULT_STRONG_USAGE_TIMEOUT);
mNotificationSeenTimeoutMillis = mParser.getDurationMillis
(KEY_NOTIFICATION_SEEN_HOLD_DURATION,
- COMPRESS_TIME ? 12 * ONE_MINUTE : 12 * ONE_HOUR);
+ COMPRESS_TIME ? 12 * ONE_MINUTE : DEFAULT_NOTIFICATION_TIMEOUT);
mSystemUpdateUsageTimeoutMillis = mParser.getDurationMillis
(KEY_SYSTEM_UPDATE_HOLD_DURATION,
- COMPRESS_TIME ? 2 * ONE_MINUTE : 2 * ONE_HOUR);
+ COMPRESS_TIME ? 2 * ONE_MINUTE : DEFAULT_SYSTEM_UPDATE_TIMEOUT);
mPredictionTimeoutMillis = mParser.getDurationMillis
(KEY_PREDICTION_TIMEOUT,
COMPRESS_TIME ? 10 * ONE_MINUTE : DEFAULT_PREDICTION_TIMEOUT);
+ mSyncAdapterTimeoutMillis = mParser.getDurationMillis
+ (KEY_SYNC_ADAPTER_HOLD_DURATION,
+ COMPRESS_TIME ? ONE_MINUTE : DEFAULT_SYNC_ADAPTER_TIMEOUT);
+ mSystemInteractionTimeoutMillis = mParser.getDurationMillis
+ (KEY_SYSTEM_INTERACTION_HOLD_DURATION,
+ COMPRESS_TIME ? ONE_MINUTE : DEFAULT_SYSTEM_INTERACTION_TIMEOUT);
}
}