Merge "Bubbles ignore gestures when notif expanded" into tm-qpr-dev am: d59f2ed60a

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18385992

Change-Id: I0ce8b5021d9758392fdddc6bfef1c05de6158e1b
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Ats Jenk
2022-05-17 22:01:02 +00:00
committed by Automerger Merge Worker
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 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_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_BUBBLES;
import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.wm.shell.bubbles.BubblePositioner.TASKBAR_POSITION_BOTTOM; 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) { private void setSysuiProxy(Bubbles.SysuiProxy proxy) {
mSysuiProxy = proxy; mSysuiProxy = proxy;
} }
@@ -1441,6 +1455,18 @@ public class BubbleController {
return mStackView; 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. * 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 @Override
public void dump(PrintWriter pw, String[] args) { public void dump(PrintWriter pw, String[] args) {
try { 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_IN;
import static com.android.wm.shell.animation.Interpolators.ALPHA_OUT; 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.DEBUG_BUBBLE_STACK_VIEW;
import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_BUBBLES; 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.BubbleDebugConfig.TAG_WITH_CLASS_NAME;
@@ -1930,11 +1931,13 @@ public class BubbleStackView extends FrameLayout
return; return;
} }
boolean wasExpanded = mIsExpanded;
hideCurrentInputMethod(); hideCurrentInputMethod();
mBubbleController.getSysuiProxy().onStackExpandChanged(shouldExpand); mBubbleController.getSysuiProxy().onStackExpandChanged(shouldExpand);
if (mIsExpanded) { if (wasExpanded) {
stopMonitoringSwipeUpGesture(); stopMonitoringSwipeUpGesture();
if (HOME_GESTURE_ENABLED) { if (HOME_GESTURE_ENABLED) {
animateCollapse(); animateCollapse();
@@ -1949,14 +1952,24 @@ public class BubbleStackView extends FrameLayout
logBubbleEvent(mExpandedBubble, logBubbleEvent(mExpandedBubble,
FrameworkStatsLog.BUBBLE_UICHANGED__ACTION__STACK_EXPANDED); FrameworkStatsLog.BUBBLE_UICHANGED__ACTION__STACK_EXPANDED);
if (HOME_GESTURE_ENABLED) { if (HOME_GESTURE_ENABLED) {
mBubbleController.isNotificationPanelExpanded(notifPanelExpanded -> {
if (!notifPanelExpanded && mIsExpanded) {
startMonitoringSwipeUpGesture(); startMonitoringSwipeUpGesture();
} }
});
}
} }
notifyExpansionChanged(mExpandedBubble, mIsExpanded); 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()) { if (isGestureNavEnabled()) {
mBubblesNavBarGestureTracker = new BubblesNavBarGestureTracker(mContext, mPositioner); mBubblesNavBarGestureTracker = new BubblesNavBarGestureTracker(mContext, mPositioner);
@@ -1971,7 +1984,17 @@ public class BubbleStackView extends FrameLayout
== WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; == 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) { if (mBubblesNavBarGestureTracker != null) {
mBubblesNavBarGestureTracker.stop(); mBubblesNavBarGestureTracker.stop();
mBubblesNavBarGestureTracker = null; mBubblesNavBarGestureTracker = null;

View File

@@ -212,6 +212,11 @@ public interface Bubbles {
NotificationChannel channel, NotificationChannel channel,
int modificationType); 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 * Called when the status bar has become visible or invisible (either permanently or
* temporarily). * temporarily).
@@ -277,7 +282,7 @@ public interface Bubbles {
/** Callback to tell SysUi components execute some methods. */ /** Callback to tell SysUi components execute some methods. */
interface SysuiProxy { interface SysuiProxy {
void isNotificationShadeExpand(Consumer<Boolean> callback); void isNotificationPanelExpand(Consumer<Boolean> callback);
void getPendingOrActiveEntry(String key, Consumer<BubbleEntry> callback); void getPendingOrActiveEntry(String key, Consumer<BubbleEntry> callback);

View File

@@ -199,7 +199,8 @@ public class SystemActions extends CoreStartable {
mNotificationShadeController = notificationShadeController; mNotificationShadeController = notificationShadeController;
// Saving in instance variable since to prevent GC since // Saving in instance variable since to prevent GC since
// NotificationShadeWindowController.registerCallback() only keeps weak references. // NotificationShadeWindowController.registerCallback() only keeps weak references.
mNotificationShadeCallback = (keyguardShowing, keyguardOccluded, bouncerShowing, mDozing) -> mNotificationShadeCallback =
(keyguardShowing, keyguardOccluded, bouncerShowing, mDozing, panelExpanded) ->
registerOrUnregisterDismissNotificationShadeAction(); registerOrUnregisterDismissNotificationShadeAction();
mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy; mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
} }

View File

@@ -736,7 +736,7 @@ public class OverviewProxyService extends CurrentUserTracker implements
} }
private void onStatusBarStateChanged(boolean keyguardShowing, boolean keyguardOccluded, 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, mSysUiState.setFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING,
keyguardShowing && !keyguardOccluded) keyguardShowing && !keyguardOccluded)
.setFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED, .setFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED,

View File

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

View File

@@ -17,5 +17,5 @@ package com.android.systemui.statusbar.phone;
public interface StatusBarWindowCallback { public interface StatusBarWindowCallback {
void onStateChanged(boolean keyguardShowing, boolean keyguardOccluded, boolean bouncerShowing, 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.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider; import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
import com.android.systemui.statusbar.phone.ShadeController; 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.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.statusbar.policy.ZenModeController;
@@ -121,6 +122,7 @@ public class BubblesManager implements Dumpable {
private final Bubbles.SysuiProxy mSysuiProxy; private final Bubbles.SysuiProxy mSysuiProxy;
// TODO (b/145659174): allow for multiple callbacks to support the "shadow" new notif pipeline // TODO (b/145659174): allow for multiple callbacks to support the "shadow" new notif pipeline
private final List<NotifCallback> mCallbacks = new ArrayList<>(); private final List<NotifCallback> mCallbacks = new ArrayList<>();
private final StatusBarWindowCallback mStatusBarWindowCallback;
/** /**
* Creates {@link BubblesManager}, returns {@code null} if Optional {@link Bubbles} not present * 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() { mSysuiProxy = new Bubbles.SysuiProxy() {
@Override @Override
public void isNotificationShadeExpand(Consumer<Boolean> callback) { public void isNotificationPanelExpand(Consumer<Boolean> callback) {
sysuiMainExecutor.execute(() -> { sysuiMainExecutor.execute(() -> {
callback.accept(mNotificationShadeWindowController.getPanelExpanded()); callback.accept(mNotificationShadeWindowController.getPanelExpanded());
}); });