diff options
| author | 2020-02-10 12:47:53 -0800 | |
|---|---|---|
| committer | 2020-02-11 11:16:22 -0800 | |
| commit | 081ce5dfc87ef9af6eec00ab03a4f9c3a65f640a (patch) | |
| tree | 84dc1c654415971cd50cfdfa0271fda87a59c04b | |
| parent | e38348d68bdf4a847573d87ca24510ece6b6f655 (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.java | 174 |
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; |