diff options
| -rw-r--r-- | services/core/java/com/android/server/media/MediaSessionService.java | 53 |
1 files changed, 30 insertions, 23 deletions
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index 8cb5cef38ec6..f97f6d2350bc 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -105,6 +105,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -151,7 +152,9 @@ public class MediaSessionService extends SystemService implements Monitor { private boolean mHasFeatureLeanback; private ActivityManagerInternal mActivityManagerInternal; private UsageStatsManagerInternal mUsageStatsManagerInternal; - private final Set<Integer> mUserEngagingSessions = new HashSet<>(); + + /* Maps uid with all user engaging session tokens associated to it */ + private final Map<Integer, Set<MediaSession.Token>> mUserEngagingSessions = new HashMap<>(); // The FullUserRecord of the current users. (i.e. The foreground user that isn't a profile) // It's always not null after the MediaSessionService is started. @@ -615,32 +618,36 @@ public class MediaSessionService extends SystemService implements Monitor { } private void reportMediaInteractionEvent(MediaSessionRecordImpl record, boolean userEngaged) { - if (!android.app.usage.Flags.userInteractionTypeApi()) { - return; - } + if (!android.app.usage.Flags.userInteractionTypeApi() + || !(record instanceof MediaSessionRecord)) { + return; + } - String packageName = record.getPackageName(); - int sessionUid = record.getUid(); - String actionToLog = null; - if (userEngaged) { - if (!mUserEngagingSessions.contains(sessionUid)) { - actionToLog = "start"; - } - mUserEngagingSessions.add(sessionUid); - } else { - if (mUserEngagingSessions.contains(sessionUid)) { - actionToLog = "stop"; - } + String packageName = record.getPackageName(); + int sessionUid = record.getUid(); + String actionToLog = null; + MediaSession.Token token = ((MediaSessionRecord) record).getSessionToken(); + if (userEngaged) { + if (!mUserEngagingSessions.containsKey(sessionUid)) { + mUserEngagingSessions.put(sessionUid, new HashSet<>()); + actionToLog = "start"; + } + mUserEngagingSessions.get(sessionUid).add(token); + } else if (mUserEngagingSessions.containsKey(sessionUid)) { + mUserEngagingSessions.get(sessionUid).remove(token); + if (mUserEngagingSessions.get(sessionUid).isEmpty()) { + actionToLog = "stop"; mUserEngagingSessions.remove(sessionUid); } + } - if (actionToLog != null) { - PersistableBundle extras = new PersistableBundle(); - extras.putString(UsageStatsManager.EXTRA_EVENT_CATEGORY, "android.media"); - extras.putString(UsageStatsManager.EXTRA_EVENT_ACTION, actionToLog); - mUsageStatsManagerInternal.reportUserInteractionEvent( - packageName, record.getUserId(), extras); - } + if (actionToLog != null) { + PersistableBundle extras = new PersistableBundle(); + extras.putString(UsageStatsManager.EXTRA_EVENT_CATEGORY, "android.media"); + extras.putString(UsageStatsManager.EXTRA_EVENT_ACTION, actionToLog); + mUsageStatsManagerInternal.reportUserInteractionEvent( + packageName, record.getUserId(), extras); + } } void tempAllowlistTargetPkgIfPossible(int targetUid, String targetPackage, |