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

Commit c227f6f1 authored by Pablo Gamito's avatar Pablo Gamito Committed by Android (Google) Code Review
Browse files

Merge changes I9881453b,I57fa88c6 into stage-aosp-master

* changes:
  Don't set background color if TDA doesn't have a valid surface
  Use TDA for background color instead of new color layer
parents 8cf55c7e da737e71
Loading
Loading
Loading
Loading
+29 −35
Original line number Diff line number Diff line
@@ -41,14 +41,13 @@ import static com.android.server.wm.DisplayContent.alwaysCreateRootTask;
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;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Color;
import android.os.UserHandle;
import android.util.IntArray;
import android.util.Slog;
@@ -83,9 +82,9 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
    DisplayContent mDisplayContent;

    /**
     * A color layer that serves as a solid color background to certain animations.
     * Keeps track of the last set color layer so that it can be reset during surface migrations.
     */
    private SurfaceControl mColorBackgroundLayer;
    private @ColorInt int mBackgroundColor = 0;

    /**
     * This counter is used to make sure we don't prematurely clear the background color in the
@@ -358,6 +357,14 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
        }
    }

    @Override
    void setInitialSurfaceControlProperties(SurfaceControl.Builder b) {
        // We want an effect layer instead of the default container layer so that we can set a
        // background color on it for task animations.
        b.setEffectLayer();
        super.setInitialSurfaceControlProperties(b);
    }

    @Override
    void addChild(WindowContainer child, int position) {
        if (child.asTaskDisplayArea() != null) {
@@ -946,11 +953,6 @@ 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();
                mSplitScreenDividerAnchor = makeChildSurface(null)
                        .setName("splitScreenDividerAnchor")
                        .setCallsite("TaskDisplayArea.onParentChanged")
@@ -962,43 +964,35 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
        } else {
            super.onParentChanged(newParent, oldParent);
            mWmService.mTransactionFactory.get()
                    .remove(mColorBackgroundLayer)
                    .remove(mSplitScreenDividerAnchor)
                    .apply();
            mColorBackgroundLayer = null;
            mSplitScreenDividerAnchor = null;
        }
    }

    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;

    void setBackgroundColor(@ColorInt int colorInt) {
        mBackgroundColor = colorInt;
        Color color = Color.valueOf(colorInt);
        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);

        // Only apply the background color if the TDA is actually attached and has a valid surface
        // to set the background color on. We still want to keep track of the background color state
        // even if we are not showing it for when/if the TDA is reattached and gets a valid surface
        if (mSurfaceControl != null) {
            getPendingTransaction()
                    .setColor(mSurfaceControl,
                            new float[]{color.red(), color.green(), color.blue()});
            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);
        // requests and TDA has a non null surface control (i.e. is attached)
        if (mColorLayerCounter == 0 && mSurfaceControl != null) {
            getPendingTransaction().unsetColor(mSurfaceControl);
            scheduleAnimation();
        }
    }
@@ -1006,12 +1000,12 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
    @Override
    void migrateToNewSurfaceControl(SurfaceControl.Transaction t) {
        super.migrateToNewSurfaceControl(t);
        if (mColorBackgroundLayer == null) {
            return;

        if (mColorLayerCounter > 0) {
            setBackgroundColor(mBackgroundColor);
        }

        // As TaskDisplayArea is getting a new surface, reparent and reorder the child surfaces.
        t.reparent(mColorBackgroundLayer, mSurfaceControl);
        t.reparent(mSplitScreenDividerAnchor, mSurfaceControl);
        reassignLayer(t);
        scheduleAnimation();