From 961a3e8803c4141c95a61123de76e2132bcd2b40 Mon Sep 17 00:00:00 2001 From: Ats Jenk Date: Fri, 13 May 2022 17:32:22 -0700 Subject: [PATCH] Bubbles ignore gestures when notif expanded When bubbles are expanded we monitor for home gesture to animate collapsig of the view. When notification panel is open, it is on top of bubbles. But our gesture monitor is still active. Listen to notification panel expanded state and stop listening for home gesture while panel is expanded. Bug: 232339931 Test: atest PlatformScenarioTests:android.platform.test.scenario.sysui.bubble.BubblesHomeGestureTest Change-Id: I123ea6b5b82906d2ed1b0a71fc1e2fa9669abfff --- .../wm/shell/bubbles/BubbleController.java | 32 ++++++++++++++++++ .../wm/shell/bubbles/BubbleStackView.java | 33 ++++++++++++++++--- .../com/android/wm/shell/bubbles/Bubbles.java | 7 +++- .../systemui/accessibility/SystemActions.java | 5 +-- .../recents/OverviewProxyService.java | 2 +- ...NotificationShadeWindowControllerImpl.java | 3 +- .../phone/StatusBarWindowCallback.java | 2 +- .../systemui/wmshell/BubblesManager.java | 10 +++++- 8 files changed, 82 insertions(+), 12 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java index 6c0a6b4c81b6e..a903a83f7cc58 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java @@ -25,6 +25,7 @@ import static android.view.View.VISIBLE; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static com.android.wm.shell.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_CONTROLLER; +import static com.android.wm.shell.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_GESTURE; import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_BUBBLES; import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.wm.shell.bubbles.BubblePositioner.TASKBAR_POSITION_BOTTOM; @@ -859,6 +860,19 @@ public class BubbleController { } } + private void onNotificationPanelExpandedChanged(boolean expanded) { + if (DEBUG_BUBBLE_GESTURE) { + Log.d(TAG, "onNotificationPanelExpandedChanged: expanded=" + expanded); + } + if (mStackView != null && mStackView.isExpanded()) { + if (expanded) { + mStackView.stopMonitoringSwipeUpGesture(); + } else { + mStackView.startMonitoringSwipeUpGesture(); + } + } + } + private void setSysuiProxy(Bubbles.SysuiProxy proxy) { mSysuiProxy = proxy; } @@ -1441,6 +1455,18 @@ public class BubbleController { return mStackView; } + /** + * Check if notification panel is in an expanded state. + * Makes a call to System UI process and delivers the result via {@code callback} on the + * WM Shell main thread. + * + * @param callback callback that has the result of notification panel expanded state + */ + public void isNotificationPanelExpanded(Consumer callback) { + mSysuiProxy.isNotificationPanelExpand(expanded -> + mMainExecutor.execute(() -> callback.accept(expanded))); + } + /** * Description of current bubble state. */ @@ -1809,6 +1835,12 @@ public class BubbleController { }); } + @Override + public void onNotificationPanelExpandedChanged(boolean expanded) { + mMainExecutor.execute( + () -> BubbleController.this.onNotificationPanelExpandedChanged(expanded)); + } + @Override public void dump(PrintWriter pw, String[] args) { try { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java index 941bcab9b81da..828ad637c5f80 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java @@ -21,6 +21,7 @@ import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import static com.android.wm.shell.animation.Interpolators.ALPHA_IN; import static com.android.wm.shell.animation.Interpolators.ALPHA_OUT; +import static com.android.wm.shell.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_GESTURE; import static com.android.wm.shell.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_STACK_VIEW; import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_BUBBLES; import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME; @@ -1930,11 +1931,13 @@ public class BubbleStackView extends FrameLayout return; } + boolean wasExpanded = mIsExpanded; + hideCurrentInputMethod(); mBubbleController.getSysuiProxy().onStackExpandChanged(shouldExpand); - if (mIsExpanded) { + if (wasExpanded) { stopMonitoringSwipeUpGesture(); if (HOME_GESTURE_ENABLED) { animateCollapse(); @@ -1949,14 +1952,24 @@ public class BubbleStackView extends FrameLayout logBubbleEvent(mExpandedBubble, FrameworkStatsLog.BUBBLE_UICHANGED__ACTION__STACK_EXPANDED); if (HOME_GESTURE_ENABLED) { - startMonitoringSwipeUpGesture(); + mBubbleController.isNotificationPanelExpanded(notifPanelExpanded -> { + if (!notifPanelExpanded && mIsExpanded) { + startMonitoringSwipeUpGesture(); + } + }); } } notifyExpansionChanged(mExpandedBubble, mIsExpanded); } - private void startMonitoringSwipeUpGesture() { - stopMonitoringSwipeUpGesture(); + /** + * Monitor for swipe up gesture that is used to collapse expanded view + */ + void startMonitoringSwipeUpGesture() { + if (DEBUG_BUBBLE_GESTURE) { + Log.d(TAG, "startMonitoringSwipeUpGesture"); + } + stopMonitoringSwipeUpGestureInternal(); if (isGestureNavEnabled()) { mBubblesNavBarGestureTracker = new BubblesNavBarGestureTracker(mContext, mPositioner); @@ -1971,7 +1984,17 @@ public class BubbleStackView extends FrameLayout == WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; } - private void stopMonitoringSwipeUpGesture() { + /** + * Stop monitoring for swipe up gesture + */ + void stopMonitoringSwipeUpGesture() { + if (DEBUG_BUBBLE_GESTURE) { + Log.d(TAG, "stopMonitoringSwipeUpGesture"); + } + stopMonitoringSwipeUpGestureInternal(); + } + + private void stopMonitoringSwipeUpGestureInternal() { if (mBubblesNavBarGestureTracker != null) { mBubblesNavBarGestureTracker.stop(); mBubblesNavBarGestureTracker = null; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java index c7db8d8d16461..8201def3e379e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java @@ -212,6 +212,11 @@ public interface Bubbles { NotificationChannel channel, int modificationType); + /** + * Called when notification panel is expanded or collapsed + */ + void onNotificationPanelExpandedChanged(boolean expanded); + /** * Called when the status bar has become visible or invisible (either permanently or * temporarily). @@ -277,7 +282,7 @@ public interface Bubbles { /** Callback to tell SysUi components execute some methods. */ interface SysuiProxy { - void isNotificationShadeExpand(Consumer callback); + void isNotificationPanelExpand(Consumer callback); void getPendingOrActiveEntry(String key, Consumer callback); diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java index bd8e44ceab803..448b99b6e5d06 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java @@ -199,8 +199,9 @@ public class SystemActions extends CoreStartable { mNotificationShadeController = notificationShadeController; // Saving in instance variable since to prevent GC since // NotificationShadeWindowController.registerCallback() only keeps weak references. - mNotificationShadeCallback = (keyguardShowing, keyguardOccluded, bouncerShowing, mDozing) -> - registerOrUnregisterDismissNotificationShadeAction(); + mNotificationShadeCallback = + (keyguardShowing, keyguardOccluded, bouncerShowing, mDozing, panelExpanded) -> + registerOrUnregisterDismissNotificationShadeAction(); mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy; } diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 9768e706764f6..da943d2ea594b 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -736,7 +736,7 @@ public class OverviewProxyService extends CurrentUserTracker implements } private void onStatusBarStateChanged(boolean keyguardShowing, boolean keyguardOccluded, - boolean bouncerShowing, boolean isDozing) { + boolean bouncerShowing, boolean isDozing, boolean panelExpanded) { mSysUiState.setFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING, keyguardShowing && !keyguardOccluded) .setFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java index faae4bbbafd02..a8da554d7e1f8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java @@ -502,7 +502,8 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW cb.onStateChanged(mCurrentState.mKeyguardShowing, mCurrentState.mKeyguardOccluded, mCurrentState.mBouncerShowing, - mCurrentState.mDozing); + mCurrentState.mDozing, + mCurrentState.mPanelExpanded); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowCallback.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowCallback.java index ac43b679da0f0..ae48c2d3b6f32 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowCallback.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowCallback.java @@ -17,5 +17,5 @@ package com.android.systemui.statusbar.phone; public interface StatusBarWindowCallback { void onStateChanged(boolean keyguardShowing, boolean keyguardOccluded, boolean bouncerShowing, - boolean isDozing); + boolean isDozing, boolean panelExpanded); } diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java index 542a537015299..adc98048d0760 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java @@ -78,6 +78,7 @@ import com.android.systemui.statusbar.notification.collection.notifcollection.No import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider; import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider; import com.android.systemui.statusbar.phone.ShadeController; +import com.android.systemui.statusbar.phone.StatusBarWindowCallback; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.ZenModeController; @@ -121,6 +122,7 @@ public class BubblesManager implements Dumpable { private final Bubbles.SysuiProxy mSysuiProxy; // TODO (b/145659174): allow for multiple callbacks to support the "shadow" new notif pipeline private final List mCallbacks = new ArrayList<>(); + private final StatusBarWindowCallback mStatusBarWindowCallback; /** * Creates {@link BubblesManager}, returns {@code null} if Optional {@link Bubbles} not present @@ -273,9 +275,15 @@ public class BubblesManager implements Dumpable { }); + // Store callback in a field so it won't get GC'd + mStatusBarWindowCallback = + (keyguardShowing, keyguardOccluded, bouncerShowing, isDozing, panelExpanded) -> + mBubbles.onNotificationPanelExpandedChanged(panelExpanded); + notificationShadeWindowController.registerCallback(mStatusBarWindowCallback); + mSysuiProxy = new Bubbles.SysuiProxy() { @Override - public void isNotificationShadeExpand(Consumer callback) { + public void isNotificationPanelExpand(Consumer callback) { sysuiMainExecutor.execute(() -> { callback.accept(mNotificationShadeWindowController.getPanelExpanded()); });