From db1f2ec05275a133526b2c3b1e2ed44d0a0e1a9d Mon Sep 17 00:00:00 2001 From: Linus Tufvesson Date: Thu, 9 Apr 2020 17:04:32 +0100 Subject: [PATCH] Make ActivityViews backing virtual display private Bug: 150310377 Test: atest CtsWindowManagerDeviceTestCases:ActivityViewTest Test: Used bubbles test app to verify that it's still happy when using private VDs Change-Id: I02c6840b1f908a5177c217494de0110f5ce78f7e --- api/test-current.txt | 1 + core/java/android/app/ActivityView.java | 14 +++++++++++++- .../window/VirtualDisplayTaskEmbedder.java | 15 +++++++++++---- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/api/test-current.txt b/api/test-current.txt index 0dff41b6a99c4..56660fbd850ca 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -142,6 +142,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");