[RESTRICT AUTOMERGE] Revert "[RESTRICT AUTOMERGE] Revert "Require permission to create trusted displays"" am: c947b10f99

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12816011

Change-Id: I1c1093f14923aa7a5f2d7891912d13acd15fab66
This commit is contained in:
Charles Chen
2020-10-19 20:34:09 +00:00
committed by Automerger Merge Worker
6 changed files with 53 additions and 8 deletions

View File

@@ -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 */
@@ -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

View File

@@ -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;
@@ -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;
@@ -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;
} }
/** /**
@@ -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(),

View File

@@ -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" />

View File

@@ -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());

View File

@@ -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);

View File

@@ -86,6 +86,7 @@ import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.provider.Settings; import android.provider.Settings;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.EventLog;
import android.util.IntArray; import android.util.IntArray;
import android.util.Pair; import android.util.Pair;
import android.util.Slog; import android.util.Slog;
@@ -2191,10 +2192,16 @@ public final class DisplayManagerService extends SystemService {
} }
} }
if (callingUid == Process.SYSTEM_UID if (callingUid != Process.SYSTEM_UID && (flags & VIRTUAL_DISPLAY_FLAG_TRUSTED) != 0) {
|| checkCallingPermission(ADD_TRUSTED_DISPLAY, "createVirtualDisplay()")) { if (!checkCallingPermission(ADD_TRUSTED_DISPLAY, "createVirtualDisplay()")) {
flags |= VIRTUAL_DISPLAY_FLAG_TRUSTED; EventLog.writeEvent(0x534e4554, "162627132", callingUid,
} else { "Attempt to create a trusted display without holding permission!");
throw new SecurityException("Requires ADD_TRUSTED_DISPLAY permission to "
+ "create a trusted virtual display.");
}
}
if ((flags & VIRTUAL_DISPLAY_FLAG_TRUSTED) == 0) {
flags &= ~VIRTUAL_DISPLAY_FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS; flags &= ~VIRTUAL_DISPLAY_FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS;
} }