diff options
author | Sunny Goyal <sunnygoyal@google.com> | 2019-01-28 16:46:31 -0800 |
---|---|---|
committer | Sunny Goyal <sunnygoyal@google.com> | 2019-01-28 16:46:48 -0800 |
commit | 703ee9f6752bf5c6641eadfa513e057fca4838b7 (patch) | |
tree | 8ac3546f646ea94e37cd4b350e90c9f3ba4647c0 /quickstep | |
parent | 0428616762b191deb4143a5bd93524a8440da639 (diff) | |
download | android_packages_apps_Trebuchet-703ee9f6752bf5c6641eadfa513e057fca4838b7.tar.gz android_packages_apps_Trebuchet-703ee9f6752bf5c6641eadfa513e057fca4838b7.tar.bz2 android_packages_apps_Trebuchet-703ee9f6752bf5c6641eadfa513e057fca4838b7.zip |
Passing proper velocity information when simulating touch events on recents view
Change-Id: I488b8d61c47e49dbdc65b16e2470b171912efc3f
Diffstat (limited to 'quickstep')
3 files changed, 44 insertions, 10 deletions
diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java index b152bb92b..5755205ea 100644 --- a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java +++ b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java @@ -67,6 +67,8 @@ import com.android.systemui.shared.system.WindowManagerWrapper; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import androidx.annotation.Nullable; + /** * Touch consumer for handling events originating from an activity other than Launcher */ @@ -196,7 +198,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC if (mPassedInitialSlop && mInteractionHandler != null) { // Move - dispatchMotion(ev, displacement - mStartDisplacement); + dispatchMotion(ev, displacement - mStartDisplacement, null); if (FeatureFlags.SWIPE_HOME.get()) { mMotionPauseDetector.addPosition(displacement); @@ -217,11 +219,11 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC } } - private void dispatchMotion(MotionEvent ev, float displacement) { + private void dispatchMotion(MotionEvent ev, float displacement, @Nullable Float velocityX) { mInteractionHandler.updateDisplacement(displacement); boolean isLandscape = isNavBarOnLeft() || isNavBarOnRight(); if (!isLandscape) { - mInteractionHandler.dispatchMotionEventToRecentsView(ev); + mInteractionHandler.dispatchMotionEventToRecentsView(ev, velocityX); } } @@ -316,15 +318,16 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC */ private void finishTouchTracking(MotionEvent ev) { if (mPassedInitialSlop && mInteractionHandler != null) { - dispatchMotion(ev, getDisplacement(ev) - mStartDisplacement); mVelocityTracker.computeCurrentVelocity(1000, ViewConfiguration.get(this).getScaledMaximumFlingVelocity()); - float velocityX = mVelocityTracker.getXVelocity(mActivePointerId); float velocity = isNavBarOnRight() ? velocityX : isNavBarOnLeft() ? -velocityX : mVelocityTracker.getYVelocity(mActivePointerId); + + dispatchMotion(ev, getDisplacement(ev) - mStartDisplacement, velocityX); + mInteractionHandler.onGestureEnded(velocity, velocityX); } else { // Since we start touch tracking on DOWN, we may reach this state without actually diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index d118e992a..86a8081be 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -70,6 +70,7 @@ import android.view.animation.Interpolator; import androidx.annotation.AnyThread; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.UiThread; import androidx.annotation.WorkerThread; @@ -624,23 +625,37 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> { } @WorkerThread - public void dispatchMotionEventToRecentsView(MotionEvent event) { + @SuppressWarnings("WrongThread") + public void dispatchMotionEventToRecentsView(MotionEvent event, @Nullable Float velocityX) { if (mRecentsView == null) { return; } - // Pass the motion events to RecentsView to allow scrolling during swipe up. - if (mDispatchedDownEvent) { - mRecentsView.dispatchTouchEvent(event); + if (Looper.myLooper() == mMainThreadHandler.getLooper()) { + dispatchMotionEventToRecentsViewUi(event, velocityX); } else { + MotionEvent ev = MotionEvent.obtain(event); + postAsyncCallback(mMainThreadHandler, () -> { + dispatchMotionEventToRecentsViewUi(ev, velocityX); + ev.recycle(); + }); + } + } + + @UiThread + private void dispatchMotionEventToRecentsViewUi(MotionEvent event, @Nullable Float velocityX) { + // Pass the motion events to RecentsView to allow scrolling during swipe up. + if (!mDispatchedDownEvent) { // The first event we dispatch should be ACTION_DOWN. mDispatchedDownEvent = true; MotionEvent downEvent = MotionEvent.obtain(event); downEvent.setAction(MotionEvent.ACTION_DOWN); int flags = downEvent.getEdgeFlags(); downEvent.setEdgeFlags(flags | TouchInteractionService.EDGE_NAV_BAR); - mRecentsView.dispatchTouchEvent(downEvent); + mRecentsView.simulateTouchEvent(downEvent, velocityX); downEvent.recycle(); } + + mRecentsView.simulateTouchEvent(event, velocityX); } @WorkerThread diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 840d2bdcf..923da7b5c 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -159,6 +159,8 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl private final ViewPool<TaskView> mTaskViewPool; + @Nullable Float mSimulatedVelocityX = null; + /** * TODO: Call reloadIdNeeded in onTaskStackChanged. */ @@ -1610,4 +1612,18 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl } } } + + public void simulateTouchEvent(MotionEvent event, @Nullable Float velocityX) { + mSimulatedVelocityX = velocityX; + dispatchTouchEvent(event); + mSimulatedVelocityX = null; + } + + @Override + protected int computeXVelocity() { + if (mSimulatedVelocityX != null) { + return mSimulatedVelocityX.intValue(); + } + return super.computeXVelocity(); + } } |