Animate expansion of notification panel before ACTION_UP
Fixes: 280335619
Test: Make sure that the notificaton shade can be pulled down before ACTION_UP
Change-Id: I357d90daef771595f4809e99f047083bce219f53
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
index 117cf78a..4b31498 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
@@ -48,7 +48,7 @@
*
* Normal gesture: DOWN, MOVE/POINTER_DOWN/POINTER_UP)*, UP or CANCLE
*/
- oneway void onStatusBarMotionEvent(in MotionEvent event) = 9;
+ oneway void onStatusBarTouchEvent(in MotionEvent event) = 9;
/**
* Proxies the assistant gesture's progress started from navigation bar.
@@ -125,5 +125,15 @@
*/
oneway void takeScreenshot(in ScreenshotRequest request) = 51;
- // Next id = 52
+ /**
+ * Dispatches trackpad status bar motion event to the notification shade. Currently these events
+ * are from the input monitor in {@link TouchInteractionService}. This is different from
+ * {@link #onStatusBarTouchEvent} above in that, this directly dispatches motion events to the
+ * notification shade, while {@link #onStatusBarTouchEvent} relies on setting the launcher
+ * window slippery to allow the frameworks to route those events after passing the initial
+ * threshold.
+ */
+ oneway void onStatusBarTrackpadEvent(in MotionEvent event) = 52;
+
+ // Next id = 53
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 07259c2..bb38b30 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -200,8 +200,8 @@
// TODO: change the method signature to use (boolean inputFocusTransferStarted)
@Override
- public void onStatusBarMotionEvent(MotionEvent event) {
- verifyCallerAndClearCallingIdentity("onStatusBarMotionEvent", () -> {
+ public void onStatusBarTouchEvent(MotionEvent event) {
+ verifyCallerAndClearCallingIdentity("onStatusBarTouchEvent", () -> {
// TODO move this logic to message queue
mCentralSurfacesOptionalLazy.get().ifPresent(centralSurfaces -> {
if (event.getActionMasked() == ACTION_DOWN) {
@@ -236,6 +236,13 @@
}
@Override
+ public void onStatusBarTrackpadEvent(MotionEvent event) {
+ verifyCallerAndClearCallingIdentityPostMain("onStatusBarTrackpadEvent", () ->
+ mCentralSurfacesOptionalLazy.get().ifPresent(centralSurfaces ->
+ centralSurfaces.onStatusBarTrackpadEvent(event)));
+ }
+
+ @Override
public void onBackPressed() {
verifyCallerAndClearCallingIdentityPostMain("onBackPressed", () -> {
sendEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
@@ -345,7 +352,7 @@
@Override
public void expandNotificationPanel() {
- verifyCallerAndClearCallingIdentity("expandNotificationPanel",
+ verifyCallerAndClearCallingIdentityPostMain("expandNotificationPanel",
() -> mCommandQueue.handleSystemKey(new KeyEvent(KeyEvent.ACTION_DOWN,
KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN)));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
index 86bf7cb..e23ac7d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
@@ -28,6 +28,7 @@
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import android.view.KeyEvent;
+import android.view.MotionEvent;
import android.view.RemoteAnimationAdapter;
import android.view.View;
import android.view.ViewGroup;
@@ -266,8 +267,21 @@
boolean isPanelExpanded();
+ /**
+ * Used to dispatch initial touch events before crossing the threshold to pull down the
+ * notification shade. After that, since the launcher window is set to slippery, input
+ * frameworks take care of routing the events to the notification shade.
+ */
void onInputFocusTransfer(boolean start, boolean cancel, float velocity);
+ /**
+ * Dispatches status bar motion event to the notification shade. This is different from
+ * {@link #onInputFocusTransfer(boolean, boolean, float)} as it doesn't rely on setting the
+ * launcher window slippery to allow the frameworks to route those events after passing the
+ * initial threshold.
+ */
+ default void onStatusBarTrackpadEvent(MotionEvent event) {}
+
void animateCollapseQuickSettings();
/** */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
index 0402d4f..713c5ad 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
@@ -91,6 +91,7 @@
import android.view.IRemoteAnimationRunner;
import android.view.IWindowManager;
import android.view.KeyEvent;
+import android.view.MotionEvent;
import android.view.ThreadedRenderer;
import android.view.View;
import android.view.ViewGroup;
@@ -428,6 +429,7 @@
public void togglePanel() {
mCommandQueueCallbacks.togglePanel();
}
+
/**
* The {@link StatusBarState} of the status bar.
*/
@@ -1991,6 +1993,11 @@
}
@Override
+ public void onStatusBarTrackpadEvent(MotionEvent event) {
+ mCentralSurfacesComponent.getNotificationPanelViewController().handleExternalTouch(event);
+ }
+
+ @Override
public void animateCollapseQuickSettings() {
if (mState == StatusBarState.SHADE) {
mShadeSurface.collapse(