Defer starting the recents animation when swiping over back button

Bug: 73242451
Test: Swipe up over back with suitable launcher build and ensure that we
      don't start the recents animation on touch down

Change-Id: I98314611eaeeabfaa47280157300ea20f0571a61
This commit is contained in:
Winson Chung
2018-02-13 10:38:41 -08:00
parent cc394cdc75
commit d56ac2a881
3 changed files with 45 additions and 17 deletions
@@ -23,6 +23,9 @@ import static android.view.MotionEvent.ACTION_UP;
import static android.view.MotionEvent.INVALID_POINTER_ID;
import static com.android.quickstep.RemoteRunnable.executeSafely;
import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_BACK;
import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_HOME;
import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_NONE;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityOptions;
@@ -52,6 +55,7 @@ import com.android.systemui.shared.recents.ISystemUiProxy;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.AssistDataReceiver;
import com.android.systemui.shared.system.BackgroundExecutor;
import com.android.systemui.shared.system.NavigationBarCompat.HitTarget;
import com.android.systemui.shared.system.RecentsAnimationControllerCompat;
import com.android.systemui.shared.system.RecentsAnimationListener;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
@@ -83,6 +87,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC
private BaseSwipeInteractionHandler mInteractionHandler;
private int mDisplayRotation;
private Rect mStableInsets = new Rect();
private @HitTarget int mDownHitTarget = HIT_TARGET_NONE;
private VelocityTracker mVelocityTracker;
@@ -98,6 +103,11 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC
mMainThreadExecutor = mainThreadExecutor;
}
@Override
public void setDownHitTarget(@HitTarget int downHitTarget) {
mDownHitTarget = downHitTarget;
}
@Override
public void accept(MotionEvent ev) {
if (mVelocityTracker == null) {
@@ -112,8 +122,9 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC
mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop();
mTouchThresholdCrossed = false;
// Start the window animation on down to give more time for launcher to draw
if (!isUsingScreenShot()) {
// Start the window animation on down to give more time for launcher to draw if the
// user didn't start the gesture over the back button
if (mDownHitTarget != HIT_TARGET_BACK && !isUsingScreenShot()) {
startTouchTrackingForWindowAnimation();
}
@@ -155,6 +166,10 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC
if (isUsingScreenShot()) {
startTouchTrackingForScreenshotAnimation();
} else if (mDownHitTarget == HIT_TARGET_BACK) {
// If the window animation was deferred on DOWN due to it starting over
// the back button, then start it now
startTouchTrackingForWindowAnimation();
}
notifyGestureStarted();
@@ -20,6 +20,8 @@ import android.os.Build;
import android.support.annotation.IntDef;
import android.view.MotionEvent;
import com.android.systemui.shared.system.NavigationBarCompat.HitTarget;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.function.Consumer;
@@ -50,6 +52,8 @@ public interface TouchConsumer extends Consumer<MotionEvent> {
return false;
}
default void setDownHitTarget(@HitTarget int downHitTarget) { }
default void updateTouchTracking(@InteractionType int interactionType) { }
default void onQuickScrubEnd() { }
@@ -36,6 +36,7 @@ import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.Choreographer;
import android.view.MotionEvent;
@@ -51,6 +52,7 @@ import com.android.launcher3.R;
import com.android.systemui.shared.recents.IOverviewProxy;
import com.android.systemui.shared.recents.ISystemUiProxy;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.NavigationBarCompat.HitTarget;
/**
* Service connected by system-UI for handling touch interaction.
@@ -69,6 +71,11 @@ public class TouchInteractionService extends Service {
private final IBinder mMyBinder = new IOverviewProxy.Stub() {
@Override
public void onPreMotionEvent(@HitTarget int downHitTarget) throws RemoteException {
onBinderPreMotionEvent(downHitTarget);
}
@Override
public void onMotionEvent(MotionEvent ev) {
onBinderMotionEvent(ev);
@@ -165,23 +172,25 @@ public class TouchInteractionService extends Service {
return mMyBinder;
}
private void onBinderMotionEvent(MotionEvent ev) {
if (ev.getActionMasked() == ACTION_DOWN) {
mRunningTask = mAM.getRunningTask();
private void onBinderPreMotionEvent(@HitTarget int downHitTarget) {
mRunningTask = mAM.getRunningTask();
mCurrentConsumer.reset();
if (mRunningTask == null) {
mCurrentConsumer = mNoOpTouchConsumer;
} else if (mRunningTask.topActivity.equals(mLauncher)) {
mCurrentConsumer = getLauncherConsumer();
} else {
mCurrentConsumer = getOtherActivityConsumer();
}
mEventQueue.setConsumer(mCurrentConsumer);
mEventQueue.setInterimChoreographer(mCurrentConsumer.shouldUseBackgroundConsumer()
? mBackgroundThreadChoreographer : null);
mCurrentConsumer.reset();
if (mRunningTask == null) {
mCurrentConsumer = mNoOpTouchConsumer;
} else if (mRunningTask.topActivity.equals(mLauncher)) {
mCurrentConsumer = getLauncherConsumer();
} else {
mCurrentConsumer = getOtherActivityConsumer();
}
mCurrentConsumer.setDownHitTarget(downHitTarget);
mEventQueue.setConsumer(mCurrentConsumer);
mEventQueue.setInterimChoreographer(mCurrentConsumer.shouldUseBackgroundConsumer()
? mBackgroundThreadChoreographer : null);
}
private void onBinderMotionEvent(MotionEvent ev) {
mCurrentConsumer.preProcessMotionEvent(ev);
mEventQueue.queue(ev);
}