[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:
@@ -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
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user