From 447e4f16e274d84dd75efac1deb608aca2193543 Mon Sep 17 00:00:00 2001 From: Mady Mellor Date: Tue, 14 Dec 2021 14:08:28 -0800 Subject: [PATCH] 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 --- .../animation/ExpandedAnimationController.java | 3 +++ .../animation/ExpandedAnimationControllerTest.java | 14 +++++++++++--- 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 f0f78748e343a..19d513f81caba 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 2b9bdce45a6c0..335222e98c6ce 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));