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

Commit 4df3b232 authored by Winson Chung's avatar Winson Chung
Browse files

Invalidate when switching to new consumer

- When switching to a new consumer, also invalidate the handler to
  clean up references held by that handler
- Also make sure that we calculate the task index used for logging
  prior to starting the task view since the handler can be invalidated
  between starting the activity and the callback happening

Bug: 185909226
Test: Presubmit
Change-Id: I20e06b5a6b31a5e242c6fc840bf4f215797eb12c
parent 222b4757
Loading
Loading
Loading
Loading
+37 −21
Original line number Original line Diff line number Diff line
@@ -150,6 +150,9 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
    protected Runnable mGestureEndCallback;
    protected Runnable mGestureEndCallback;
    protected MultiStateCallback mStateCallback;
    protected MultiStateCallback mStateCallback;
    protected boolean mCanceled;
    protected boolean mCanceled;
    // One time flag set when onConsumerAboutToBeSwitched() is called, indicating that certain
    // shared animations should not be canceled when this handler is invalidated
    private boolean mConsumerIsSwitching;
    private boolean mRecentsViewScrollLinked = false;
    private boolean mRecentsViewScrollLinked = false;


    private static int getFlagForIndex(int index, String name) {
    private static int getFlagForIndex(int index, String name) {
@@ -1003,7 +1006,14 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
        animateToProgress(startShift, endShift, duration, interpolator, endTarget, velocity);
        animateToProgress(startShift, endShift, duration, interpolator, endTarget, velocity);
    }
    }


    private void doLogGesture(GestureEndTarget endTarget, @Nullable TaskView targetTask) {
    private int getLogGestureTaskIndex(@Nullable TaskView targetTask) {
        return mRecentsView == null || targetTask == null
                ? LOG_NO_OP_PAGE_INDEX
                : mRecentsView.indexOfChild(targetTask);
    }

    private void doLogGesture(GestureEndTarget endTarget, @Nullable TaskView targetTask,
            int pageIndex) {
        StatsLogManager.EventEnum event;
        StatsLogManager.EventEnum event;
        switch (endTarget) {
        switch (endTarget) {
            case HOME:
            case HOME:
@@ -1032,9 +1042,6 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
            // We probably never received an animation controller, skip logging.
            // We probably never received an animation controller, skip logging.
            return;
            return;
        }
        }
        int pageIndex = endTarget == LAST_TASK
                ? LOG_NO_OP_PAGE_INDEX
                : mRecentsView.getNextPage();
        // TODO: set correct container using the pageIndex
        // TODO: set correct container using the pageIndex
        logger.log(event);
        logger.log(event);
    }
    }
@@ -1279,18 +1286,18 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
    }
    }


    public void onConsumerAboutToBeSwitched() {
    public void onConsumerAboutToBeSwitched() {
        mConsumerIsSwitching = true;
        if (mActivity != null) {
        if (mActivity != null) {
            // In the off chance that the gesture ends before Launcher is started, we should clear
            // In the off chance that the gesture ends before Launcher is started, we should clear
            // the callback here so that it doesn't update with the wrong state
            // the callback here so that it doesn't update with the wrong state
            mActivity.clearRunOnceOnStartCallback();
            mActivity.clearRunOnceOnStartCallback();
            resetLauncherListeners();
        }
        }
        if (mGestureState.getEndTarget() != null && !mGestureState.isRunningAnimationToLauncher()) {
        if (mGestureState.getEndTarget() != null && !mGestureState.isRunningAnimationToLauncher()) {
            cancelCurrentAnimation();
            cancelCurrentAnimation();
        } else {
        } else {
            mStateCallback.setStateOnUiThread(STATE_FINISH_WITH_NO_END);
            mStateCallback.setStateOnUiThread(STATE_FINISH_WITH_NO_END);
            reset();
        }
        }
        reset();
    }
    }


    public boolean isCanceled() {
    public boolean isCanceled() {
@@ -1301,13 +1308,14 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
    private void resumeLastTask() {
    private void resumeLastTask() {
        mRecentsAnimationController.finish(false /* toRecents */, null);
        mRecentsAnimationController.finish(false /* toRecents */, null);
        ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimation", false);
        ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimation", false);
        doLogGesture(LAST_TASK, null);
        doLogGesture(LAST_TASK, null, getLogGestureTaskIndex(null));
        reset();
        reset();
    }
    }


    @UiThread
    @UiThread
    private void startNewTask() {
    private void startNewTask() {
        TaskView taskToLaunch = mRecentsView == null ? null : mRecentsView.getNextPageTaskView();
        TaskView taskToLaunch = mRecentsView == null ? null : mRecentsView.getNextPageTaskView();
        int taskPageIndex = getLogGestureTaskIndex(taskToLaunch);
        startNewTask(success -> {
        startNewTask(success -> {
            if (!success) {
            if (!success) {
                reset();
                reset();
@@ -1316,7 +1324,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
                endLauncherTransitionController();
                endLauncherTransitionController();
                updateSysUiFlags(1 /* windowProgress == overview */);
                updateSysUiFlags(1 /* windowProgress == overview */);
            }
            }
            doLogGesture(NEW_TASK, taskToLaunch);
            doLogGesture(NEW_TASK, taskToLaunch, taskPageIndex);
        });
        });
    }
    }


@@ -1350,32 +1358,38 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
    }
    }


    private void invalidateHandler() {
    private void invalidateHandler() {
        if (!mConsumerIsSwitching) {
            if (!LIVE_TILE.get() || !mActivityInterface.isInLiveTileMode()
            if (!LIVE_TILE.get() || !mActivityInterface.isInLiveTileMode()
                    || mGestureState.getEndTarget() != RECENTS) {
                    || mGestureState.getEndTarget() != RECENTS) {
                mInputConsumerProxy.destroy();
                mInputConsumerProxy.destroy();
                mTaskAnimationManager.setLiveTileCleanUpHandler(null);
                mTaskAnimationManager.setLiveTileCleanUpHandler(null);
            }
            }
        mInputConsumerProxy.unregisterCallback();
            endRunningWindowAnim(false /* cancel */);
            endRunningWindowAnim(false /* cancel */);


            if (mGestureEndCallback != null) {
            if (mGestureEndCallback != null) {
                mGestureEndCallback.run();
                mGestureEndCallback.run();
            }
            }
        }


        mInputConsumerProxy.unregisterCallback();
        mActivityInitListener.unregister();
        mActivityInitListener.unregister();
        ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mActivityRestartListener);
        ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mActivityRestartListener);
        mTaskSnapshot = null;
        mTaskSnapshot = null;
        mHandler.post(() -> {
        mHandler.post(() -> {
            // Defer clearing the activity since invalidation can happen over multiple callbacks
            // Defer clearing the activity since invalidation can happen over multiple callbacks
            // ie. invalidateHandlerWithLauncher()
            mActivity = null;
            mActivity = null;
            mRecentsView = null;
        });
        });
    }
    }


    private void invalidateHandlerWithLauncher() {
    private void invalidateHandlerWithLauncher() {
        if (!mConsumerIsSwitching) {
            endLauncherTransitionController();
            endLauncherTransitionController();
            mRecentsView.onGestureAnimationEnd();
        }


        mRecentsView.removeOnScrollChangedListener(mOnRecentsScrollListener);
        mRecentsView.removeOnScrollChangedListener(mOnRecentsScrollListener);
        mRecentsView.onGestureAnimationEnd();
        resetLauncherListeners();
        resetLauncherListeners();
    }
    }


@@ -1500,7 +1514,8 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
                    () -> mStateCallback.setStateOnUiThread(STATE_CURRENT_TASK_FINISHED));
                    () -> mStateCallback.setStateOnUiThread(STATE_CURRENT_TASK_FINISHED));
        }
        }
        ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimation", true);
        ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimation", true);
        doLogGesture(HOME, mRecentsView == null ? null : mRecentsView.getCurrentPageTaskView());
        TaskView taskToLaunch = mRecentsView == null ? null : mRecentsView.getCurrentPageTaskView();
        doLogGesture(HOME, taskToLaunch, getLogGestureTaskIndex(taskToLaunch));
    }
    }


    /**
    /**
@@ -1531,7 +1546,8 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
        }
        }


        SystemUiProxy.INSTANCE.get(mContext).onOverviewShown(false, TAG);
        SystemUiProxy.INSTANCE.get(mContext).onOverviewShown(false, TAG);
        doLogGesture(RECENTS, mRecentsView.getCurrentPageTaskView());
        TaskView taskToLaunch = mRecentsView.getCurrentPageTaskView();
        doLogGesture(RECENTS, taskToLaunch, getLogGestureTaskIndex(taskToLaunch));
        reset();
        reset();
    }
    }