diff options
| author | 2019-07-08 11:11:28 -0700 | |
|---|---|---|
| committer | 2019-07-08 11:11:28 -0700 | |
| commit | 1aaa574c8d46e9197cdf4911bbc36302db89c89a (patch) | |
| tree | 6f74a0af4d391dad4be5fe1944262a7d25422533 | |
| parent | 59dc6124c842503d57d279b1f0139ae1302675f2 (diff) | |
| parent | aaf7d4fca8b88bb225f05fed80854c0514cf5f54 (diff) | |
Merge "swipe down to open noti shade fling support" into qt-r1-dev am: 2b9a187195
am: aaf7d4fca8
Change-Id: Ib632c28de4a93bd789ffb6ab491c1b0edf9750a9
3 files changed, 51 insertions, 16 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index ed6f599b69a6..19edc94a3871 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -120,6 +120,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis private int mCurrentBoundedUserId = -1; private float mNavBarButtonAlpha; private boolean mInputFocusTransferStarted; + private float mInputFocusTransferStartY; + private long mInputFocusTransferStartMillis; private float mWindowCornerRadius; private boolean mSupportsRoundedCornersOnWindows; private int mNavBarMode = NAV_BAR_MODE_3BUTTON; @@ -180,12 +182,16 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis int action = event.getActionMasked(); if (action == ACTION_DOWN) { mInputFocusTransferStarted = true; - + mInputFocusTransferStartY = event.getY(); + mInputFocusTransferStartMillis = event.getEventTime(); + bar.onInputFocusTransfer(mInputFocusTransferStarted, 0 /* velocity */); } if (action == ACTION_UP || action == ACTION_CANCEL) { mInputFocusTransferStarted = false; + bar.onInputFocusTransfer(mInputFocusTransferStarted, + (event.getY() - mInputFocusTransferStartY) + / (event.getEventTime() - mInputFocusTransferStartMillis)); } - bar.onInputFocusTransfer(mInputFocusTransferStarted); event.recycle(); } }); @@ -596,7 +602,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis StatusBar bar = SysUiServiceProvider.getComponent(mContext, StatusBar.class); if (bar != null) { mInputFocusTransferStarted = false; - bar.onInputFocusTransfer(false); + bar.onInputFocusTransfer(false, 0 /* velocity */); } }); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 6eeb96813c94..7430f7cc2cd1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -290,7 +290,11 @@ public class NotificationPanelView extends PanelView implements private boolean mIsFullWidth; private boolean mBlockingExpansionForCurrentTouch; - private boolean mExpectingOpenPanelGesture; + /** + * Following variables maintain state of events when input focus transfer may occur. + */ + private boolean mExpectingSynthesizedDown; // expecting to see synthesized DOWN event + private boolean mLastEventSynthesizedDown; // last event was synthesized DOWN event /** * Current dark amount that follows regular interpolation curve of animation. @@ -1059,6 +1063,15 @@ public class NotificationPanelView extends PanelView implements mDownY = event.getY(); mCollapsedOnDown = isFullyCollapsed(); mListenForHeadsUp = mCollapsedOnDown && mHeadsUpManager.hasPinnedHeadsUp(); + if (mExpectingSynthesizedDown) { + mLastEventSynthesizedDown = true; + } else { + // down but not synthesized motion event. + mLastEventSynthesizedDown = false; + } + } else { + // not down event at all. + mLastEventSynthesizedDown = false; } } @@ -1124,12 +1137,18 @@ public class NotificationPanelView extends PanelView implements return false; } - initDownStates(event); // Make sure the next touch won't the blocked after the current ends. if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { mBlockingExpansionForCurrentTouch = false; } + // When touch focus transfer happens, ACTION_DOWN->ACTION_UP may happen immediately + // without any ACTION_MOVE event. + // In such case, simply expand the panel instead of being stuck at the bottom bar. + if (mLastEventSynthesizedDown && event.getAction() == MotionEvent.ACTION_UP) { + expand(true /* animate */); + } + initDownStates(event); if (!mIsExpanding && !shouldQuickSettingsIntercept(mDownX, mDownY, 0) && mPulseExpansionHandler.onTouchEvent(event)) { // We're expanding all the other ones shouldn't get this anymore @@ -1255,17 +1274,28 @@ public class NotificationPanelView extends PanelView implements if (!isFullyCollapsed()) { return; } - mExpectingOpenPanelGesture = true; + mExpectingSynthesizedDown = true; onTrackingStarted(); } /** - * Input focus transfer has already happened as this view decided to intercept - * very first down event. + * Called when this view is no longer waiting for input focus transfer. + * + * There are two scenarios behind this function call. First, input focus transfer + * has successfully happened and this view already received synthetic DOWN event. + * (mExpectingSynthesizedDown == false). Do nothing. + * + * Second, before input focus transfer finished, user may have lifted finger + * in previous window and this window never received synthetic DOWN event. + * (mExpectingSynthesizedDown == true). + * In this case, we use the velocity to trigger fling event. + * + * @param velocity unit is in px / millis */ - public void stopWaitingForOpenPanelGesture() { - if (mExpectingOpenPanelGesture) { - mExpectingOpenPanelGesture = false; + public void stopWaitingForOpenPanelGesture(float velocity) { + if (mExpectingSynthesizedDown) { + mExpectingSynthesizedDown = false; + fling(velocity > 1f ? 1000f * velocity : 0, true /* animate */); onTrackingStopped(false); } } @@ -1283,8 +1313,8 @@ public class NotificationPanelView extends PanelView implements @Override protected boolean shouldGestureWaitForTouchSlop() { - if (mExpectingOpenPanelGesture) { - mExpectingOpenPanelGesture = false; + if (mExpectingSynthesizedDown) { + mExpectingSynthesizedDown = false; return false; } return isFullyCollapsed() || mBarState != StatusBarState.SHADE; 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 c8b78992b550..4392c35ee233 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -80,7 +80,6 @@ import android.metrics.LogMaker; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; -import android.os.Debug; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -1932,7 +1931,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) { + public void onInputFocusTransfer(boolean start, float velocity) { if (!mCommandQueue.panelsEnabled()) { return; } @@ -1940,7 +1939,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (start) { mNotificationPanel.startWaitingForOpenPanelGesture(); } else { - mNotificationPanel.stopWaitingForOpenPanelGesture(); + mNotificationPanel.stopWaitingForOpenPanelGesture(velocity); } } |