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

Commit 147a9fb5 authored by Jernej Virag's avatar Jernej Virag Committed by Automerger Merge Worker
Browse files

Merge "Do not keep MediaSession Tokens for Notification accounting" into tm-qpr-dev am: 4d3ec5c8

parents ac7f50eb 4d3ec5c8
Loading
Loading
Loading
Loading
+17 −8
Original line number Diff line number Diff line
@@ -58,10 +58,10 @@ constructor(

    // Keep track of the key used for the session tokens. This information is used to know when to
    // dispatch a removed event so that a media object for a local session will be removed.
    private val keyedTokens: MutableMap<String, MutableSet<MediaSession.Token>> = mutableMapOf()
    private val keyedTokens: MutableMap<String, MutableSet<TokenId>> = mutableMapOf()

    // Keep track of which media session tokens have associated notifications.
    private val tokensWithNotifications: MutableSet<MediaSession.Token> = mutableSetOf()
    private val tokensWithNotifications: MutableSet<TokenId> = mutableSetOf()

    private val sessionListener =
        object : MediaSessionManager.OnActiveSessionsChangedListener {
@@ -101,15 +101,15 @@ constructor(
        isSsReactivated: Boolean
    ) {
        backgroundExecutor.execute {
            data.token?.let { tokensWithNotifications.add(it) }
            data.token?.let { tokensWithNotifications.add(TokenId(it)) }
            val isMigration = oldKey != null && key != oldKey
            if (isMigration) {
                keyedTokens.remove(oldKey)?.let { removed -> keyedTokens.put(key, removed) }
            }
            if (data.token != null) {
                keyedTokens.get(key)?.let { tokens -> tokens.add(data.token) }
                keyedTokens.get(key)?.let { tokens -> tokens.add(TokenId(data.token)) }
                    ?: run {
                        val tokens = mutableSetOf(data.token)
                        val tokens = mutableSetOf(TokenId(data.token))
                        keyedTokens.put(key, tokens)
                    }
            }
@@ -125,7 +125,7 @@ constructor(
                isMigration ||
                    remote == null ||
                    remote.sessionToken == data.token ||
                    !tokensWithNotifications.contains(remote.sessionToken)
                    !tokensWithNotifications.contains(TokenId(remote.sessionToken))
            ) {
                // Not filtering in this case. Passing the event along to listeners.
                dispatchMediaDataLoaded(key, oldKey, data, immediately)
@@ -136,7 +136,7 @@ constructor(
                // If the local session uses a different notification key, then lets go a step
                // farther and dismiss the media data so that media controls for the local session
                // don't hang around while casting.
                if (!keyedTokens.get(key)!!.contains(remote.sessionToken)) {
                if (!keyedTokens.get(key)!!.contains(TokenId(remote.sessionToken))) {
                    dispatchMediaDataRemoved(key)
                }
            }
@@ -199,6 +199,15 @@ constructor(
                    packageControllers.put(controller.packageName, tokens)
                }
        }
        tokensWithNotifications.retainAll(controllers.map { it.sessionToken })
        tokensWithNotifications.retainAll(controllers.map { TokenId(it.sessionToken) })
    }

    /**
     * Represents a unique identifier for a [MediaSession.Token].
     *
     * It's used to avoid storing strong binders for media session tokens.
     */
    private data class TokenId(val id: Int) {
        constructor(token: MediaSession.Token) : this(token.hashCode())
    }
}