Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb50daa7 authored by Naomi Musgrave's avatar Naomi Musgrave
Browse files

[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
parent 9541f4a4
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -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;
    }