diff options
| -rw-r--r-- | services/usage/java/com/android/server/usage/UsageStatsService.java | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 27c383c283a1..bf46154caf3e 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -113,6 +113,7 @@ import com.android.internal.util.IndentingPrintWriter; import com.android.server.IoThread; import com.android.server.LocalServices; import com.android.server.SystemService; +import com.android.server.pm.UserManagerInternal; import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener; import com.android.server.utils.AlarmQueue; @@ -1063,6 +1064,18 @@ public class UsageStatsService extends SystemService implements synchronized (mReportedEvents) { LinkedList<Event> events = mReportedEvents.get(userId); if (events == null) { + // TODO (b/347644400): callers of this API should verify that the userId passed to + // this method exists - there is currently a known case where USER_ALL is passed + // here and it would be added to the queue, never to be flushed correctly. The logic + // below should only remain as a last-resort catch-all fix. + final UserManagerInternal umi = LocalServices.getService(UserManagerInternal.class); + if (umi == null || (umi != null && !umi.exists(userId))) { + // The userId passed is a non-existent user so don't report the event. + Slog.wtf(TAG, "Attempted to report event for non-existent user " + userId + + " (" + event.mPackage + "/" + event.mClass + + " eventType:" + event.mEventType + ")"); + return; + } events = new LinkedList<>(); mReportedEvents.put(userId, events); } |