diff --git a/api/test-current.txt b/api/test-current.txt index 781cc3f16b276..b516d18071553 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -151,6 +151,7 @@ package android.app { 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 ab7925c53689f..1098fa1753361 100644 --- a/core/java/android/app/ActivityView.java +++ b/core/java/android/app/ActivityView.java @@ -90,11 +90,23 @@ public class ActivityView extends ViewGroup implements android.window.TaskEmbedd 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 70164692032fb..1c0598b1d2164 100644 --- a/core/java/android/window/VirtualDisplayTaskEmbedder.java +++ b/core/java/android/window/VirtualDisplayTaskEmbedder.java @@ -64,6 +64,7 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder { // 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 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder { * 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 class VirtualDisplayTaskEmbedder extends TaskEmbedder { 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");