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
This commit is contained in:
Tony Wickham 2020-05-29 17:33:24 -05:00
parent 625bd51fe3
commit cc558e86fb
1 changed files with 12 additions and 19 deletions

View File

@ -29,7 +29,6 @@ import android.view.KeyEvent;
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 @@ public class RecentsAnimationController {
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 @@ public class RecentsAnimationController {
@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 @@ public class RecentsAnimationController {
@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 @@ public class RecentsAnimationController {
} 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) {