Loading core/java/android/app/ActivityView.java +13 −2 Original line number Original line Diff line number Diff line Loading @@ -105,7 +105,8 @@ public class ActivityView extends ViewGroup implements android.window.TaskEmbedd public ActivityView( public ActivityView( @NonNull Context context, @NonNull AttributeSet attrs, int defStyle, @NonNull Context context, @NonNull AttributeSet attrs, int defStyle, boolean singleTaskInstance, boolean usePublicVirtualDisplay) { boolean singleTaskInstance, boolean usePublicVirtualDisplay) { this(context, attrs, defStyle, singleTaskInstance, usePublicVirtualDisplay, false); this(context, attrs, defStyle, singleTaskInstance, usePublicVirtualDisplay, false /* disableSurfaceViewBackgroundLayer */); } } /** @hide */ /** @hide */ Loading @@ -113,12 +114,22 @@ public class ActivityView extends ViewGroup implements android.window.TaskEmbedd @NonNull Context context, @NonNull AttributeSet attrs, int defStyle, @NonNull Context context, @NonNull AttributeSet attrs, int defStyle, boolean singleTaskInstance, boolean usePublicVirtualDisplay, boolean singleTaskInstance, boolean usePublicVirtualDisplay, boolean disableSurfaceViewBackgroundLayer) { 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); super(context, attrs, defStyle); if (useTaskOrganizer()) { if (useTaskOrganizer()) { mTaskEmbedder = new TaskOrganizerTaskEmbedder(context, this); mTaskEmbedder = new TaskOrganizerTaskEmbedder(context, this); } else { } else { mTaskEmbedder = new VirtualDisplayTaskEmbedder(context, this, singleTaskInstance, mTaskEmbedder = new VirtualDisplayTaskEmbedder(context, this, singleTaskInstance, usePublicVirtualDisplay); usePublicVirtualDisplay, useTrustedDisplay); } } mSurfaceView = new SurfaceView(context, null, 0, 0, disableSurfaceViewBackgroundLayer); mSurfaceView = new SurfaceView(context, null, 0, 0, disableSurfaceViewBackgroundLayer); // Since ActivityView#getAlpha has been overridden, we should use parent class's alpha // Since ActivityView#getAlpha has been overridden, we should use parent class's alpha Loading core/java/android/window/VirtualDisplayTaskEmbedder.java +8 −1 Original line number Original line Diff line number Diff line Loading @@ -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_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_OWN_CONTENT_ONLY; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC; 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 static android.view.Display.INVALID_DISPLAY; import android.app.ActivityManager; import android.app.ActivityManager; Loading Loading @@ -63,6 +64,7 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder { private int mDisplayDensityDpi; private int mDisplayDensityDpi; private final boolean mSingleTaskInstance; private final boolean mSingleTaskInstance; private final boolean mUsePublicVirtualDisplay; private final boolean mUsePublicVirtualDisplay; private final boolean mUseTrustedDisplay; private VirtualDisplay mVirtualDisplay; private VirtualDisplay mVirtualDisplay; private Insets mForwardedInsets; private Insets mForwardedInsets; private DisplayMetrics mTmpDisplayMetrics; private DisplayMetrics mTmpDisplayMetrics; Loading @@ -77,10 +79,12 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder { * only applicable if virtual displays are used * only applicable if virtual displays are used */ */ public VirtualDisplayTaskEmbedder(Context context, VirtualDisplayTaskEmbedder.Host host, public VirtualDisplayTaskEmbedder(Context context, VirtualDisplayTaskEmbedder.Host host, boolean singleTaskInstance, boolean usePublicVirtualDisplay) { boolean singleTaskInstance, boolean usePublicVirtualDisplay, boolean useTrustedDisplay) { super(context, host); super(context, host); mSingleTaskInstance = singleTaskInstance; mSingleTaskInstance = singleTaskInstance; mUsePublicVirtualDisplay = usePublicVirtualDisplay; mUsePublicVirtualDisplay = usePublicVirtualDisplay; mUseTrustedDisplay = useTrustedDisplay; } } /** /** Loading @@ -103,6 +107,9 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder { if (mUsePublicVirtualDisplay) { if (mUsePublicVirtualDisplay) { virtualDisplayFlags |= VIRTUAL_DISPLAY_FLAG_PUBLIC; virtualDisplayFlags |= VIRTUAL_DISPLAY_FLAG_PUBLIC; } } if (mUseTrustedDisplay) { virtualDisplayFlags |= VIRTUAL_DISPLAY_FLAG_TRUSTED; } mVirtualDisplay = displayManager.createVirtualDisplay( mVirtualDisplay = displayManager.createVirtualDisplay( DISPLAY_NAME + "@" + System.identityHashCode(this), mHost.getWidth(), DISPLAY_NAME + "@" + System.identityHashCode(this), mHost.getWidth(), Loading core/tests/coretests/AndroidManifest.xml +1 −0 Original line number Original line Diff line number Diff line Loading @@ -129,6 +129,7 @@ <!-- virtual display test permissions --> <!-- virtual display test permissions --> <uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT" /> <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.CAPTURE_SECURE_VIDEO_OUTPUT" /> <uses-permission android:name="android.permission.ADD_TRUSTED_DISPLAY" /> <!-- color extraction test permissions --> <!-- color extraction test permissions --> <uses-permission android:name="android.permission.READ_FRAME_BUFFER" /> <uses-permission android:name="android.permission.READ_FRAME_BUFFER" /> Loading core/tests/coretests/src/android/hardware/display/VirtualDisplayTest.java +19 −0 Original line number Original line Diff line number Diff line Loading @@ -247,6 +247,25 @@ public class VirtualDisplayTest extends AndroidTestCase { assertDisplayUnregistered(display); 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) { private void assertDisplayRegistered(Display display, int flags) { assertNotNull("display object must not be null", display); assertNotNull("display object must not be null", display); assertTrue("display must be valid", display.isValid()); assertTrue("display must be valid", display.isValid()); Loading packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -301,7 +301,7 @@ public class BubbleExpandedView extends LinearLayout { mActivityView = new ActivityView(mContext, null /* attrs */, 0 /* defStyle */, mActivityView = new ActivityView(mContext, null /* attrs */, 0 /* defStyle */, true /* singleTaskInstance */, false /* usePublicVirtualDisplay*/, 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. // Set ActivityView's alpha value as zero, since there is no view content to be shown. setContentVisibility(false); setContentVisibility(false); Loading Loading
core/java/android/app/ActivityView.java +13 −2 Original line number Original line Diff line number Diff line Loading @@ -105,7 +105,8 @@ public class ActivityView extends ViewGroup implements android.window.TaskEmbedd public ActivityView( public ActivityView( @NonNull Context context, @NonNull AttributeSet attrs, int defStyle, @NonNull Context context, @NonNull AttributeSet attrs, int defStyle, boolean singleTaskInstance, boolean usePublicVirtualDisplay) { boolean singleTaskInstance, boolean usePublicVirtualDisplay) { this(context, attrs, defStyle, singleTaskInstance, usePublicVirtualDisplay, false); this(context, attrs, defStyle, singleTaskInstance, usePublicVirtualDisplay, false /* disableSurfaceViewBackgroundLayer */); } } /** @hide */ /** @hide */ Loading @@ -113,12 +114,22 @@ public class ActivityView extends ViewGroup implements android.window.TaskEmbedd @NonNull Context context, @NonNull AttributeSet attrs, int defStyle, @NonNull Context context, @NonNull AttributeSet attrs, int defStyle, boolean singleTaskInstance, boolean usePublicVirtualDisplay, boolean singleTaskInstance, boolean usePublicVirtualDisplay, boolean disableSurfaceViewBackgroundLayer) { 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); super(context, attrs, defStyle); if (useTaskOrganizer()) { if (useTaskOrganizer()) { mTaskEmbedder = new TaskOrganizerTaskEmbedder(context, this); mTaskEmbedder = new TaskOrganizerTaskEmbedder(context, this); } else { } else { mTaskEmbedder = new VirtualDisplayTaskEmbedder(context, this, singleTaskInstance, mTaskEmbedder = new VirtualDisplayTaskEmbedder(context, this, singleTaskInstance, usePublicVirtualDisplay); usePublicVirtualDisplay, useTrustedDisplay); } } mSurfaceView = new SurfaceView(context, null, 0, 0, disableSurfaceViewBackgroundLayer); mSurfaceView = new SurfaceView(context, null, 0, 0, disableSurfaceViewBackgroundLayer); // Since ActivityView#getAlpha has been overridden, we should use parent class's alpha // Since ActivityView#getAlpha has been overridden, we should use parent class's alpha Loading
core/java/android/window/VirtualDisplayTaskEmbedder.java +8 −1 Original line number Original line Diff line number Diff line Loading @@ -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_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_OWN_CONTENT_ONLY; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC; 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 static android.view.Display.INVALID_DISPLAY; import android.app.ActivityManager; import android.app.ActivityManager; Loading Loading @@ -63,6 +64,7 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder { private int mDisplayDensityDpi; private int mDisplayDensityDpi; private final boolean mSingleTaskInstance; private final boolean mSingleTaskInstance; private final boolean mUsePublicVirtualDisplay; private final boolean mUsePublicVirtualDisplay; private final boolean mUseTrustedDisplay; private VirtualDisplay mVirtualDisplay; private VirtualDisplay mVirtualDisplay; private Insets mForwardedInsets; private Insets mForwardedInsets; private DisplayMetrics mTmpDisplayMetrics; private DisplayMetrics mTmpDisplayMetrics; Loading @@ -77,10 +79,12 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder { * only applicable if virtual displays are used * only applicable if virtual displays are used */ */ public VirtualDisplayTaskEmbedder(Context context, VirtualDisplayTaskEmbedder.Host host, public VirtualDisplayTaskEmbedder(Context context, VirtualDisplayTaskEmbedder.Host host, boolean singleTaskInstance, boolean usePublicVirtualDisplay) { boolean singleTaskInstance, boolean usePublicVirtualDisplay, boolean useTrustedDisplay) { super(context, host); super(context, host); mSingleTaskInstance = singleTaskInstance; mSingleTaskInstance = singleTaskInstance; mUsePublicVirtualDisplay = usePublicVirtualDisplay; mUsePublicVirtualDisplay = usePublicVirtualDisplay; mUseTrustedDisplay = useTrustedDisplay; } } /** /** Loading @@ -103,6 +107,9 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder { if (mUsePublicVirtualDisplay) { if (mUsePublicVirtualDisplay) { virtualDisplayFlags |= VIRTUAL_DISPLAY_FLAG_PUBLIC; virtualDisplayFlags |= VIRTUAL_DISPLAY_FLAG_PUBLIC; } } if (mUseTrustedDisplay) { virtualDisplayFlags |= VIRTUAL_DISPLAY_FLAG_TRUSTED; } mVirtualDisplay = displayManager.createVirtualDisplay( mVirtualDisplay = displayManager.createVirtualDisplay( DISPLAY_NAME + "@" + System.identityHashCode(this), mHost.getWidth(), DISPLAY_NAME + "@" + System.identityHashCode(this), mHost.getWidth(), Loading
core/tests/coretests/AndroidManifest.xml +1 −0 Original line number Original line Diff line number Diff line Loading @@ -129,6 +129,7 @@ <!-- virtual display test permissions --> <!-- virtual display test permissions --> <uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT" /> <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.CAPTURE_SECURE_VIDEO_OUTPUT" /> <uses-permission android:name="android.permission.ADD_TRUSTED_DISPLAY" /> <!-- color extraction test permissions --> <!-- color extraction test permissions --> <uses-permission android:name="android.permission.READ_FRAME_BUFFER" /> <uses-permission android:name="android.permission.READ_FRAME_BUFFER" /> Loading
core/tests/coretests/src/android/hardware/display/VirtualDisplayTest.java +19 −0 Original line number Original line Diff line number Diff line Loading @@ -247,6 +247,25 @@ public class VirtualDisplayTest extends AndroidTestCase { assertDisplayUnregistered(display); 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) { private void assertDisplayRegistered(Display display, int flags) { assertNotNull("display object must not be null", display); assertNotNull("display object must not be null", display); assertTrue("display must be valid", display.isValid()); assertTrue("display must be valid", display.isValid()); Loading
packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -301,7 +301,7 @@ public class BubbleExpandedView extends LinearLayout { mActivityView = new ActivityView(mContext, null /* attrs */, 0 /* defStyle */, mActivityView = new ActivityView(mContext, null /* attrs */, 0 /* defStyle */, true /* singleTaskInstance */, false /* usePublicVirtualDisplay*/, 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. // Set ActivityView's alpha value as zero, since there is no view content to be shown. setContentVisibility(false); setContentVisibility(false); Loading