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

Commit c1bca5a0 authored by wilsonshih's avatar wilsonshih
Browse files

Clear close prepare transition token by TransitionObserver

Transition handler won't receive startAnimation nor mergeAnimation if
there is no changes in that transition. Use TransitionObserver to
track the state in case the close prepare transition is aborted.

Flag: EXEMPT bugfix
Bug: 373828944
Test: disable snapshot, click app button on edge which also trigger
predictive back animation, verify the close prepare transition can
be reset if aborted.

Change-Id: I6c927f5a7602ed3345da05564671445496d30b5a
parent cf244b08
Loading
Loading
Loading
Loading
+24 −12
Original line number Original line Diff line number Diff line
@@ -164,8 +164,8 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
     */
     */
    private BackTouchTracker mQueuedTracker = new BackTouchTracker();
    private BackTouchTracker mQueuedTracker = new BackTouchTracker();


    private final FocusTaskTrackerObserver mFocusTaskTrackerObserver =
    private final BackTransitionObserver mBackTransitionObserver =
            new FocusTaskTrackerObserver();
            new BackTransitionObserver();


    private final Runnable mAnimationTimeoutRunnable = () -> {
    private final Runnable mAnimationTimeoutRunnable = () -> {
        ProtoLog.w(WM_SHELL_BACK_PREVIEW, "Animation didn't finish in %d ms. Resetting...",
        ProtoLog.w(WM_SHELL_BACK_PREVIEW, "Animation didn't finish in %d ms. Resetting...",
@@ -271,7 +271,8 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
        mBackTransitionHandler = new BackTransitionHandler();
        mBackTransitionHandler = new BackTransitionHandler();
        mTransitions.addHandler(mBackTransitionHandler);
        mTransitions.addHandler(mBackTransitionHandler);
        mHandler = handler;
        mHandler = handler;
        mTransitions.registerObserver(mFocusTaskTrackerObserver);
        mTransitions.registerObserver(mBackTransitionObserver);
        mBackTransitionObserver.setBackTransitionHandler(mBackTransitionHandler);
        updateTouchableArea();
        updateTouchableArea();
    }
    }


@@ -736,7 +737,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
     * @return Latest task id which back gesture has occurred on it.
     * @return Latest task id which back gesture has occurred on it.
     */
     */
    public int getLatestTriggerBackTask() {
    public int getLatestTriggerBackTask() {
        return mFocusTaskTrackerObserver.mFocusedTaskId;
        return mBackTransitionObserver.mFocusedTaskId;
    }
    }


    /**
    /**
@@ -804,7 +805,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
        ProtoLog.d(WM_SHELL_BACK_PREVIEW, "onGestureFinished() mTriggerBack == %s", triggerBack);
        ProtoLog.d(WM_SHELL_BACK_PREVIEW, "onGestureFinished() mTriggerBack == %s", triggerBack);


        if (triggerBack) {
        if (triggerBack) {
            mFocusTaskTrackerObserver.update(mBackNavigationInfo != null
            mBackTransitionObserver.update(mBackNavigationInfo != null
                            ? mBackNavigationInfo.getFocusedTaskId()
                            ? mBackNavigationInfo.getFocusedTaskId()
                            : INVALID_TASK_ID);
                            : INVALID_TASK_ID);
        }
        }
@@ -1234,6 +1235,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
            }
            }


            if (shouldCancelAnimation(info)) {
            if (shouldCancelAnimation(info)) {
                mPrepareOpenTransition = null;
                return false;
                return false;
            }
            }


@@ -1663,9 +1665,13 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
    }
    }


    // Record the latest back gesture happen on which task.
    // Record the latest back gesture happen on which task.
    static class FocusTaskTrackerObserver implements Transitions.TransitionObserver {
    static class BackTransitionObserver implements Transitions.TransitionObserver {
        int mFocusedTaskId = INVALID_TASK_ID;
        int mFocusedTaskId = INVALID_TASK_ID;
        IBinder mMonitorBinder;
        IBinder mFocusTaskMonitorToken;
        private BackTransitionHandler mBackTransitionHandler;
        void setBackTransitionHandler(BackTransitionHandler handler) {
            mBackTransitionHandler = handler;
        }


        void update(int focusedTaskId) {
        void update(int focusedTaskId) {
            mFocusedTaskId = focusedTaskId;
            mFocusedTaskId = focusedTaskId;
@@ -1681,28 +1687,34 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
            for (int i = info.getChanges().size() - 1; i >= 0; --i) {
            for (int i = info.getChanges().size() - 1; i >= 0; --i) {
                final TransitionInfo.Change c = info.getChanges().get(i);
                final TransitionInfo.Change c = info.getChanges().get(i);
                if (c.getTaskInfo() != null && c.getTaskInfo().taskId == mFocusedTaskId) {
                if (c.getTaskInfo() != null && c.getTaskInfo().taskId == mFocusedTaskId) {
                    mMonitorBinder = transition;
                    mFocusTaskMonitorToken = transition;
                    break;
                    break;
                }
                }
            }
            }
            // Transition happen but the task isn't involved, reset.
            // Transition happen but the task isn't involved, reset.
            if (mMonitorBinder == null) {
            if (mFocusTaskMonitorToken == null) {
                mFocusedTaskId = INVALID_TASK_ID;
                mFocusedTaskId = INVALID_TASK_ID;
            }
            }
        }
        }


        @Override
        @Override
        public void onTransitionMerged(@NonNull IBinder merged, @NonNull IBinder playing) {
        public void onTransitionMerged(@NonNull IBinder merged, @NonNull IBinder playing) {
            if (mMonitorBinder == merged) {
            if (mFocusTaskMonitorToken == merged) {
                mMonitorBinder = playing;
                mFocusTaskMonitorToken = playing;
            }
            if (mBackTransitionHandler.mClosePrepareTransition == merged) {
                mBackTransitionHandler.mClosePrepareTransition = null;
            }
            }
        }
        }


        @Override
        @Override
        public void onTransitionFinished(@NonNull IBinder transition, boolean aborted) {
        public void onTransitionFinished(@NonNull IBinder transition, boolean aborted) {
            if (mMonitorBinder == transition) {
            if (mFocusTaskMonitorToken == transition) {
                mFocusedTaskId = INVALID_TASK_ID;
                mFocusedTaskId = INVALID_TASK_ID;
            }
            }
            if (mBackTransitionHandler.mClosePrepareTransition == transition) {
                mBackTransitionHandler.mClosePrepareTransition = null;
            }
        }
        }
    }
    }
}
}