From 82bcdaf2df535d9613b186a91b42b05d02f7ff9d Mon Sep 17 00:00:00 2001 From: Naomi Musgrave Date: Fri, 12 May 2023 13:59:39 +0000 Subject: [PATCH] [MediaProjection] Handle null DisplayContent when trying to set the session The VirtualDisplay may have already been removed by the time WindowManager attempts to handle an incoming recording session. The returned DisplayContent is then null. Bug: 280596594 Test: Manual; no NPE when screenshot from Betterbug Change-Id: Ie956a6b6fea0efd5bd35afa0f73b415a7f6ca346 --- data/etc/services.core.protolog.json | 6 ++++++ .../com/android/server/wm/ContentRecordingController.java | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json index 7c2759af156fa..8d52233233b82 100644 --- a/data/etc/services.core.protolog.json +++ b/data/etc/services.core.protolog.json @@ -2059,6 +2059,12 @@ "group": "WM_DEBUG_CONFIGURATION", "at": "com\/android\/server\/wm\/ActivityRecord.java" }, + "-233530384": { + "message": "Content Recording: Incoming session on display %d can't be set since it is already null; the corresponding VirtualDisplay must have already been removed.", + "level": "VERBOSE", + "group": "WM_DEBUG_CONTENT_RECORDING", + "at": "com\/android\/server\/wm\/ContentRecordingController.java" + }, "-230587670": { "message": "SyncGroup %d: Unfinished container: %s", "level": "VERBOSE", diff --git a/services/core/java/com/android/server/wm/ContentRecordingController.java b/services/core/java/com/android/server/wm/ContentRecordingController.java index 040da8862c748..4da55e20382e3 100644 --- a/services/core/java/com/android/server/wm/ContentRecordingController.java +++ b/services/core/java/com/android/server/wm/ContentRecordingController.java @@ -98,6 +98,13 @@ final class ContentRecordingController { mSession == null ? null : mSession.getVirtualDisplayId()); incomingDisplayContent = wmService.mRoot.getDisplayContentOrCreate( incomingSession.getVirtualDisplayId()); + if (incomingDisplayContent == null) { + ProtoLog.v(WM_DEBUG_CONTENT_RECORDING, + "Content Recording: Incoming session on display %d can't be set since it " + + "is already null; the corresponding VirtualDisplay must have " + + "already been removed.", incomingSession.getVirtualDisplayId()); + return; + } incomingDisplayContent.setContentRecordingSession(incomingSession); // TODO(b/270118861): When user grants consent to re-use, explicitly ask ContentRecorder // to update, since no config/display change arrives. Mark recording as black.