Merge "Defer starting the recents animation when swiping over back button" into ub-launcher3-master
diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java
index 80584c8..ad40952 100644
--- a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java
+++ b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java
@@ -23,6 +23,9 @@
 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.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 @@
     private BaseSwipeInteractionHandler mInteractionHandler;
     private int mDisplayRotation;
     private Rect mStableInsets = new Rect();
+    private @HitTarget int mDownHitTarget = HIT_TARGET_NONE;
 
     private VelocityTracker mVelocityTracker;
 
@@ -99,6 +104,11 @@
     }
 
     @Override
+    public void setDownHitTarget(@HitTarget int downHitTarget) {
+        mDownHitTarget = downHitTarget;
+    }
+
+    @Override
     public void accept(MotionEvent ev) {
         if (mVelocityTracker == null) {
             return;
@@ -112,8 +122,9 @@
                 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 @@
 
                         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();
diff --git a/quickstep/src/com/android/quickstep/TouchConsumer.java b/quickstep/src/com/android/quickstep/TouchConsumer.java
index 77480af..5cfa8df 100644
--- a/quickstep/src/com/android/quickstep/TouchConsumer.java
+++ b/quickstep/src/com/android/quickstep/TouchConsumer.java
@@ -20,6 +20,8 @@
 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 @@
         return false;
     }
 
+    default void setDownHitTarget(@HitTarget int downHitTarget) { }
+
     default void updateTouchTracking(@InteractionType int interactionType) { }
 
     default void onQuickScrubEnd() { }
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index d5fa723..35c982c 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -35,6 +35,7 @@
 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;
@@ -52,6 +53,7 @@
 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.
@@ -71,6 +73,11 @@
     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);
         }
@@ -166,23 +173,25 @@
         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);
     }