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

Commit a5d3200b authored by Chris Li's avatar Chris Li Committed by Android (Google) Code Review
Browse files

Merge "Pass TaskFragmentAnimationParams to TaskFragment"

parents 6f05ddbe 2109cc26
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.window;

/**
 * Data object for animation related override of TaskFragment.
 * @hide
 */
parcelable TaskFragmentAnimationParams;
+129 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.window;

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

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

    /** The default {@link TaskFragmentAnimationParams} to use when there is no app override. */
    public static final TaskFragmentAnimationParams DEFAULT =
            new TaskFragmentAnimationParams.Builder().build();

    @ColorInt
    private final int mAnimationBackgroundColor;

    private TaskFragmentAnimationParams(@ColorInt int animationBackgroundColor) {
        mAnimationBackgroundColor = animationBackgroundColor;
    }

    /**
     * The {@link ColorInt} to use for the background during the animation with this TaskFragment if
     * the animation requires a background.
     *
     * The default value is {@code 0}, which is to use the theme window background.
     */
    @ColorInt
    public int getAnimationBackgroundColor() {
        return mAnimationBackgroundColor;
    }

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

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

    @NonNull
    public static final Creator<TaskFragmentAnimationParams> CREATOR =
            new Creator<TaskFragmentAnimationParams>() {
                @Override
                public TaskFragmentAnimationParams createFromParcel(Parcel in) {
                    return new TaskFragmentAnimationParams(in);
                }

                @Override
                public TaskFragmentAnimationParams[] newArray(int size) {
                    return new TaskFragmentAnimationParams[size];
                }
            };

    @Override
    public String toString() {
        return "TaskFragmentAnimationParams{"
                + " animationBgColor=" + Integer.toHexString(mAnimationBackgroundColor)
                + "}";
    }

    @Override
    public int hashCode() {
        return mAnimationBackgroundColor;
    }

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

    @Override
    public int describeContents() {
        return 0;
    }

    /** Builder to construct the {@link TaskFragmentAnimationParams}. */
    public static final class Builder {

        @ColorInt
        private int mAnimationBackgroundColor = 0;

        /**
         * 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
         * {@code 0}, which is to use the theme window background.
         *
         * @param color a packed color int, {@code AARRGGBB}, for the animation background color.
         * @return this {@link Builder}.
         */
        @NonNull
        public Builder setAnimationBackgroundColor(@ColorInt int color) {
            mAnimationBackgroundColor = color;
            return this;
        }

        /** Constructs the {@link TaskFragmentAnimationParams}. */
        @NonNull
        public TaskFragmentAnimationParams build() {
            return new TaskFragmentAnimationParams(mAnimationBackgroundColor);
        }
    }
}
+23 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.window;

/**
 * Data object of params for TaskFragment related {@link WindowContainerTransaction} operation.
 * @hide
 */
parcelable TaskFragmentOperation;
+168 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.window;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Objects;

/**
 * Data object of params for TaskFragment related {@link WindowContainerTransaction} operation.
 *
 * @see WindowContainerTransaction#setTaskFragmentOperation(IBinder, TaskFragmentOperation).
 * @hide
 */
// TODO(b/263436063): move other TaskFragment related operation here.
public final class TaskFragmentOperation implements Parcelable {

    /** Sets the {@link TaskFragmentAnimationParams} for the given TaskFragment. */
    public static final int OP_TYPE_SET_ANIMATION_PARAMS = 0;

    @IntDef(prefix = { "OP_TYPE_" }, value = {
            OP_TYPE_SET_ANIMATION_PARAMS
    })
    @Retention(RetentionPolicy.SOURCE)
    @interface OperationType {}

    @OperationType
    private final int mOpType;

    @Nullable
    private final TaskFragmentAnimationParams mAnimationParams;

    private TaskFragmentOperation(@OperationType int opType,
            @Nullable TaskFragmentAnimationParams animationParams) {
        mOpType = opType;
        mAnimationParams = animationParams;
    }

    private TaskFragmentOperation(Parcel in) {
        mOpType = in.readInt();
        mAnimationParams = in.readTypedObject(TaskFragmentAnimationParams.CREATOR);
    }

    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeInt(mOpType);
        dest.writeTypedObject(mAnimationParams, flags);
    }

    @NonNull
    public static final Creator<TaskFragmentOperation> CREATOR =
            new Creator<TaskFragmentOperation>() {
                @Override
                public TaskFragmentOperation createFromParcel(Parcel in) {
                    return new TaskFragmentOperation(in);
                }

                @Override
                public TaskFragmentOperation[] newArray(int size) {
                    return new TaskFragmentOperation[size];
                }
            };

    /**
     * Gets the {@link OperationType} of this {@link TaskFragmentOperation}.
     */
    @OperationType
    public int getOpType() {
        return mOpType;
    }

    /**
     * Gets the animation related override of TaskFragment.
     */
    @Nullable
    public TaskFragmentAnimationParams getAnimationParams() {
        return mAnimationParams;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();
        sb.append("TaskFragmentOperation{ opType=").append(mOpType);
        if (mAnimationParams != null) {
            sb.append(", animationParams=").append(mAnimationParams);
        }

        sb.append('}');
        return sb.toString();
    }

    @Override
    public int hashCode() {
        int result = mOpType;
        result = result * 31 + mAnimationParams.hashCode();
        return result;
    }

    @Override
    public boolean equals(@Nullable Object obj) {
        if (!(obj instanceof TaskFragmentOperation)) {
            return false;
        }
        final TaskFragmentOperation other = (TaskFragmentOperation) obj;
        return mOpType == other.mOpType
                && Objects.equals(mAnimationParams, other.mAnimationParams);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    /** Builder to construct the {@link TaskFragmentOperation}. */
    public static final class Builder {

        @OperationType
        private final int mOpType;

        @Nullable
        private TaskFragmentAnimationParams mAnimationParams;

        /**
         * @param opType the {@link OperationType} of this {@link TaskFragmentOperation}.
         */
        public Builder(@OperationType int opType) {
            mOpType = opType;
        }

        /**
         * Sets the {@link TaskFragmentAnimationParams} for the given TaskFragment.
         */
        @NonNull
        public Builder setAnimationParams(@Nullable TaskFragmentAnimationParams animationParams) {
            mAnimationParams = animationParams;
            return this;
        }

        /**
         * Constructs the {@link TaskFragmentOperation}.
         */
        @NonNull
        public TaskFragmentOperation build() {
            return new TaskFragmentOperation(mOpType, mAnimationParams);
        }
    }
}
+51 −1
Original line number Diff line number Diff line
@@ -750,6 +750,30 @@ public final class WindowContainerTransaction implements Parcelable {
        return this;
    }

    /**
     * Sets the {@link TaskFragmentOperation} to apply to the given TaskFragment.
     *
     * @param fragmentToken client assigned unique token to create TaskFragment with specified in
     *                      {@link TaskFragmentCreationParams#getFragmentToken()}.
     * @param taskFragmentOperation the {@link TaskFragmentOperation} to apply to the given
     *                              TaskFramgent.
     * @hide
     */
    @NonNull
    public WindowContainerTransaction setTaskFragmentOperation(@NonNull IBinder fragmentToken,
            @NonNull TaskFragmentOperation taskFragmentOperation) {
        Objects.requireNonNull(fragmentToken);
        Objects.requireNonNull(taskFragmentOperation);
        final HierarchyOp hierarchyOp =
                new HierarchyOp.Builder(
                        HierarchyOp.HIERARCHY_OP_TYPE_SET_TASK_FRAGMENT_OPERATION)
                        .setContainer(fragmentToken)
                        .setTaskFragmentOperation(taskFragmentOperation)
                        .build();
        mHierarchyOps.add(hierarchyOp);
        return this;
    }

    /**
     * Sets/removes the always on top flag for this {@code windowContainer}. See
     * {@link com.android.server.wm.ConfigurationContainer#setAlwaysOnTop(boolean)}.
@@ -1261,6 +1285,7 @@ public final class WindowContainerTransaction implements Parcelable {
        public static final int HIERARCHY_OP_TYPE_SET_COMPANION_TASK_FRAGMENT = 22;
        public static final int HIERARCHY_OP_TYPE_CLEAR_ADJACENT_ROOTS = 23;
        public static final int HIERARCHY_OP_TYPE_SET_REPARENT_LEAF_TASK_IF_RELAUNCH = 24;
        public static final int HIERARCHY_OP_TYPE_SET_TASK_FRAGMENT_OPERATION = 25;

        // The following key(s) are for use with mLaunchOptions:
        // When launching a task (eg. from recents), this is the taskId to be launched.
@@ -1301,10 +1326,14 @@ public final class WindowContainerTransaction implements Parcelable {
        @Nullable
        private Intent mActivityIntent;

        // Used as options for WindowContainerTransaction#createTaskFragment().
        /** Used as options for {@link #createTaskFragment}. */
        @Nullable
        private TaskFragmentCreationParams mTaskFragmentCreationOptions;

        /** Used as options for {@link #setTaskFragmentOperation}. */
        @Nullable
        private TaskFragmentOperation mTaskFragmentOperation;

        @Nullable
        private PendingIntent mPendingIntent;

@@ -1424,6 +1453,7 @@ public final class WindowContainerTransaction implements Parcelable {
            mLaunchOptions = copy.mLaunchOptions;
            mActivityIntent = copy.mActivityIntent;
            mTaskFragmentCreationOptions = copy.mTaskFragmentCreationOptions;
            mTaskFragmentOperation = copy.mTaskFragmentOperation;
            mPendingIntent = copy.mPendingIntent;
            mShortcutInfo = copy.mShortcutInfo;
            mAlwaysOnTop = copy.mAlwaysOnTop;
@@ -1447,6 +1477,7 @@ public final class WindowContainerTransaction implements Parcelable {
            mLaunchOptions = in.readBundle();
            mActivityIntent = in.readTypedObject(Intent.CREATOR);
            mTaskFragmentCreationOptions = in.readTypedObject(TaskFragmentCreationParams.CREATOR);
            mTaskFragmentOperation = in.readTypedObject(TaskFragmentOperation.CREATOR);
            mPendingIntent = in.readTypedObject(PendingIntent.CREATOR);
            mShortcutInfo = in.readTypedObject(ShortcutInfo.CREATOR);
            mAlwaysOnTop = in.readBoolean();
@@ -1534,6 +1565,11 @@ public final class WindowContainerTransaction implements Parcelable {
            return mTaskFragmentCreationOptions;
        }

        @Nullable
        public TaskFragmentOperation getTaskFragmentOperation() {
            return mTaskFragmentOperation;
        }

        @Nullable
        public PendingIntent getPendingIntent() {
            return mPendingIntent;
@@ -1612,6 +1648,9 @@ public final class WindowContainerTransaction implements Parcelable {
                case HIERARCHY_OP_TYPE_SET_REPARENT_LEAF_TASK_IF_RELAUNCH:
                    return "{setReparentLeafTaskIfRelaunch: container= " + mContainer
                            + " reparentLeafTaskIfRelaunch= " + mReparentLeafTaskIfRelaunch + "}";
                case HIERARCHY_OP_TYPE_SET_TASK_FRAGMENT_OPERATION:
                    return "{setTaskFragmentOperation: fragmentToken= " + mContainer
                            + " operation= " + mTaskFragmentOperation + "}";
                default:
                    return "{mType=" + mType + " container=" + mContainer + " reparent=" + mReparent
                            + " mToTop=" + mToTop
@@ -1639,6 +1678,7 @@ public final class WindowContainerTransaction implements Parcelable {
            dest.writeBundle(mLaunchOptions);
            dest.writeTypedObject(mActivityIntent, flags);
            dest.writeTypedObject(mTaskFragmentCreationOptions, flags);
            dest.writeTypedObject(mTaskFragmentOperation, flags);
            dest.writeTypedObject(mPendingIntent, flags);
            dest.writeTypedObject(mShortcutInfo, flags);
            dest.writeBoolean(mAlwaysOnTop);
@@ -1695,6 +1735,9 @@ public final class WindowContainerTransaction implements Parcelable {
            @Nullable
            private TaskFragmentCreationParams mTaskFragmentCreationOptions;

            @Nullable
            private TaskFragmentOperation mTaskFragmentOperation;

            @Nullable
            private PendingIntent mPendingIntent;

@@ -1775,6 +1818,12 @@ public final class WindowContainerTransaction implements Parcelable {
                return this;
            }

            Builder setTaskFragmentOperation(
                    @Nullable TaskFragmentOperation taskFragmentOperation) {
                mTaskFragmentOperation = taskFragmentOperation;
                return this;
            }

            Builder setReparentLeafTaskIfRelaunch(boolean reparentLeafTaskIfRelaunch) {
                mReparentLeafTaskIfRelaunch = reparentLeafTaskIfRelaunch;
                return this;
@@ -1804,6 +1853,7 @@ public final class WindowContainerTransaction implements Parcelable {
                hierarchyOp.mPendingIntent = mPendingIntent;
                hierarchyOp.mAlwaysOnTop = mAlwaysOnTop;
                hierarchyOp.mTaskFragmentCreationOptions = mTaskFragmentCreationOptions;
                hierarchyOp.mTaskFragmentOperation = mTaskFragmentOperation;
                hierarchyOp.mShortcutInfo = mShortcutInfo;
                hierarchyOp.mReparentLeafTaskIfRelaunch = mReparentLeafTaskIfRelaunch;

Loading