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
This commit is contained in:
Ats Jenk
2022-05-13 17:32:22 -07:00
parent cb815498c6
commit 961a3e8803
8 changed files with 82 additions and 12 deletions

View File

@@ -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<Boolean> 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 {

View File

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

View File

@@ -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<Boolean> callback);
void isNotificationPanelExpand(Consumer<Boolean> callback);
void getPendingOrActiveEntry(String key, Consumer<BubbleEntry> callback);

View File

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

View File

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

View File

@@ -502,7 +502,8 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW
cb.onStateChanged(mCurrentState.mKeyguardShowing,
mCurrentState.mKeyguardOccluded,
mCurrentState.mBouncerShowing,
mCurrentState.mDozing);
mCurrentState.mDozing,
mCurrentState.mPanelExpanded);
}
}

View File

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

View File

@@ -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<NotifCallback> 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<Boolean> callback) {
public void isNotificationPanelExpand(Consumer<Boolean> callback) {
sysuiMainExecutor.execute(() -> {
callback.accept(mNotificationShadeWindowController.getPanelExpanded());
});