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

Commit 2626c319 authored by Wei Sheng Shih's avatar Wei Sheng Shih Committed by Automerger Merge Worker
Browse files

Merge "Play seekable animation for customize activity transition API." into udc-dev am: 06dfb810

parents a47151db 06dfb810
Loading
Loading
Loading
Loading
+90 −2
Original line number Original line Diff line number Diff line
@@ -92,6 +92,8 @@ public final class BackNavigationInfo implements Parcelable {
    @Nullable
    @Nullable
    private final IOnBackInvokedCallback mOnBackInvokedCallback;
    private final IOnBackInvokedCallback mOnBackInvokedCallback;
    private final boolean mPrepareRemoteAnimation;
    private final boolean mPrepareRemoteAnimation;
    @Nullable
    private final CustomAnimationInfo mCustomAnimationInfo;


    /**
    /**
     * Create a new {@link BackNavigationInfo} instance.
     * Create a new {@link BackNavigationInfo} instance.
@@ -104,11 +106,13 @@ public final class BackNavigationInfo implements Parcelable {
    private BackNavigationInfo(@BackTargetType int type,
    private BackNavigationInfo(@BackTargetType int type,
            @Nullable RemoteCallback onBackNavigationDone,
            @Nullable RemoteCallback onBackNavigationDone,
            @Nullable IOnBackInvokedCallback onBackInvokedCallback,
            @Nullable IOnBackInvokedCallback onBackInvokedCallback,
            boolean isPrepareRemoteAnimation) {
            boolean isPrepareRemoteAnimation,
            @Nullable CustomAnimationInfo customAnimationInfo) {
        mType = type;
        mType = type;
        mOnBackNavigationDone = onBackNavigationDone;
        mOnBackNavigationDone = onBackNavigationDone;
        mOnBackInvokedCallback = onBackInvokedCallback;
        mOnBackInvokedCallback = onBackInvokedCallback;
        mPrepareRemoteAnimation = isPrepareRemoteAnimation;
        mPrepareRemoteAnimation = isPrepareRemoteAnimation;
        mCustomAnimationInfo = customAnimationInfo;
    }
    }


    private BackNavigationInfo(@NonNull Parcel in) {
    private BackNavigationInfo(@NonNull Parcel in) {
@@ -116,6 +120,7 @@ public final class BackNavigationInfo implements Parcelable {
        mOnBackNavigationDone = in.readTypedObject(RemoteCallback.CREATOR);
        mOnBackNavigationDone = in.readTypedObject(RemoteCallback.CREATOR);
        mOnBackInvokedCallback = IOnBackInvokedCallback.Stub.asInterface(in.readStrongBinder());
        mOnBackInvokedCallback = IOnBackInvokedCallback.Stub.asInterface(in.readStrongBinder());
        mPrepareRemoteAnimation = in.readBoolean();
        mPrepareRemoteAnimation = in.readBoolean();
        mCustomAnimationInfo = in.readTypedObject(CustomAnimationInfo.CREATOR);
    }
    }


    /** @hide */
    /** @hide */
@@ -125,6 +130,7 @@ public final class BackNavigationInfo implements Parcelable {
        dest.writeTypedObject(mOnBackNavigationDone, flags);
        dest.writeTypedObject(mOnBackNavigationDone, flags);
        dest.writeStrongInterface(mOnBackInvokedCallback);
        dest.writeStrongInterface(mOnBackInvokedCallback);
        dest.writeBoolean(mPrepareRemoteAnimation);
        dest.writeBoolean(mPrepareRemoteAnimation);
        dest.writeTypedObject(mCustomAnimationInfo, flags);
    }
    }


    /**
    /**
@@ -172,6 +178,15 @@ public final class BackNavigationInfo implements Parcelable {
        }
        }
    }
    }


    /**
     * Get customize animation info.
     * @hide
     */
    @Nullable
    public CustomAnimationInfo getCustomAnimationInfo() {
        return mCustomAnimationInfo;
    }

    /** @hide */
    /** @hide */
    @Override
    @Override
    public int describeContents() {
    public int describeContents() {
@@ -197,6 +212,7 @@ public final class BackNavigationInfo implements Parcelable {
                + "mType=" + typeToString(mType) + " (" + mType + ")"
                + "mType=" + typeToString(mType) + " (" + mType + ")"
                + ", mOnBackNavigationDone=" + mOnBackNavigationDone
                + ", mOnBackNavigationDone=" + mOnBackNavigationDone
                + ", mOnBackInvokedCallback=" + mOnBackInvokedCallback
                + ", mOnBackInvokedCallback=" + mOnBackInvokedCallback
                + ", mCustomizeAnimationInfo=" + mCustomAnimationInfo
                + '}';
                + '}';
    }
    }


@@ -222,6 +238,67 @@ public final class BackNavigationInfo implements Parcelable {
        return String.valueOf(type);
        return String.valueOf(type);
    }
    }


    /**
     * Information for customize back animation.
     * @hide
     */
    public static final class CustomAnimationInfo implements Parcelable {
        private final String mPackageName;
        private int mWindowAnimations;

        /**
         * The package name of the windowAnimations.
         */
        @NonNull
        public String getPackageName() {
            return mPackageName;
        }

        /**
         * The resource Id of window animations.
         */
        public int getWindowAnimations() {
            return mWindowAnimations;
        }

        public CustomAnimationInfo(@NonNull String packageName) {
            this.mPackageName = packageName;
        }

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

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

        private CustomAnimationInfo(@NonNull Parcel in) {
            mPackageName = in.readString8();
            mWindowAnimations = in.readInt();
        }

        @Override
        public String toString() {
            return "CustomAnimationInfo, package name= " + mPackageName;
        }

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

            @Override
            public CustomAnimationInfo[] newArray(int size) {
                return new CustomAnimationInfo[size];
            }
        };
    }
    /**
    /**
     * @hide
     * @hide
     */
     */
@@ -233,6 +310,7 @@ public final class BackNavigationInfo implements Parcelable {
        @Nullable
        @Nullable
        private IOnBackInvokedCallback mOnBackInvokedCallback = null;
        private IOnBackInvokedCallback mOnBackInvokedCallback = null;
        private boolean mPrepareRemoteAnimation;
        private boolean mPrepareRemoteAnimation;
        private CustomAnimationInfo mCustomAnimationInfo;


        /**
        /**
         * @see BackNavigationInfo#getType()
         * @see BackNavigationInfo#getType()
@@ -267,13 +345,23 @@ public final class BackNavigationInfo implements Parcelable {
            return this;
            return this;
        }
        }


        /**
         * Set windowAnimations for customize animation.
         */
        public Builder setWindowAnimations(String packageName, int windowAnimations) {
            mCustomAnimationInfo = new CustomAnimationInfo(packageName);
            mCustomAnimationInfo.mWindowAnimations = windowAnimations;
            return this;
        }

        /**
        /**
         * Builds and returns an instance of {@link BackNavigationInfo}
         * Builds and returns an instance of {@link BackNavigationInfo}
         */
         */
        public BackNavigationInfo build() {
        public BackNavigationInfo build() {
            return new BackNavigationInfo(mType, mOnBackNavigationDone,
            return new BackNavigationInfo(mType, mOnBackNavigationDone,
                    mOnBackInvokedCallback,
                    mOnBackInvokedCallback,
                    mPrepareRemoteAnimation);
                    mPrepareRemoteAnimation,
                    mCustomAnimationInfo);
        }
        }
    }
    }
}
}
+1 −2
Original line number Original line Diff line number Diff line
@@ -37,14 +37,13 @@ oneway interface IBackAnimationRunner {


    /**
    /**
     * Called when the system is ready for the handler to start animating all the visible tasks.
     * Called when the system is ready for the handler to start animating all the visible tasks.
     * @param type The back navigation type.
     * @param apps The list of departing (type=MODE_CLOSING) and entering (type=MODE_OPENING)
     * @param apps The list of departing (type=MODE_CLOSING) and entering (type=MODE_OPENING)
                   windows to animate,
                   windows to animate,
     * @param wallpapers The list of wallpapers to animate.
     * @param wallpapers The list of wallpapers to animate.
     * @param nonApps The list of non-app windows such as Bubbles to animate.
     * @param nonApps The list of non-app windows such as Bubbles to animate.
     * @param finishedCallback The callback to invoke when the animation is finished.
     * @param finishedCallback The callback to invoke when the animation is finished.
     */
     */
    void onAnimationStart(in int type,
    void onAnimationStart(
            in RemoteAnimationTarget[] apps,
            in RemoteAnimationTarget[] apps,
            in RemoteAnimationTarget[] wallpapers,
            in RemoteAnimationTarget[] wallpapers,
            in RemoteAnimationTarget[] nonApps,
            in RemoteAnimationTarget[] nonApps,
+28 −0
Original line number Original line Diff line number Diff line
@@ -265,6 +265,34 @@ public class TransitionAnimation {
        }
        }
        return null;
        return null;
    }
    }

    /** Get animation resId by attribute Id from specific LayoutParams */
    public int getAnimationResId(LayoutParams lp, int animAttr, int transit) {
        int resId = Resources.ID_NULL;
        if (animAttr >= 0) {
            AttributeCache.Entry ent = getCachedAnimations(lp);
            if (ent != null) {
                resId = ent.array.getResourceId(animAttr, 0);
            }
        }
        resId = updateToTranslucentAnimIfNeeded(resId, transit);
        return resId;
    }

    /** Get default animation resId */
    public int getDefaultAnimationResId(int animAttr, int transit) {
        int resId = Resources.ID_NULL;
        if (animAttr >= 0) {
            AttributeCache.Entry ent = getCachedAnimations(DEFAULT_PACKAGE,
                    mDefaultWindowAnimationStyleResId);
            if (ent != null) {
                resId = ent.array.getResourceId(animAttr, 0);
            }
        }
        resId = updateToTranslucentAnimIfNeeded(resId, transit);
        return resId;
    }

    /**
    /**
     * Load animation by attribute Id from a specific AnimationStyle resource.
     * Load animation by attribute Id from a specific AnimationStyle resource.
     *
     *
+43 −10
Original line number Original line Diff line number Diff line
@@ -120,6 +120,9 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
    @Nullable
    @Nullable
    private IOnBackInvokedCallback mActiveCallback;
    private IOnBackInvokedCallback mActiveCallback;


    private CrossActivityAnimation mDefaultActivityAnimation;
    private CustomizeActivityAnimation mCustomizeActivityAnimation;

    @VisibleForTesting
    @VisibleForTesting
    final RemoteCallback mNavigationObserver = new RemoteCallback(
    final RemoteCallback mNavigationObserver = new RemoteCallback(
            new RemoteCallback.OnResultListener() {
            new RemoteCallback.OnResultListener() {
@@ -194,10 +197,12 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
                new CrossTaskBackAnimation(mContext, mAnimationBackground);
                new CrossTaskBackAnimation(mContext, mAnimationBackground);
        mAnimationDefinition.set(BackNavigationInfo.TYPE_CROSS_TASK,
        mAnimationDefinition.set(BackNavigationInfo.TYPE_CROSS_TASK,
                crossTaskAnimation.mBackAnimationRunner);
                crossTaskAnimation.mBackAnimationRunner);
        final CrossActivityAnimation crossActivityAnimation =
        mDefaultActivityAnimation =
                new CrossActivityAnimation(mContext, mAnimationBackground);
                new CrossActivityAnimation(mContext, mAnimationBackground);
        mAnimationDefinition.set(BackNavigationInfo.TYPE_CROSS_ACTIVITY,
        mAnimationDefinition.set(BackNavigationInfo.TYPE_CROSS_ACTIVITY,
                crossActivityAnimation.mBackAnimationRunner);
                mDefaultActivityAnimation.mBackAnimationRunner);
        mCustomizeActivityAnimation =
                new CustomizeActivityAnimation(mContext, mAnimationBackground);
        // TODO (236760237): register dialog close animation when it's completed.
        // TODO (236760237): register dialog close animation when it's completed.
    }
    }


@@ -368,7 +373,6 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
        final boolean shouldDispatchToAnimator = shouldDispatchToAnimator();
        final boolean shouldDispatchToAnimator = shouldDispatchToAnimator();
        if (shouldDispatchToAnimator) {
        if (shouldDispatchToAnimator) {
            if (mAnimationDefinition.contains(backType)) {
            if (mAnimationDefinition.contains(backType)) {
                mActiveCallback = mAnimationDefinition.get(backType).getCallback();
                mAnimationDefinition.get(backType).startGesture();
                mAnimationDefinition.get(backType).startGesture();
            } else {
            } else {
                mActiveCallback = null;
                mActiveCallback = null;
@@ -542,13 +546,12 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
        }
        }


        final int backType = mBackNavigationInfo.getType();
        final int backType = mBackNavigationInfo.getType();
        final BackAnimationRunner runner = mAnimationDefinition.get(backType);
        // Simply trigger and finish back navigation when no animator defined.
        // Simply trigger and finish back navigation when no animator defined.
        if (!shouldDispatchToAnimator() || mActiveCallback == null) {
        if (!shouldDispatchToAnimator() || runner == null) {
            invokeOrCancelBack();
            invokeOrCancelBack();
            return;
            return;
        }
        }

        final BackAnimationRunner runner = mAnimationDefinition.get(backType);
        if (runner.isWaitingAnimation()) {
        if (runner.isWaitingAnimation()) {
            ProtoLog.w(WM_SHELL_BACK_PREVIEW, "Gesture released, but animation didn't ready.");
            ProtoLog.w(WM_SHELL_BACK_PREVIEW, "Gesture released, but animation didn't ready.");
            return;
            return;
@@ -607,6 +610,12 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
        mShouldStartOnNextMoveEvent = false;
        mShouldStartOnNextMoveEvent = false;
        mTouchTracker.reset();
        mTouchTracker.reset();
        mActiveCallback = null;
        mActiveCallback = null;
        // reset to default
        if (mDefaultActivityAnimation != null
                && mAnimationDefinition.contains(BackNavigationInfo.TYPE_CROSS_ACTIVITY)) {
            mAnimationDefinition.set(BackNavigationInfo.TYPE_CROSS_ACTIVITY,
                    mDefaultActivityAnimation.mBackAnimationRunner);
        }
        if (mBackNavigationInfo != null) {
        if (mBackNavigationInfo != null) {
            mBackNavigationInfo.onBackNavigationFinished(mTriggerBack);
            mBackNavigationInfo.onBackNavigationFinished(mTriggerBack);
            mBackNavigationInfo = null;
            mBackNavigationInfo = null;
@@ -614,14 +623,35 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
        mTriggerBack = false;
        mTriggerBack = false;
    }
    }


    private BackAnimationRunner getAnimationRunnerAndInit() {
        int type = mBackNavigationInfo.getType();
        // Initiate customized cross-activity animation, or fall back to cross activity animation
        if (type == BackNavigationInfo.TYPE_CROSS_ACTIVITY && mAnimationDefinition.contains(type)) {
            final BackNavigationInfo.CustomAnimationInfo animationInfo =
                    mBackNavigationInfo.getCustomAnimationInfo();
            if (animationInfo != null && mCustomizeActivityAnimation != null
                    && mCustomizeActivityAnimation.prepareNextAnimation(animationInfo)) {
                mAnimationDefinition.get(type).resetWaitingAnimation();
                mAnimationDefinition.set(BackNavigationInfo.TYPE_CROSS_ACTIVITY,
                        mCustomizeActivityAnimation.mBackAnimationRunner);
            }
        }
        return mAnimationDefinition.get(type);
    }

    private void createAdapter() {
    private void createAdapter() {
        IBackAnimationRunner runner = new IBackAnimationRunner.Stub() {
        IBackAnimationRunner runner = new IBackAnimationRunner.Stub() {
            @Override
            @Override
            public void onAnimationStart(int type, RemoteAnimationTarget[] apps,
            public void onAnimationStart(RemoteAnimationTarget[] apps,
                    RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps,
                    RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps,
                    IBackAnimationFinishedCallback finishedCallback) {
                    IBackAnimationFinishedCallback finishedCallback) {
                mShellExecutor.execute(() -> {
                mShellExecutor.execute(() -> {
                    final BackAnimationRunner runner = mAnimationDefinition.get(type);
                    if (mBackNavigationInfo == null) {
                        Log.e(TAG, "Lack of navigation info to start animation.");
                        return;
                    }
                    final int type = mBackNavigationInfo.getType();
                    final BackAnimationRunner runner = getAnimationRunnerAndInit();
                    if (runner == null) {
                    if (runner == null) {
                        Log.e(TAG, "Animation didn't be defined for type "
                        Log.e(TAG, "Animation didn't be defined for type "
                                + BackNavigationInfo.typeToString(type));
                                + BackNavigationInfo.typeToString(type));
@@ -634,6 +664,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
                        }
                        }
                        return;
                        return;
                    }
                    }
                    mActiveCallback = runner.getCallback();
                    mBackAnimationFinishedCallback = finishedCallback;
                    mBackAnimationFinishedCallback = finishedCallback;


                    ProtoLog.d(WM_SHELL_BACK_PREVIEW, "BackAnimationController: startAnimation()");
                    ProtoLog.d(WM_SHELL_BACK_PREVIEW, "BackAnimationController: startAnimation()");
@@ -645,11 +676,13 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
                                mActiveCallback, mTouchTracker.createStartEvent(apps[0]));
                                mActiveCallback, mTouchTracker.createStartEvent(apps[0]));
                    }
                    }


                    // Dispatch the first progress after animation start for smoothing the initial
                    // animation, instead of waiting for next onMove.
                    final BackMotionEvent backFinish = mTouchTracker.createProgressEvent();
                    dispatchOnBackProgressed(mActiveCallback, backFinish);
                    if (!mBackGestureStarted) {
                    if (!mBackGestureStarted) {
                        // if the down -> up gesture happened before animation start, we have to
                        // if the down -> up gesture happened before animation start, we have to
                        // trigger the uninterruptible transition to finish the back animation.
                        // trigger the uninterruptible transition to finish the back animation.
                        final BackMotionEvent backFinish = mTouchTracker.createProgressEvent();
                        dispatchOnBackProgressed(mActiveCallback, backFinish);
                        startPostCommitAnimation();
                        startPostCommitAnimation();
                    }
                    }
                });
                });
+4 −0
Original line number Original line Diff line number Diff line
@@ -99,4 +99,8 @@ class BackAnimationRunner {
    boolean isAnimationCancelled() {
    boolean isAnimationCancelled() {
        return mAnimationCancelled;
        return mAnimationCancelled;
    }
    }

    void resetWaitingAnimation() {
        mWaitingAnimation = false;
    }
}
}
Loading