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:
Phill Hayers
2022-10-20 15:04:56 +00:00
parent b4de8520bf
commit 23586beee0
6 changed files with 132 additions and 15 deletions

View File

@@ -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;
/**

View File

@@ -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 = {

View File

@@ -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.
*/

View File

@@ -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(

View File

@@ -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) {

View File

@@ -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);