From 59f0ef35350ff033b47922da608f56f38d769c9c Mon Sep 17 00:00:00 2001 From: Jerry Chang Date: Wed, 28 Apr 2021 21:41:23 +0800 Subject: [PATCH] Fix tapping on divider bar several times makes split sloggish Make sure it won't introduce redundant fling animation when touch on divider bar didn't exceed tap threshold. This make sure it won't queue extra sync transactions with SyncTransactionQueue. Also skip redundant checks after detected double tap in staged split. Fix: 186626153 Fix: 179004532 Test: tapping on divider bar of legacy and staged split, it won't make split sloggish. Change-Id: I2a326f54f25d77e86fa51bca67b68daca21dedfc --- .../wm/shell/common/split/DividerView.java | 15 ++++++++++----- .../wm/shell/common/split/SplitLayout.java | 1 + .../wm/shell/legacysplitscreen/DividerView.java | 4 ++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java index b9fdaa1ab1afe..442e7a4c6796c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java @@ -110,6 +110,10 @@ public class DividerView extends FrameLayout implements View.OnTouchListener, return false; } + if (mDoubleTapDetector.onTouchEvent(event)) { + return true; + } + final int action = event.getAction() & MotionEvent.ACTION_MASK; final boolean isLandscape = isLandscape(); // Using raw xy to prevent lost track of motion events while moving divider bar. @@ -136,21 +140,22 @@ public class DividerView extends FrameLayout implements View.OnTouchListener, case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: mVelocityTracker.addMovement(event); + releaseTouching(); + + if (!mMoving) break; + mVelocityTracker.computeCurrentVelocity(1000 /* units */); final float velocity = isLandscape ? mVelocityTracker.getXVelocity() : mVelocityTracker.getYVelocity(); - releaseTouching(); - mMoving = false; - final int position = mSplitLayout.getDividePosition() + touchPos - mStartPos; final DividerSnapAlgorithm.SnapTarget snapTarget = mSplitLayout.findSnapTarget(position, velocity, false /* hardDismiss */); mSplitLayout.snapToTarget(position, snapTarget); + mMoving = false; break; } - mDoubleTapDetector.onTouchEvent(event); return true; } @@ -229,7 +234,7 @@ public class DividerView extends FrameLayout implements View.OnTouchListener, if (mSplitLayout != null) { mSplitLayout.onDoubleTappedDivider(); } - return false; + return true; } } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java index b64c796a1a43d..d318a5aaef5cd 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java @@ -231,6 +231,7 @@ public class SplitLayout { } private void flingDividePosition(int from, int to) { + if (from == to) return; ValueAnimator animator = ValueAnimator .ofInt(from, to) .setDuration(250); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java index a18d106abea46..60f7ee2941e25 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java @@ -49,7 +49,6 @@ import android.view.VelocityTracker; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewConfiguration; -import android.view.ViewRootImpl; import android.view.ViewTreeObserver.InternalInsetsInfo; import android.view.ViewTreeObserver.OnComputeInternalInsetsListener; import android.view.WindowManager; @@ -524,9 +523,10 @@ public class DividerView extends FrameLayout implements OnTouchListener, case MotionEvent.ACTION_CANCEL: mVelocityTracker.addMovement(event); + if (!mMoving) break; + x = (int) event.getRawX(); y = (int) event.getRawY(); - mVelocityTracker.computeCurrentVelocity(1000); int position = calculatePosition(x, y); stopDragging(position, isHorizontalDivision() ? mVelocityTracker.getYVelocity()