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

Commit c2b395c7 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Require permission to create trusted displays" into rvc-qpr-dev

parents b445d8d9 ef7b1333
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -105,7 +105,8 @@ public class ActivityView extends ViewGroup implements android.window.TaskEmbedd
    public ActivityView(
            @NonNull Context context, @NonNull AttributeSet attrs, int defStyle,
            boolean singleTaskInstance, boolean usePublicVirtualDisplay) {
        this(context, attrs, defStyle, singleTaskInstance, usePublicVirtualDisplay, false);
        this(context, attrs, defStyle, singleTaskInstance, usePublicVirtualDisplay,
                false /* disableSurfaceViewBackgroundLayer */);
    }

    /** @hide */
@@ -113,12 +114,22 @@ public class ActivityView extends ViewGroup implements android.window.TaskEmbedd
            @NonNull Context context, @NonNull AttributeSet attrs, int defStyle,
            boolean singleTaskInstance, boolean usePublicVirtualDisplay,
            boolean disableSurfaceViewBackgroundLayer) {
        this(context, attrs, defStyle, singleTaskInstance, usePublicVirtualDisplay,
                disableSurfaceViewBackgroundLayer, false /* useTrustedDisplay */);
    }

    // TODO(b/162901735): Refactor ActivityView with Builder
    /** @hide */
    public ActivityView(
            @NonNull Context context, @NonNull AttributeSet attrs, int defStyle,
            boolean singleTaskInstance, boolean usePublicVirtualDisplay,
            boolean disableSurfaceViewBackgroundLayer, boolean useTrustedDisplay) {
        super(context, attrs, defStyle);
        if (useTaskOrganizer()) {
            mTaskEmbedder = new TaskOrganizerTaskEmbedder(context, this);
        } else {
            mTaskEmbedder = new VirtualDisplayTaskEmbedder(context, this, singleTaskInstance,
                    usePublicVirtualDisplay);
                    usePublicVirtualDisplay, useTrustedDisplay);
        }
        mSurfaceView = new SurfaceView(context, null, 0, 0, disableSurfaceViewBackgroundLayer);
        // Since ActivityView#getAlpha has been overridden, we should use parent class's alpha
+8 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.window;
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL;
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY;
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUSTED;
import static android.view.Display.INVALID_DISPLAY;

import android.app.ActivityManager;
@@ -63,6 +64,7 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder {
    private int mDisplayDensityDpi;
    private final boolean mSingleTaskInstance;
    private final boolean mUsePublicVirtualDisplay;
    private final boolean mUseTrustedDisplay;
    private VirtualDisplay mVirtualDisplay;
    private Insets mForwardedInsets;
    private DisplayMetrics mTmpDisplayMetrics;
@@ -77,10 +79,12 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder {
     *                           only applicable if virtual displays are used
     */
    public VirtualDisplayTaskEmbedder(Context context, VirtualDisplayTaskEmbedder.Host host,
            boolean singleTaskInstance, boolean usePublicVirtualDisplay) {
            boolean singleTaskInstance, boolean usePublicVirtualDisplay,
            boolean useTrustedDisplay) {
        super(context, host);
        mSingleTaskInstance = singleTaskInstance;
        mUsePublicVirtualDisplay = usePublicVirtualDisplay;
        mUseTrustedDisplay = useTrustedDisplay;
    }

    /**
@@ -103,6 +107,9 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder {
        if (mUsePublicVirtualDisplay) {
            virtualDisplayFlags |= VIRTUAL_DISPLAY_FLAG_PUBLIC;
        }
        if (mUseTrustedDisplay) {
            virtualDisplayFlags |= VIRTUAL_DISPLAY_FLAG_TRUSTED;
        }

        mVirtualDisplay = displayManager.createVirtualDisplay(
                DISPLAY_NAME + "@" + System.identityHashCode(this), mHost.getWidth(),
+1 −0
Original line number Diff line number Diff line
@@ -129,6 +129,7 @@
    <!-- virtual display test permissions -->
    <uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT" />
    <uses-permission android:name="android.permission.CAPTURE_SECURE_VIDEO_OUTPUT" />
    <uses-permission android:name="android.permission.ADD_TRUSTED_DISPLAY" />

    <!-- color extraction test permissions -->
    <uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
+19 −0
Original line number Diff line number Diff line
@@ -247,6 +247,25 @@ public class VirtualDisplayTest extends AndroidTestCase {
        assertDisplayUnregistered(display);
    }

    /**
     * Ensures that an application can create a trusted virtual display with the permission
     * {@code ADD_TRUSTED_DISPLAY}.
     */
    public void testTrustedVirtualDisplay() throws Exception {
        VirtualDisplay virtualDisplay = mDisplayManager.createVirtualDisplay(NAME,
                WIDTH, HEIGHT, DENSITY, mSurface,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUSTED);
        assertNotNull("virtual display must not be null", virtualDisplay);

        Display display = virtualDisplay.getDisplay();
        try {
            assertDisplayRegistered(display, Display.FLAG_PRIVATE | Display.FLAG_TRUSTED);
        } finally {
            virtualDisplay.release();
        }
        assertDisplayUnregistered(display);
    }

    private void assertDisplayRegistered(Display display, int flags) {
        assertNotNull("display object must not be null", display);
        assertTrue("display must be valid", display.isValid());
+1 −1
Original line number Diff line number Diff line
@@ -301,7 +301,7 @@ public class BubbleExpandedView extends LinearLayout {

        mActivityView = new ActivityView(mContext, null /* attrs */, 0 /* defStyle */,
                true /* singleTaskInstance */, false /* usePublicVirtualDisplay*/,
                true /* disableSurfaceViewBackgroundLayer */);
                true /* disableSurfaceViewBackgroundLayer */, true /* useTrustedDisplay */);

        // Set ActivityView's alpha value as zero, since there is no view content to be shown.
        setContentVisibility(false);
Loading