Merge "Make ActivityViews backing virtual display private" into rvc-dev
diff --git a/api/test-current.txt b/api/test-current.txt
index 8f3d042..755380e 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -151,6 +151,7 @@
ctor public ActivityView(android.content.Context, android.util.AttributeSet);
ctor public ActivityView(android.content.Context, android.util.AttributeSet, int);
ctor public ActivityView(android.content.Context, android.util.AttributeSet, int, boolean);
+ ctor public ActivityView(@NonNull android.content.Context, @NonNull android.util.AttributeSet, int, boolean, boolean);
method public int getVirtualDisplayId();
method public void onLayout(boolean, int, int, int, int);
method public void onLocationChanged();
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java
index ab7925c..1098fa1 100644
--- a/core/java/android/app/ActivityView.java
+++ b/core/java/android/app/ActivityView.java
@@ -90,11 +90,23 @@
public ActivityView(Context context, AttributeSet attrs, int defStyle,
boolean singleTaskInstance) {
+ this(context, attrs, defStyle, singleTaskInstance, false /* usePublicVirtualDisplay */);
+ }
+
+ /**
+ * This constructor let's the caller explicitly request a public virtual display as the backing
+ * display. Using a public display is not recommended as it exposes it to other applications,
+ * but it might be needed for backwards compatibility.
+ */
+ public ActivityView(
+ @NonNull Context context, @NonNull AttributeSet attrs, int defStyle,
+ boolean singleTaskInstance, boolean usePublicVirtualDisplay) {
super(context, attrs, defStyle);
if (useTaskOrganizer()) {
mTaskEmbedder = new TaskOrganizerTaskEmbedder(context, this);
} else {
- mTaskEmbedder = new VirtualDisplayTaskEmbedder(context, this, singleTaskInstance);
+ mTaskEmbedder = new VirtualDisplayTaskEmbedder(context, this, singleTaskInstance,
+ usePublicVirtualDisplay);
}
mSurfaceView = new SurfaceView(context);
// Since ActivityView#getAlpha has been overridden, we should use parent class's alpha
diff --git a/core/java/android/window/VirtualDisplayTaskEmbedder.java b/core/java/android/window/VirtualDisplayTaskEmbedder.java
index 7016469..1c0598b 100644
--- a/core/java/android/window/VirtualDisplayTaskEmbedder.java
+++ b/core/java/android/window/VirtualDisplayTaskEmbedder.java
@@ -64,6 +64,7 @@
// For Virtual Displays
private int mDisplayDensityDpi;
private final boolean mSingleTaskInstance;
+ private final boolean mUsePublicVirtualDisplay;
private VirtualDisplay mVirtualDisplay;
private Insets mForwardedInsets;
private DisplayMetrics mTmpDisplayMetrics;
@@ -78,9 +79,10 @@
* only applicable if virtual displays are used
*/
public VirtualDisplayTaskEmbedder(Context context, VirtualDisplayTaskEmbedder.Host host,
- boolean singleTaskInstance) {
+ boolean singleTaskInstance, boolean usePublicVirtualDisplay) {
super(context, host);
mSingleTaskInstance = singleTaskInstance;
+ mUsePublicVirtualDisplay = usePublicVirtualDisplay;
}
/**
@@ -97,11 +99,16 @@
public boolean onInitialize() {
final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
mDisplayDensityDpi = getBaseDisplayDensity();
+
+ int virtualDisplayFlags = VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
+ | VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL;
+ if (mUsePublicVirtualDisplay) {
+ virtualDisplayFlags |= VIRTUAL_DISPLAY_FLAG_PUBLIC;
+ }
+
mVirtualDisplay = displayManager.createVirtualDisplay(
DISPLAY_NAME + "@" + System.identityHashCode(this), mHost.getWidth(),
- mHost.getHeight(), mDisplayDensityDpi, null,
- VIRTUAL_DISPLAY_FLAG_PUBLIC | VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
- | VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL);
+ mHost.getHeight(), mDisplayDensityDpi, null, virtualDisplayFlags);
if (mVirtualDisplay == null) {
Log.e(TAG, "Failed to initialize TaskEmbedder");