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

Commit 32814954 authored by Charles Chen's avatar Charles Chen
Browse files

Move AnimationOptions to Change

There are several reasons for this requests:
1. Fix "Dim flicker on package installer"
2. Implement overlay transition by animation resources override
3. Activity Embedding Animation Customization

Test: atest TransitionTests ActivityEmbeddingAnimationRunnerTests ActivityEmbeddingControllerTests
Bug: 327332488
Bug: 295805497
Flag: com.android.window.flags.move_animation_options_to_change
Change-Id: I060b87506a1bf732228ec6b44e7e9dd48782ec0c
parent 49f56cd9
Loading
Loading
Loading
Loading
+75 −4
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import static android.view.WindowManager.TransitionFlags;
import static android.view.WindowManager.TransitionType;
import static android.view.WindowManager.transitTypeToString;

import android.annotation.AnimRes;
import android.annotation.ColorInt;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -54,6 +55,8 @@ import android.view.Surface;
import android.view.SurfaceControl;
import android.view.WindowManager;

import com.android.window.flags.Flags;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -211,6 +214,8 @@ public final class TransitionInfo implements Parcelable {
    private final ArrayList<Change> mChanges = new ArrayList<>();
    private final ArrayList<Root> mRoots = new ArrayList<>();

    // TODO(b/327332488): Clean-up usages after the flag is fully enabled.
    @Deprecated
    private AnimationOptions mOptions;

    /** This is only a BEST-EFFORT id used for log correlation. DO NOT USE for any real work! */
@@ -275,7 +280,15 @@ public final class TransitionInfo implements Parcelable {
        mRoots.add(other);
    }

    /**
     * @deprecated Set {@link AnimationOptions} to change. This method is only used if
     * {@link Flags#FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE} is disabled.
     */
    @Deprecated
    public void setAnimationOptions(@Nullable AnimationOptions options) {
        if (Flags.moveAnimationOptionsToChange()) {
            return;
        }
        mOptions = options;
    }

@@ -340,6 +353,11 @@ public final class TransitionInfo implements Parcelable {
        return mRoots.get(0).mLeash;
    }

    /**
     * @deprecated Use {@link Change#getAnimationOptions()} instead. This method is called only
     * if {@link Flags#FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE} is disabled.
     */
    @Deprecated
    @Nullable
    public AnimationOptions getAnimationOptions() {
        return mOptions;
@@ -661,6 +679,7 @@ public final class TransitionInfo implements Parcelable {
        private SurfaceControl mSnapshot = null;
        private float mSnapshotLuma;
        private ComponentName mActivityComponent = null;
        private AnimationOptions mAnimationOptions = null;

        public Change(@Nullable WindowContainerToken container, @NonNull SurfaceControl leash) {
            mContainer = container;
@@ -690,6 +709,7 @@ public final class TransitionInfo implements Parcelable {
            mSnapshot = in.readTypedObject(SurfaceControl.CREATOR);
            mSnapshotLuma = in.readFloat();
            mActivityComponent = in.readTypedObject(ComponentName.CREATOR);
            mAnimationOptions = in.readTypedObject(AnimationOptions.CREATOR);
        }

        private Change localRemoteCopy() {
@@ -713,6 +733,7 @@ public final class TransitionInfo implements Parcelable {
            out.mSnapshot = mSnapshot != null ? new SurfaceControl(mSnapshot, "localRemote") : null;
            out.mSnapshotLuma = mSnapshotLuma;
            out.mActivityComponent = mActivityComponent;
            out.mAnimationOptions = mAnimationOptions;
            return out;
        }

@@ -813,6 +834,16 @@ public final class TransitionInfo implements Parcelable {
            mActivityComponent = component;
        }

        /**
         * Sets {@link AnimationOptions} to override animation.
         */
        public void setAnimationOptions(@Nullable AnimationOptions options) {
            if (!Flags.moveAnimationOptionsToChange()) {
                return;
            }
            mAnimationOptions = options;
        }

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

        /**
         * Returns the {@link AnimationOptions}.
         */
        @Nullable
        public AnimationOptions getAnimationOptions() {
            return mAnimationOptions;
        }

        /** @hide */
        @Override
        public void writeToParcel(@NonNull Parcel dest, int flags) {
@@ -976,6 +1015,7 @@ public final class TransitionInfo implements Parcelable {
            dest.writeTypedObject(mSnapshot, flags);
            dest.writeFloat(mSnapshotLuma);
            dest.writeTypedObject(mActivityComponent, flags);
            dest.writeTypedObject(mAnimationOptions, flags);
        }

        @NonNull
@@ -1028,6 +1068,9 @@ public final class TransitionInfo implements Parcelable {
            if (mEndFixedRotation != ROTATION_UNDEFINED) {
                sb.append(" endFixedRotation="); sb.append(mEndFixedRotation);
            }
            if (mBackgroundColor != 0) {
                sb.append(" bc=").append(Integer.toHexString(mBackgroundColor));
            }
            if (mSnapshot != null) {
                sb.append(" snapshot="); sb.append(mSnapshot);
            }
@@ -1042,6 +1085,9 @@ public final class TransitionInfo implements Parcelable {
                sb.append(" taskParent=");
                sb.append(mTaskInfo.parentTaskId);
            }
            if (mAnimationOptions != null) {
                sb.append(" opt=").append(mAnimationOptions);
            }
            sb.append('}');
            return sb.toString();
        }
@@ -1051,14 +1097,23 @@ public final class TransitionInfo implements Parcelable {
    @SuppressWarnings("UserHandleName")
    public static final class AnimationOptions implements Parcelable {

        /**
         * The default value for animation resources ID, which means to use the system default
         * animation.
         */
        @SuppressWarnings("ResourceType") // Use as a hint to use the system default animation.
        @AnimRes
        public static final int DEFAULT_ANIMATION_RESOURCES_ID = 0xFFFFFFFF;

        private int mType;
        private int mEnterResId;
        private int mExitResId;
        private @AnimRes int mEnterResId = DEFAULT_ANIMATION_RESOURCES_ID;
        private @AnimRes int mExitResId = DEFAULT_ANIMATION_RESOURCES_ID;
        private boolean mOverrideTaskTransition;
        private String mPackageName;
        private final Rect mTransitionBounds = new Rect();
        private HardwareBuffer mThumbnail;
        private int mAnimations;
        // TODO(b/295805497): Extract it from AnimationOptions
        private @ColorInt int mBackgroundColor;
        // Customize activity transition animation
        private CustomActivityTransition mCustomActivityOpenTransition;
@@ -1121,10 +1176,18 @@ public final class TransitionInfo implements Parcelable {
            customTransition.addCustomActivityTransition(enterResId, exitResId, backgroundColor);
        }

        /** Make options for a custom animation based on anim resources */
        /**
         * Make options for a custom animation based on anim resources.
         *
         * @param packageName the package name to find the animation resources
         * @param enterResId the open animation resources ID
         * @param exitResId the close animation resources ID
         * @param backgroundColor the background color
         * @param overrideTaskTransition whether to override the task transition
         */
        @NonNull
        public static AnimationOptions makeCustomAnimOptions(@NonNull String packageName,
                int enterResId, int exitResId, @ColorInt int backgroundColor,
                @AnimRes int enterResId, @AnimRes int exitResId, @ColorInt int backgroundColor,
                boolean overrideTaskTransition) {
            AnimationOptions options = new AnimationOptions(ANIM_CUSTOM);
            options.mPackageName = packageName;
@@ -1182,10 +1245,12 @@ public final class TransitionInfo implements Parcelable {
            return mType;
        }

        @AnimRes
        public int getEnterResId() {
            return mEnterResId;
        }

        @AnimRes
        public int getExitResId() {
            return mExitResId;
        }
@@ -1284,6 +1349,12 @@ public final class TransitionInfo implements Parcelable {
            if (!mTransitionBounds.isEmpty()) {
                sb.append(" bounds=").append(mTransitionBounds);
            }
            if (mEnterResId != DEFAULT_ANIMATION_RESOURCES_ID) {
                sb.append(" enterResId=").append(mEnterResId);
            }
            if (mExitResId != DEFAULT_ANIMATION_RESOURCES_ID) {
                sb.append(" exitResId=").append(mExitResId);
            }
            sb.append('}');
            return sb.toString();
        }
+11 −4
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import android.view.animation.TranslateAnimation;
import android.window.TransitionInfo;

import com.android.internal.policy.TransitionAnimation;
import com.android.window.flags.Flags;
import com.android.wm.shell.shared.TransitionUtil;

/** Animation spec for ActivityEmbedding transition. */
@@ -202,7 +203,7 @@ class ActivityEmbeddingAnimationSpec {
    Animation loadOpenAnimation(@NonNull TransitionInfo info,
            @NonNull TransitionInfo.Change change, @NonNull Rect wholeAnimationBounds) {
        final boolean isEnter = TransitionUtil.isOpeningType(change.getMode());
        final Animation customAnimation = loadCustomAnimation(info, isEnter);
        final Animation customAnimation = loadCustomAnimation(info, change, isEnter);
        final Animation animation;
        if (customAnimation != null) {
            animation = customAnimation;
@@ -229,7 +230,7 @@ class ActivityEmbeddingAnimationSpec {
    Animation loadCloseAnimation(@NonNull TransitionInfo info,
            @NonNull TransitionInfo.Change change, @NonNull Rect wholeAnimationBounds) {
        final boolean isEnter = TransitionUtil.isOpeningType(change.getMode());
        final Animation customAnimation = loadCustomAnimation(info, isEnter);
        final Animation customAnimation = loadCustomAnimation(info, change, isEnter);
        final Animation animation;
        if (customAnimation != null) {
            animation = customAnimation;
@@ -261,8 +262,14 @@ class ActivityEmbeddingAnimationSpec {
    }

    @Nullable
    private Animation loadCustomAnimation(@NonNull TransitionInfo info, boolean isEnter) {
        final TransitionInfo.AnimationOptions options = info.getAnimationOptions();
    private Animation loadCustomAnimation(@NonNull TransitionInfo info,
            @NonNull TransitionInfo.Change change, boolean isEnter) {
        final TransitionInfo.AnimationOptions options;
        if (Flags.moveAnimationOptionsToChange()) {
            options = change.getAnimationOptions();
        } else {
            options = info.getAnimationOptions();
        }
        if (options == null || options.getType() != ANIM_CUSTOM) {
            return null;
        }
+29 −12
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import android.os.IBinder;
import android.util.ArrayMap;
import android.view.SurfaceControl;
import android.window.TransitionInfo;
import android.window.TransitionInfo.AnimationOptions;
import android.window.TransitionRequestInfo;
import android.window.WindowContainerTransaction;

@@ -39,6 +40,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.android.internal.annotations.VisibleForTesting;
import com.android.window.flags.Flags;
import com.android.wm.shell.shared.TransitionUtil;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.transition.Transitions;
@@ -117,8 +119,26 @@ public class ActivityEmbeddingController implements Transitions.TransitionHandle
            return false;
        }

        final TransitionInfo.AnimationOptions options = info.getAnimationOptions();
        if (options != null) {
        return shouldAnimateAnimationOptions(info);
    }

    private boolean shouldAnimateAnimationOptions(@NonNull TransitionInfo info) {
        if (!Flags.moveAnimationOptionsToChange()) {
            return shouldAnimateAnimationOptions(info.getAnimationOptions());
        }
        for (TransitionInfo.Change change : info.getChanges()) {
            if (!shouldAnimateAnimationOptions(change.getAnimationOptions())) {
                // If any of override animation is not supported, don't animate the transition.
                return false;
            }
        }
        return true;
    }

    private boolean shouldAnimateAnimationOptions(@Nullable AnimationOptions options) {
        if (options == null) {
            return true;
        }
        // Scene-transition should be handled by app side.
        if (options.getType() == ANIM_SCENE_TRANSITION) {
            return false;
@@ -132,9 +152,6 @@ public class ActivityEmbeddingController implements Transitions.TransitionHandle
        return !isSupportedOverrideAnimation(options);
    }

        return true;
    }

    @Override
    public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction startTransaction,
+14 −2
Original line number Diff line number Diff line
@@ -103,6 +103,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.policy.ScreenDecorationsUtils;
import com.android.internal.policy.TransitionAnimation;
import com.android.internal.protolog.common.ProtoLog;
import com.android.window.flags.Flags;
import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayLayout;
@@ -543,7 +544,13 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
                        mTransactionPool, mMainExecutor, animRelOffset, cornerRadius,
                        clipRect);

                if (info.getAnimationOptions() != null) {
                final TransitionInfo.AnimationOptions options;
                if (Flags.moveAnimationOptionsToChange()) {
                    options = info.getAnimationOptions();
                } else {
                    options = change.getAnimationOptions();
                }
                if (options != null) {
                    attachThumbnail(animations, onAnimFinish, change, info.getAnimationOptions(),
                            cornerRadius);
                }
@@ -725,7 +732,12 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
        final boolean isOpeningType = TransitionUtil.isOpeningType(type);
        final boolean enter = TransitionUtil.isOpeningType(changeMode);
        final boolean isTask = change.getTaskInfo() != null;
        final TransitionInfo.AnimationOptions options = info.getAnimationOptions();
        final TransitionInfo.AnimationOptions options;
        if (Flags.moveAnimationOptionsToChange()) {
            options = change.getAnimationOptions();
        } else {
            options = info.getAnimationOptions();
        }
        final int overrideType = options != null ? options.getType() : ANIM_NONE;
        final Rect endBounds = TransitionUtil.isClosingType(changeMode)
                ? mRotator.getEndBoundsInStartRotation(change)
+8 −2
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ import android.window.TransitionInfo;
import com.android.internal.R;
import com.android.internal.policy.TransitionAnimation;
import com.android.internal.protolog.common.ProtoLog;
import com.android.window.flags.Flags;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.shared.TransitionUtil;

@@ -71,7 +72,12 @@ public class TransitionAnimationHelper {
        final int changeFlags = change.getFlags();
        final boolean enter = TransitionUtil.isOpeningType(changeMode);
        final boolean isTask = change.getTaskInfo() != null;
        final TransitionInfo.AnimationOptions options = info.getAnimationOptions();
        final TransitionInfo.AnimationOptions options;
        if (Flags.moveAnimationOptionsToChange()) {
            options = change.getAnimationOptions();
        } else {
            options = info.getAnimationOptions();
        }
        final int overrideType = options != null ? options.getType() : ANIM_NONE;
        int animAttr = 0;
        boolean translucent = false;
@@ -246,7 +252,7 @@ public class TransitionAnimationHelper {
        if (!a.getShowBackdrop()) {
            return defaultColor;
        }
        if (info.getAnimationOptions() != null
        if (!Flags.moveAnimationOptionsToChange() && info.getAnimationOptions() != null
                && info.getAnimationOptions().getBackgroundColor() != 0) {
            // If available use the background color provided through AnimationOptions
            return info.getAnimationOptions().getBackgroundColor();
Loading