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

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

Add animation override to TaskFragmentAnimationParams

It's to support the overlay transition and we could
also support animation customization in the future.

Bug: 295805497
Test: presubmit
Flag: com.android.window.flags.move_animation_options_to_change
Flag: com.android.window.flags.activity_embedding_overlay_presentation_flag

Change-Id: Ia2105de1a8b20e3d9c2153a726f450b654b572ff
parent 0409a5f5
Loading
Loading
Loading
Loading
+129 −7
Original line number Original line Diff line number Diff line
@@ -16,17 +16,21 @@


package android.window;
package android.window;


import static android.window.TransitionInfo.AnimationOptions.DEFAULT_ANIMATION_RESOURCES_ID;

import android.annotation.AnimRes;
import android.annotation.ColorInt;
import android.annotation.ColorInt;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable;


import java.util.Objects;

/**
/**
 * Data object for animation related override of TaskFragment.
 * Data object for animation related override of TaskFragment.
 * @hide
 * @hide
 */
 */
// TODO(b/206557124): Add more animation customization options.
public final class TaskFragmentAnimationParams implements Parcelable {
public final class TaskFragmentAnimationParams implements Parcelable {


    /** The default {@link TaskFragmentAnimationParams} to use when there is no app override. */
    /** The default {@link TaskFragmentAnimationParams} to use when there is no app override. */
@@ -43,8 +47,22 @@ public final class TaskFragmentAnimationParams implements Parcelable {
    @ColorInt
    @ColorInt
    private final int mAnimationBackgroundColor;
    private final int mAnimationBackgroundColor;


    private TaskFragmentAnimationParams(@ColorInt int animationBackgroundColor) {
    @AnimRes
    private final int mOpenAnimationResId;

    @AnimRes
    private final int mChangeAnimationResId;

    @AnimRes
    private final int mCloseAnimationResId;

    private TaskFragmentAnimationParams(@ColorInt int animationBackgroundColor,
            @AnimRes int openAnimationResId, @AnimRes int changeAnimationResId,
            @AnimRes int closeAnimationResId) {
        mAnimationBackgroundColor = animationBackgroundColor;
        mAnimationBackgroundColor = animationBackgroundColor;
        mOpenAnimationResId = openAnimationResId;
        mChangeAnimationResId = changeAnimationResId;
        mCloseAnimationResId = closeAnimationResId;
    }
    }


    /**
    /**
@@ -58,13 +76,52 @@ public final class TaskFragmentAnimationParams implements Parcelable {
        return mAnimationBackgroundColor;
        return mAnimationBackgroundColor;
    }
    }


    /**
     * Returns the resources ID of open animation that applies to this TaskFragment.
     * <p>
     * The default value is {@link DEFAULT_ANIMATION_RESOURCES_ID}, which is to use the system
     * default animation.
     */
    @AnimRes
    public int getOpenAnimationResId() {
        return mOpenAnimationResId;
    }

    /**
     * Returns the resources ID of change animation that applies to this TaskFragment.
     * <p>
     * The default value is {@link DEFAULT_ANIMATION_RESOURCES_ID}, which is to use the system
     * default animation.
     */
    @AnimRes
    public int getChangeAnimationResId() {
        return mChangeAnimationResId;
    }

    /**
     * Returns the resources ID of close animation that applies to this TaskFragment.
     * <p>
     * The default value is {@link DEFAULT_ANIMATION_RESOURCES_ID}, which is to use the system
     * default animation.
     */
    @AnimRes
    public int getCloseAnimationResId() {
        return mCloseAnimationResId;
    }

    private TaskFragmentAnimationParams(Parcel in) {
    private TaskFragmentAnimationParams(Parcel in) {
        mAnimationBackgroundColor = in.readInt();
        mAnimationBackgroundColor = in.readInt();
        mOpenAnimationResId = in.readInt();
        mChangeAnimationResId = in.readInt();
        mCloseAnimationResId = in.readInt();
    }
    }


    @Override
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeInt(mAnimationBackgroundColor);
        dest.writeInt(mAnimationBackgroundColor);
        dest.writeInt(mOpenAnimationResId);
        dest.writeInt(mChangeAnimationResId);
        dest.writeInt(mCloseAnimationResId);
    }
    }


    @NonNull
    @NonNull
@@ -85,21 +142,37 @@ public final class TaskFragmentAnimationParams implements Parcelable {
    public String toString() {
    public String toString() {
        return "TaskFragmentAnimationParams{"
        return "TaskFragmentAnimationParams{"
                + " animationBgColor=" + Integer.toHexString(mAnimationBackgroundColor)
                + " animationBgColor=" + Integer.toHexString(mAnimationBackgroundColor)
                + " openAnimResId=" + mOpenAnimationResId
                + " changeAnimResId=" + mChangeAnimationResId
                + " closeAnimResId=" + mCloseAnimationResId
                + "}";
                + "}";
    }
    }


    @Override
    @Override
    public int hashCode() {
    public int hashCode() {
        return mAnimationBackgroundColor;
        return Objects.hash(mAnimationBackgroundColor, mOpenAnimationResId, mChangeAnimationResId,
                mCloseAnimationResId);
    }
    }


    @Override
    @Override
    public boolean equals(@Nullable Object obj) {
    public boolean equals(@Nullable Object obj) {
        if (!(obj instanceof TaskFragmentAnimationParams)) {
        if (!(obj instanceof TaskFragmentAnimationParams other)) {
            return false;
            return false;
        }
        }
        final TaskFragmentAnimationParams other = (TaskFragmentAnimationParams) obj;
        return mAnimationBackgroundColor == other.mAnimationBackgroundColor
        return mAnimationBackgroundColor == other.mAnimationBackgroundColor;
                && mOpenAnimationResId == other.mOpenAnimationResId
                && mChangeAnimationResId == other.mChangeAnimationResId
                && mCloseAnimationResId == other.mCloseAnimationResId;
    }

    /**
     * Returns {@code true} if one of {@link #getOpenAnimationResId()},
     * {@link #getChangeAnimationResId()} or {@link #getCloseAnimationResId()} is specified.
     */
    public boolean hasOverrideAnimation() {
        return mOpenAnimationResId != DEFAULT_ANIMATION_RESOURCES_ID
                || mChangeAnimationResId != DEFAULT_ANIMATION_BACKGROUND_COLOR
                || mCloseAnimationResId != DEFAULT_ANIMATION_RESOURCES_ID;
    }
    }


    @Override
    @Override
@@ -113,6 +186,15 @@ public final class TaskFragmentAnimationParams implements Parcelable {
        @ColorInt
        @ColorInt
        private int mAnimationBackgroundColor = DEFAULT_ANIMATION_BACKGROUND_COLOR;
        private int mAnimationBackgroundColor = DEFAULT_ANIMATION_BACKGROUND_COLOR;


        @AnimRes
        private int mOpenAnimationResId = DEFAULT_ANIMATION_RESOURCES_ID;

        @AnimRes
        private int mChangeAnimationResId = DEFAULT_ANIMATION_RESOURCES_ID;

        @AnimRes
        private int mCloseAnimationResId = DEFAULT_ANIMATION_RESOURCES_ID;

        /**
        /**
         * Sets the {@link ColorInt} to use for the background during the animation with this
         * Sets the {@link ColorInt} to use for the background during the animation with this
         * TaskFragment if the animation requires a background. The default value is
         * TaskFragment if the animation requires a background. The default value is
@@ -128,10 +210,50 @@ public final class TaskFragmentAnimationParams implements Parcelable {
            return this;
            return this;
        }
        }


        /**
         * Sets the open animation resources ID this TaskFragment. The default value is
         * {@link DEFAULT_ANIMATION_RESOURCES_ID}, which is to use the system default animation.
         *
         * @param resId the open animation resources ID.
         * @return this {@link Builder}.
         */
        @NonNull
        public Builder setOpenAnimationResId(@AnimRes int resId) {
            mOpenAnimationResId = resId;
            return this;
        }

        /**
         * Sets the change animation resources ID this TaskFragment. The default value is
         * {@link DEFAULT_ANIMATION_RESOURCES_ID}, which is to use the system default animation.
         *
         * @param resId the change animation resources ID.
         * @return this {@link Builder}.
         */
        @NonNull
        public Builder setChangeAnimationResId(@AnimRes int resId) {
            mChangeAnimationResId = resId;
            return this;
        }

        /**
         * Sets the close animation resources ID this TaskFragment. The default value is
         * {@link DEFAULT_ANIMATION_RESOURCES_ID}, which is to use the system default animation.
         *
         * @param resId the close animation resources ID.
         * @return this {@link Builder}.
         */
        @NonNull
        public Builder setCloseAnimationResId(@AnimRes int resId) {
            mCloseAnimationResId = resId;
            return this;
        }

        /** Constructs the {@link TaskFragmentAnimationParams}. */
        /** Constructs the {@link TaskFragmentAnimationParams}. */
        @NonNull
        @NonNull
        public TaskFragmentAnimationParams build() {
        public TaskFragmentAnimationParams build() {
            return new TaskFragmentAnimationParams(mAnimationBackgroundColor);
            return new TaskFragmentAnimationParams(mAnimationBackgroundColor,
                    mOpenAnimationResId, mChangeAnimationResId, mCloseAnimationResId);
        }
        }
    }
    }
}
}
+29 −0
Original line number Original line Diff line number Diff line
@@ -1107,6 +1107,7 @@ public final class TransitionInfo implements Parcelable {


        private int mType;
        private int mType;
        private @AnimRes int mEnterResId = DEFAULT_ANIMATION_RESOURCES_ID;
        private @AnimRes int mEnterResId = DEFAULT_ANIMATION_RESOURCES_ID;
        private @AnimRes int mChangeResId = DEFAULT_ANIMATION_RESOURCES_ID;
        private @AnimRes int mExitResId = DEFAULT_ANIMATION_RESOURCES_ID;
        private @AnimRes int mExitResId = DEFAULT_ANIMATION_RESOURCES_ID;
        private boolean mOverrideTaskTransition;
        private boolean mOverrideTaskTransition;
        private String mPackageName;
        private String mPackageName;
@@ -1126,6 +1127,7 @@ public final class TransitionInfo implements Parcelable {
        private AnimationOptions(Parcel in) {
        private AnimationOptions(Parcel in) {
            mType = in.readInt();
            mType = in.readInt();
            mEnterResId = in.readInt();
            mEnterResId = in.readInt();
            mChangeResId = in.readInt();
            mExitResId = in.readInt();
            mExitResId = in.readInt();
            mBackgroundColor = in.readInt();
            mBackgroundColor = in.readInt();
            mOverrideTaskTransition = in.readBoolean();
            mOverrideTaskTransition = in.readBoolean();
@@ -1189,9 +1191,27 @@ public final class TransitionInfo implements Parcelable {
        public static AnimationOptions makeCustomAnimOptions(@NonNull String packageName,
        public static AnimationOptions makeCustomAnimOptions(@NonNull String packageName,
                @AnimRes int enterResId, @AnimRes int exitResId, @ColorInt int backgroundColor,
                @AnimRes int enterResId, @AnimRes int exitResId, @ColorInt int backgroundColor,
                boolean overrideTaskTransition) {
                boolean overrideTaskTransition) {
            return makeCustomAnimOptions(packageName, enterResId, DEFAULT_ANIMATION_RESOURCES_ID,
                    exitResId, backgroundColor, overrideTaskTransition);
        }

        /**
         * Creates a {@link android.app.ActivityOptions#ANIM_CUSTOM} {@link AnimationOptions}.
         *
         * @param packageName the package name that includes the animation resources.
         * @param enterResId the resources ID of open animation.
         * @param changeResId the resources ID of change animation.
         * @param exitResId the resources ID of close animation.
         * @param overrideTaskTransition indicates whether to override task transition.
         */
        @NonNull
        public static AnimationOptions makeCustomAnimOptions(@NonNull String packageName,
                @AnimRes int enterResId, @AnimRes int changeResId, @AnimRes int exitResId,
                @ColorInt int backgroundColor, boolean overrideTaskTransition) {
            AnimationOptions options = new AnimationOptions(ANIM_CUSTOM);
            AnimationOptions options = new AnimationOptions(ANIM_CUSTOM);
            options.mPackageName = packageName;
            options.mPackageName = packageName;
            options.mEnterResId = enterResId;
            options.mEnterResId = enterResId;
            options.mChangeResId = changeResId;
            options.mExitResId = exitResId;
            options.mExitResId = exitResId;
            options.mBackgroundColor = backgroundColor;
            options.mBackgroundColor = backgroundColor;
            options.mOverrideTaskTransition = overrideTaskTransition;
            options.mOverrideTaskTransition = overrideTaskTransition;
@@ -1250,6 +1270,11 @@ public final class TransitionInfo implements Parcelable {
            return mEnterResId;
            return mEnterResId;
        }
        }


        @AnimRes
        public int getChangeResId() {
            return mChangeResId;
        }

        @AnimRes
        @AnimRes
        public int getExitResId() {
        public int getExitResId() {
            return mExitResId;
            return mExitResId;
@@ -1292,6 +1317,7 @@ public final class TransitionInfo implements Parcelable {
        public void writeToParcel(@NonNull Parcel dest, int flags) {
        public void writeToParcel(@NonNull Parcel dest, int flags) {
            dest.writeInt(mType);
            dest.writeInt(mType);
            dest.writeInt(mEnterResId);
            dest.writeInt(mEnterResId);
            dest.writeInt(mChangeResId);
            dest.writeInt(mExitResId);
            dest.writeInt(mExitResId);
            dest.writeInt(mBackgroundColor);
            dest.writeInt(mBackgroundColor);
            dest.writeBoolean(mOverrideTaskTransition);
            dest.writeBoolean(mOverrideTaskTransition);
@@ -1352,6 +1378,9 @@ public final class TransitionInfo implements Parcelable {
            if (mEnterResId != DEFAULT_ANIMATION_RESOURCES_ID) {
            if (mEnterResId != DEFAULT_ANIMATION_RESOURCES_ID) {
                sb.append(" enterResId=").append(mEnterResId);
                sb.append(" enterResId=").append(mEnterResId);
            }
            }
            if (mChangeResId != DEFAULT_ANIMATION_RESOURCES_ID) {
                sb.append(" changeResId=").append(mChangeResId);
            }
            if (mExitResId != DEFAULT_ANIMATION_RESOURCES_ID) {
            if (mExitResId != DEFAULT_ANIMATION_RESOURCES_ID) {
                sb.append(" exitResId=").append(mExitResId);
                sb.append(" exitResId=").append(mExitResId);
            }
            }
+29 −8
Original line number Original line Diff line number Diff line
@@ -95,6 +95,7 @@ import android.view.Display;
import android.view.SurfaceControl;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.view.WindowManager;
import android.window.ScreenCapture;
import android.window.ScreenCapture;
import android.window.TaskFragmentAnimationParams;
import android.window.TransitionInfo;
import android.window.TransitionInfo;
import android.window.WindowContainerTransaction;
import android.window.WindowContainerTransaction;


@@ -2699,10 +2700,10 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
            return out;
            return out;
        }
        }


        final AnimationOptions animOptions = calculateAnimationOptionsForActivityTransition(type,
        final AnimationOptions animOptionsForActivityTransition =
                sortedTargets);
                calculateAnimationOptionsForActivityTransition(type, sortedTargets);
        if (!Flags.moveAnimationOptionsToChange() && animOptions != null) {
        if (!Flags.moveAnimationOptionsToChange() && animOptionsForActivityTransition != null) {
            out.setAnimationOptions(animOptions);
            out.setAnimationOptions(animOptionsForActivityTransition);
        }
        }


        // Convert all the resolved ChangeInfos into TransactionInfo.Change objects in order.
        // Convert all the resolved ChangeInfos into TransactionInfo.Change objects in order.
@@ -2730,6 +2731,8 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {


            final Task task = target.asTask();
            final Task task = target.asTask();
            final TaskFragment taskFragment = target.asTaskFragment();
            final TaskFragment taskFragment = target.asTaskFragment();
            final boolean isEmbeddedTaskFragment = taskFragment != null
                    && taskFragment.isEmbedded();
            final ActivityRecord activityRecord = target.asActivityRecord();
            final ActivityRecord activityRecord = target.asActivityRecord();


            if (task != null) {
            if (task != null) {
@@ -2769,7 +2772,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
                change.setEndAbsBounds(bounds);
                change.setEndAbsBounds(bounds);
            }
            }


            if (activityRecord != null || (taskFragment != null && taskFragment.isEmbedded())) {
            if (activityRecord != null || isEmbeddedTaskFragment) {
                final int backgroundColor;
                final int backgroundColor;
                final TaskFragment organizedTf = activityRecord != null
                final TaskFragment organizedTf = activityRecord != null
                        ? activityRecord.getOrganizedTaskFragment()
                        ? activityRecord.getOrganizedTaskFragment()
@@ -2794,10 +2797,28 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
                change.setBackgroundColor(ColorUtils.setAlphaComponent(backgroundColor, 255));
                change.setBackgroundColor(ColorUtils.setAlphaComponent(backgroundColor, 255));
            }
            }


            if (Flags.moveAnimationOptionsToChange() && activityRecord != null
            AnimationOptions animOptions = null;
                    && animOptions != null) {
            if (Flags.moveAnimationOptionsToChange()) {
                if (activityRecord != null && animOptionsForActivityTransition != null) {
                    animOptions = animOptionsForActivityTransition;
                } else if (Flags.activityEmbeddingOverlayPresentationFlag()
                        && isEmbeddedTaskFragment) {
                    final TaskFragmentAnimationParams params = taskFragment.getAnimationParams();
                    if (params.hasOverrideAnimation()) {
                        // Only set AnimationOptions if there's any animation override.
                        // We use separated field for backgroundColor, and
                        // AnimationOptions#backgroundColor will be removed in long term.
                        animOptions = AnimationOptions.makeCustomAnimOptions(
                                taskFragment.getTask().getBasePackageName(),
                                params.getOpenAnimationResId(), params.getChangeAnimationResId(),
                                params.getCloseAnimationResId(), 0 /* backgroundColor */,
                                false /* overrideTaskTransition */);
                    }
                }
                if (animOptions != null) {
                    change.setAnimationOptions(animOptions);
                    change.setAnimationOptions(animOptions);
                }
                }
            }


            if (activityRecord != null) {
            if (activityRecord != null) {
                change.setActivityComponent(activityRecord.mActivityComponent);
                change.setActivityComponent(activityRecord.mActivityComponent);