summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mark Renouf <mrenouf@google.com> 2021-04-14 16:30:17 -0400
committer Mark Renouf <mrenouf@google.com> 2021-04-15 13:31:48 -0400
commit1cd1c555c26779cb6558f53f6cd19bedfb626849 (patch)
tree4d08e7bea84d0871c1dd447961b891722cd3d4df
parent41f4544e59c2860682f4557baefaa6d21e8f3615 (diff)
ScrollCaptureConnection: fix npe on close() when active
A reference to the callback was being removed while still needed. Instead use a local copy for posted callback. Bug: 12345678 Test: atest ScrollCaptureConnectionTest#testCloseWhileActive Change-Id: I3a11ac86a8c291972f442ebce962ba8a3a1ddee6
-rw-r--r--core/java/android/view/ScrollCaptureConnection.java3
-rw-r--r--core/tests/coretests/src/android/view/ScrollCaptureConnectionTest.java12
2 files changed, 14 insertions, 1 deletions
diff --git a/core/java/android/view/ScrollCaptureConnection.java b/core/java/android/view/ScrollCaptureConnection.java
index a6d786e1db21..5fcb011c76f1 100644
--- a/core/java/android/view/ScrollCaptureConnection.java
+++ b/core/java/android/view/ScrollCaptureConnection.java
@@ -185,7 +185,8 @@ public class ScrollCaptureConnection extends IScrollCaptureConnection.Stub {
}
Log.w(TAG, "close(): capture session still active! Ending now.");
// -> UiThread
- mUiThread.execute(() -> mLocal.onScrollCaptureEnd(() -> { /* ignore */ }));
+ final ScrollCaptureCallback callback = mLocal;
+ mUiThread.execute(() -> callback.onScrollCaptureEnd(() -> { /* ignore */ }));
mActive = false;
}
mActive = false;
diff --git a/core/tests/coretests/src/android/view/ScrollCaptureConnectionTest.java b/core/tests/coretests/src/android/view/ScrollCaptureConnectionTest.java
index 22c71b527d48..e7b88c8df393 100644
--- a/core/tests/coretests/src/android/view/ScrollCaptureConnectionTest.java
+++ b/core/tests/coretests/src/android/view/ScrollCaptureConnectionTest.java
@@ -32,6 +32,7 @@ import android.graphics.Point;
import android.graphics.Rect;
import android.os.Handler;
import android.os.ICancellationSignal;
+import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
@@ -189,4 +190,15 @@ public class ScrollCaptureConnectionTest {
verifyNoMoreInteractions(mRemote);
}
+ @Test
+ public void testClose_whileActive() throws RemoteException {
+ mConnection.startCapture(mSurface, mRemote);
+
+ mCallback.completeStartRequest();
+ assertTrue(mConnection.isActive());
+
+ mConnection.close();
+ mCallback.completeEndRequest();
+ assertFalse(mConnection.isActive());
+ }
}