From 821e678d8f33bea91a5d582805c542af68271117 Mon Sep 17 00:00:00 2001 From: Mark Renouf Date: Mon, 1 Apr 2019 14:17:37 -0400 Subject: [PATCH] Set system gesture exclusion rects for Bubbles When there is at least one Bubble on-screen, the bounds of the first (top) bubble are set to exclude system navigation gestures. Test: manually w/fully gesture nav enabled Bug: 126360272 Change-Id: I47a3c69fdc89476805d48b5214a7f05f5d033306 --- .../systemui/bubbles/BubbleStackView.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index b1998c497022f..00b1c9e5ced44 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -64,6 +64,8 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry; import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.Collections; +import java.util.List; /** * Renders bubbles in a stack and handles animating expanded and collapsed states. @@ -164,6 +166,8 @@ public class BubbleStackView extends FrameLayout { int[] mTempLoc = new int[2]; RectF mTempRect = new RectF(); + private final List mSystemGestureExclusionRects = Collections.singletonList(new Rect()); + private ViewTreeObserver.OnPreDrawListener mViewUpdater = new ViewTreeObserver.OnPreDrawListener() { @Override @@ -175,6 +179,9 @@ public class BubbleStackView extends FrameLayout { } }; + private ViewTreeObserver.OnDrawListener mSystemGestureExcludeUpdater = + this::updateSystemGestureExcludeRects; + private ViewClippingUtil.ClippingParameters mClippingParameters = new ViewClippingUtil.ClippingParameters() { @@ -296,6 +303,9 @@ public class BubbleStackView extends FrameLayout { () -> mExpandedBubble.expandedView.updateInsets(insets)); return view.onApplyWindowInsets(insets); }); + + // This must be a separate OnDrawListener since it should be called for every draw. + getViewTreeObserver().addOnDrawListener(mSystemGestureExcludeUpdater); } /** @@ -362,6 +372,22 @@ public class BubbleStackView extends FrameLayout { return false; } + private void updateSystemGestureExcludeRects() { + // Exclude the region occupied by the first BubbleView in the stack + Rect excludeZone = mSystemGestureExclusionRects.get(0); + if (mBubbleContainer.getChildCount() > 0) { + View firstBubble = mBubbleContainer.getChildAt(0); + excludeZone.set(firstBubble.getLeft(), firstBubble.getTop(), firstBubble.getRight(), + firstBubble.getBottom()); + excludeZone.offset((int) (firstBubble.getTranslationX() + 0.5f), + (int) (firstBubble.getTranslationY() + 0.5f)); + mBubbleContainer.setSystemGestureExclusionRects(mSystemGestureExclusionRects); + } else { + excludeZone.setEmpty(); + mBubbleContainer.setSystemGestureExclusionRects(Collections.emptyList()); + } + } + /** * Updates the visibility of the 'dot' indicating an update on the bubble. * @param key the {@link NotificationEntry#key} associated with the bubble.