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:
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -502,7 +502,8 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW
|
||||
cb.onStateChanged(mCurrentState.mKeyguardShowing,
|
||||
mCurrentState.mKeyguardOccluded,
|
||||
mCurrentState.mBouncerShowing,
|
||||
mCurrentState.mDozing);
|
||||
mCurrentState.mDozing,
|
||||
mCurrentState.mPanelExpanded);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user