summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/current.txt28
-rw-r--r--core/api/system-current.txt4
-rw-r--r--core/java/android/companion/virtual/VirtualDeviceManager.java64
-rw-r--r--core/java/android/hardware/display/DisplayManager.java80
-rw-r--r--core/java/android/hardware/display/VirtualDisplayConfig.java645
-rw-r--r--services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java10
6 files changed, 296 insertions, 535 deletions
diff --git a/core/api/current.txt b/core/api/current.txt
index 8a6bb7b7a08b..0725ef951f1c 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -19527,9 +19527,9 @@ package android.hardware.display {
public final class DisplayManager {
method public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, @IntRange(from=1) int, @IntRange(from=1) int, @IntRange(from=1) int, @Nullable android.view.Surface, int);
- method @Nullable public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, @IntRange(from=1) int, @IntRange(from=1) int, @IntRange(from=1) int, float, @Nullable android.view.Surface, int);
method public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, @IntRange(from=1) int, @IntRange(from=1) int, @IntRange(from=1) int, @Nullable android.view.Surface, int, @Nullable android.hardware.display.VirtualDisplay.Callback, @Nullable android.os.Handler);
- method @Nullable public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, @IntRange(from=1) int, @IntRange(from=1) int, @IntRange(from=1) int, float, @Nullable android.view.Surface, int, @Nullable android.os.Handler, @Nullable android.hardware.display.VirtualDisplay.Callback);
+ method @Nullable public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull android.hardware.display.VirtualDisplayConfig);
+ method @Nullable public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull android.hardware.display.VirtualDisplayConfig, @Nullable android.os.Handler, @Nullable android.hardware.display.VirtualDisplay.Callback);
method public android.view.Display getDisplay(int);
method public android.view.Display[] getDisplays();
method public android.view.Display[] getDisplays(String);
@@ -19584,6 +19584,30 @@ package android.hardware.display {
method public void onStopped();
}
+ public final class VirtualDisplayConfig implements android.os.Parcelable {
+ method public int describeContents();
+ method public int getDensityDpi();
+ method @NonNull public java.util.List<java.lang.String> getDisplayCategories();
+ method public int getFlags();
+ method public int getHeight();
+ method @NonNull public String getName();
+ method public float getRequestedRefreshRate();
+ method @Nullable public android.view.Surface getSurface();
+ method public int getWidth();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.VirtualDisplayConfig> CREATOR;
+ }
+
+ public static final class VirtualDisplayConfig.Builder {
+ ctor public VirtualDisplayConfig.Builder(@NonNull String, @IntRange(from=1) int, @IntRange(from=1) int, @IntRange(from=1) int);
+ method @NonNull public android.hardware.display.VirtualDisplayConfig.Builder addDisplayCategory(@NonNull String);
+ method @NonNull public android.hardware.display.VirtualDisplayConfig build();
+ method @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setDisplayCategories(@NonNull java.util.List<java.lang.String>);
+ method @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setFlags(int);
+ method @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setRequestedRefreshRate(@FloatRange(from=0.0f) float);
+ method @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setSurface(@Nullable android.view.Surface);
+ }
+
}
package android.hardware.fingerprint {
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 71bbd562294b..bdd1b8f6137f 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -3217,8 +3217,8 @@ package android.companion.virtual {
method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void close();
method @NonNull public android.content.Context createContext();
method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.companion.virtual.audio.VirtualAudioDevice createVirtualAudioDevice(@NonNull android.hardware.display.VirtualDisplay, @Nullable java.util.concurrent.Executor, @Nullable android.companion.virtual.audio.VirtualAudioDevice.AudioConfigurationChangeCallback);
- method @Nullable public android.hardware.display.VirtualDisplay createVirtualDisplay(@IntRange(from=1) int, @IntRange(from=1) int, @IntRange(from=1) int, @Nullable android.view.Surface, int, @Nullable java.util.concurrent.Executor, @Nullable android.hardware.display.VirtualDisplay.Callback);
- method @Nullable public android.hardware.display.VirtualDisplay createVirtualDisplay(@IntRange(from=1) int, @IntRange(from=1) int, @IntRange(from=1) int, @NonNull java.util.List<java.lang.String>, @Nullable android.view.Surface, int, @Nullable java.util.concurrent.Executor, @Nullable android.hardware.display.VirtualDisplay.Callback);
+ method @Deprecated @Nullable public android.hardware.display.VirtualDisplay createVirtualDisplay(@IntRange(from=1) int, @IntRange(from=1) int, @IntRange(from=1) int, @Nullable android.view.Surface, int, @Nullable java.util.concurrent.Executor, @Nullable android.hardware.display.VirtualDisplay.Callback);
+ method @Nullable public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull android.hardware.display.VirtualDisplayConfig, @Nullable java.util.concurrent.Executor, @Nullable android.hardware.display.VirtualDisplay.Callback);
method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualDpad createVirtualDpad(@NonNull android.hardware.input.VirtualDpadConfig);
method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualKeyboard createVirtualKeyboard(@NonNull android.hardware.input.VirtualKeyboardConfig);
method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualKeyboard createVirtualKeyboard(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int);
diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java
index 4d2c7cb3d1aa..6cc4c8a24c48 100644
--- a/core/java/android/companion/virtual/VirtualDeviceManager.java
+++ b/core/java/android/companion/virtual/VirtualDeviceManager.java
@@ -89,14 +89,6 @@ public final class VirtualDeviceManager {
private static final String TAG = "VirtualDeviceManager";
- private static final int DEFAULT_VIRTUAL_DISPLAY_FLAGS =
- DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC
- | DisplayManager.VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT
- | 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_FOCUS;
-
/**
* Broadcast Action: A Virtual Device was removed.
*
@@ -539,7 +531,11 @@ public final class VirtualDeviceManager {
* not create the virtual display.
*
* @see DisplayManager#createVirtualDisplay
+ *
+ * @deprecated use {@link #createVirtualDisplay(VirtualDisplayConfig, Executor,
+ * VirtualDisplay.Callback)}
*/
+ @Deprecated
@Nullable
public VirtualDisplay createVirtualDisplay(
@IntRange(from = 1) int width,
@@ -552,30 +548,16 @@ public final class VirtualDeviceManager {
VirtualDisplayConfig config = new VirtualDisplayConfig.Builder(
getVirtualDisplayName(), width, height, densityDpi)
.setSurface(surface)
- .setFlags(getVirtualDisplayFlags(flags))
+ .setFlags(flags)
.build();
- return createVirtualDisplayInternal(config, executor, callback);
+ return createVirtualDisplay(config, executor, callback);
}
/**
* Creates a virtual display for this virtual device. All displays created on the same
* device belongs to the same display group.
*
- * @param width The width of the virtual display in pixels, must be greater than 0.
- * @param height The height of the virtual display in pixels, must be greater than 0.
- * @param densityDpi The density of the virtual display in dpi, must be greater than 0.
- * @param displayCategories The categories of the virtual display, indicating the type of
- * activities allowed to run on the display. Activities can declare their type using
- * {@link android.content.pm.ActivityInfo#requiredDisplayCategory}.
- * @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 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 config The configuration of the display.
* @param executor The executor on which {@code callback} will be invoked. This is ignored
* if {@code callback} is {@code null}. If {@code callback} is specified, this executor must
* not be null.
@@ -587,28 +569,6 @@ public final class VirtualDeviceManager {
*/
@Nullable
public VirtualDisplay createVirtualDisplay(
- @IntRange(from = 1) int width,
- @IntRange(from = 1) int height,
- @IntRange(from = 1) int densityDpi,
- @NonNull List<String> displayCategories,
- @Nullable Surface surface,
- @VirtualDisplayFlag int flags,
- @Nullable @CallbackExecutor Executor executor,
- @Nullable VirtualDisplay.Callback callback) {
- VirtualDisplayConfig config = new VirtualDisplayConfig.Builder(
- getVirtualDisplayName(), width, height, densityDpi)
- .setDisplayCategories(displayCategories)
- .setSurface(surface)
- .setFlags(getVirtualDisplayFlags(flags))
- .build();
- return createVirtualDisplayInternal(config, executor, callback);
- }
-
- /**
- * @hide
- */
- @Nullable
- private VirtualDisplay createVirtualDisplayInternal(
@NonNull VirtualDisplayConfig config,
@Nullable @CallbackExecutor Executor executor,
@Nullable VirtualDisplay.Callback callback) {
@@ -897,16 +857,6 @@ public final class VirtualDeviceManager {
}
}
- /**
- * Returns the display flags that should be added to a particular virtual display.
- * Additional device-level flags from {@link
- * com.android.server.companion.virtual.VirtualDeviceImpl#getBaseVirtualDisplayFlags()} will
- * be added by DisplayManagerService.
- */
- private int getVirtualDisplayFlags(int flags) {
- return DEFAULT_VIRTUAL_DISPLAY_FLAGS | flags;
- }
-
private String getVirtualDisplayName() {
try {
// Currently this just use the device ID, which means all of the virtual displays
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index b766cd19cdb0..50dd7a0bc1be 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -989,24 +989,6 @@ public final class DisplayManager {
/**
* Creates a virtual display.
- *
- * @see #createVirtualDisplay(String, int, int, int, float, Surface, int,
- * Handler, VirtualDisplay.Callback)
- */
- @Nullable
- public VirtualDisplay createVirtualDisplay(@NonNull String name,
- @IntRange(from = 1) int width,
- @IntRange(from = 1) int height,
- @IntRange(from = 1) int densityDpi,
- float requestedRefreshRate,
- @Nullable Surface surface,
- @VirtualDisplayFlag int flags) {
- return createVirtualDisplay(name, width, height, densityDpi, requestedRefreshRate,
- surface, flags, null, null);
- }
-
- /**
- * Creates a virtual display.
* <p>
* The content of a virtual display is rendered to a {@link Surface} provided
* by the application.
@@ -1056,8 +1038,23 @@ public final class DisplayManager {
@VirtualDisplayFlag int flags,
@Nullable VirtualDisplay.Callback callback,
@Nullable Handler handler) {
- return createVirtualDisplay(name, width, height, densityDpi, 0.0f, surface,
- flags, handler, callback);
+ final VirtualDisplayConfig.Builder builder =
+ new VirtualDisplayConfig.Builder(name, width, height, densityDpi);
+ builder.setFlags(flags);
+ if (surface != null) {
+ builder.setSurface(surface);
+ }
+ return createVirtualDisplay(builder.build(), handler, callback);
+ }
+
+ /**
+ * Creates a virtual display.
+ *
+ * @see #createVirtualDisplay(VirtualDisplayConfig, Handler, VirtualDisplay.Callback)
+ */
+ @Nullable
+ public VirtualDisplay createVirtualDisplay(@NonNull VirtualDisplayConfig config) {
+ return createVirtualDisplay(config, /*handler=*/null, /*callback=*/null);
}
/**
@@ -1084,21 +1081,7 @@ public final class DisplayManager {
* turning off the screen.
* </p>
*
- * @param name The name of the virtual display, must be non-empty.
- * @param width The width of the virtual display in pixels, must be greater than 0.
- * @param height The height of the virtual display in pixels, must be greater than 0.
- * @param densityDpi The density of the virtual display in dpi, must be greater than 0.
- * @param requestedRefreshRate The requested refresh rate in frames per second.
- * For best results, specify a divisor of the physical refresh rate, e.g., 30 or 60 on
- * 120hz display. If an arbitrary refresh rate is specified, the rate will be rounded
- * up or down to a divisor of the physical display. If 0 is specified, the virtual
- * display is refreshed at the physical display refresh rate.
- * @param surface The surface to which the content of the virtual display should
- * be rendered, or null if there is none initially.
- * @param flags A combination of virtual display flags:
- * {@link #VIRTUAL_DISPLAY_FLAG_PUBLIC}, {@link #VIRTUAL_DISPLAY_FLAG_PRESENTATION},
- * {@link #VIRTUAL_DISPLAY_FLAG_SECURE}, {@link #VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY},
- * or {@link #VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR}.
+ * @param config The configuration of the virtual display, must be non-null.
* @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.
* @param callback Callback to call when the state of the {@link VirtualDisplay} changes
@@ -1106,33 +1089,14 @@ public final class DisplayManager {
* not create the virtual display.
*
* @throws SecurityException if the caller does not have permission to create
- * a virtual display with the specified flags.
+ * a virtual display with flags specified in the configuration.
*/
@Nullable
- public VirtualDisplay createVirtualDisplay(@NonNull String name,
- @IntRange(from = 1) int width,
- @IntRange(from = 1) int height,
- @IntRange(from = 1) int densityDpi,
- float requestedRefreshRate,
- @Nullable Surface surface,
- @VirtualDisplayFlag int flags,
+ public VirtualDisplay createVirtualDisplay(
+ @NonNull VirtualDisplayConfig config,
@Nullable Handler handler,
@Nullable VirtualDisplay.Callback callback) {
- if (!ENABLE_VIRTUAL_DISPLAY_REFRESH_RATE && requestedRefreshRate != 0.0f) {
- Slog.e(TAG, "Please turn on ENABLE_VIRTUAL_DISPLAY_REFRESH_RATE to use the new api");
- return null;
- }
-
- final VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder(name, width,
- height, densityDpi);
- builder.setFlags(flags);
- if (surface != null) {
- builder.setSurface(surface);
- }
- if (requestedRefreshRate != 0.0f) {
- builder.setRequestedRefreshRate(requestedRefreshRate);
- }
- return createVirtualDisplay(null /* projection */, builder.build(), callback, handler,
+ return createVirtualDisplay(null /* projection */, config, callback, handler,
null /* windowContext */);
}
diff --git a/core/java/android/hardware/display/VirtualDisplayConfig.java b/core/java/android/hardware/display/VirtualDisplayConfig.java
index f6a2e33c7164..6b56a067a198 100644
--- a/core/java/android/hardware/display/VirtualDisplayConfig.java
+++ b/core/java/android/hardware/display/VirtualDisplayConfig.java
@@ -18,121 +18,44 @@ package android.hardware.display;
import static android.view.Display.DEFAULT_DISPLAY;
+import android.annotation.FloatRange;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.hardware.display.DisplayManager.VirtualDisplayFlag;
import android.media.projection.MediaProjection;
+import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
+import android.view.Display;
import android.view.Surface;
-import com.android.internal.util.DataClass;
-
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
+import java.util.Objects;
/**
- * Holds configuration used to create {@link VirtualDisplay} instances. See
- * {@link MediaProjection#createVirtualDisplay} and
- * {@link android.companion.virtual.VirtualDeviceManager.VirtualDevice#createVirtualDisplay}.
+ * Holds configuration used to create {@link VirtualDisplay} instances.
*
- * @hide
+ * @see DisplayManager#createVirtualDisplay(VirtualDisplayConfig, Handler, VirtualDisplay.Callback)
+ * @see MediaProjection#createVirtualDisplay
*/
-@DataClass(genParcelable = true, genAidl = true, genBuilder = true)
public final class VirtualDisplayConfig implements Parcelable {
- /**
- * The name of the virtual display, must be non-empty.
- */
- @NonNull
- private String mName;
-
- /**
- * The width of the virtual display in pixels. Must be greater than 0.
- */
- @IntRange(from = 1)
- private int mWidth;
-
- /**
- * The height of the virtual display in pixels. Must be greater than 0.
- */
- @IntRange(from = 1)
- private int mHeight;
-
- /**
- * The density of the virtual display in dpi. Must be greater than 0.
- */
- @IntRange(from = 1)
- private int mDensityDpi;
-
- /**
- * A combination of virtual display flags.
- * {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_PUBLIC},
- * {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_PRESENTATION},
- * {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_SECURE},
- * {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY},
- * or {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR}.
- */
- @VirtualDisplayFlag
- private int mFlags = 0;
-
- /**
- * The surface to which the content of the virtual display should be rendered, or null if
- * there is none initially.
- */
- @Nullable
- private Surface mSurface = null;
-
- /**
- * The unique identifier for the display. Shouldn't be displayed to the user.
- * @hide
- */
- @Nullable
- private String mUniqueId = null;
-
- /**
- * The id of the display that the virtual display should mirror, or
- * {@link android.view.Display#DEFAULT_DISPLAY} if there is none initially.
- */
- private int mDisplayIdToMirror = DEFAULT_DISPLAY;
-
- /**
- * Indicates if WindowManager is responsible for mirroring content to this VirtualDisplay, or
- * if DisplayManager should record contents instead.
- */
- private boolean mWindowManagerMirroring = false;
-
- /**
- * The display categories. If set, only corresponding activities from the same category can be
- * shown on the display.
- */
- @DataClass.PluralOf("displayCategory")
- @NonNull private List<String> mDisplayCategories = new ArrayList<>();
-
- /**
- * The refresh rate of a virtual display in frames per second.
- * If this value is non-zero, this is the requested refresh rate to set.
- * If this value is zero, the system chooses a default refresh rate.
- */
- private float mRequestedRefreshRate = 0.0f;
-
-
- // Code below generated by codegen v1.0.23.
- //
- // DO NOT MODIFY!
- // CHECKSTYLE:OFF Generated code
- //
- // To regenerate run:
- // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/hardware/display/VirtualDisplayConfig.java
- //
- // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
- // Settings > Editor > Code Style > Formatter Control
- //@formatter:off
-
-
- @DataClass.Generated.Member
- /* package-private */ VirtualDisplayConfig(
+ private final String mName;
+ private final int mWidth;
+ private final int mHeight;
+ private final int mDensityDpi;
+ private final int mFlags;
+ private final Surface mSurface;
+ private final String mUniqueId;
+ private final int mDisplayIdToMirror;
+ private final boolean mWindowManagerMirroring;
+ private ArrayList<String> mDisplayCategories = null;
+ private final float mRequestedRefreshRate;
+
+ private VirtualDisplayConfig(
@NonNull String name,
@IntRange(from = 1) int width,
@IntRange(from = 1) int height,
@@ -142,219 +65,200 @@ public final class VirtualDisplayConfig implements Parcelable {
@Nullable String uniqueId,
int displayIdToMirror,
boolean windowManagerMirroring,
- @NonNull List<String> displayCategories,
+ @NonNull ArrayList<String> displayCategories,
float requestedRefreshRate) {
- this.mName = name;
- com.android.internal.util.AnnotationValidations.validate(
- NonNull.class, null, mName);
- this.mWidth = width;
- com.android.internal.util.AnnotationValidations.validate(
- IntRange.class, null, mWidth,
- "from", 1);
- this.mHeight = height;
- com.android.internal.util.AnnotationValidations.validate(
- IntRange.class, null, mHeight,
- "from", 1);
- this.mDensityDpi = densityDpi;
- com.android.internal.util.AnnotationValidations.validate(
- IntRange.class, null, mDensityDpi,
- "from", 1);
- this.mFlags = flags;
- com.android.internal.util.AnnotationValidations.validate(
- VirtualDisplayFlag.class, null, mFlags);
- this.mSurface = surface;
- this.mUniqueId = uniqueId;
- this.mDisplayIdToMirror = displayIdToMirror;
- this.mWindowManagerMirroring = windowManagerMirroring;
- this.mDisplayCategories = displayCategories;
- com.android.internal.util.AnnotationValidations.validate(
- NonNull.class, null, mDisplayCategories);
- this.mRequestedRefreshRate = requestedRefreshRate;
-
- // onConstructed(); // You can define this method to get a callback
+ mName = name;
+ mWidth = width;
+ mHeight = height;
+ mDensityDpi = densityDpi;
+ mFlags = flags;
+ mSurface = surface;
+ mUniqueId = uniqueId;
+ mDisplayIdToMirror = displayIdToMirror;
+ mWindowManagerMirroring = windowManagerMirroring;
+ mDisplayCategories = displayCategories;
+ mRequestedRefreshRate = requestedRefreshRate;
}
/**
- * The name of the virtual display, must be non-empty.
+ * Returns the name of the virtual display.
*/
- @DataClass.Generated.Member
- public @NonNull String getName() {
+ @NonNull
+ public String getName() {
return mName;
}
/**
- * The width of the virtual display in pixels. Must be greater than 0.
+ * Returns the width of the virtual display in pixels.
*/
- @DataClass.Generated.Member
- public @IntRange(from = 1) int getWidth() {
+ public int getWidth() {
return mWidth;
}
/**
- * The height of the virtual display in pixels. Must be greater than 0.
+ * Returns the height of the virtual display in pixels.
*/
- @DataClass.Generated.Member
- public @IntRange(from = 1) int getHeight() {
+ public int getHeight() {
return mHeight;
}
/**
- * The density of the virtual display in dpi. Must be greater than 0.
+ * Returns the density of the virtual display in dpi.
*/
- @DataClass.Generated.Member
- public @IntRange(from = 1) int getDensityDpi() {
+ public int getDensityDpi() {
return mDensityDpi;
}
/**
- * A combination of virtual display flags.
- * {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_PUBLIC},
- * {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_PRESENTATION},
- * {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_SECURE},
- * {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY},
- * or {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR}.
+ * Returns the virtual display flags.
+ *
+ * @see Builder#setFlags
*/
- @DataClass.Generated.Member
- public @VirtualDisplayFlag int getFlags() {
+ public int getFlags() {
return mFlags;
}
/**
- * The surface to which the content of the virtual display should be rendered, or null if
- * there is none initially.
+ * Returns the surface to which the content of the virtual display should be rendered, if any.
+ *
+ * @see Builder#setSurface
*/
- @DataClass.Generated.Member
- public @Nullable Surface getSurface() {
+ @Nullable
+ public Surface getSurface() {
return mSurface;
}
/**
- * The unique identifier for the display. Shouldn't be displayed to the user.
- *
+ * Returns the unique identifier for the display. Shouldn't be displayed to the user.
* @hide
*/
- @DataClass.Generated.Member
- public @Nullable String getUniqueId() {
+ @Nullable
+ public String getUniqueId() {
return mUniqueId;
}
/**
- * The id of the display that the virtual display should mirror, or
- * {@link android.view.Display#DEFAULT_DISPLAY} if there is none initially.
+ * Returns the id of the display that the virtual display should mirror, or
+ * {@link android.view.Display#DEFAULT_DISPLAY} if there is none.
+ * @hide
*/
- @DataClass.Generated.Member
public int getDisplayIdToMirror() {
return mDisplayIdToMirror;
}
/**
- * Indicates if WindowManager is responsible for mirroring content to this VirtualDisplay, or
+ * Whether if WindowManager is responsible for mirroring content to this VirtualDisplay, or
* if DisplayManager should record contents instead.
+ * @hide
*/
- @DataClass.Generated.Member
public boolean isWindowManagerMirroring() {
return mWindowManagerMirroring;
}
/**
- * The display categories. If set, only corresponding activities from the same category can be
- * shown on the display.
+ * Returns the display categories.
+ *
+ * @see Builder#setDisplayCategories
*/
- @DataClass.Generated.Member
- public @NonNull List<String> getDisplayCategories() {
- return mDisplayCategories;
+ @NonNull
+ public List<String> getDisplayCategories() {
+ return Collections.unmodifiableList(mDisplayCategories);
}
/**
- * The refresh rate of a virtual display in frames per second.
- * If this value is none zero, this is the requested refresh rate to set.
- * If this value is zero, the system chooses a default refresh rate.
+ * Returns the refresh rate of a virtual display in frames per second, or zero if it is using a
+ * default refresh rate chosen by the system.
+ *
+ * @see Builder#setRequestedRefreshRate
*/
- @DataClass.Generated.Member
public float getRequestedRefreshRate() {
return mRequestedRefreshRate;
}
@Override
- @DataClass.Generated.Member
public void writeToParcel(@NonNull Parcel dest, int flags) {
- // You can override field parcelling by defining methods like:
- // void parcelFieldName(Parcel dest, int flags) { ... }
-
- int flg = 0;
- if (mWindowManagerMirroring) flg |= 0x100;
- if (mSurface != null) flg |= 0x20;
- if (mUniqueId != null) flg |= 0x40;
- dest.writeInt(flg);
- dest.writeString(mName);
+ dest.writeString8(mName);
dest.writeInt(mWidth);
dest.writeInt(mHeight);
dest.writeInt(mDensityDpi);
dest.writeInt(mFlags);
- if (mSurface != null) dest.writeTypedObject(mSurface, flags);
- if (mUniqueId != null) dest.writeString(mUniqueId);
+ dest.writeTypedObject(mSurface, flags);
+ dest.writeString8(mUniqueId);
dest.writeInt(mDisplayIdToMirror);
+ dest.writeBoolean(mWindowManagerMirroring);
dest.writeStringList(mDisplayCategories);
dest.writeFloat(mRequestedRefreshRate);
}
@Override
- @DataClass.Generated.Member
public int describeContents() { return 0; }
- /** @hide */
- @SuppressWarnings({"unchecked", "RedundantCast"})
- @DataClass.Generated.Member
- /* package-private */ VirtualDisplayConfig(@NonNull Parcel in) {
- // You can override field unparcelling by defining methods like:
- // static FieldType unparcelFieldName(Parcel in) { ... }
-
- int flg = in.readInt();
- boolean windowManagerMirroring = (flg & 0x100) != 0;
- String name = in.readString();
- int width = in.readInt();
- int height = in.readInt();
- int densityDpi = in.readInt();
- int flags = in.readInt();
- Surface surface = (flg & 0x20) == 0 ? null : (Surface) in.readTypedObject(Surface.CREATOR);
- String uniqueId = (flg & 0x40) == 0 ? null : in.readString();
- int displayIdToMirror = in.readInt();
- List<String> displayCategories = new ArrayList<>();
- in.readStringList(displayCategories);
- float requestedRefreshRate = in.readFloat();
-
- this.mName = name;
- com.android.internal.util.AnnotationValidations.validate(
- NonNull.class, null, mName);
- this.mWidth = width;
- com.android.internal.util.AnnotationValidations.validate(
- IntRange.class, null, mWidth,
- "from", 1);
- this.mHeight = height;
- com.android.internal.util.AnnotationValidations.validate(
- IntRange.class, null, mHeight,
- "from", 1);
- this.mDensityDpi = densityDpi;
- com.android.internal.util.AnnotationValidations.validate(
- IntRange.class, null, mDensityDpi,
- "from", 1);
- this.mFlags = flags;
- com.android.internal.util.AnnotationValidations.validate(
- VirtualDisplayFlag.class, null, mFlags);
- this.mSurface = surface;
- this.mUniqueId = uniqueId;
- this.mDisplayIdToMirror = displayIdToMirror;
- this.mWindowManagerMirroring = windowManagerMirroring;
- this.mDisplayCategories = displayCategories;
- com.android.internal.util.AnnotationValidations.validate(
- NonNull.class, null, mDisplayCategories);
- this.mRequestedRefreshRate = requestedRefreshRate;
-
- // onConstructed(); // You can define this method to get a callback
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof VirtualDisplayConfig)) {
+ return false;
+ }
+ VirtualDisplayConfig that = (VirtualDisplayConfig) o;
+ return Objects.equals(mName, that.mName)
+ && mWidth == that.mWidth
+ && mHeight == that.mHeight
+ && mDensityDpi == that.mDensityDpi
+ && mFlags == that.mFlags
+ && Objects.equals(mSurface, that.mSurface)
+ && Objects.equals(mUniqueId, that.mUniqueId)
+ && mDisplayIdToMirror == that.mDisplayIdToMirror
+ && mWindowManagerMirroring == that.mWindowManagerMirroring
+ && Objects.equals(mDisplayCategories, that.mDisplayCategories)
+ && mRequestedRefreshRate == that.mRequestedRefreshRate;
+ }
+
+ @Override
+ public int hashCode() {
+ int hashCode = Objects.hash(
+ mName, mWidth, mHeight, mDensityDpi, mFlags, mSurface, mUniqueId,
+ mDisplayIdToMirror, mWindowManagerMirroring, mDisplayCategories,
+ mRequestedRefreshRate);
+ return hashCode;
+ }
+
+ @Override
+ @NonNull
+ public String toString() {
+ return "VirtualDisplayConfig("
+ + " mName=" + mName
+ + " mHeight=" + mHeight
+ + " mWidth=" + mWidth
+ + " mDensityDpi=" + mDensityDpi
+ + " mFlags=" + mFlags
+ + " mSurface=" + mSurface
+ + " mUniqueId=" + mUniqueId
+ + " mDisplayIdToMirror=" + mDisplayIdToMirror
+ + " mWindowManagerMirroring=" + mWindowManagerMirroring
+ + " mDisplayCategories=" + mDisplayCategories
+ + " mRequestedRefreshRate=" + mRequestedRefreshRate
+ + ")";
+ }
+
+ private VirtualDisplayConfig(@NonNull Parcel in) {
+ mName = in.readString8();
+ mWidth = in.readInt();
+ mHeight = in.readInt();
+ mDensityDpi = in.readInt();
+ mFlags = in.readInt();
+ mSurface = in.readTypedObject(Surface.CREATOR);
+ mUniqueId = in.readString8();
+ mDisplayIdToMirror = in.readInt();
+ mWindowManagerMirroring = in.readBoolean();
+ mDisplayCategories = new ArrayList<>();
+ in.readStringList(mDisplayCategories);
+ mRequestedRefreshRate = in.readFloat();
}
- @DataClass.Generated.Member
- public static final @NonNull Parcelable.Creator<VirtualDisplayConfig> CREATOR
+ @NonNull
+ public static final Parcelable.Creator<VirtualDisplayConfig> CREATOR
= new Parcelable.Creator<VirtualDisplayConfig>() {
@Override
public VirtualDisplayConfig[] newArray(int size) {
@@ -368,229 +272,161 @@ public final class VirtualDisplayConfig implements Parcelable {
};
/**
- * A builder for {@link VirtualDisplayConfig}
+ * A builder for {@link VirtualDisplayConfig}.
*/
- @SuppressWarnings("WeakerAccess")
- @DataClass.Generated.Member
public static final class Builder {
-
- private @NonNull String mName;
- private @IntRange(from = 1) int mWidth;
- private @IntRange(from = 1) int mHeight;
- private @IntRange(from = 1) int mDensityDpi;
- private @VirtualDisplayFlag int mFlags;
- private @Nullable Surface mSurface;
- private @Nullable String mUniqueId;
- private int mDisplayIdToMirror;
- private boolean mWindowManagerMirroring;
- private @NonNull List<String> mDisplayCategories;
- private float mRequestedRefreshRate;
-
- private long mBuilderFieldsSet = 0L;
+ private final String mName;
+ private final int mWidth;
+ private final int mHeight;
+ private final int mDensityDpi;
+ private int mFlags = 0;
+ private Surface mSurface = null;
+ private String mUniqueId = null;
+ private int mDisplayIdToMirror = DEFAULT_DISPLAY;
+ private boolean mWindowManagerMirroring = false;
+ private ArrayList<String> mDisplayCategories = new ArrayList<>();
+ private float mRequestedRefreshRate = 0.0f;
/**
* Creates a new Builder.
*
- * @param name
- * The name of the virtual display, must be non-empty.
- * @param width
- * The width of the virtual display in pixels. Must be greater than 0.
- * @param height
- * The height of the virtual display in pixels. Must be greater than 0.
- * @param densityDpi
- * The density of the virtual display in dpi. Must be greater than 0.
+ * @param name The name of the virtual display, must be non-empty.
+ * @param width The width of the virtual display in pixels. Must be greater than 0.
+ * @param height The height of the virtual display in pixels. Must be greater than 0.
+ * @param densityDpi The density of the virtual display in dpi. Must be greater than 0.
*/
public Builder(
@NonNull String name,
@IntRange(from = 1) int width,
@IntRange(from = 1) int height,
@IntRange(from = 1) int densityDpi) {
+ if (name == null) {
+ throw new IllegalArgumentException("Virtual display name is required");
+ }
+ if (width <= 0) {
+ throw new IllegalArgumentException("Virtual display width must be positive");
+ }
+ if (height <= 0) {
+ throw new IllegalArgumentException("Virtual display height must be positive");
+ }
+ if (densityDpi <= 0) {
+ throw new IllegalArgumentException("Virtual display density must be positive");
+ }
mName = name;
- com.android.internal.util.AnnotationValidations.validate(
- NonNull.class, null, mName);
mWidth = width;
- com.android.internal.util.AnnotationValidations.validate(
- IntRange.class, null, mWidth,
- "from", 1);
mHeight = height;
- com.android.internal.util.AnnotationValidations.validate(
- IntRange.class, null, mHeight,
- "from", 1);
mDensityDpi = densityDpi;
- com.android.internal.util.AnnotationValidations.validate(
- IntRange.class, null, mDensityDpi,
- "from", 1);
- }
-
- /**
- * The name of the virtual display, must be non-empty.
- */
- @DataClass.Generated.Member
- public @NonNull Builder setName(@NonNull String value) {
- checkNotUsed();
- mBuilderFieldsSet |= 0x1;
- mName = value;
- return this;
- }
-
- /**
- * The width of the virtual display in pixels. Must be greater than 0.
- */
- @DataClass.Generated.Member
- public @NonNull Builder setWidth(@IntRange(from = 1) int value) {
- checkNotUsed();
- mBuilderFieldsSet |= 0x2;
- mWidth = value;
- return this;
- }
-
- /**
- * The height of the virtual display in pixels. Must be greater than 0.
- */
- @DataClass.Generated.Member
- public @NonNull Builder setHeight(@IntRange(from = 1) int value) {
- checkNotUsed();
- mBuilderFieldsSet |= 0x4;
- mHeight = value;
- return this;
- }
-
- /**
- * The density of the virtual display in dpi. Must be greater than 0.
- */
- @DataClass.Generated.Member
- public @NonNull Builder setDensityDpi(@IntRange(from = 1) int value) {
- checkNotUsed();
- mBuilderFieldsSet |= 0x8;
- mDensityDpi = value;
- return this;
}
/**
- * A combination of virtual display flags.
+ * Sets the virtual display flags, a combination of
* {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_PUBLIC},
* {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_PRESENTATION},
* {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_SECURE},
* {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY},
* or {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR}.
*/
- @DataClass.Generated.Member
- public @NonNull Builder setFlags(@VirtualDisplayFlag int value) {
- checkNotUsed();
- mBuilderFieldsSet |= 0x10;
- mFlags = value;
+ @NonNull
+ public Builder setFlags(@VirtualDisplayFlag int flags) {
+ mFlags = flags;
return this;
}
/**
- * The surface to which the content of the virtual display should be rendered, or null if
- * there is none initially.
+ * Sets the surface to which the content of the virtual display should be rendered.
+ *
+ * <p>The surface can also be set after the display creation using
+ * {@link VirtualDisplay#setSurface(Surface)}.
*/
- @DataClass.Generated.Member
- public @NonNull Builder setSurface(@NonNull Surface value) {
- checkNotUsed();
- mBuilderFieldsSet |= 0x20;
- mSurface = value;
+ @NonNull
+ public Builder setSurface(@Nullable Surface surface) {
+ mSurface = surface;
return this;
}
/**
- * The unique identifier for the display. Shouldn't be displayed to the user.
- *
+ * Sets the unique identifier for the display.
* @hide
*/
- @DataClass.Generated.Member
- public @NonNull Builder setUniqueId(@NonNull String value) {
- checkNotUsed();
- mBuilderFieldsSet |= 0x40;
- mUniqueId = value;
+ @NonNull
+ public Builder setUniqueId(@Nullable String uniqueId) {
+ mUniqueId = uniqueId;
return this;
}
/**
- * The id of the display that the virtual display should mirror, or
- * {@link android.view.Display#DEFAULT_DISPLAY} if there is none initially.
+ * Sets the id of the display that the virtual display should mirror.
+ * @hide
*/
- @DataClass.Generated.Member
- public @NonNull Builder setDisplayIdToMirror(int value) {
- checkNotUsed();
- mBuilderFieldsSet |= 0x80;
- mDisplayIdToMirror = value;
+ @NonNull
+ public Builder setDisplayIdToMirror(int displayIdToMirror) {
+ mDisplayIdToMirror = displayIdToMirror;
return this;
}
/**
- * Indicates if WindowManager is responsible for mirroring content to this VirtualDisplay, or
- * if DisplayManager should record contents instead.
+ * Sets whether WindowManager is responsible for mirroring content to this VirtualDisplay.
+ * If unset or false, DisplayManager should record contents instead.
+ * @hide
*/
- @DataClass.Generated.Member
- public @NonNull Builder setWindowManagerMirroring(boolean value) {
- checkNotUsed();
- mBuilderFieldsSet |= 0x100;
- mWindowManagerMirroring = value;
+ @NonNull
+ public Builder setWindowManagerMirroring(boolean windowManagerMirroring) {
+ mWindowManagerMirroring = windowManagerMirroring;
return this;
}
/**
- * The display categories. If set, only corresponding activities from the same category can be
- * shown on the display.
+ * Sets the display categories.
+ *
+ * <p>The categories of the display indicate the type of activities allowed to run on that
+ * display. Activities can declare a display category using
+ * {@link android.content.pm.ActivityInfo#requiredDisplayCategory}.
*/
- @DataClass.Generated.Member
- public @NonNull Builder setDisplayCategories(@NonNull List<String> value) {
- checkNotUsed();
- mBuilderFieldsSet |= 0x200;
- mDisplayCategories = value;
+ @NonNull
+ public Builder setDisplayCategories(@NonNull List<String> displayCategories) {
+ mDisplayCategories.clear();
+ mDisplayCategories.addAll(Objects.requireNonNull(displayCategories));
return this;
}
- /** @see #setDisplayCategories */
- @DataClass.Generated.Member
- public @NonNull Builder addDisplayCategory(@NonNull String value) {
- if (mDisplayCategories == null) setDisplayCategories(new ArrayList<>());
- mDisplayCategories.add(value);
+ /**
+ * Adds a display category.
+ *
+ * @see #setDisplayCategories
+ */
+ @NonNull
+ public Builder addDisplayCategory(@NonNull String displayCategory) {
+ mDisplayCategories.add(Objects.requireNonNull(displayCategory));
return this;
}
/**
- * The refresh rate of a virtual display in frames per second.
- * If this value is none zero, this is the requested refresh rate to set.
- * If this value is zero, the system chooses a default refresh rate.
+ * Sets the refresh rate of a virtual display in frames per second.
+ *
+ * <p>For best results, specify a divisor of the physical refresh rate, e.g., 30 or 60 on
+ * a 120hz display. If an arbitrary refresh rate is specified, the rate will be rounded up
+ * down to a divisor of the physical display. If unset or zero, the virtual display will be
+ * refreshed at the physical display refresh rate.
+ *
+ * @see Display#getRefreshRate()
*/
- @DataClass.Generated.Member
- public @NonNull Builder setRequestedRefreshRate(float value) {
- checkNotUsed();
- mBuilderFieldsSet |= 0x400;
- mRequestedRefreshRate = value;
+ @NonNull
+ public Builder setRequestedRefreshRate(
+ @FloatRange(from = 0.0f) float requestedRefreshRate) {
+ if (requestedRefreshRate < 0.0f) {
+ throw new IllegalArgumentException(
+ "Virtual display requested refresh rate must be non-negative");
+ }
+ mRequestedRefreshRate = requestedRefreshRate;
return this;
}
- /** Builds the instance. This builder should not be touched after calling this! */
- public @NonNull VirtualDisplayConfig build() {
- checkNotUsed();
- mBuilderFieldsSet |= 0x800; // Mark builder used
-
- if ((mBuilderFieldsSet & 0x10) == 0) {
- mFlags = 0;
- }
- if ((mBuilderFieldsSet & 0x20) == 0) {
- mSurface = null;
- }
- if ((mBuilderFieldsSet & 0x40) == 0) {
- mUniqueId = null;
- }
- if ((mBuilderFieldsSet & 0x80) == 0) {
- mDisplayIdToMirror = DEFAULT_DISPLAY;
- }
- if ((mBuilderFieldsSet & 0x100) == 0) {
- mWindowManagerMirroring = false;
- }
- if ((mBuilderFieldsSet & 0x200) == 0) {
- mDisplayCategories = new ArrayList<>();
- }
- if ((mBuilderFieldsSet & 0x400) == 0) {
- mRequestedRefreshRate = 0.0f;
- }
- VirtualDisplayConfig o = new VirtualDisplayConfig(
+ /**
+ * Builds the {@link VirtualDisplayConfig} instance.
+ */
+ @NonNull
+ public VirtualDisplayConfig build() {
+ return new VirtualDisplayConfig(
mName,
mWidth,
mHeight,
@@ -602,27 +438,6 @@ public final class VirtualDisplayConfig implements Parcelable {
mWindowManagerMirroring,
mDisplayCategories,
mRequestedRefreshRate);
- return o;
- }
-
- private void checkNotUsed() {
- if ((mBuilderFieldsSet & 0x800) != 0) {
- throw new IllegalStateException(
- "This Builder should not be reused. Use a new Builder instance instead");
- }
}
}
-
- @DataClass.Generated(
- time = 1671047069703L,
- codegenVersion = "1.0.23",
- sourceFile = "frameworks/base/core/java/android/hardware/display/VirtualDisplayConfig.java",
- inputSignatures = "private @android.annotation.NonNull java.lang.String mName\nprivate @android.annotation.IntRange int mWidth\nprivate @android.annotation.IntRange int mHeight\nprivate @android.annotation.IntRange int mDensityDpi\nprivate @android.hardware.display.DisplayManager.VirtualDisplayFlag int mFlags\nprivate @android.annotation.Nullable android.view.Surface mSurface\nprivate @android.annotation.Nullable java.lang.String mUniqueId\nprivate int mDisplayIdToMirror\nprivate boolean mWindowManagerMirroring\nprivate @com.android.internal.util.DataClass.PluralOf(\"displayCategory\") @android.annotation.NonNull java.util.List<java.lang.String> mDisplayCategories\nprivate float mRequestedRefreshRate\nclass VirtualDisplayConfig extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genParcelable=true, genAidl=true, genBuilder=true)")
- @Deprecated
- private void __metadata() {}
-
-
- //@formatter:on
- // End of generated code
-
}
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
index f650560e6b22..642eaef80c47 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
@@ -105,6 +105,14 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
private static final String TAG = "VirtualDeviceImpl";
+ private static final int DEFAULT_VIRTUAL_DISPLAY_FLAGS =
+ DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC
+ | DisplayManager.VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT
+ | 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_FOCUS;
+
/**
* Timeout until {@link #launchPendingIntent} stops waiting for an activity to be launched.
*/
@@ -281,7 +289,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
* device.
*/
int getBaseVirtualDisplayFlags() {
- int flags = 0;
+ int flags = DEFAULT_VIRTUAL_DISPLAY_FLAGS;
if (mParams.getLockState() == VirtualDeviceParams.LOCK_STATE_ALWAYS_UNLOCKED) {
flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED;
}