diff options
4 files changed, 57 insertions, 44 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 88b0086b9fda..f7f196b5a6ab 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -2582,10 +2582,32 @@ package android.companion { package android.companion.virtual { public final class VirtualDeviceManager { + method @Nullable @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.companion.virtual.VirtualDeviceManager.VirtualDevice createVirtualDevice(int, @NonNull android.companion.virtual.VirtualDeviceParams); } public static class VirtualDeviceManager.VirtualDevice implements java.lang.AutoCloseable { method public void close(); + method @Nullable public android.hardware.display.VirtualDisplay createVirtualDisplay(int, int, int, @Nullable android.view.Surface, int, @Nullable android.os.Handler, @Nullable android.hardware.display.VirtualDisplay.Callback); + method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualKeyboard createVirtualKeyboard(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int); + method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualMouse createVirtualMouse(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int); + method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualTouchscreen createVirtualTouchscreen(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int); + } + + public final class VirtualDeviceParams implements android.os.Parcelable { + method public int describeContents(); + method public int getLockState(); + method @NonNull public java.util.Set<android.os.UserHandle> getUsersWithMatchingAccounts(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.companion.virtual.VirtualDeviceParams> CREATOR; + field public static final int LOCK_STATE_ALWAYS_LOCKED = 0; // 0x0 + field public static final int LOCK_STATE_ALWAYS_UNLOCKED = 1; // 0x1 + } + + public static final class VirtualDeviceParams.Builder { + ctor public VirtualDeviceParams.Builder(); + method @NonNull public android.companion.virtual.VirtualDeviceParams build(); + method @NonNull @RequiresPermission(value="android.permission.ADD_ALWAYS_UNLOCKED_DISPLAY", conditional=true) public android.companion.virtual.VirtualDeviceParams.Builder setLockState(int); + method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setUsersWithMatchingAccounts(@NonNull java.util.Set<android.os.UserHandle>); } } @@ -3639,6 +3661,7 @@ package android.hardware.display { method @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration); method @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public void setBrightnessConfigurationForDisplay(@NonNull android.hardware.display.BrightnessConfiguration, @NonNull String); method @Deprecated @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_SATURATION) public void setSaturationLevel(float); + field public static final int VIRTUAL_DISPLAY_FLAG_TRUSTED = 1024; // 0x400 } } diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java index 8ab668873f33..a97b7b3ae81c 100644 --- a/core/java/android/companion/virtual/VirtualDeviceManager.java +++ b/core/java/android/companion/virtual/VirtualDeviceManager.java @@ -16,7 +16,6 @@ package android.companion.virtual; -import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; @@ -43,10 +42,6 @@ import android.os.RemoteException; import android.os.ResultReceiver; import android.view.Surface; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; import java.util.concurrent.Executor; /** @@ -61,23 +56,6 @@ public final class VirtualDeviceManager { private static final boolean DEBUG = false; private static final String LOG_TAG = "VirtualDeviceManager"; - /** @hide */ - @IntDef(prefix = "DISPLAY_FLAG_", - flag = true, - value = {DISPLAY_FLAG_TRUSTED}) - @Retention(RetentionPolicy.SOURCE) - @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) - public @interface DisplayFlags {} - - /** - * Indicates that the display is trusted to show system decorations and receive inputs without - * users' touch. - * - * @see DisplayManager#VIRTUAL_DISPLAY_FLAG_TRUSTED - * @hide // TODO(b/194949534): Unhide this API - */ - public static final int DISPLAY_FLAG_TRUSTED = 1; - private static final int DEFAULT_VIRTUAL_DISPLAY_FLAGS = DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | DisplayManager.VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT @@ -102,12 +80,12 @@ public final class VirtualDeviceManager { * @param associationId The association ID as returned by {@link AssociationInfo#getId()} from * Companion Device Manager. Virtual devices must have a corresponding association with CDM in * order to be created. - * @hide */ @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) @Nullable - public VirtualDevice createVirtualDevice(int associationId, VirtualDeviceParams params) { - // TODO(b/194949534): Unhide this API + public VirtualDevice createVirtualDevice( + int associationId, + @NonNull VirtualDeviceParams params) { try { IVirtualDevice virtualDevice = mService.createVirtualDevice( new Binder(), mContext.getPackageName(), associationId, params); @@ -187,7 +165,12 @@ public final class VirtualDeviceManager { * @param surface The surface to which the content of the virtual display should * be rendered, or null if there is none initially. The surface can also be set later using * {@link VirtualDisplay#setSurface(Surface)}. - * @param flags Either 0, or {@link #DISPLAY_FLAG_TRUSTED}. + * @param flags A combination of virtual display flags accepted by + * {@link DisplayManager#createVirtualDisplay}. In addition, the following flags are + * automatically set for all virtual devices: + * {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_PUBLIC VIRTUAL_DISPLAY_FLAG_PUBLIC} and + * {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY + * VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY}. * @param callback Callback to call when the state of the {@link VirtualDisplay} changes * @param handler The handler on which the listener should be invoked, or null * if the listener should be invoked on the calling thread's looper. @@ -195,9 +178,7 @@ public final class VirtualDeviceManager { * not create the virtual display. * * @see DisplayManager#createVirtualDisplay - * @hide */ - // TODO(b/194949534): Unhide this API // Suppress "ExecutorRegistration" because DisplayManager.createVirtualDisplay takes a // handler @SuppressLint("ExecutorRegistration") @@ -207,7 +188,7 @@ public final class VirtualDeviceManager { int height, int densityDpi, @Nullable Surface surface, - @DisplayFlags int flags, + int flags, @Nullable Handler handler, @Nullable VirtualDisplay.Callback callback) { // TODO(b/205343547): Handle display groups properly instead of creating a new display @@ -246,7 +227,6 @@ public final class VirtualDeviceManager { * @param inputDeviceName the name to call this input device * @param vendorId the vendor id * @param productId the product id - * @hide */ @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) @NonNull @@ -273,7 +253,6 @@ public final class VirtualDeviceManager { * @param inputDeviceName the name to call this input device * @param vendorId the vendor id * @param productId the product id - * @hide */ @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) @NonNull @@ -300,7 +279,6 @@ public final class VirtualDeviceManager { * @param inputDeviceName the name to call this input device * @param vendorId the vendor id * @param productId the product id - * @hide */ @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) @NonNull @@ -328,12 +306,8 @@ public final class VirtualDeviceManager { * com.android.server.companion.virtual.VirtualDeviceImpl#getBaseVirtualDisplayFlags()} will * be added by DisplayManagerService. */ - private int getVirtualDisplayFlags(@DisplayFlags int flags) { - int virtualDisplayFlags = DEFAULT_VIRTUAL_DISPLAY_FLAGS; - if ((flags & DISPLAY_FLAG_TRUSTED) != 0) { - virtualDisplayFlags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUSTED; - } - return virtualDisplayFlags; + private int getVirtualDisplayFlags(int flags) { + return DEFAULT_VIRTUAL_DISPLAY_FLAGS | flags; } private String getVirtualDisplayName() { diff --git a/core/java/android/companion/virtual/VirtualDeviceParams.java b/core/java/android/companion/virtual/VirtualDeviceParams.java index 169f4e1ad281..2ddfeb4c8ab5 100644 --- a/core/java/android/companion/virtual/VirtualDeviceParams.java +++ b/core/java/android/companion/virtual/VirtualDeviceParams.java @@ -22,6 +22,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; +import android.annotation.SystemApi; import android.content.ComponentName; import android.os.Parcel; import android.os.Parcelable; @@ -41,7 +42,7 @@ import java.util.Set; * * @hide */ -// TODO(b/194949534): Unhide this API +@SystemApi public final class VirtualDeviceParams implements Parcelable { /** @hide */ @@ -53,15 +54,11 @@ public final class VirtualDeviceParams implements Parcelable { /** * Indicates that the lock state of the virtual device should be always locked. - * - * @hide // TODO(b/194949534): Unhide this API */ public static final int LOCK_STATE_ALWAYS_LOCKED = 0; /** * Indicates that the lock state of the virtual device should be always unlocked. - * - * @hide // TODO(b/194949534): Unhide this API */ public static final int LOCK_STATE_ALWAYS_UNLOCKED = 1; @@ -112,6 +109,7 @@ public final class VirtualDeviceParams implements Parcelable { * Returns the set of activities allowed to be streamed, or {@code null} if this is not set. * * @see Builder#setAllowedActivities(Set) + * @hide // TODO(b/194949534): Unhide this API */ @Nullable public Set<ComponentName> getAllowedActivities() { @@ -126,6 +124,7 @@ public final class VirtualDeviceParams implements Parcelable { * set. * * @see Builder#setBlockedActivities(Set) + * @hide // TODO(b/194949534): Unhide this API */ @Nullable public Set<ComponentName> getBlockedActivities() { @@ -169,6 +168,7 @@ public final class VirtualDeviceParams implements Parcelable { } @Override + @NonNull public String toString() { return "VirtualDeviceParams(" + " mLockState=" + mLockState @@ -178,6 +178,7 @@ public final class VirtualDeviceParams implements Parcelable { + ")"; } + @NonNull public static final Parcelable.Creator<VirtualDeviceParams> CREATOR = new Parcelable.Creator<VirtualDeviceParams>() { public VirtualDeviceParams createFromParcel(Parcel in) { @@ -216,13 +217,25 @@ public final class VirtualDeviceParams implements Parcelable { /** * Sets the user handles with matching managed accounts on the remote device to which - * this virtual device is streaming. + * this virtual device is streaming. The caller is responsible for verifying the presence + * and legitimacy of a matching managed account on the remote device. + * + * <p>If the app streaming policy is + * {@link android.app.admin.DevicePolicyManager#NEARBY_STREAMING_SAME_MANAGED_ACCOUNT_ONLY + * NEARBY_STREAMING_SAME_MANAGED_ACCOUNT_ONLY}, activities not in + * {@code usersWithMatchingAccounts} will be blocked from starting. + * + * <p> If {@code usersWithMatchingAccounts} is empty (the default), streaming is allowed + * only if there is no device policy, or if the nearby streaming policy is + * {@link android.app.admin.DevicePolicyManager#NEARBY_STREAMING_ENABLED + * NEARBY_STREAMING_ENABLED}. * * @param usersWithMatchingAccounts A set of user handles with matching managed * accounts on the remote device this is streaming to. * * @see android.app.admin.DevicePolicyManager#NEARBY_STREAMING_SAME_MANAGED_ACCOUNT_ONLY */ + @NonNull public Builder setUsersWithMatchingAccounts( @NonNull Set<UserHandle> usersWithMatchingAccounts) { mUsersWithMatchingAccounts = usersWithMatchingAccounts; @@ -242,6 +255,7 @@ public final class VirtualDeviceParams implements Parcelable { * * @param allowedActivities A set of activity {@link ComponentName} allowed to be launched * in the virtual device. + * @hide // TODO(b/194949534): Unhide this API */ public Builder setAllowedActivities(@Nullable Set<ComponentName> allowedActivities) { if (mBlockedActivities != null && allowedActivities != null) { @@ -265,6 +279,7 @@ public final class VirtualDeviceParams implements Parcelable { * * @param blockedActivities A set of {@link ComponentName} to be blocked launching from * virtual device. + * @hide // TODO(b/194949534): Unhide this API */ public Builder setBlockedActivities(@Nullable Set<ComponentName> blockedActivities) { if (mAllowedActivities != null && blockedActivities != null) { diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index 89ac8bf2d7bc..eefa1d3279e3 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -334,6 +334,7 @@ public final class DisplayManager { * @hide */ @TestApi + @SystemApi public static final int VIRTUAL_DISPLAY_FLAG_TRUSTED = 1 << 10; /** |