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

Commit f980a759 authored by Nicolo' Mazzucato's avatar Nicolo' Mazzucato Committed by Nicolò Mazzucato
Browse files

Fix black frame when unfold animation starts

The dark scrim was added with a value of 0f (that means, completely black), and then updated in the background thread with a value of 1f (completely transparent).

This was ok when unfolding (as the overlay needed to be black at first), but not when folding (as it needs to be transparent at first)

When the background thread was slow, this was causing one completely black frame at the beginning of the animation.

Bug: 261560634
Test: start unfold animation repeatedly
Change-Id: I98e17d0204cb4d75a85d3c31c6a6faa8e58466f0
parent 7700e677
Loading
Loading
Loading
Loading
+17 −6
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@ import com.android.systemui.dagger.qualifiers.UiBackground
import com.android.systemui.statusbar.LightRevealEffect
import com.android.systemui.statusbar.LightRevealScrim
import com.android.systemui.statusbar.LinearLightRevealEffect
import com.android.systemui.unfold.UnfoldLightRevealOverlayAnimation.AddOverlayReason.FOLD
import com.android.systemui.unfold.UnfoldLightRevealOverlayAnimation.AddOverlayReason.UNFOLD
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener
import com.android.systemui.unfold.updates.RotationChangeProvider
import com.android.systemui.unfold.util.ScaleAwareTransitionProgressProvider.Companion.areAnimationsEnabled
@@ -125,7 +127,7 @@ constructor(
        try {
            // Add the view only if we are unfolding and this is the first screen on
            if (!isFolded && !isUnfoldHandled && contentResolver.areAnimationsEnabled()) {
                executeInBackground { addView(onOverlayReady) }
                executeInBackground { addOverlay(onOverlayReady, reason = UNFOLD) }
                isUnfoldHandled = true
            } else {
                // No unfold transition, immediately report that overlay is ready
@@ -137,7 +139,7 @@ constructor(
        }
    }

    private fun addView(onOverlayReady: Runnable? = null) {
    private fun addOverlay(onOverlayReady: Runnable? = null, reason: AddOverlayReason) {
        if (!::wwm.isInitialized) {
            // Surface overlay is not created yet on the first SysUI launch
            onOverlayReady?.run()
@@ -152,7 +154,10 @@ constructor(
            LightRevealScrim(context, null).apply {
                revealEffect = createLightRevealEffect()
                isScrimOpaqueChangedListener = Consumer {}
                revealAmount = 0f
                revealAmount = when (reason) {
                    FOLD -> TRANSPARENT
                    UNFOLD -> BLACK
                }
            }

        val params = getLayoutParams()
@@ -247,7 +252,7 @@ constructor(
        override fun onTransitionStarted() {
            // Add view for folding case (when unfolding the view is added earlier)
            if (scrimView == null) {
                executeInBackground { addView() }
                executeInBackground { addOverlay(reason = FOLD) }
            }
            // Disable input dispatching during transition.
            InputManager.getInstance().cancelCurrentTouch()
@@ -294,11 +299,17 @@ constructor(
            }
        )

    private enum class AddOverlayReason { FOLD, UNFOLD }

    private companion object {
        private const val ROTATION_ANIMATION_OVERLAY_Z_INDEX = Integer.MAX_VALUE
        const val ROTATION_ANIMATION_OVERLAY_Z_INDEX = Integer.MAX_VALUE

        // Put the unfold overlay below the rotation animation screenshot to hide the moment
        // when it is rotated but the rotation of the other windows hasn't happen yet
        private const val UNFOLD_OVERLAY_LAYER_Z_INDEX = ROTATION_ANIMATION_OVERLAY_Z_INDEX - 1
        const val UNFOLD_OVERLAY_LAYER_Z_INDEX = ROTATION_ANIMATION_OVERLAY_Z_INDEX - 1

        // constants for revealAmount.
        const val TRANSPARENT = 1f
        const val BLACK = 0f
    }
}