Merge "swipe down to open noti shade fling support" into qt-r1-dev

This commit is contained in:
Hyunyoung Song
2019-07-08 17:35:04 +00:00
committed by Android (Google) Code Review
3 changed files with 51 additions and 16 deletions

View File

@@ -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 */);
}
});
}

View File

@@ -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;

View File

@@ -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);
}
}