summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Wachenschwanz <mwachens@google.com>2021-04-20 16:07:12 -0700
committerMichael Wachenschwanz <mwachens@google.com>2021-04-20 16:31:15 -0700
commit289f167929cccc74985cdb9dddbe8bfb25290a55 (patch)
treed5e013532c426eaa1d9e0d4fe6db299033aa619b
parent466a9e2b68e3e9805256a94e7b93aa0a3ee243d3 (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.java67
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