diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index ed6f599b69a6e..19edc94a3871b 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 CallbackControllerACTION_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 c8b78992b5500..4392c35ee233a 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); } }