Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fd912c06 authored by Michael Wachenschwanz's avatar Michael Wachenschwanz
Browse files

Handle mismatched task root on Activity resume and stop

It is possible for UsageStats to recieve activity resume and stop events
for the same activity, that have different task roots. Change UsageStats
to report usage start/stop to AppTimeLimitController using only the
package name on Activity pause.

Fixes: 169970833
Test: atest android.app.usage.cts.UsageStatsTest
Change-Id: Ie0ff4a18bf2001f72f637cc1687b7bd0a5afa85e
parent 49ae1cbd
Loading
Loading
Loading
Loading
+19 −23
Original line number Diff line number Diff line
@@ -182,10 +182,12 @@ public class UsageStatsService extends SystemService implements
    private static class ActivityData {
        private final String mTaskRootPackage;
        private final String mTaskRootClass;
        private final String mUsageSourcePackage;
        public int lastEvent = Event.NONE;
        private ActivityData(String taskRootPackage, String taskRootClass) {
        private ActivityData(String taskRootPackage, String taskRootClass, String sourcePackage) {
            mTaskRootPackage = taskRootPackage;
            mTaskRootClass = taskRootClass;
            mUsageSourcePackage = sourcePackage;
        }
    }

@@ -818,23 +820,25 @@ 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 ActivityData resumedData = new ActivityData(event.mTaskRootPackage,
                            event.mTaskRootClass);
                    resumedData.lastEvent = Event.ACTIVITY_RESUMED;
                    mVisibleActivities.put(event.mInstanceId, resumedData);
                    try {
                    final String usageSourcePackage;
                    switch(mUsageSource) {
                        case USAGE_SOURCE_CURRENT_ACTIVITY:
                                mAppTimeLimit.noteUsageStart(event.mPackage, userId);
                            usageSourcePackage = event.mPackage;
                            break;
                        case USAGE_SOURCE_TASK_ROOT_ACTIVITY:
                        default:
                                mAppTimeLimit.noteUsageStart(event.mTaskRootPackage, userId);
                            usageSourcePackage = event.mTaskRootPackage;
                            break;
                    }
                    try {
                        mAppTimeLimit.noteUsageStart(usageSourcePackage, userId);
                    } catch (IllegalArgumentException iae) {
                        Slog.e(TAG, "Failed to note usage start", iae);
                    }
                    final ActivityData resumedData = new ActivityData(event.mTaskRootPackage,
                            event.mTaskRootClass, usageSourcePackage);
                    resumedData.lastEvent = Event.ACTIVITY_RESUMED;
                    mVisibleActivities.put(event.mInstanceId, resumedData);
                    break;
                case Event.ACTIVITY_PAUSED:
                    final ActivityData pausedData = mVisibleActivities.get(event.mInstanceId);
@@ -906,15 +910,7 @@ public class UsageStatsService extends SystemService implements
                        event.mTaskRootClass = prevData.mTaskRootClass;
                    }
                    try {
                        switch(mUsageSource) {
                            case USAGE_SOURCE_CURRENT_ACTIVITY:
                                mAppTimeLimit.noteUsageStop(event.mPackage, userId);
                                break;
                            case USAGE_SOURCE_TASK_ROOT_ACTIVITY:
                            default:
                                mAppTimeLimit.noteUsageStop(event.mTaskRootPackage, userId);
                                break;
                        }
                        mAppTimeLimit.noteUsageStop(prevData.mUsageSourcePackage, userId);
                    } catch (IllegalArgumentException iae) {
                        Slog.w(TAG, "Failed to note usage stop", iae);
                    }