Remove VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP as a default flag.
This will update the default behaviour of DisplayGroup assignment for Virtual Devices and assign them to the device display group by default. Bug: 205343547 Test: atest CreateVirtualDisplayTest Change-Id: I128010d4399eebbbbd3b36b5cb4f10a8372bb6a7
This commit is contained in:
@@ -71,7 +71,6 @@ import java.util.function.IntConsumer;
|
||||
@SystemService(Context.VIRTUAL_DEVICE_SERVICE)
|
||||
public final class VirtualDeviceManager {
|
||||
|
||||
private static final boolean DEBUG = false;
|
||||
private static final String TAG = "VirtualDeviceManager";
|
||||
|
||||
private static final int DEFAULT_VIRTUAL_DISPLAY_FLAGS =
|
||||
@@ -80,7 +79,6 @@ public final class VirtualDeviceManager {
|
||||
| DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
|
||||
| DisplayManager.VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL
|
||||
| DisplayManager.VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH
|
||||
| DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP
|
||||
| DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_FOCUS;
|
||||
|
||||
/**
|
||||
|
||||
@@ -419,6 +419,15 @@ public final class DisplayManager {
|
||||
@TestApi
|
||||
public static final int VIRTUAL_DISPLAY_FLAG_OWN_FOCUS = 1 << 14;
|
||||
|
||||
/**
|
||||
* Virtual display flags: Indicates that the display should not be a part of the default
|
||||
* DisplayGroup and instead be part of a DisplayGroup associated with its virtual device.
|
||||
*
|
||||
* @see #createVirtualDisplay
|
||||
* @hide
|
||||
*/
|
||||
public static final int VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP = 1 << 15;
|
||||
|
||||
|
||||
/** @hide */
|
||||
@IntDef(prefix = {"MATCH_CONTENT_FRAMERATE_"}, value = {
|
||||
|
||||
@@ -145,7 +145,7 @@ final class DisplayDeviceInfo {
|
||||
/**
|
||||
* Flag: Indicates that the display should always be unlocked. Only valid on virtual displays
|
||||
* that aren't in the default display group.
|
||||
* @see #FLAG_OWN_DISPLAY_GROUP
|
||||
* @see #FLAG_OWN_DISPLAY_GROUP and #FLAG_DEVICE_DISPLAY_GROUP
|
||||
* @hide
|
||||
*/
|
||||
public static final int FLAG_ALWAYS_UNLOCKED = 1 << 15;
|
||||
@@ -171,6 +171,14 @@ final class DisplayDeviceInfo {
|
||||
*/
|
||||
public static final int FLAG_OWN_FOCUS = 1 << 17;
|
||||
|
||||
/**
|
||||
* Flag: indicates that the display should not be a part of the default {@link DisplayGroup} and
|
||||
* instead be part of a {@link DisplayGroup} associated with the Virtual Device.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public static final int FLAG_DEVICE_DISPLAY_GROUP = 1 << 18;
|
||||
|
||||
/**
|
||||
* Touch attachment: Display does not receive touch.
|
||||
*/
|
||||
|
||||
@@ -25,6 +25,7 @@ import static android.hardware.display.DisplayManager.EventsMask;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;
|
||||
@@ -1275,6 +1276,9 @@ public final class DisplayManagerService extends SystemService {
|
||||
if ((flags & VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR) != 0) {
|
||||
flags &= ~VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP;
|
||||
}
|
||||
if ((flags & VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP) == 0 && virtualDevice != null) {
|
||||
flags |= VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP;
|
||||
}
|
||||
|
||||
if (projection != null) {
|
||||
try {
|
||||
@@ -1402,7 +1406,7 @@ public final class DisplayManagerService extends SystemService {
|
||||
// If the display is to be added to a device display group, we need to make the
|
||||
// LogicalDisplayMapper aware of the link between the new display and its associated virtual
|
||||
// device before triggering DISPLAY_DEVICE_EVENT_ADDED.
|
||||
if (virtualDevice != null && (flags & VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP) == 0) {
|
||||
if ((flags & VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP) != 0) {
|
||||
try {
|
||||
final int virtualDeviceId = virtualDevice.getDeviceId();
|
||||
mLogicalDisplayMapper.associateDisplayDeviceWithVirtualDevice(
|
||||
|
||||
@@ -20,6 +20,7 @@ import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_ALWAY
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_FOCUS;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION;
|
||||
@@ -32,6 +33,7 @@ import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_TOUCH
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUSTED;
|
||||
|
||||
import static com.android.server.display.DisplayDeviceInfo.FLAG_ALWAYS_UNLOCKED;
|
||||
import static com.android.server.display.DisplayDeviceInfo.FLAG_DEVICE_DISPLAY_GROUP;
|
||||
import static com.android.server.display.DisplayDeviceInfo.FLAG_OWN_DISPLAY_GROUP;
|
||||
import static com.android.server.display.DisplayDeviceInfo.FLAG_TOUCH_FEEDBACK_DISABLED;
|
||||
import static com.android.server.display.DisplayDeviceInfo.FLAG_TRUSTED;
|
||||
@@ -466,6 +468,9 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
|
||||
mInfo.flags |= FLAG_OWN_DISPLAY_GROUP;
|
||||
}
|
||||
}
|
||||
if ((mFlags & VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP) != 0) {
|
||||
mInfo.flags |= FLAG_DEVICE_DISPLAY_GROUP;
|
||||
}
|
||||
|
||||
if ((mFlags & VIRTUAL_DISPLAY_FLAG_SECURE) != 0) {
|
||||
mInfo.flags |= DisplayDeviceInfo.FLAG_SECURE;
|
||||
@@ -498,11 +503,15 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
|
||||
mInfo.flags |= FLAG_TRUSTED;
|
||||
}
|
||||
if ((mFlags & VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED) != 0) {
|
||||
if ((mFlags & VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP) != 0) {
|
||||
if ((mInfo.flags & DisplayDeviceInfo.FLAG_OWN_DISPLAY_GROUP) != 0
|
||||
|| (mFlags & VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP) != 0) {
|
||||
mInfo.flags |= FLAG_ALWAYS_UNLOCKED;
|
||||
} else {
|
||||
Slog.w(TAG, "Ignoring VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED as it "
|
||||
+ "requires VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP.");
|
||||
Slog.w(
|
||||
TAG,
|
||||
"Ignoring VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED as it requires"
|
||||
+ " VIRTUAL_DISPLAY_FLAG_DEVICE_DISPLAY_GROUP or"
|
||||
+ " VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP.");
|
||||
}
|
||||
}
|
||||
if ((mFlags & VIRTUAL_DISPLAY_FLAG_TOUCH_FEEDBACK_DISABLED) != 0) {
|
||||
|
||||
@@ -16,7 +16,9 @@
|
||||
|
||||
package com.android.server.display;
|
||||
|
||||
import static android.Manifest.permission.ADD_ALWAYS_UNLOCKED_DISPLAY;
|
||||
import static android.Manifest.permission.ADD_TRUSTED_DISPLAY;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY;
|
||||
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP;
|
||||
|
||||
@@ -723,9 +725,6 @@ public class DisplayManagerServiceTest {
|
||||
registerDefaultDisplays(displayManager);
|
||||
when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
|
||||
|
||||
when(mContext.checkCallingPermission(ADD_TRUSTED_DISPLAY))
|
||||
.thenReturn(PackageManager.PERMISSION_DENIED);
|
||||
|
||||
IVirtualDevice virtualDevice = mock(IVirtualDevice.class);
|
||||
when(mMockVirtualDeviceManagerInternal.isValidVirtualDevice(virtualDevice))
|
||||
.thenReturn(true);
|
||||
@@ -779,9 +778,6 @@ public class DisplayManagerServiceTest {
|
||||
registerDefaultDisplays(displayManager);
|
||||
when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
|
||||
|
||||
when(mContext.checkCallingPermission(ADD_TRUSTED_DISPLAY))
|
||||
.thenReturn(PackageManager.PERMISSION_DENIED);
|
||||
|
||||
IVirtualDevice virtualDevice = mock(IVirtualDevice.class);
|
||||
when(mMockVirtualDeviceManagerInternal.isValidVirtualDevice(virtualDevice))
|
||||
.thenReturn(true);
|
||||
@@ -791,7 +787,7 @@ public class DisplayManagerServiceTest {
|
||||
// virtual device.
|
||||
final VirtualDisplayConfig.Builder builder1 =
|
||||
new VirtualDisplayConfig.Builder(VIRTUAL_DISPLAY_NAME, 600, 800, 320)
|
||||
.setUniqueId("uniqueId --- device display group 1");
|
||||
.setUniqueId("uniqueId --- device display group");
|
||||
|
||||
int displayId1 =
|
||||
localService.createVirtualDisplay(
|
||||
@@ -807,7 +803,7 @@ public class DisplayManagerServiceTest {
|
||||
final VirtualDisplayConfig.Builder builder2 =
|
||||
new VirtualDisplayConfig.Builder(VIRTUAL_DISPLAY_NAME, 600, 800, 320)
|
||||
.setFlags(VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP)
|
||||
.setUniqueId("uniqueId --- device display group 1");
|
||||
.setUniqueId("uniqueId --- own display group");
|
||||
|
||||
int displayId2 =
|
||||
localService.createVirtualDisplay(
|
||||
@@ -825,6 +821,99 @@ public class DisplayManagerServiceTest {
|
||||
displayGroupId2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void displaysInDeviceOrOwnDisplayGroupShouldPreserveAlwaysUnlockedFlag()
|
||||
throws Exception {
|
||||
DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
|
||||
DisplayManagerInternal localService = displayManager.new LocalService();
|
||||
|
||||
registerDefaultDisplays(displayManager);
|
||||
when(mMockAppToken.asBinder()).thenReturn(mMockAppToken);
|
||||
|
||||
IVirtualDevice virtualDevice = mock(IVirtualDevice.class);
|
||||
when(mMockVirtualDeviceManagerInternal.isValidVirtualDevice(virtualDevice))
|
||||
.thenReturn(true);
|
||||
when(virtualDevice.getDeviceId()).thenReturn(1);
|
||||
|
||||
// Allow an ALWAYS_UNLOCKED display to be created.
|
||||
when(mContext.checkCallingPermission(ADD_TRUSTED_DISPLAY))
|
||||
.thenReturn(PackageManager.PERMISSION_GRANTED);
|
||||
|
||||
when(mContext.checkCallingPermission(ADD_ALWAYS_UNLOCKED_DISPLAY))
|
||||
.thenReturn(PackageManager.PERMISSION_GRANTED);
|
||||
|
||||
// Create a virtual display in a device display group.
|
||||
final VirtualDisplayConfig deviceDisplayGroupDisplayConfig =
|
||||
new VirtualDisplayConfig.Builder(VIRTUAL_DISPLAY_NAME, 600, 800, 320)
|
||||
.setUniqueId("uniqueId --- device display group 1")
|
||||
.setFlags(VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED)
|
||||
.build();
|
||||
|
||||
int deviceDisplayGroupDisplayId =
|
||||
localService.createVirtualDisplay(
|
||||
deviceDisplayGroupDisplayConfig,
|
||||
mMockAppToken /* callback */,
|
||||
virtualDevice /* virtualDeviceToken */,
|
||||
mock(DisplayWindowPolicyController.class),
|
||||
PACKAGE_NAME);
|
||||
|
||||
// Check that FLAG_ALWAYS_UNLOCKED is set.
|
||||
assertNotEquals(
|
||||
"FLAG_ALWAYS_UNLOCKED should be set for displays created in a device display"
|
||||
+ " group.",
|
||||
(displayManager.getDisplayDeviceInfoInternal(deviceDisplayGroupDisplayId).flags
|
||||
& DisplayDeviceInfo.FLAG_ALWAYS_UNLOCKED),
|
||||
0);
|
||||
|
||||
// Create a virtual display in its own display group.
|
||||
final VirtualDisplayConfig ownDisplayGroupConfig =
|
||||
new VirtualDisplayConfig.Builder(VIRTUAL_DISPLAY_NAME, 600, 800, 320)
|
||||
.setUniqueId("uniqueId --- own display group 1")
|
||||
.setFlags(
|
||||
VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED
|
||||
| VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP)
|
||||
.build();
|
||||
|
||||
int ownDisplayGroupDisplayId =
|
||||
localService.createVirtualDisplay(
|
||||
ownDisplayGroupConfig,
|
||||
mMockAppToken /* callback */,
|
||||
virtualDevice /* virtualDeviceToken */,
|
||||
mock(DisplayWindowPolicyController.class),
|
||||
PACKAGE_NAME);
|
||||
|
||||
// Check that FLAG_ALWAYS_UNLOCKED is set.
|
||||
assertNotEquals(
|
||||
"FLAG_ALWAYS_UNLOCKED should be set for displays created in their own display"
|
||||
+ " group.",
|
||||
(displayManager.getDisplayDeviceInfoInternal(ownDisplayGroupDisplayId).flags
|
||||
& DisplayDeviceInfo.FLAG_ALWAYS_UNLOCKED),
|
||||
0);
|
||||
|
||||
// Create a virtual display in a device display group.
|
||||
final VirtualDisplayConfig defaultDisplayGroupConfig =
|
||||
new VirtualDisplayConfig.Builder(VIRTUAL_DISPLAY_NAME, 600, 800, 320)
|
||||
.setUniqueId("uniqueId --- default display group 1")
|
||||
.setFlags(VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED)
|
||||
.build();
|
||||
|
||||
int defaultDisplayGroupDisplayId =
|
||||
localService.createVirtualDisplay(
|
||||
defaultDisplayGroupConfig,
|
||||
mMockAppToken /* callback */,
|
||||
null /* virtualDeviceToken */,
|
||||
mock(DisplayWindowPolicyController.class),
|
||||
PACKAGE_NAME);
|
||||
|
||||
// Check that FLAG_ALWAYS_UNLOCKED is not set.
|
||||
assertEquals(
|
||||
"FLAG_ALWAYS_UNLOCKED should not be set for displays created in the default"
|
||||
+ " display group.",
|
||||
(displayManager.getDisplayDeviceInfoInternal(defaultDisplayGroupDisplayId).flags
|
||||
& DisplayDeviceInfo.FLAG_ALWAYS_UNLOCKED),
|
||||
0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetDisplayIdToMirror() throws Exception {
|
||||
DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
|
||||
|
||||
Reference in New Issue
Block a user