Merge "Make ActivityViews backing virtual display private" into rvc-dev am: 3bfec32633

Change-Id: Id1a5c917efe65bebc10d8b4540caabc8b01b5864
This commit is contained in:
Linus Tufvesson
2020-04-21 10:22:05 +00:00
committed by Automerger Merge Worker
3 changed files with 25 additions and 5 deletions

View File

@@ -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);
ctor public ActivityView(android.content.Context, android.util.AttributeSet, int); ctor public ActivityView(android.content.Context, android.util.AttributeSet, int);
ctor public ActivityView(android.content.Context, android.util.AttributeSet, int, boolean); 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 int getVirtualDisplayId();
method public void onLayout(boolean, int, int, int, int); method public void onLayout(boolean, int, int, int, int);
method public void onLocationChanged(); method public void onLocationChanged();

View File

@@ -90,11 +90,23 @@ public class ActivityView extends ViewGroup implements android.window.TaskEmbedd
public ActivityView(Context context, AttributeSet attrs, int defStyle, public ActivityView(Context context, AttributeSet attrs, int defStyle,
boolean singleTaskInstance) { 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); 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);
} }
mSurfaceView = new SurfaceView(context); mSurfaceView = new SurfaceView(context);
// 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

@@ -64,6 +64,7 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder {
// For Virtual Displays // For Virtual Displays
private int mDisplayDensityDpi; private int mDisplayDensityDpi;
private final boolean mSingleTaskInstance; private final boolean mSingleTaskInstance;
private final boolean mUsePublicVirtualDisplay;
private VirtualDisplay mVirtualDisplay; private VirtualDisplay mVirtualDisplay;
private Insets mForwardedInsets; private Insets mForwardedInsets;
private DisplayMetrics mTmpDisplayMetrics; private DisplayMetrics mTmpDisplayMetrics;
@@ -78,9 +79,10 @@ 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 singleTaskInstance, boolean usePublicVirtualDisplay) {
super(context, host); super(context, host);
mSingleTaskInstance = singleTaskInstance; mSingleTaskInstance = singleTaskInstance;
mUsePublicVirtualDisplay = usePublicVirtualDisplay;
} }
/** /**
@@ -97,11 +99,16 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder {
public boolean onInitialize() { public boolean onInitialize() {
final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class); final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
mDisplayDensityDpi = getBaseDisplayDensity(); 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( mVirtualDisplay = displayManager.createVirtualDisplay(
DISPLAY_NAME + "@" + System.identityHashCode(this), mHost.getWidth(), DISPLAY_NAME + "@" + System.identityHashCode(this), mHost.getWidth(),
mHost.getHeight(), mDisplayDensityDpi, null, mHost.getHeight(), mDisplayDensityDpi, null, virtualDisplayFlags);
VIRTUAL_DISPLAY_FLAG_PUBLIC | VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
| VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL);
if (mVirtualDisplay == null) { if (mVirtualDisplay == null) {
Log.e(TAG, "Failed to initialize TaskEmbedder"); Log.e(TAG, "Failed to initialize TaskEmbedder");