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

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

[MediaProjection] Do not rely on WindowContext to indicate display

Remove WindowContext for indicating the display to capture;
revert to prior behaviour through VirtualDisplayConfig.
Retrieve the display id to mirror through a pre-existing
DisplayManagerInternal API.

Bug: 272036836
Test: manual screen recording
Test: atest FrameworksServicesTests:DisplayManagerServiceTest
Change-Id: Iecdc175dc4292507fe8ec54c4550c3f8b5620054
parent f85d969f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -583,7 +583,7 @@ public final class VirtualDeviceManager {
                throw ex.rethrowFromSystemServer();
            }
            DisplayManagerGlobal displayManager = DisplayManagerGlobal.getInstance();
            return displayManager.createVirtualDisplayWrapper(config, mContext, callbackWrapper,
            return displayManager.createVirtualDisplayWrapper(config, callbackWrapper,
                    displayId);
        }

+5 −8
Original line number Diff line number Diff line
@@ -1096,8 +1096,7 @@ public final class DisplayManager {
            @NonNull VirtualDisplayConfig config,
            @Nullable Handler handler,
            @Nullable VirtualDisplay.Callback callback) {
        return createVirtualDisplay(null /* projection */, config, callback, handler,
                null /* windowContext */);
        return createVirtualDisplay(null /* projection */, config, callback, handler);
    }

    // TODO : Remove this hidden API after remove all callers. (Refer to MultiDisplayService)
@@ -1122,15 +1121,13 @@ public final class DisplayManager {
        if (surface != null) {
            builder.setSurface(surface);
        }
        return createVirtualDisplay(projection, builder.build(), callback, handler,
                null /* windowContext */);
        return createVirtualDisplay(projection, builder.build(), callback, handler);
    }

    /** @hide */
    public VirtualDisplay createVirtualDisplay(@Nullable MediaProjection projection,
            @NonNull VirtualDisplayConfig virtualDisplayConfig,
            @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler,
            @Nullable Context windowContext) {
            @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) {
        Executor executor = null;
        // If callback is null, the executor will not be used. Avoid creating the handler and the
        // handler executor.
@@ -1139,7 +1136,7 @@ public final class DisplayManager {
                    Handler.createAsync(handler != null ? handler.getLooper() : Looper.myLooper()));
        }
        return mGlobal.createVirtualDisplay(mContext, projection, virtualDisplayConfig, callback,
                executor, windowContext);
                executor);
    }

    /**
@@ -1610,7 +1607,7 @@ public final class DisplayManager {
            throw ex.rethrowFromSystemServer();
        }
        return DisplayManagerGlobal.getInstance().createVirtualDisplayWrapper(virtualDisplayConfig,
                null, callbackWrapper, displayId);
                callbackWrapper, displayId);
    }

    /**
+4 −4
Original line number Diff line number Diff line
@@ -635,7 +635,7 @@ public final class DisplayManagerGlobal {

    public VirtualDisplay createVirtualDisplay(@NonNull Context context, MediaProjection projection,
            @NonNull VirtualDisplayConfig virtualDisplayConfig, VirtualDisplay.Callback callback,
            @Nullable Executor executor, @Nullable Context windowContext) {
            @Nullable Executor executor) {
        VirtualDisplayCallback callbackWrapper = new VirtualDisplayCallback(callback, executor);
        IMediaProjection projectionToken = projection != null ? projection.getProjection() : null;
        int displayId;
@@ -645,7 +645,7 @@ public final class DisplayManagerGlobal {
        } catch (RemoteException ex) {
            throw ex.rethrowFromSystemServer();
        }
        return createVirtualDisplayWrapper(virtualDisplayConfig, windowContext, callbackWrapper,
        return createVirtualDisplayWrapper(virtualDisplayConfig, callbackWrapper,
                displayId);
    }

@@ -655,7 +655,7 @@ public final class DisplayManagerGlobal {
     */
    @Nullable
    public VirtualDisplay createVirtualDisplayWrapper(VirtualDisplayConfig virtualDisplayConfig,
            Context windowContext, IVirtualDisplayCallback callbackWrapper, int displayId) {
            IVirtualDisplayCallback callbackWrapper, int displayId) {
        if (displayId < 0) {
            Log.e(TAG, "Could not create virtual display: " + virtualDisplayConfig.getName());
            return null;
@@ -672,7 +672,7 @@ public final class DisplayManagerGlobal {
            return null;
        }
        return new VirtualDisplay(this, display, callbackWrapper,
                virtualDisplayConfig.getSurface(), windowContext);
                virtualDisplayConfig.getSurface());
    }

    public void setVirtualDisplaySurface(IVirtualDisplayCallback token, Surface surface) {
+2 −11
Original line number Diff line number Diff line
@@ -15,8 +15,6 @@
 */
package android.hardware.display;

import android.annotation.Nullable;
import android.content.Context;
import android.view.Display;
import android.view.Surface;

@@ -38,19 +36,12 @@ public final class VirtualDisplay {
    private final Display mDisplay;
    private IVirtualDisplayCallback mToken;
    private Surface mSurface;
    /**
     * 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 final Context mWindowContext;

    VirtualDisplay(DisplayManagerGlobal global, Display display,
            IVirtualDisplayCallback token, Surface surface, Context windowContext) {
    VirtualDisplay(DisplayManagerGlobal global, Display display, IVirtualDisplayCallback token,
            Surface surface) {
        mGlobal = global;
        mDisplay = display;
        mToken = token;
        mSurface = surface;
        mWindowContext = windowContext;
    }

    /**
+2 −36
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArraySet;
import android.view.ContentRecordingSession;
import android.view.Display;
import android.view.Surface;

@@ -54,8 +53,6 @@ public final class VirtualDisplayConfig implements Parcelable {
    private final int mDisplayIdToMirror;
    private final boolean mWindowManagerMirroringEnabled;
    private ArraySet<String> mDisplayCategories = null;
    @Nullable
    private ContentRecordingSession mContentRecordingSession;
    private final float mRequestedRefreshRate;

    private VirtualDisplayConfig(
@@ -68,7 +65,6 @@ public final class VirtualDisplayConfig implements Parcelable {
            @Nullable String uniqueId,
            int displayIdToMirror,
            boolean windowManagerMirroringEnabled,
            ContentRecordingSession session,
            @NonNull ArraySet<String> displayCategories,
            float requestedRefreshRate) {
        mName = name;
@@ -80,7 +76,6 @@ public final class VirtualDisplayConfig implements Parcelable {
        mUniqueId = uniqueId;
        mDisplayIdToMirror = displayIdToMirror;
        mWindowManagerMirroringEnabled = windowManagerMirroringEnabled;
        mContentRecordingSession = session;
        mDisplayCategories = displayCategories;
        mRequestedRefreshRate = requestedRefreshRate;
    }
@@ -160,16 +155,6 @@ public final class VirtualDisplayConfig implements Parcelable {
        return mWindowManagerMirroringEnabled;
    }

    /**
     * Returns the recording session associated with this {@link VirtualDisplay}. Only used for
     * recording via {@link MediaProjection}.
     * @hide
     */
    @Nullable
    public ContentRecordingSession getContentRecordingSession() {
        return mContentRecordingSession;
    }

    /**
     * Returns the display categories.
     *
@@ -201,7 +186,6 @@ public final class VirtualDisplayConfig implements Parcelable {
        dest.writeString8(mUniqueId);
        dest.writeInt(mDisplayIdToMirror);
        dest.writeBoolean(mWindowManagerMirroringEnabled);
        dest.writeTypedObject(mContentRecordingSession, flags);
        dest.writeArraySet(mDisplayCategories);
        dest.writeFloat(mRequestedRefreshRate);
    }
@@ -227,7 +211,6 @@ public final class VirtualDisplayConfig implements Parcelable {
                && Objects.equals(mUniqueId, that.mUniqueId)
                && mDisplayIdToMirror == that.mDisplayIdToMirror
                && mWindowManagerMirroringEnabled == that.mWindowManagerMirroringEnabled
                && Objects.equals(mContentRecordingSession, that.mContentRecordingSession)
                && Objects.equals(mDisplayCategories, that.mDisplayCategories)
                && mRequestedRefreshRate == that.mRequestedRefreshRate;
    }
@@ -236,8 +219,8 @@ public final class VirtualDisplayConfig implements Parcelable {
    public int hashCode() {
        int hashCode = Objects.hash(
                mName, mWidth, mHeight, mDensityDpi, mFlags, mSurface, mUniqueId,
                mDisplayIdToMirror, mWindowManagerMirroringEnabled, mContentRecordingSession,
                mDisplayCategories, mRequestedRefreshRate);
                mDisplayIdToMirror, mWindowManagerMirroringEnabled, mDisplayCategories,
                mRequestedRefreshRate);
        return hashCode;
    }

@@ -254,7 +237,6 @@ public final class VirtualDisplayConfig implements Parcelable {
                + " mUniqueId=" + mUniqueId
                + " mDisplayIdToMirror=" + mDisplayIdToMirror
                + " mWindowManagerMirroringEnabled=" + mWindowManagerMirroringEnabled
                + " mContentRecordingSession=" + mContentRecordingSession
                + " mDisplayCategories=" + mDisplayCategories
                + " mRequestedRefreshRate=" + mRequestedRefreshRate
                + ")";
@@ -270,7 +252,6 @@ public final class VirtualDisplayConfig implements Parcelable {
        mUniqueId = in.readString8();
        mDisplayIdToMirror = in.readInt();
        mWindowManagerMirroringEnabled = in.readBoolean();
        mContentRecordingSession = in.readTypedObject(ContentRecordingSession.CREATOR);
        mDisplayCategories = (ArraySet<String>) in.readArraySet(null);
        mRequestedRefreshRate = in.readFloat();
    }
@@ -302,8 +283,6 @@ public final class VirtualDisplayConfig implements Parcelable {
        private String mUniqueId = null;
        private int mDisplayIdToMirror = DEFAULT_DISPLAY;
        private boolean mWindowManagerMirroringEnabled = false;
        @Nullable
        private ContentRecordingSession mContentRecordingSession;
        private ArraySet<String> mDisplayCategories = new ArraySet<>();
        private float mRequestedRefreshRate = 0.0f;

@@ -395,18 +374,6 @@ public final class VirtualDisplayConfig implements Parcelable {
            return this;
        }

        /**
         * Sets the recording session associated with this {@link VirtualDisplay}. Only used for
         * recording via {@link MediaProjection}.
         *
         * @hide
         */
        @NonNull
        public Builder setContentRecordingSession(@Nullable ContentRecordingSession session) {
            mContentRecordingSession = session;
            return this;
        }

        /**
         * Sets the display categories.
         *
@@ -468,7 +435,6 @@ public final class VirtualDisplayConfig implements Parcelable {
                    mUniqueId,
                    mDisplayIdToMirror,
                    mWindowManagerMirroringEnabled,
                    mContentRecordingSession,
                    mDisplayCategories,
                    mRequestedRefreshRate);
        }
Loading