diff options
author | Michael Wachenschwanz <mwachens@google.com> | 2021-04-20 16:07:12 -0700 |
---|---|---|
committer | Michael Wachenschwanz <mwachens@google.com> | 2021-04-20 16:31:15 -0700 |
commit | 289f167929cccc74985cdb9dddbe8bfb25290a55 (patch) | |
tree | d5e013532c426eaa1d9e0d4fe6db299033aa619b | |
parent | 466a9e2b68e3e9805256a94e7b93aa0a3ee243d3 (diff) |
Handle STOPPED to PAUSED Usage events
UsageStatsService wrongly assumed a ACTIVITY_PAUSED event must be
preceded by a ACTIVITY_RESUMED event, but there are some scenarios where
it is possibly to go directly from STOPPED to PAUSED.
Fixes: 182007710
Test: manual (start a pip activity, turn off the screen, and turn it
back on. UsageStats logs should not report unexpected events.)
Test: atest android.app.usage.cts.UsageStatsTest
Change-Id: I609ecb574d8401ab597aa61ba7c3b9d1f4e66827
-rw-r--r-- | services/usage/java/com/android/server/usage/UsageStatsService.java | 67 |
1 files changed, 39 insertions, 28 deletions
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 309673d72dd4..ae53ca19ee6e 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -943,16 +943,7 @@ public class UsageStatsService extends SystemService implements .APP_USAGE_EVENT_OCCURRED__EVENT_TYPE__MOVE_TO_FOREGROUND); // check if this activity has already been resumed if (mVisibleActivities.get(event.mInstanceId) != null) break; - final String usageSourcePackage; - switch(mUsageSource) { - case USAGE_SOURCE_CURRENT_ACTIVITY: - usageSourcePackage = event.mPackage; - break; - case USAGE_SOURCE_TASK_ROOT_ACTIVITY: - default: - usageSourcePackage = event.mTaskRootPackage; - break; - } + final String usageSourcePackage = getUsageSourcePackage(event); try { mAppTimeLimit.noteUsageStart(usageSourcePackage, userId); } catch (IllegalArgumentException iae) { @@ -964,26 +955,34 @@ public class UsageStatsService extends SystemService implements mVisibleActivities.put(event.mInstanceId, resumedData); break; case Event.ACTIVITY_PAUSED: - final ActivityData pausedData = mVisibleActivities.get(event.mInstanceId); + ActivityData pausedData = mVisibleActivities.get(event.mInstanceId); if (pausedData == null) { - Slog.w(TAG, "Unexpected activity event reported! (" + event.mPackage - + "/" + event.mClass + " event : " + event.mEventType - + " instanceId : " + event.mInstanceId + ")"); - } else { - pausedData.lastEvent = Event.ACTIVITY_PAUSED; - if (event.mTaskRootPackage == null) { - // Task Root info is missing. Repair the event based on previous data - event.mTaskRootPackage = pausedData.mTaskRootPackage; - event.mTaskRootClass = pausedData.mTaskRootClass; + // Must have transitioned from Stopped/Destroyed to Paused state. + final String usageSourcePackage2 = getUsageSourcePackage(event); + try { + mAppTimeLimit.noteUsageStart(usageSourcePackage2, userId); + } catch (IllegalArgumentException iae) { + Slog.e(TAG, "Failed to note usage start", iae); } + pausedData = new ActivityData(event.mTaskRootPackage, event.mTaskRootClass, + usageSourcePackage2); + mVisibleActivities.put(event.mInstanceId, pausedData); + } else { + FrameworkStatsLog.write( + FrameworkStatsLog.APP_USAGE_EVENT_OCCURRED, + uid, + event.mPackage, + event.mClass, + FrameworkStatsLog + .APP_USAGE_EVENT_OCCURRED__EVENT_TYPE__MOVE_TO_BACKGROUND); + } + + pausedData.lastEvent = Event.ACTIVITY_PAUSED; + if (event.mTaskRootPackage == null) { + // Task Root info is missing. Repair the event based on previous data + event.mTaskRootPackage = pausedData.mTaskRootPackage; + event.mTaskRootClass = pausedData.mTaskRootClass; } - FrameworkStatsLog.write( - FrameworkStatsLog.APP_USAGE_EVENT_OCCURRED, - uid, - event.mPackage, - event.mClass, - FrameworkStatsLog - .APP_USAGE_EVENT_OCCURRED__EVENT_TYPE__MOVE_TO_BACKGROUND); break; case Event.ACTIVITY_DESTROYED: // Treat activity destroys like activity stops. @@ -993,7 +992,9 @@ public class UsageStatsService extends SystemService implements final ActivityData prevData = mVisibleActivities.removeReturnOld(event.mInstanceId); if (prevData == null) { - // The activity stop was already handled. + Slog.w(TAG, "Unexpected activity event reported! (" + event.mPackage + + "/" + event.mClass + " event : " + event.mEventType + + " instanceId : " + event.mInstanceId + ")"); return; } @@ -1059,6 +1060,16 @@ public class UsageStatsService extends SystemService implements } } + private String getUsageSourcePackage(Event event) { + switch(mUsageSource) { + case USAGE_SOURCE_CURRENT_ACTIVITY: + return event.mPackage; + case USAGE_SOURCE_TASK_ROOT_ACTIVITY: + default: + return event.mTaskRootPackage; + } + } + /** * Some events like FLUSH_TO_DISK need to be sent to all userId. * @param event |