Loading packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListener.kt +26 −18 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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, Loading Loading @@ -147,6 +152,7 @@ constructor( } reusedListener?.let { bgExecutor.execute { val wasPlaying = it.isPlaying() logger.logUpdateListener(key, wasPlaying) it.setMediaData(data) Loading @@ -163,6 +169,7 @@ constructor( } } } } return } Loading Loading @@ -221,15 +228,16 @@ constructor( 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 Loading Loading @@ -259,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 Loading @@ -285,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) { Loading Loading @@ -314,7 +322,7 @@ constructor( expireMediaTimeout(key, "playback started - $state, $key") timedOut = false if (dispatchEvents) { timeoutCallback(key, timedOut) uiExecutor.execute { timeoutCallback(key, timedOut) } } } } Loading packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListenerTest.kt +83 −65 File changed.Preview size limit exceeded, changes collapsed. Show changes packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListenerKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading
packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListener.kt +26 −18 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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, Loading Loading @@ -147,6 +152,7 @@ constructor( } reusedListener?.let { bgExecutor.execute { val wasPlaying = it.isPlaying() logger.logUpdateListener(key, wasPlaying) it.setMediaData(data) Loading @@ -163,6 +169,7 @@ constructor( } } } } return } Loading Loading @@ -221,15 +228,16 @@ constructor( 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 Loading Loading @@ -259,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 Loading @@ -285,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) { Loading Loading @@ -314,7 +322,7 @@ constructor( expireMediaTimeout(key, "playback started - $state, $key") timedOut = false if (dispatchEvents) { timeoutCallback(key, timedOut) uiExecutor.execute { timeoutCallback(key, timedOut) } } } } Loading
packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListenerTest.kt +83 −65 File changed.Preview size limit exceeded, changes collapsed. Show changes
packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListenerKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -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, Loading