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
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user