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

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

Fix turbulence noise logic

Flag: ACONFIG media_controls_refactor DEVELOPMENT
Bug: 340866094
Test: manually paused then played UMO.
Change-Id: I43acab2fa62838f828bd7ebcb015607db2c96f97
parent a481fc36
Loading
Loading
Loading
Loading
+0 −16
Original line number Diff line number Diff line
@@ -21,9 +21,7 @@ import android.app.BroadcastOptions
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.media.session.MediaController
import android.media.session.MediaSession
import android.media.session.PlaybackState
import android.provider.Settings
import android.util.Log
import com.android.internal.jank.Cuj
@@ -42,7 +40,6 @@ import com.android.systemui.media.dialog.MediaOutputDialogManager
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.kotlin.pairwiseBy
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import kotlinx.coroutines.flow.Flow
@@ -70,19 +67,6 @@ constructor(
            .map { entries -> entries[instanceId]?.let { toMediaControlModel(it) } }
            .distinctUntilChanged()

    val isStartedPlaying: Flow<Boolean> =
        mediaControl
            .map { mediaControl ->
                mediaControl?.token?.let { token ->
                    MediaController(applicationContext, token).playbackState?.let {
                        it.state == PlaybackState.STATE_PLAYING
                    }
                }
                    ?: false
            }
            .pairwiseBy(initialValue = false) { wasPlaying, isPlaying -> !wasPlaying && isPlaying }
            .distinctUntilChanged()

    val onAnyMediaConfigurationChange: Flow<Unit> = repository.onAnyMediaConfigurationChange

    fun removeMediaControl(
+8 −6
Original line number Diff line number Diff line
@@ -709,12 +709,6 @@ constructor(

        // For Turbulence noise.
        val loadingEffectView = mediaViewHolder.loadingEffectView
        turbulenceNoiseAnimationConfig =
            createTurbulenceNoiseConfig(
                loadingEffectView,
                turbulenceNoiseView,
                colorSchemeTransition
            )
        noiseDrawCallback =
            object : PaintDrawCallback {
                override fun onDraw(paint: Paint) {
@@ -809,6 +803,14 @@ constructor(

    fun setUpTurbulenceNoise() {
        if (!mediaFlags.isMediaControlsRefactorEnabled()) return
        if (!this::turbulenceNoiseAnimationConfig.isInitialized) {
            turbulenceNoiseAnimationConfig =
                createTurbulenceNoiseConfig(
                    mediaViewHolder.loadingEffectView,
                    mediaViewHolder.turbulenceNoiseView,
                    colorSchemeTransition
                )
        }
        if (Flags.shaderlibLoadingEffectRefactor()) {
            if (!this::loadingEffect.isInitialized) {
                loadingEffect =
+19 −29
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.content.Context
import android.content.pm.PackageManager
import android.media.session.MediaController
import android.media.session.MediaSession.Token
import android.media.session.PlaybackState
import android.text.TextUtils
import android.util.Log
import androidx.constraintlayout.widget.ConstraintSet
@@ -40,16 +41,14 @@ import com.android.systemui.media.controls.util.MediaUiEventLogger
import com.android.systemui.monet.ColorScheme
import com.android.systemui.monet.Style
import com.android.systemui.res.R
import com.android.systemui.util.kotlin.sample
import java.util.concurrent.Executor
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map

/** Models UI state and handles user input for a media control. */
class MediaControlViewModel(
@@ -60,31 +59,20 @@ class MediaControlViewModel(
    private val logger: MediaUiEventLogger,
) {

    private val isAnyButtonClicked: MutableStateFlow<Boolean> = MutableStateFlow(false)

    private val playTurbulenceNoise: Flow<Boolean> =
        interactor.mediaControl.sample(
            combine(isAnyButtonClicked, interactor.isStartedPlaying) {
                    isButtonClicked,
                    isStartedPlaying ->
                    isButtonClicked && isStartedPlaying
                }
                .distinctUntilChanged()
        )

    @OptIn(ExperimentalCoroutinesApi::class)
    val player: Flow<MediaPlayerViewModel?> =
        interactor.onAnyMediaConfigurationChange
            .flatMapLatest {
                combine(playTurbulenceNoise, interactor.mediaControl) {
                    playTurbulenceNoise,
                    mediaControl ->
                    mediaControl?.let { toViewModel(it, playTurbulenceNoise) }
                interactor.mediaControl.map { mediaControl ->
                    mediaControl?.let { toViewModel(it) }
                }
            }
            .distinctUntilChanged()
            .flowOn(backgroundDispatcher)

    private var isPlaying = false
    private var isAnyButtonClicked = false

    private fun onDismissMediaData(
        token: Token?,
        uid: Int,
@@ -95,10 +83,8 @@ class MediaControlViewModel(
        interactor.removeMediaControl(token, instanceId, MEDIA_PLAYER_ANIMATION_DELAY)
    }

    private suspend fun toViewModel(
        model: MediaControlModel,
        playTurbulenceNoise: Boolean
    ): MediaPlayerViewModel? {
    private suspend fun toViewModel(model: MediaControlModel): MediaPlayerViewModel? {
        val mediaController = model.token?.let { MediaController(applicationContext, it) }
        val wallpaperColors =
            MediaArtworkHelper.getWallpaperColor(
                applicationContext,
@@ -118,8 +104,14 @@ class MediaControlViewModel(

        val gutsViewModel = toGutsViewModel(model, scheme)

        // Set playing state
        val wasPlaying = isPlaying
        isPlaying =
            mediaController?.playbackState?.let { it.state == PlaybackState.STATE_PLAYING } ?: false

        // Resetting button clicks state.
        isAnyButtonClicked.value = false
        val wasButtonClicked = isAnyButtonClicked
        isAnyButtonClicked = false

        return MediaPlayerViewModel(
            contentDescription = { gutsVisible ->
@@ -144,7 +136,7 @@ class MediaControlViewModel(
            shouldAddGradient = wallpaperColors != null,
            colorScheme = scheme,
            canShowTime = canShowScrubbingTimeViews(model.semanticActionButtons),
            playTurbulenceNoise = playTurbulenceNoise,
            playTurbulenceNoise = isPlaying && !wasPlaying && wasButtonClicked,
            useSemanticActions = model.semanticActionButtons != null,
            actionButtons = toActionViewModels(model),
            outputSwitcher = toOutputSwitcherViewModel(model),
@@ -168,9 +160,7 @@ class MediaControlViewModel(
                    seekBarViewModel.updateStaticProgress(model.resumeProgress)
                } else {
                    backgroundExecutor.execute {
                        seekBarViewModel.updateController(
                            model.token?.let { MediaController(applicationContext, it) }
                        )
                        seekBarViewModel.updateController(mediaController)
                    }
                }
            }
@@ -367,7 +357,7 @@ class MediaControlViewModel(
    ) {
        logger.logTapAction(id, uid, packageName, instanceId)
        // TODO (b/330897926) log smartspace card reported (SMARTSPACE_CARD_CLICK_EVENT)
        isAnyButtonClicked.value = true
        isAnyButtonClicked = true
        action.run()
    }