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

Commit e778a656 authored by Nicolò Mazzucato's avatar Nicolò Mazzucato Committed by Automerger Merge Worker
Browse files

Merge "Add dark scrim from a background thread during unfold" into tm-qpr-dev...

Merge "Add dark scrim from a background thread during unfold" into tm-qpr-dev am: d1783ae8 am: e4f61e1e

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20437905



Change-Id: Iec36f3bee1d915078bc102c815e7aec4b85fb24c
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 8b6d1169 e4f61e1e
Loading
Loading
Loading
Loading
+38 −13
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ import android.hardware.devicestate.DeviceStateManager
import android.hardware.devicestate.DeviceStateManager.FoldStateListener
import android.hardware.display.DisplayManager
import android.hardware.input.InputManager
import android.os.Handler
import android.os.Looper
import android.os.Trace
import android.view.Choreographer
import android.view.Display
@@ -32,6 +34,7 @@ import android.view.SurfaceControlViewHost
import android.view.SurfaceSession
import android.view.WindowManager
import android.view.WindowlessWindowManager
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dagger.qualifiers.UiBackground
import com.android.systemui.statusbar.LightRevealEffect
@@ -40,6 +43,7 @@ import com.android.systemui.statusbar.LinearLightRevealEffect
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener
import com.android.systemui.unfold.updates.RotationChangeProvider
import com.android.systemui.unfold.util.ScaleAwareTransitionProgressProvider.Companion.areAnimationsEnabled
import com.android.systemui.util.Assert.isMainThread
import com.android.systemui.util.traceSection
import com.android.wm.shell.displayareahelper.DisplayAreaHelper
import java.util.Optional
@@ -59,6 +63,7 @@ constructor(
    private val displayAreaHelper: Optional<DisplayAreaHelper>,
    @Main private val executor: Executor,
    @UiBackground private val backgroundExecutor: Executor,
    @Background private val bgHandler: Handler,
    private val rotationChangeProvider: RotationChangeProvider,
) {

@@ -120,11 +125,11 @@ constructor(
        try {
            // Add the view only if we are unfolding and this is the first screen on
            if (!isFolded && !isUnfoldHandled && contentResolver.areAnimationsEnabled()) {
                addView(onOverlayReady)
                executeInBackground { addView(onOverlayReady) }
                isUnfoldHandled = true
            } else {
                // No unfold transition, immediately report that overlay is ready
                ensureOverlayRemoved()
                executeInBackground { ensureOverlayRemoved() }
                onOverlayReady.run()
            }
        } finally {
@@ -139,6 +144,7 @@ constructor(
            return
        }

        ensureInBackground()
        ensureOverlayRemoved()

        val newRoot = SurfaceControlViewHost(context, context.display!!, wwm)
@@ -152,7 +158,7 @@ constructor(
        val params = getLayoutParams()
        newRoot.setView(newView, params)

        onOverlayReady?.let { callback ->
        if (onOverlayReady != null) {
            Trace.beginAsyncSection("UnfoldLightRevealOverlayAnimation#relayout", 0)

            newRoot.relayout(params) { transaction ->
@@ -170,7 +176,7 @@ constructor(
                    .setFrameTimelineVsync(vsyncId + 1)
                    .addTransactionCommittedListener(backgroundExecutor) {
                        Trace.endAsyncSection("UnfoldLightRevealOverlayAnimation#relayout", 0)
                        callback.run()
                        onOverlayReady.run()
                    }
                    .apply()
            }
@@ -213,10 +219,13 @@ constructor(
    }

    private fun ensureOverlayRemoved() {
        ensureInBackground()
        traceSection("ensureOverlayRemoved") {
            root?.release()
            root = null
            scrimView = null
        }
    }

    private fun getUnfoldedDisplayInfo(): DisplayInfo =
        displayManager.displays
@@ -228,17 +237,17 @@ constructor(
    private inner class TransitionListener : TransitionProgressListener {

        override fun onTransitionProgress(progress: Float) {
            scrimView?.revealAmount = progress
            executeInBackground { scrimView?.revealAmount = progress }
        }

        override fun onTransitionFinished() {
            ensureOverlayRemoved()
            executeInBackground { ensureOverlayRemoved() }
        }

        override fun onTransitionStarted() {
            // Add view for folding case (when unfolding the view is added earlier)
            if (scrimView == null) {
                addView()
                executeInBackground { addView() }
            }
            // Disable input dispatching during transition.
            InputManager.getInstance().cancelCurrentTouch()
@@ -250,19 +259,35 @@ constructor(
            traceSection("UnfoldLightRevealOverlayAnimation#onRotationChanged") {
                if (currentRotation != newRotation) {
                    currentRotation = newRotation
                    executeInBackground {
                        scrimView?.revealEffect = createLightRevealEffect()
                        root?.relayout(getLayoutParams())
                    }
                }
            }
        }
    }

    private fun executeInBackground(f: () -> Unit) {
        ensureInMainThread()
        // The UiBackground executor is not used as it doesn't have a prepared looper.
        bgHandler.post(f)
    }

    private fun ensureInBackground() {
        check(Looper.myLooper() == bgHandler.looper) { "Not being executed in the background!" }
    }

    private fun ensureInMainThread() {
        isMainThread()
    }

    private inner class FoldListener :
        FoldStateListener(
            context,
            Consumer { isFolded ->
                if (isFolded) {
                    ensureOverlayRemoved()
                    executeInBackground { ensureOverlayRemoved() }
                    isUnfoldHandled = false
                }
                this.isFolded = isFolded