summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Michael Wachenschwanz <mwachens@google.com> 2020-02-10 12:47:53 -0800
committer Michael Wachenschwanz <mwachens@google.com> 2020-02-11 11:16:22 -0800
commit081ce5dfc87ef9af6eec00ab03a4f9c3a65f640a (patch)
tree84dc1c654415971cd50cfdfa0271fda87a59c04b
parente38348d68bdf4a847573d87ca24510ece6b6f655 (diff)
Move AppStandbyController synchronous event reporting logic
Bug: 140808123 Test: atest com.android.server.usage.AppStandbyControllerTests Change-Id: If8b79ff7703ebc598ddfbdb636c05de35b06d6e9
-rw-r--r--apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java174
1 files changed, 87 insertions, 87 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 b1b8fba78ab9..d221559451cf 100644
--- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
+++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
@@ -396,12 +396,9 @@ public class AppStandbyController implements AppStandbyInternal {
}
if (!packageName.equals(providerPkgName)) {
synchronized (mAppIdleLock) {
- AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId,
- STANDBY_BUCKET_ACTIVE, REASON_SUB_USAGE_SYNC_ADAPTER,
- 0,
- elapsedRealtime + mSyncAdapterTimeoutMillis);
- maybeInformListeners(packageName, userId, elapsedRealtime,
- appUsage.currentBucket, appUsage.bucketingReason, false);
+ reportNoninteractiveUsageLocked(packageName, userId, STANDBY_BUCKET_ACTIVE,
+ REASON_SUB_USAGE_SYNC_ADAPTER, elapsedRealtime,
+ mSyncAdapterTimeoutMillis);
}
}
} catch (PackageManager.NameNotFoundException e) {
@@ -432,12 +429,8 @@ public class AppStandbyController implements AppStandbyInternal {
final long elapsedRealtime = mInjector.elapsedRealtime();
synchronized (mAppIdleLock) {
- AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId,
- bucketToPromote, usageReason,
- 0,
- elapsedRealtime + durationMillis);
- maybeInformListeners(packageName, userId, elapsedRealtime,
- appUsage.currentBucket, appUsage.bucketingReason, false);
+ reportNoninteractiveUsageLocked(packageName, userId, bucketToPromote,
+ usageReason, elapsedRealtime, durationMillis);
}
}
@@ -450,12 +443,9 @@ public class AppStandbyController implements AppStandbyInternal {
mAppIdleHistory.getAppStandbyBucket(packageName, userId, elapsedRealtime);
if (currentBucket == STANDBY_BUCKET_NEVER) {
// Bring the app out of the never bucket
- AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId,
- STANDBY_BUCKET_WORKING_SET, REASON_SUB_USAGE_UNEXEMPTED_SYNC_SCHEDULED,
- 0,
- elapsedRealtime + mUnexemptedSyncScheduledTimeoutMillis);
- maybeInformListeners(packageName, userId, elapsedRealtime,
- appUsage.currentBucket, appUsage.bucketingReason, false);
+ reportNoninteractiveUsageLocked(packageName, userId, STANDBY_BUCKET_WORKING_SET,
+ REASON_SUB_USAGE_UNEXEMPTED_SYNC_SCHEDULED, elapsedRealtime,
+ mUnexemptedSyncScheduledTimeoutMillis);
}
}
}
@@ -466,15 +456,23 @@ public class AppStandbyController implements AppStandbyInternal {
final long elapsedRealtime = mInjector.elapsedRealtime();
synchronized (mAppIdleLock) {
- AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId,
- STANDBY_BUCKET_ACTIVE, REASON_SUB_USAGE_EXEMPTED_SYNC_START,
- 0,
- elapsedRealtime + mExemptedSyncStartTimeoutMillis);
- maybeInformListeners(packageName, userId, elapsedRealtime,
- appUsage.currentBucket, appUsage.bucketingReason, false);
+ reportNoninteractiveUsageLocked(packageName, userId, STANDBY_BUCKET_ACTIVE,
+ REASON_SUB_USAGE_EXEMPTED_SYNC_START, elapsedRealtime,
+ mExemptedSyncStartTimeoutMillis);
}
}
+ private void reportNoninteractiveUsageLocked(String packageName, int userId, int bucket,
+ int subReason, long elapsedRealtime, long nextCheckDelay) {
+ final AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId, bucket,
+ subReason, 0, elapsedRealtime + nextCheckDelay);
+ mHandler.sendMessageDelayed(
+ mHandler.obtainMessage(MSG_CHECK_PACKAGE_IDLE_STATE, userId, -1, packageName),
+ nextCheckDelay);
+ maybeInformListeners(packageName, userId, elapsedRealtime, appUsage.currentBucket,
+ appUsage.bucketingReason, false);
+ }
+
@Override
public void postCheckIdleStates(int userId) {
mHandler.sendMessage(mHandler.obtainMessage(MSG_CHECK_IDLE_STATES, userId, 0));
@@ -699,73 +697,75 @@ public class AppStandbyController implements AppStandbyInternal {
@Override
public void reportEvent(UsageEvents.Event event, long elapsedRealtime, int userId) {
if (!mAppIdleEnabled) return;
- synchronized (mAppIdleLock) {
- final String pkg = event.getPackageName();
- final int eventType = event.getEventType();
- // TODO: Ideally this should call isAppIdleFiltered() to avoid calling back
- // about apps that are on some kind of whitelist anyway.
- final boolean previouslyIdle = mAppIdleHistory.isIdle(
- pkg, userId, elapsedRealtime);
- // Inform listeners if necessary
- if ((eventType == UsageEvents.Event.ACTIVITY_RESUMED
- || eventType == UsageEvents.Event.ACTIVITY_PAUSED
- || eventType == UsageEvents.Event.SYSTEM_INTERACTION
- || eventType == UsageEvents.Event.USER_INTERACTION
- || eventType == UsageEvents.Event.NOTIFICATION_SEEN
- || eventType == UsageEvents.Event.SLICE_PINNED
- || eventType == UsageEvents.Event.SLICE_PINNED_PRIV
- || eventType == UsageEvents.Event.FOREGROUND_SERVICE_START)) {
-
- final AppUsageHistory appHistory = mAppIdleHistory.getAppUsageHistory(
- pkg, userId, elapsedRealtime);
- final int prevBucket = appHistory.currentBucket;
- final int prevBucketReason = appHistory.bucketingReason;
- final long nextCheckTime;
- final int subReason = usageEventToSubReason(eventType);
- final int reason = REASON_MAIN_USAGE | subReason;
- if (eventType == UsageEvents.Event.NOTIFICATION_SEEN
- || eventType == UsageEvents.Event.SLICE_PINNED) {
- // Mild usage elevates to WORKING_SET but doesn't change usage time.
- mAppIdleHistory.reportUsage(appHistory, pkg,
- STANDBY_BUCKET_WORKING_SET, subReason,
- 0, elapsedRealtime + mNotificationSeenTimeoutMillis);
- nextCheckTime = mNotificationSeenTimeoutMillis;
- } else if (eventType == UsageEvents.Event.SYSTEM_INTERACTION) {
- mAppIdleHistory.reportUsage(appHistory, pkg,
- STANDBY_BUCKET_ACTIVE, subReason,
- 0, elapsedRealtime + mSystemInteractionTimeoutMillis);
- nextCheckTime = mSystemInteractionTimeoutMillis;
- } else if (eventType == UsageEvents.Event.FOREGROUND_SERVICE_START) {
- // Only elevate bucket if this is the first usage of the app
- if (prevBucket != STANDBY_BUCKET_NEVER) return;
- mAppIdleHistory.reportUsage(appHistory, pkg,
- STANDBY_BUCKET_ACTIVE, subReason,
- 0, elapsedRealtime + mInitialForegroundServiceStartTimeoutMillis);
- nextCheckTime = mInitialForegroundServiceStartTimeoutMillis;
- } else {
- mAppIdleHistory.reportUsage(appHistory, pkg,
- STANDBY_BUCKET_ACTIVE, subReason,
- elapsedRealtime, elapsedRealtime + mStrongUsageTimeoutMillis);
- nextCheckTime = mStrongUsageTimeoutMillis;
- }
- if (appHistory.currentBucket != prevBucket) {
- mHandler.sendMessageDelayed(
- mHandler.obtainMessage(MSG_CHECK_PACKAGE_IDLE_STATE, userId, -1, pkg),
- nextCheckTime);
- final boolean userStartedInteracting =
- appHistory.currentBucket == STANDBY_BUCKET_ACTIVE
- && (prevBucketReason & REASON_MAIN_MASK) != REASON_MAIN_USAGE;
- maybeInformListeners(pkg, userId, elapsedRealtime,
- appHistory.currentBucket, reason, userStartedInteracting);
- }
-
- if (previouslyIdle) {
- notifyBatteryStats(pkg, userId, false);
- }
+ final int eventType = event.getEventType();
+ if ((eventType == UsageEvents.Event.ACTIVITY_RESUMED
+ || eventType == UsageEvents.Event.ACTIVITY_PAUSED
+ || eventType == UsageEvents.Event.SYSTEM_INTERACTION
+ || eventType == UsageEvents.Event.USER_INTERACTION
+ || eventType == UsageEvents.Event.NOTIFICATION_SEEN
+ || eventType == UsageEvents.Event.SLICE_PINNED
+ || eventType == UsageEvents.Event.SLICE_PINNED_PRIV
+ || eventType == UsageEvents.Event.FOREGROUND_SERVICE_START)) {
+ synchronized (mAppIdleLock) {
+ reportEventLocked(event.getPackageName(), eventType, elapsedRealtime, userId);
}
}
}
+ private void reportEventLocked(String pkg, int eventType, long elapsedRealtime, int userId) {
+ // TODO: Ideally this should call isAppIdleFiltered() to avoid calling back
+ // about apps that are on some kind of whitelist anyway.
+ final boolean previouslyIdle = mAppIdleHistory.isIdle(
+ pkg, userId, elapsedRealtime);
+
+ final AppUsageHistory appHistory = mAppIdleHistory.getAppUsageHistory(
+ pkg, userId, elapsedRealtime);
+ final int prevBucket = appHistory.currentBucket;
+ final int prevBucketReason = appHistory.bucketingReason;
+ final long nextCheckDelay;
+ final int subReason = usageEventToSubReason(eventType);
+ final int reason = REASON_MAIN_USAGE | subReason;
+ if (eventType == UsageEvents.Event.NOTIFICATION_SEEN
+ || eventType == UsageEvents.Event.SLICE_PINNED) {
+ // Mild usage elevates to WORKING_SET but doesn't change usage time.
+ mAppIdleHistory.reportUsage(appHistory, pkg,
+ STANDBY_BUCKET_WORKING_SET, subReason,
+ 0, elapsedRealtime + mNotificationSeenTimeoutMillis);
+ nextCheckDelay = mNotificationSeenTimeoutMillis;
+ } else if (eventType == UsageEvents.Event.SYSTEM_INTERACTION) {
+ mAppIdleHistory.reportUsage(appHistory, pkg,
+ STANDBY_BUCKET_ACTIVE, subReason,
+ 0, elapsedRealtime + mSystemInteractionTimeoutMillis);
+ nextCheckDelay = mSystemInteractionTimeoutMillis;
+ } else if (eventType == UsageEvents.Event.FOREGROUND_SERVICE_START) {
+ // Only elevate bucket if this is the first usage of the app
+ if (prevBucket != STANDBY_BUCKET_NEVER) return;
+ mAppIdleHistory.reportUsage(appHistory, pkg,
+ STANDBY_BUCKET_ACTIVE, subReason,
+ 0, elapsedRealtime + mInitialForegroundServiceStartTimeoutMillis);
+ nextCheckDelay = mInitialForegroundServiceStartTimeoutMillis;
+ } else {
+ mAppIdleHistory.reportUsage(appHistory, pkg,
+ STANDBY_BUCKET_ACTIVE, subReason,
+ elapsedRealtime, elapsedRealtime + mStrongUsageTimeoutMillis);
+ nextCheckDelay = mStrongUsageTimeoutMillis;
+ }
+ if (appHistory.currentBucket != prevBucket) {
+ mHandler.sendMessageDelayed(
+ mHandler.obtainMessage(MSG_CHECK_PACKAGE_IDLE_STATE, userId, -1, pkg),
+ nextCheckDelay);
+ final boolean userStartedInteracting =
+ appHistory.currentBucket == STANDBY_BUCKET_ACTIVE
+ && (prevBucketReason & REASON_MAIN_MASK) != REASON_MAIN_USAGE;
+ maybeInformListeners(pkg, userId, elapsedRealtime,
+ appHistory.currentBucket, reason, userStartedInteracting);
+ }
+
+ if (previouslyIdle) {
+ notifyBatteryStats(pkg, userId, false);
+ }
+ }
+
private int usageEventToSubReason(int eventType) {
switch (eventType) {
case UsageEvents.Event.ACTIVITY_RESUMED: return REASON_SUB_USAGE_MOVE_TO_FOREGROUND;