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

Commit d1a4ff3a authored by Tony Wickham's avatar Tony Wickham
Browse files

Only run InputConsumerProxy callback for touch event

The callback exists to ensure the current running animation ends
immediately on touch down, so that we can handle that touch. It
was never intended to run for other events such as HOVER. Updated
to ensure that's the case and also updated documentation/names.

Fixes: 295984940
Test: Manual with animation duration x5:
  - Swipe up followed by HOVER event, ensure animation still plays
  - Swipe to overview, tap on a tile during transition, ensure
    it animates back up
Flag: NONE
Change-Id: I29039ea10154083dcab2e29a97752b18ae8b9331
parent a0ed884d
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.view.Surface.ROTATION_0;
import static android.view.Surface.ROTATION_270;
import static android.view.Surface.ROTATION_90;
import static android.widget.Toast.LENGTH_SHORT;

import static com.android.app.animation.Interpolators.ACCELERATE_DECELERATE;
import static com.android.app.animation.Interpolators.DECELERATE;
import static com.android.app.animation.Interpolators.OVERSHOOT_1_2;
@@ -351,7 +352,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
                        return ROTATION_0;
                    }
                    return mRecentsView.getPagedViewOrientedState().getRecentsActivityRotation();
                }, inputConsumer, /* callback = */ () -> {
                }, inputConsumer, /* onTouchDownCallback = */ () -> {
                    endRunningWindowAnim(mGestureState.getEndTarget() == HOME /* cancel */);
                    endLauncherTransitionController();
                }, new InputProxyHandlerFactory(mActivityInterface, mGestureState));
@@ -1943,7 +1944,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
        mCurrentShift.cancelAnimation();

        // Cleanup when switching handlers
        mInputConsumerProxy.unregisterCallback();
        mInputConsumerProxy.unregisterOnTouchDownCallback();
        mActivityInitListener.unregister();
        TaskStackChangeListeners.getInstance().unregisterTaskStackListener(
                mActivityRestartListener);
@@ -1955,7 +1956,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
            mInputConsumerProxy.destroy();
            mTaskAnimationManager.setLiveTileCleanUpHandler(null);
        }
        mInputConsumerProxy.unregisterCallback();
        mInputConsumerProxy.unregisterOnTouchDownCallback();
        endRunningWindowAnim(false /* cancel */);

        if (mGestureEndCallback != null) {
+17 −11
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import android.view.InputEvent;
import android.view.KeyEvent;
import android.view.MotionEvent;

import androidx.annotation.Nullable;

import com.android.quickstep.InputConsumer;
import com.android.quickstep.SimpleOrientationTouchTransformer;
import com.android.systemui.shared.system.InputConsumerController;
@@ -42,7 +44,10 @@ public class InputConsumerProxy {
    private final Context mContext;
    private final Supplier<Integer> mRotationSupplier;
    private final InputConsumerController mInputConsumerController;
    private Runnable mCallback;

    /** Called if a new InputConsumer is created via touch down event. */
    private @Nullable Runnable mOnTouchDownCallback;

    private Supplier<InputConsumer> mConsumerSupplier;

    // The consumer is created lazily on demand.
@@ -54,11 +59,11 @@ public class InputConsumerProxy {

    public InputConsumerProxy(Context context, Supplier<Integer> rotationSupplier,
            InputConsumerController inputConsumerController,
            Runnable callback, Supplier<InputConsumer> consumerSupplier) {
            Runnable onTouchDownCallback, Supplier<InputConsumer> consumerSupplier) {
        mContext = context;
        mRotationSupplier = rotationSupplier;
        mInputConsumerController = inputConsumerController;
        mCallback = callback;
        mOnTouchDownCallback = onTouchDownCallback;
        mConsumerSupplier = consumerSupplier;
    }

@@ -82,7 +87,7 @@ public class InputConsumerProxy {
                onInputConsumerMotionEvent(event);
            }
        } else if (ev instanceof KeyEvent) {
            initInputConsumerIfNeeded();
            initInputConsumerIfNeeded(/* isFromTouchDown= */ false);
            mInputConsumer.onKeyEvent((KeyEvent) ev);
            return true;
        }
@@ -105,7 +110,7 @@ public class InputConsumerProxy {

        if (action == ACTION_DOWN) {
            mTouchInProgress = true;
            initInputConsumerIfNeeded();
            initInputConsumerIfNeeded(/* isFromTouchDown= */ true);
        } else if (action == ACTION_CANCEL || action == ACTION_UP) {
            // Finish any pending actions
            mTouchInProgress = false;
@@ -123,7 +128,7 @@ public class InputConsumerProxy {
    }

    private void onInputConsumerHoverEvent(MotionEvent ev) {
        initInputConsumerIfNeeded();
        initInputConsumerIfNeeded(/* isFromTouchDown= */ false);
        if (mInputConsumer != null) {
            SimpleOrientationTouchTransformer.INSTANCE.get(mContext).transform(ev,
                    mRotationSupplier.get());
@@ -141,14 +146,15 @@ public class InputConsumerProxy {
        mInputConsumerController.setInputListener(null);
    }

    public void unregisterCallback() {
        mCallback = null;
    /** Sets mOnToudhCownCallback = null. */
    public void unregisterOnTouchDownCallback() {
        mOnTouchDownCallback = null;
    }

    private void initInputConsumerIfNeeded() {
    private void initInputConsumerIfNeeded(boolean isFromTouchDown) {
        if (mInputConsumer == null) {
            if (mCallback != null) {
                mCallback.run();
            if (isFromTouchDown && mOnTouchDownCallback != null) {
                mOnTouchDownCallback.run();
            }
            mInputConsumer = mConsumerSupplier.get();
            mConsumerSupplier = null;