diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java index 80584c8750..ad40952d55 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.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(); diff --git a/quickstep/src/com/android/quickstep/TouchConsumer.java b/quickstep/src/com/android/quickstep/TouchConsumer.java index 77480afacc..5cfa8df8d3 100644 --- a/quickstep/src/com/android/quickstep/TouchConsumer.java +++ b/quickstep/src/com/android/quickstep/TouchConsumer.java @@ -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 { 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 0c5d9612c2..1576c4eeb7 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -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); }