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

Commit 157738c8 authored by Pablo Gamito's avatar Pablo Gamito
Browse files

Support backgrounds during animations in shell

This is required for the go/t-activity-transitions where we want to allow apps to fade to a clear background color and fade back in from the background to another activity

Test: atest FlickerTests
Bug: 202844659
Change-Id: Iea18a8e7d32a63da55ab3430c47f903da5cff807
parent 4a7c9273
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import static android.view.WindowManager.TransitionFlags;
import static android.view.WindowManager.TransitionType;
import static android.view.WindowManager.transitTypeToString;

import android.annotation.ColorInt;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -366,6 +367,7 @@ public final class TransitionInfo implements Parcelable {
        private int mStartRotation = ROTATION_UNDEFINED;
        private int mEndRotation = ROTATION_UNDEFINED;
        private int mRotationAnimation = ROTATION_ANIMATION_UNSPECIFIED;
        private @ColorInt int mBackgroundColor;

        public Change(@Nullable WindowContainerToken container, @NonNull SurfaceControl leash) {
            mContainer = container;
@@ -387,6 +389,7 @@ public final class TransitionInfo implements Parcelable {
            mStartRotation = in.readInt();
            mEndRotation = in.readInt();
            mRotationAnimation = in.readInt();
            mBackgroundColor = in.readInt();
        }

        /** Sets the parent of this change's container. The parent must be a participant or null. */
@@ -446,6 +449,11 @@ public final class TransitionInfo implements Parcelable {
            mRotationAnimation = anim;
        }

        /** Sets the background color of this change's container. */
        public void setBackgroundColor(@ColorInt int backgroundColor) {
            mBackgroundColor = backgroundColor;
        }

        /** @return the container that is changing. May be null if non-remotable (eg. activity) */
        @Nullable
        public WindowContainerToken getContainer() {
@@ -526,6 +534,12 @@ public final class TransitionInfo implements Parcelable {
            return mRotationAnimation;
        }

        /** @return get the background color of this change's container. */
        @ColorInt
        public int getBackgroundColor() {
            return mBackgroundColor;
        }

        /** @hide */
        @Override
        public void writeToParcel(@NonNull Parcel dest, int flags) {
@@ -542,6 +556,7 @@ public final class TransitionInfo implements Parcelable {
            dest.writeInt(mStartRotation);
            dest.writeInt(mEndRotation);
            dest.writeInt(mRotationAnimation);
            dest.writeInt(mBackgroundColor);
        }

        @NonNull
+28 −19
Original line number Diff line number Diff line
@@ -291,8 +291,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
            finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */);
        };

        boolean requireBackgroundForTransition = false;

        @ColorInt int backgroundColorForTransition = 0;
        final int wallpaperTransit = getWallpaperTransitType(info);
        for (int i = info.getChanges().size() - 1; i >= 0; --i) {
            final TransitionInfo.Change change = info.getChanges().get(i);
@@ -352,8 +351,19 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {

            Animation a = loadAnimation(info, change, wallpaperTransit);
            if (a != null) {
                if (changeRequiresBackground(info, change)) {
                    requireBackgroundForTransition = true;
                if (isTask) {
                    final @TransitionType int type = info.getType();
                    final boolean isOpenOrCloseTransition = type == TRANSIT_OPEN
                            || type == TRANSIT_CLOSE
                            || type == TRANSIT_TO_FRONT
                            || type == TRANSIT_TO_BACK;
                    if (isOpenOrCloseTransition) {
                        // Use the overview background as the background for the animation
                        final Context uiContext = ActivityThread.currentActivityThread()
                                .getSystemUiContext();
                        backgroundColorForTransition =
                                uiContext.getColor(R.color.overview_background);
                    }
                }

                float cornerRadius = 0;
@@ -365,6 +375,15 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
                            ScreenDecorationsUtils.getWindowCornerRadius(displayContext);
                }

                if (a.getShowBackground()) {
                    // use the window's background color if provided as the background color for the
                    // animation - the top most window with a valid background color and
                    // showBackground set takes precedence.
                    if (change.getBackgroundColor() != 0) {
                        backgroundColorForTransition = change.getBackgroundColor();
                    }
                }

                startSurfaceAnimation(animations, a, change.getLeash(), onAnimFinish,
                        mTransactionPool, mMainExecutor, mAnimExecutor, null /* position */,
                        cornerRadius, change.getEndAbsBounds());
@@ -376,8 +395,9 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
            }
        }

        if (requireBackgroundForTransition) {
            addBackgroundToTransition(info.getRootLeash(), startTransaction, finishTransaction);
        if (backgroundColorForTransition != 0) {
            addBackgroundToTransition(info.getRootLeash(), backgroundColorForTransition,
                    startTransaction, finishTransaction);
        }

        startTransaction.apply();
@@ -388,24 +408,13 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
        return true;
    }

    private boolean changeRequiresBackground(TransitionInfo info,
            TransitionInfo.Change change) {
        final boolean isTask = change.getTaskInfo() != null;
        final @TransitionType int type = info.getType();
        final boolean isOpenOrCloseTransition = type == TRANSIT_OPEN || type == TRANSIT_CLOSE
                || type == TRANSIT_TO_FRONT || type == TRANSIT_TO_BACK;
        return isTask && isOpenOrCloseTransition;
    }

    private void addBackgroundToTransition(
            @NonNull SurfaceControl rootLeash,
            @ColorInt int color,
            @NonNull SurfaceControl.Transaction startTransaction,
            @NonNull SurfaceControl.Transaction finishTransaction
    ) {
        final Context uiContext = ActivityThread.currentActivityThread().getSystemUiContext();
        final @ColorInt int overviewBackgroundColor =
                uiContext.getColor(R.color.overview_background);
        final Color bgColor = Color.valueOf(overviewBackgroundColor);
        final Color bgColor = Color.valueOf(color);
        final float[] colorArray = new float[] { bgColor.red(), bgColor.green(), bgColor.blue() };

        final SurfaceControl animationBackgroundSurface = new SurfaceControl.Builder()
+9 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ import android.window.RemoteTransition;
import android.window.TransitionInfo;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.graphics.ColorUtils;
import com.android.internal.protolog.ProtoLogGroup;
import com.android.internal.protolog.common.ProtoLog;
import com.android.internal.util.function.pooled.PooledLambda;
@@ -1271,6 +1272,14 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
                change.setAllowEnterPip(topMostActivity != null
                        && topMostActivity.checkEnterPictureInPictureAppOpsState());
            }
            final ActivityRecord activityRecord = target.asActivityRecord();
            if (activityRecord != null) {
                final Task arTask = activityRecord.getTask();
                final int backgroundColor = ColorUtils.setAlphaComponent(
                        arTask.getTaskDescription().getBackgroundColor(), 255);
                change.setBackgroundColor(backgroundColor);
            }

            out.addChange(change);
        }