From f980a759c6543f0e1ebd5cce8955cbd9f8eebaff Mon Sep 17 00:00:00 2001 From: Nicolo' Mazzucato Date: Tue, 6 Dec 2022 17:59:32 +0000 Subject: 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 --- .../unfold/UnfoldLightRevealOverlayAnimation.kt | 23 ++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt index 162c915552ed..eb33fd31d59c 100644 --- a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt +++ b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt @@ -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 } } -- cgit v1.2.3-59-g8ed1b