Don't defer finish, only defer disableInputProxy
We should always finish the controller when requested, to ensure
everything is cleaned up immediately. But if touch is in progress,
we should keep input proxy enabled until touch up/cancel.
Test: swipe up to launcher and interact with it during the transition
- Swipe to recents and scroll it or dismiss the current task
- Swipe to home and open another app or swipe again on the nav bar
Bug: 157771305
Change-Id: Ida53289e4ecbd5e5d16933fcc79bbebdf1f8d898
diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationController.java b/quickstep/src/com/android/quickstep/RecentsAnimationController.java
index b0a3cd2..4e9aa61 100644
--- a/quickstep/src/com/android/quickstep/RecentsAnimationController.java
+++ b/quickstep/src/com/android/quickstep/RecentsAnimationController.java
@@ -29,7 +29,6 @@
import android.view.MotionEvent;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
import com.android.launcher3.util.Preconditions;
@@ -58,8 +57,7 @@
private boolean mUseLauncherSysBarFlags = false;
private boolean mSplitScreenMinimized = false;
private boolean mTouchInProgress;
- private boolean mFinishPending;
- private @Nullable Runnable mFinishPendingCallback;
+ private boolean mDisableInputProxyPending;
public RecentsAnimationController(RecentsAnimationControllerCompat controller,
boolean allowMinimizeSplitScreen,
@@ -138,12 +136,12 @@
@UiThread
public void finishAnimationToHome() {
- finishAndClear(true /* toRecents */, null, false /* sendUserLeaveHint */);
+ finishAndDisableInputProxy(true /* toRecents */, null, false /* sendUserLeaveHint */);
}
@UiThread
public void finishAnimationToApp() {
- finishAndClear(false /* toRecents */, null, false /* sendUserLeaveHint */);
+ finishAndDisableInputProxy(false /* toRecents */, null, false /* sendUserLeaveHint */);
}
/** See {@link #finish(boolean, Runnable, boolean)} */
@@ -162,19 +160,16 @@
@UiThread
public void finish(boolean toRecents, Runnable onFinishComplete, boolean sendUserLeaveHint) {
Preconditions.assertUIThread();
- if (!toRecents) {
- finishAndClear(false, onFinishComplete, sendUserLeaveHint);
+ if (toRecents && mTouchInProgress) {
+ // Finish the controller as requested, but don't disable input proxy yet.
+ mDisableInputProxyPending = true;
+ finishController(toRecents, onFinishComplete, sendUserLeaveHint);
} else {
- if (mTouchInProgress) {
- mFinishPending = true;
- mFinishPendingCallback = onFinishComplete;
- } else {
- finishAndClear(true, onFinishComplete, sendUserLeaveHint);
- }
+ finishAndDisableInputProxy(toRecents, onFinishComplete, sendUserLeaveHint);
}
}
- private void finishAndClear(boolean toRecents, Runnable onFinishComplete,
+ private void finishAndDisableInputProxy(boolean toRecents, Runnable onFinishComplete,
boolean sendUserLeaveHint) {
disableInputProxy();
finishController(toRecents, onFinishComplete, sendUserLeaveHint);
@@ -262,11 +257,9 @@
} else if (action == ACTION_CANCEL || action == ACTION_UP) {
// Finish any pending actions
mTouchInProgress = false;
- if (mFinishPending) {
- mFinishPending = false;
- finishAndClear(true /* toRecents */, mFinishPendingCallback,
- false /* sendUserLeaveHint */);
- mFinishPendingCallback = null;
+ if (mDisableInputProxyPending) {
+ mDisableInputProxyPending = false;
+ disableInputProxy();
}
}
if (mInputConsumer != null) {