From e7a25c27278eb56b372c34aed5fd7faedfceafc6 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 12 Jun 2020 20:30:28 -0700 Subject: [PATCH] Minor touch changes for resizing - Pilfer whenever we cross the threshold in either axis (otherwise the app under pip will continue to receive touch events while it is resizing) - Only resize once you pass the threshold, otherwise a sloppy tap would trigger an unexpected micro-resize - Handle cancel when triggering notification from launcher (when pip starts pilfering touches and sends a cancel to launcher, it should not continue to treat that as an up event and trigger notifications to show) Change-Id: Id31d12484f7ecd55a8e48073979c1886764a9648 Bug: 158887398 Test: Resize PIP, try resizing over home with a swipe down --- .../pip/phone/PipResizeGestureHandler.java | 33 +++++++++++-------- .../recents/OverviewProxyService.java | 7 ++-- .../NotificationPanelViewController.java | 10 ++++-- .../systemui/statusbar/phone/StatusBar.java | 4 +-- 4 files changed, 33 insertions(+), 21 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java index f6b212c6f19f7..c151715cd4ef6 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java @@ -260,12 +260,14 @@ public class PipResizeGestureHandler { private void onMotionEvent(MotionEvent ev) { int action = ev.getActionMasked(); + float x = ev.getX(); + float y = ev.getY(); if (action == MotionEvent.ACTION_DOWN) { mLastResizeBounds.setEmpty(); - mAllowGesture = isWithinTouchRegion((int) ev.getX(), (int) ev.getY()); + mAllowGesture = isWithinTouchRegion((int) x, (int) y); if (mAllowGesture) { - setCtrlType((int) ev.getX(), (int) ev.getY()); - mDownPoint.set(ev.getX(), ev.getY()); + setCtrlType((int) x, (int) y); + mDownPoint.set(x, y); mLastDownBounds.set(mMotionHelper.getBounds()); } @@ -277,20 +279,23 @@ public class PipResizeGestureHandler { break; case MotionEvent.ACTION_MOVE: // Capture inputs - float dx = Math.abs(ev.getX() - mDownPoint.x); - float dy = Math.abs(ev.getY() - mDownPoint.y); - if (!mThresholdCrossed && dx > mTouchSlop && dy > mTouchSlop) { + if (!mThresholdCrossed + && Math.hypot(x - mDownPoint.x, y - mDownPoint.y) > mTouchSlop) { mThresholdCrossed = true; + // Reset the down to begin resizing from this point + mDownPoint.set(x, y); mInputMonitor.pilferPointers(); } - final Rect currentPipBounds = mMotionHelper.getBounds(); - mLastResizeBounds.set(TaskResizingAlgorithm.resizeDrag(ev.getX(), ev.getY(), - mDownPoint.x, mDownPoint.y, currentPipBounds, mCtrlType, mMinSize.x, - mMinSize.y, mMaxSize, true, - mLastDownBounds.width() > mLastDownBounds.height())); - mPipBoundsHandler.transformBoundsToAspectRatio(mLastResizeBounds); - mPipTaskOrganizer.scheduleUserResizePip(mLastDownBounds, mLastResizeBounds, - null); + if (mThresholdCrossed) { + final Rect currentPipBounds = mMotionHelper.getBounds(); + mLastResizeBounds.set(TaskResizingAlgorithm.resizeDrag(x, y, + mDownPoint.x, mDownPoint.y, currentPipBounds, mCtrlType, mMinSize.x, + mMinSize.y, mMaxSize, true, + mLastDownBounds.width() > mLastDownBounds.height())); + mPipBoundsHandler.transformBoundsToAspectRatio(mLastResizeBounds); + mPipTaskOrganizer.scheduleUserResizePip(mLastDownBounds, mLastResizeBounds, + null); + } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 8a012b8b06f18..15e4d0fa134f8 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -200,11 +200,13 @@ public class OverviewProxyService extends CurrentUserTracker implements mInputFocusTransferStartY = event.getY(); mInputFocusTransferStartMillis = event.getEventTime(); statusBar.onInputFocusTransfer( - mInputFocusTransferStarted, 0 /* velocity */); + mInputFocusTransferStarted, false /* cancel */, + 0 /* velocity */); } if (action == ACTION_UP || action == ACTION_CANCEL) { mInputFocusTransferStarted = false; statusBar.onInputFocusTransfer(mInputFocusTransferStarted, + action == ACTION_CANCEL, (event.getY() - mInputFocusTransferStartY) / (event.getEventTime() - mInputFocusTransferStartMillis)); } @@ -692,7 +694,8 @@ public class OverviewProxyService extends CurrentUserTracker implements mHandler.post(()-> { mStatusBarOptionalLazy.ifPresent(statusBarLazy -> { mInputFocusTransferStarted = false; - statusBarLazy.get().onInputFocusTransfer(false, 0 /* velocity */); + statusBarLazy.get().onInputFocusTransfer(false, true /* cancel */, + 0 /* velocity */); }); }); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index d884bdd479308..d7ea90bbc07dc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -1328,11 +1328,15 @@ public class NotificationPanelViewController extends PanelViewController { * * @param velocity unit is in px / millis */ - public void stopWaitingForOpenPanelGesture(final float velocity) { + public void stopWaitingForOpenPanelGesture(boolean cancel, final float velocity) { if (mExpectingSynthesizedDown) { mExpectingSynthesizedDown = false; - maybeVibrateOnOpening(); - fling(velocity > 1f ? 1000f * velocity : 0, true /* expand */); + if (cancel) { + collapse(false /* delayed */, 1.0f /* speedUpFactor */); + } else { + maybeVibrateOnOpening(); + fling(velocity > 1f ? 1000f * velocity : 0, true /* expand */); + } onTrackingStopped(false); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index e2714af33247b..ce00440196b2c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -2090,7 +2090,7 @@ public class StatusBar extends SystemUI implements DemoMode, /** * Called when another window is about to transfer it's input focus. */ - public void onInputFocusTransfer(boolean start, float velocity) { + public void onInputFocusTransfer(boolean start, boolean cancel, float velocity) { if (!mCommandQueue.panelsEnabled()) { return; } @@ -2098,7 +2098,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (start) { mNotificationPanelViewController.startWaitingForOpenPanelGesture(); } else { - mNotificationPanelViewController.stopWaitingForOpenPanelGesture(velocity); + mNotificationPanelViewController.stopWaitingForOpenPanelGesture(cancel, velocity); } }