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

Commit 0eb0b827 authored by Sherry Zhou's avatar Sherry Zhou
Browse files

Fix shape is sometimes too small on lockscreen

Avoid sending wrong bounds from homescreen to wallpaper by filtering the FINISHED transitionStep to LOCKSCREEN, and filtering out the FINISHED transitionStep from LOCKSCREEN

Test: manual test that no bounds is sent to wallpaper when unlocking
Bug: 396667623
Flag: com.android.systemui.shared.extended_wallpaper_effects

Change-Id: Ied576062ebdfb44ba0814b26c8db4505647055d2
parent ccb979d4
Loading
Loading
Loading
Loading
+1 −10
Original line number Diff line number Diff line
@@ -88,7 +88,6 @@ import kotlin.math.min
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.DisposableHandle
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update

@@ -374,16 +373,8 @@ object KeyguardRootViewBinder {
                    if (wallpaperFocalAreaViewModel.hasFocalArea.value) {
                        launch {
                            wallpaperFocalAreaViewModel.wallpaperFocalAreaBounds.collect {
                                wallpaperFocalAreaBounds ->
                                wallpaperFocalAreaViewModel.setFocalAreaBounds(
                                    wallpaperFocalAreaBounds
                                )
                            }
                                wallpaperFocalAreaViewModel.setFocalAreaBounds(it)
                            }
                        launch {
                            wallpaperFocalAreaViewModel.wallpaperFocalAreaBounds
                                .filterNotNull()
                                .collect { wallpaperFocalAreaViewModel.setFocalAreaBounds(it) }
                        }
                    }
                }
+18 −11
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import com.android.systemui.wallpapers.domain.interactor.WallpaperFocalAreaInter
import javax.inject.Inject
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.map

class WallpaperFocalAreaViewModel
@@ -39,25 +40,31 @@ constructor(
    val wallpaperFocalAreaBounds =
        combine(
                wallpaperFocalAreaInteractor.wallpaperFocalAreaBounds,
                keyguardTransitionInteractor.startedKeyguardTransitionStep,
                // Emit transition state when FINISHED instead of STARTED to avoid race with
                // wakingup command, causing layout change command not be received.
                keyguardTransitionInteractor
                    .transition(
                        edge = Edge.create(to = Scenes.Lockscreen),
                        edgeWithoutSceneContainer = Edge.create(to = KeyguardState.LOCKSCREEN),
                    )
                    .filter { transitionStep ->
                        // Should not filter by TransitionState.STARTED, it may race with
                        // wakingup command, causing layout change command not be received.
                        transitionStep.transitionState == TransitionState.FINISHED
                    },
                ::Pair,
                    .filter { it.transitionState == TransitionState.FINISHED },
                ::Triple,
            )
            .map { (bounds, _) -> bounds }
            .map { (bounds, startedStep, _) ->
                // Avoid sending wrong bounds when transitioning from LOCKSCREEN to GONE
                if (
                    startedStep.to == KeyguardState.LOCKSCREEN &&
                        startedStep.from != KeyguardState.LOCKSCREEN
                ) {
                    bounds
                } else {
                    null
                }
            }
            .filterNotNull()

    fun setFocalAreaBounds(bounds: RectF) {
        wallpaperFocalAreaInteractor.setFocalAreaBounds(bounds)
    }

    fun setTapPosition(x: Float, y: Float) {
        wallpaperFocalAreaInteractor.setTapPosition(x, y)
    }
}