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

Commit ea2130f4 authored by Pablo Gamito's avatar Pablo Gamito
Browse files

Add color layer to TaskDisplayArea for animations

We want a solid color background to be used for task animations so that we show that instead of the wallpaper.

We need a way to set the color when the animation start and clear it at
the end of the animation.

Test: atest FlickerTests:TaskTransitionTest
Bug: 199507257
Change-Id: I47fe530ffe37b453bbec8e65e0a4199fba2f04a3
parent 2ccc829e
Loading
Loading
Loading
Loading
+61 −0
Original line number Diff line number Diff line
@@ -42,6 +42,9 @@ import static com.android.server.wm.Task.TASK_VISIBILITY_VISIBLE;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ROOT_TASK;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;

import static java.lang.Integer.MIN_VALUE;

import android.annotation.ColorInt;
import android.annotation.Nullable;
import android.app.ActivityOptions;
import android.app.WindowConfiguration;
@@ -79,6 +82,22 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {

    DisplayContent mDisplayContent;

    /**
     * A color layer that serves as a solid color background to certain animations.
     */
    private SurfaceControl mColorBackgroundLayer;

    /**
     * This counter is used to make sure we don't prematurely clear the background color in the
     * case that background color animations are interleaved.
     * NOTE: The last set color will remain until the counter is reset to 0, which means that an
     * animation background color may sometime remain after the animation has finished through an
     * animation with a different background color if an animation starts after and ends before
     * another where both set different background colors. However, this is not a concern as
     * currently all task animation backgrounds are the same color.
     */
    private int mColorLayerCounter = 0;

    /**
     * A control placed at the appropriate level for transitions to occur.
     */
@@ -961,6 +980,11 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
    void onParentChanged(ConfigurationContainer newParent, ConfigurationContainer oldParent) {
        if (getParent() != null) {
            super.onParentChanged(newParent, oldParent, () -> {
                mColorBackgroundLayer = makeChildSurface(null)
                        .setColorLayer()
                        .setName("colorBackgroundLayer")
                        .setCallsite("TaskDisplayArea.onParentChanged")
                        .build();
                mAppAnimationLayer = makeChildSurface(null)
                        .setName("animationLayer")
                        .setCallsite("TaskDisplayArea.onParentChanged")
@@ -977,6 +1001,7 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
                        .setName("splitScreenDividerAnchor")
                        .setCallsite("TaskDisplayArea.onParentChanged")
                        .build();

                getSyncTransaction()
                        .show(mAppAnimationLayer)
                        .show(mBoostedAppAnimationLayer)
@@ -986,11 +1011,13 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
        } else {
            super.onParentChanged(newParent, oldParent);
            mWmService.mTransactionFactory.get()
                    .remove(mColorBackgroundLayer)
                    .remove(mAppAnimationLayer)
                    .remove(mBoostedAppAnimationLayer)
                    .remove(mHomeAppAnimationLayer)
                    .remove(mSplitScreenDividerAnchor)
                    .apply();
            mColorBackgroundLayer = null;
            mAppAnimationLayer = null;
            mBoostedAppAnimationLayer = null;
            mHomeAppAnimationLayer = null;
@@ -998,6 +1025,39 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
        }
    }

    void setBackgroundColor(@ColorInt int color) {
        if (mColorBackgroundLayer == null) {
            return;
        }

        float r = ((color >> 16) & 0xff) / 255.0f;
        float g = ((color >>  8) & 0xff) / 255.0f;
        float b = ((color >>  0) & 0xff) / 255.0f;
        float a = ((color >> 24) & 0xff) / 255.0f;

        mColorLayerCounter++;

        getPendingTransaction().setLayer(mColorBackgroundLayer, MIN_VALUE)
                .setColor(mColorBackgroundLayer, new float[]{r, g, b})
                .setAlpha(mColorBackgroundLayer, a)
                .setWindowCrop(mColorBackgroundLayer, getSurfaceWidth(), getSurfaceHeight())
                .setPosition(mColorBackgroundLayer, 0, 0)
                .show(mColorBackgroundLayer);

        scheduleAnimation();
    }

    void clearBackgroundColor() {
        mColorLayerCounter--;

        // Only clear the color layer if we have received the same amounts of clear as set
        // requests.
        if (mColorLayerCounter == 0) {
            getPendingTransaction().hide(mColorBackgroundLayer);
            scheduleAnimation();
        }
    }

    @Override
    void migrateToNewSurfaceControl(SurfaceControl.Transaction t) {
        super.migrateToNewSurfaceControl(t);
@@ -1006,6 +1066,7 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
        }

        // As TaskDisplayArea is getting a new surface, reparent and reorder the child surfaces.
        t.reparent(mColorBackgroundLayer, mSurfaceControl);
        t.reparent(mAppAnimationLayer, mSurfaceControl);
        t.reparent(mBoostedAppAnimationLayer, mSurfaceControl);
        t.reparent(mHomeAppAnimationLayer, mSurfaceControl);