summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Naomi Musgrave <nmusgrave@google.com> 2021-08-27 17:51:34 +0100
committer Naomi Musgrave <nmusgrave@google.com> 2021-09-01 10:29:44 +0100
commitcb50daa74cf2718c21ca12e240ecae3bb6a382de (patch)
tree54e577455125a259b75fd2f351a7b370aa92c406
parent9541f4a48a14786ba4a6afe53e87fef32f410157 (diff)
[MediaProjection] Store WindowContext in field
When WindowContext is a local variable for starting layer mirroring, the variable is eventually garbage collected. When this occurs when MediaProjection is still running, then DisplayContent fails to transform the captured content from onConfigurationChanged. The destroyed WindowContext triggers unregistering the WindowContainerListener. Even though the WindowToken is still being used by DisplayContent, DisplayContent is no longer able to retrieve the WindowContainer associated with the WindowToken. The WindowToken set when layer mirroring begins is used to indicate the layer of the hierarchy to mirror. Bug: 197579637 Test: Manual Change-Id: Ib8a971d1a85ebfe9db59d9267cc387f4f4d15991
-rw-r--r--media/java/android/media/projection/MediaProjection.java11
1 files changed, 9 insertions, 2 deletions
diff --git a/media/java/android/media/projection/MediaProjection.java b/media/java/android/media/projection/MediaProjection.java
index 72cddc91f436..353556d70a19 100644
--- a/media/java/android/media/projection/MediaProjection.java
+++ b/media/java/android/media/projection/MediaProjection.java
@@ -50,6 +50,13 @@ public final class MediaProjection {
private final Context mContext;
private final Map<Callback, CallbackRecord> mCallbacks;
+ /**
+ * Store the WindowContext in a field. If it is a local variable, and it is garbage collected
+ * during a MediaProjection session, the WindowContainer listener no longer exists.
+ */
+ @Nullable
+ private Context mWindowContext;
+
/** @hide */
public MediaProjection(Context context, IMediaProjection impl) {
mCallbacks = new ArrayMap<Callback, CallbackRecord>();
@@ -162,11 +169,11 @@ public final class MediaProjection {
*/
private VirtualDisplayConfig.Builder buildMirroredVirtualDisplay(@NonNull String name,
int width, int height, int dpi) {
- Context windowContext = mContext.createWindowContext(mContext.getDisplayNoVerify(),
+ mWindowContext = mContext.createWindowContext(mContext.getDisplayNoVerify(),
TYPE_APPLICATION, null /* options */);
final VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder(name, width,
height, dpi);
- builder.setWindowTokenClientToMirror(windowContext.getWindowContextToken());
+ builder.setWindowTokenClientToMirror(mWindowContext.getWindowContextToken());
return builder;
}