From 419f9ed5ddfc92db48e8f29c587a6a743286e086 Mon Sep 17 00:00:00 2001 From: Oleg Blinnikov Date: Mon, 26 Sep 2022 14:38:41 +0000 Subject: [PATCH] Fix NullPointerException in ContentRecorder Bug: 245132672 Test: atest ContentRecorderTests Change-Id: If16d5c94275fbed6bcfa767c07eb153adc38b38d --- .../com/android/server/wm/ContentRecorder.java | 15 ++++++++++----- .../android/server/wm/ContentRecorderTests.java | 8 ++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/ContentRecorder.java b/services/core/java/com/android/server/wm/ContentRecorder.java index 35a744f70d27b..f304b4a009b54 100644 --- a/services/core/java/com/android/server/wm/ContentRecorder.java +++ b/services/core/java/com/android/server/wm/ContentRecorder.java @@ -388,8 +388,7 @@ final class ContentRecorder implements WindowContainerListener { *

*/ private void handleStartRecordingFailed() { - final boolean shouldExitTaskRecording = mContentRecordingSession != null - && mContentRecordingSession.getContentToRecord() == RECORD_CONTENT_TASK; + final boolean shouldExitTaskRecording = isRecordingContentTask(); clearContentRecordingSession(); if (shouldExitTaskRecording) { // Clean up the cached session first to ensure recording doesn't re-start, since @@ -475,9 +474,10 @@ final class ContentRecorder implements WindowContainerListener { ProtoLog.v(WM_DEBUG_CONTENT_RECORDING, "Recorded task is removed, so stop recording on display %d", mDisplayContent.getDisplayId()); - Task recordedTask = mRecordedWindowContainer.asTask(); - if (recordedTask == null - || mContentRecordingSession.getContentToRecord() != RECORD_CONTENT_TASK) { + + Task recordedTask = mRecordedWindowContainer != null + ? mRecordedWindowContainer.asTask() : null; + if (recordedTask == null || !isRecordingContentTask()) { return; } recordedTask.unregisterWindowContainerListener(this); @@ -501,4 +501,9 @@ final class ContentRecorder implements WindowContainerListener { @VisibleForTesting interface MediaProjectionManagerWrapper { void stopActiveProjection(); } + + private boolean isRecordingContentTask() { + return mContentRecordingSession != null + && mContentRecordingSession.getContentToRecord() == RECORD_CONTENT_TASK; + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/ContentRecorderTests.java b/services/tests/wmtests/src/com/android/server/wm/ContentRecorderTests.java index 7fbf6bb683bfc..f6d53852f9a17 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ContentRecorderTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ContentRecorderTests.java @@ -288,6 +288,14 @@ public class ContentRecorderTests extends WindowTestsBase { verify(mMediaProjectionManagerWrapper).stopActiveProjection(); } + @Test + public void testRemoveTask_stopsRecording_nullSessionShouldNotThrowExceptions() { + mContentRecorder.setContentRecordingSession(mTaskSession); + mContentRecorder.updateRecording(); + mContentRecorder.setContentRecordingSession(null); + mTask.removeImmediately(); + } + @Test public void testUpdateMirroredSurface_capturedAreaResized() { mContentRecorder.setContentRecordingSession(mDisplaySession);