Transfer focus to open panel
Bug: 131356741
Test: Manual
Tested Single finger, multiple finger.
Tested launcher death scenario
Change-Id: I43fbec5b1b3a64cec7f5e565fb46b884ecdf8835
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index e5caf68..f88259c 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -119,7 +119,7 @@
private boolean mIsEnabled;
private int mCurrentBoundedUserId = -1;
private float mNavBarButtonAlpha;
- private MotionEvent mStatusBarGestureDownEvent;
+ private boolean mInputFocusTransferStarted;
private float mWindowCornerRadius;
private boolean mSupportsRoundedCornersOnWindows;
private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
@@ -164,6 +164,7 @@
}
}
+ // TODO: change the method signature to use (boolean inputFocusTransferStarted)
@Override
public void onStatusBarMotionEvent(MotionEvent event) {
if (!verifyCaller("onStatusBarMotionEvent")) {
@@ -175,16 +176,16 @@
mHandler.post(()->{
StatusBar bar = SysUiServiceProvider.getComponent(mContext, StatusBar.class);
if (bar != null) {
- bar.dispatchNotificationsPanelTouchEvent(event);
int action = event.getActionMasked();
if (action == ACTION_DOWN) {
- mStatusBarGestureDownEvent = MotionEvent.obtain(event);
+ mInputFocusTransferStarted = true;
+
}
if (action == ACTION_UP || action == ACTION_CANCEL) {
- mStatusBarGestureDownEvent.recycle();
- mStatusBarGestureDownEvent = null;
+ mInputFocusTransferStarted = false;
}
+ bar.onInputFocusTransfer(mInputFocusTransferStarted);
event.recycle();
}
});
@@ -590,14 +591,12 @@
}
public void cleanupAfterDeath() {
- if (mStatusBarGestureDownEvent != null) {
+ if (mInputFocusTransferStarted) {
mHandler.post(()-> {
StatusBar bar = SysUiServiceProvider.getComponent(mContext, StatusBar.class);
if (bar != null) {
- mStatusBarGestureDownEvent.setAction(MotionEvent.ACTION_CANCEL);
- bar.dispatchNotificationsPanelTouchEvent(mStatusBarGestureDownEvent);
- mStatusBarGestureDownEvent.recycle();
- mStatusBarGestureDownEvent = null;
+ mInputFocusTransferStarted = false;
+ bar.onInputFocusTransfer(false);
}
});
}
@@ -780,6 +779,7 @@
pw.println(QuickStepContract.isBackGestureDisabled(mSysUiStateFlags));
pw.print(" assistantGestureDisabled=");
pw.println(QuickStepContract.isAssistantGestureDisabled(mSysUiStateFlags));
+ pw.print(" mInputFocusTransferStarted="); pw.println(mInputFocusTransferStarted);
}
public interface OverviewProxyListener {
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 029d6b3..0886005 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -279,6 +279,8 @@
private boolean mIsFullWidth;
private boolean mBlockingExpansionForCurrentTouch;
+ private boolean mExpectingOpenPanelGesture;
+
/**
* Current dark amount that follows regular interpolation curve of animation.
*/
@@ -1232,6 +1234,28 @@
}
}
+ /**
+ * Input focus transfer is about to happen.
+ */
+ public void startWaitingForOpenPanelGesture() {
+ if (!isFullyCollapsed()) {
+ return;
+ }
+ mExpectingOpenPanelGesture = true;
+ onTrackingStarted();
+ }
+
+ /**
+ * Input focus transfer has already happened as this view decided to intercept
+ * very first down event.
+ */
+ public void stopWaitingForOpenPanelGesture() {
+ if (mExpectingOpenPanelGesture) {
+ mExpectingOpenPanelGesture = false;
+ onTrackingStopped(false);
+ }
+ }
+
@Override
protected boolean flingExpands(float vel, float vectorVel, float x, float y) {
boolean expands = super.flingExpands(vel, vectorVel, x, y);
@@ -1244,8 +1268,12 @@
}
@Override
- protected boolean hasConflictingGestures() {
- return mBarState != StatusBarState.SHADE;
+ protected boolean shouldGestureWaitForTouchSlop() {
+ if (mExpectingOpenPanelGesture) {
+ mExpectingOpenPanelGesture = false;
+ return false;
+ }
+ return isFullyCollapsed() || mBarState != StatusBarState.SHADE;
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index a9a3b2d..a5b221b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -301,7 +301,7 @@
final float y = event.getY(pointerIndex);
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
- mGestureWaitForTouchSlop = isFullyCollapsed() || hasConflictingGestures();
+ mGestureWaitForTouchSlop = shouldGestureWaitForTouchSlop();
mIgnoreXTouchSlop = isFullyCollapsed() || shouldGestureIgnoreXTouchSlop(x, y);
}
@@ -519,7 +519,7 @@
return (int) (mUnlockFalsingThreshold * factor);
}
- protected abstract boolean hasConflictingGestures();
+ protected abstract boolean shouldGestureWaitForTouchSlop();
protected abstract boolean shouldGestureIgnoreXTouchSlop(float x, float y);
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 5e671bf..f4501ee 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -1918,19 +1918,18 @@
mStatusBarKeyguardViewManager.readyForKeyguardDone();
}
- public void dispatchNotificationsPanelTouchEvent(MotionEvent ev) {
+ /**
+ * Called when another window is about to transfer it's input focus.
+ */
+ public void onInputFocusTransfer(boolean start) {
if (!mCommandQueue.panelsEnabled()) {
return;
}
- mNotificationPanel.dispatchTouchEvent(ev);
- int action = ev.getAction();
- if (action == MotionEvent.ACTION_DOWN) {
- // Start ignoring all touch events coming to status bar window.
- // TODO: handle case where ACTION_UP is not sent over the binder
- mStatusBarWindowController.setNotTouchable(true);
- } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
- mStatusBarWindowController.setNotTouchable(false);
+ if (start) {
+ mNotificationPanel.startWaitingForOpenPanelGesture();
+ } else {
+ mNotificationPanel.stopWaitingForOpenPanelGesture();
}
}