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

Commit e2b6ed23 authored by Michael Mikhail's avatar Michael Mikhail
Browse files

Send all binder calls in MediaTimeoutListener to background thread.

Flag: EXEMPT bugfix
Bug: 364610391
Bug: 345304469
Test: atest MediaTimeoutListenerTest

Change-Id: Iee585c51c0d4ca8d4563481ddb45967aae6884a8
parent 4d96988c
Loading
Loading
Loading
Loading
+28 −18
Original line number Diff line number Diff line
@@ -16,12 +16,14 @@

package com.android.systemui.media.controls.domain.pipeline

import android.annotation.WorkerThread
import android.media.session.MediaController
import android.media.session.MediaSession
import android.media.session.PlaybackState
import android.os.SystemProperties
import com.android.internal.annotations.VisibleForTesting
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.media.controls.shared.model.MediaData
import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
@@ -32,6 +34,7 @@ import com.android.systemui.statusbar.NotificationMediaManager.isPlayingState
import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.systemui.util.time.SystemClock
import java.util.concurrent.Executor
import java.util.concurrent.TimeUnit
import javax.inject.Inject

@@ -49,6 +52,8 @@ class MediaTimeoutListener
@Inject
constructor(
    private val mediaControllerFactory: MediaControllerFactory,
    @Background private val bgExecutor: Executor,
    @Main private val uiExecutor: Executor,
    @Main private val mainExecutor: DelayableExecutor,
    private val logger: MediaTimeoutLogger,
    statusBarStateController: SysuiStatusBarStateController,
@@ -147,6 +152,7 @@ constructor(
        }

        reusedListener?.let {
            bgExecutor.execute {
                val wasPlaying = it.isPlaying()
                logger.logUpdateListener(key, wasPlaying)
                it.setMediaData(data)
@@ -163,6 +169,7 @@ constructor(
                        }
                    }
                }
            }
            return
        }

@@ -217,18 +224,20 @@ constructor(
            private set

        fun Int.isPlaying() = isPlayingState(this)

        fun isPlaying() = lastState?.state?.isPlaying() ?: false

        init {
            setMediaData(data)
            bgExecutor.execute { setMediaData(data) }
        }

        fun destroy() {
            mediaController?.unregisterCallback(this)
            bgExecutor.execute { mediaController?.unregisterCallback(this) }
            cancellation?.run()
            destroyed = true
        }

        @WorkerThread
        fun setMediaData(data: MediaData) {
            sessionToken = data.token
            destroyed = false
@@ -258,7 +267,7 @@ constructor(
            if (resumption == true) {
                // Some apps create a session when MBS is queried. We should unregister the
                // controller since it will no longer be valid, but don't cancel the timeout
                mediaController?.unregisterCallback(this)
                bgExecutor.execute { mediaController?.unregisterCallback(this) }
            } else {
                // For active controls, if the session is destroyed, clean up everything since we
                // will need to recreate it if this key is updated later
@@ -284,7 +293,7 @@ constructor(

            if ((!actionsSame || !playingStateSame) && state != null && dispatchEvents) {
                logger.logStateCallback(key)
                stateCallback.invoke(key, state)
                uiExecutor.execute { stateCallback.invoke(key, state) }
            }

            if (playingStateSame && !resumptionChanged) {
@@ -313,7 +322,7 @@ constructor(
                expireMediaTimeout(key, "playback started - $state, $key")
                timedOut = false
                if (dispatchEvents) {
                    timeoutCallback(key, timedOut)
                    uiExecutor.execute { timeoutCallback(key, timedOut) }
                }
            }
        }
@@ -391,6 +400,7 @@ constructor(
        var destroyed = false
        var expiration = Long.MAX_VALUE
            private set

        var cancellation: Runnable? = null
            private set

+83 −65

File changed.

Preview size limit exceeded, changes collapsed.

+2 −0
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ val Kosmos.mediaTimeoutListener by
    Kosmos.Fixture {
        MediaTimeoutListener(
            mediaControllerFactory = fakeMediaControllerFactory,
            bgExecutor = fakeExecutor,
            uiExecutor = fakeExecutor,
            mainExecutor = fakeExecutor,
            logger = MediaTimeoutLogger(logcatLogBuffer("MediaTimeoutLogBuffer")),
            statusBarStateController = statusBarStateController,