diff options
author | Mady Mellor <madym@google.com> | 2021-12-14 14:08:28 -0800 |
---|---|---|
committer | Mady Mellor <madym@google.com> | 2021-12-14 15:21:41 -0800 |
commit | 447e4f16e274d84dd75efac1deb608aca2193543 (patch) | |
tree | beb2ae5bd3e6f12e53e0724aacb10d78ba59357f | |
parent | eeb998c0937884db93dda5ec9df1550501f3c837 (diff) |
Fix a potential NPE
I've never been able to reproduce this and the stack traces I have
of it don't match existing code, but looking at the code paths I think
this could still happen, there are a couple of places where the
mMagnetizedBubbleDraggingOut gets nulled out (e.g. on child removed)
I've tried to repro by:
- canceling the bubbles in the middle of dragging to dismiss
- trying to snap the bubble back and then drag it again to dismiss
(snap back also nulls it)
I see a recent stack of it in pitot so I think it's worth adding the
null check.
Test: atest ExpandedAnimationControllerTest
Bug: 201866808
Change-Id: Ib9425a2b63410c95fddaaea59761dfd18557ed54
2 files changed, 14 insertions, 3 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java index f0f78748e343..19d513f81cab 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java @@ -346,6 +346,9 @@ public class ExpandedAnimationController * bubble is dragged back into the row. */ public void dragBubbleOut(View bubbleView, float x, float y) { + if (mMagnetizedBubbleDraggingOut == null) { + return; + } if (mSpringToTouchOnNextMotionEvent) { springBubbleTo(mMagnetizedBubbleDraggingOut.getUnderlyingObject(), x, y); mSpringToTouchOnNextMotionEvent = false; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationControllerTest.java index 2b9bdce45a6c..335222e98c6c 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationControllerTest.java @@ -59,19 +59,21 @@ public class ExpandedAnimationControllerTest extends PhysicsAnimationLayoutTestC private int mStackOffset; private PointF mExpansionPoint; private BubblePositioner mPositioner; - private BubbleStackView.StackViewState mStackViewState; + private BubbleStackView.StackViewState mStackViewState = new BubbleStackView.StackViewState(); @SuppressLint("VisibleForTests") @Before public void setUp() throws Exception { super.setUp(); - BubbleStackView stackView = mock(BubbleStackView.class); - when(stackView.getState()).thenReturn(getStackViewState()); mPositioner = new BubblePositioner(getContext(), mock(WindowManager.class)); mPositioner.updateInternal(Configuration.ORIENTATION_PORTRAIT, Insets.of(0, 0, 0, 0), new Rect(0, 0, mDisplayWidth, mDisplayHeight)); + + BubbleStackView stackView = mock(BubbleStackView.class); + when(stackView.getState()).thenReturn(getStackViewState()); + mExpandedController = new ExpandedAnimationController(mPositioner, mOnBubbleAnimatedOutAction, stackView); @@ -135,6 +137,12 @@ public class ExpandedAnimationControllerTest extends PhysicsAnimationLayoutTestC testBubblesInCorrectExpandedPositions(); } + @Test + public void testDragBubbleOutDoesntNPE() throws InterruptedException { + mExpandedController.onGestureFinished(); + mExpandedController.dragBubbleOut(mViews.get(0), 1, 1); + } + /** Expand the stack and wait for animations to finish. */ private void expand() throws InterruptedException { mExpandedController.expandFromStack(mock(Runnable.class)); |