summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/companion/virtual/IVirtualDeviceManager.aidl14
-rw-r--r--core/java/android/companion/virtual/VirtualDeviceManager.java35
-rw-r--r--core/java/android/hardware/display/DisplayManager.java14
-rw-r--r--core/java/android/hardware/display/DisplayManagerGlobal.java26
-rw-r--r--core/java/android/hardware/display/DisplayManagerInternal.java9
-rw-r--r--core/java/android/hardware/display/IDisplayManager.aidl5
6 files changed, 68 insertions, 35 deletions
diff --git a/core/java/android/companion/virtual/IVirtualDeviceManager.aidl b/core/java/android/companion/virtual/IVirtualDeviceManager.aidl
index a1640ee6d2e8..5418f7e93dd9 100644
--- a/core/java/android/companion/virtual/IVirtualDeviceManager.aidl
+++ b/core/java/android/companion/virtual/IVirtualDeviceManager.aidl
@@ -19,6 +19,8 @@ package android.companion.virtual;
import android.companion.virtual.IVirtualDevice;
import android.companion.virtual.IVirtualDeviceActivityListener;
import android.companion.virtual.VirtualDeviceParams;
+import android.hardware.display.IVirtualDisplayCallback;
+import android.hardware.display.VirtualDisplayConfig;
/**
* Interface for communication between VirtualDeviceManager and VirtualDeviceManagerService.
@@ -42,4 +44,16 @@ interface IVirtualDeviceManager {
IVirtualDevice createVirtualDevice(
in IBinder token, String packageName, int associationId,
in VirtualDeviceParams params, in IVirtualDeviceActivityListener activityListener);
+
+ /**
+ * Creates a virtual display owned by a particular virtual device.
+ *
+ * @param virtualDisplayConfig The configuration used in creating the display
+ * @param callback A callback that receives display lifecycle events
+ * @param virtualDevice The device that will own this display
+ * @param packageName The package name of the calling app
+ */
+ int createVirtualDisplay(in VirtualDisplayConfig virtualDisplayConfig,
+ in IVirtualDisplayCallback callback, in IVirtualDevice virtualDevice,
+ String packageName);
}
diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java
index 3bb837317ad4..1b93bb851567 100644
--- a/core/java/android/companion/virtual/VirtualDeviceManager.java
+++ b/core/java/android/companion/virtual/VirtualDeviceManager.java
@@ -33,6 +33,8 @@ import android.content.Context;
import android.graphics.Point;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.VirtualDisplayFlag;
+import android.hardware.display.DisplayManagerGlobal;
+import android.hardware.display.IVirtualDisplayCallback;
import android.hardware.display.VirtualDisplay;
import android.hardware.display.VirtualDisplayConfig;
import android.hardware.input.VirtualKeyboard;
@@ -65,7 +67,7 @@ import java.util.function.IntConsumer;
public final class VirtualDeviceManager {
private static final boolean DEBUG = false;
- private static final String LOG_TAG = "VirtualDeviceManager";
+ private static final String TAG = "VirtualDeviceManager";
private static final int DEFAULT_VIRTUAL_DISPLAY_FLAGS =
DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC
@@ -150,6 +152,7 @@ public final class VirtualDeviceManager {
public static class VirtualDevice implements AutoCloseable {
private final Context mContext;
+ private final IVirtualDeviceManager mService;
private final IVirtualDevice mVirtualDevice;
private final ArrayMap<ActivityListener, ActivityListenerDelegate> mActivityListeners =
new ArrayMap<>();
@@ -189,6 +192,7 @@ public final class VirtualDeviceManager {
Context context,
int associationId,
VirtualDeviceParams params) throws RemoteException {
+ mService = service;
mContext = context.getApplicationContext();
mVirtualDevice = service.createVirtualDevice(
new Binder(),
@@ -274,18 +278,23 @@ public final class VirtualDeviceManager {
// TODO(b/205343547): Handle display groups properly instead of creating a new display
// group for every new virtual display created using this API.
// belongs to the same display group.
- DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
- // DisplayManager will call into VirtualDeviceManagerInternal to register the
- // created displays.
- return displayManager.createVirtualDisplay(
- mVirtualDevice,
- new VirtualDisplayConfig.Builder(
- getVirtualDisplayName(), width, height, densityDpi)
- .setSurface(surface)
- .setFlags(getVirtualDisplayFlags(flags))
- .build(),
- callback,
- executor);
+ VirtualDisplayConfig config = new VirtualDisplayConfig.Builder(
+ getVirtualDisplayName(), width, height, densityDpi)
+ .setSurface(surface)
+ .setFlags(getVirtualDisplayFlags(flags))
+ .build();
+ IVirtualDisplayCallback callbackWrapper =
+ new DisplayManagerGlobal.VirtualDisplayCallback(callback, executor);
+ final int displayId;
+ try {
+ displayId = mService.createVirtualDisplay(config, callbackWrapper, mVirtualDevice,
+ mContext.getPackageName());
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ DisplayManagerGlobal displayManager = DisplayManagerGlobal.getInstance();
+ return displayManager.createVirtualDisplayWrapper(config, mContext, callbackWrapper,
+ displayId);
}
/**
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index eadcac91dcd7..b505395a091a 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -31,7 +31,6 @@ import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
import android.app.KeyguardManager;
-import android.companion.virtual.IVirtualDevice;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.res.Resources;
@@ -971,17 +970,8 @@ public final class DisplayManager {
executor = new HandlerExecutor(
Handler.createAsync(handler != null ? handler.getLooper() : Looper.myLooper()));
}
- return mGlobal.createVirtualDisplay(mContext, projection, null /* virtualDevice */,
- virtualDisplayConfig, callback, executor, windowContext);
- }
-
- /** @hide */
- public VirtualDisplay createVirtualDisplay(@Nullable IVirtualDevice virtualDevice,
- @NonNull VirtualDisplayConfig virtualDisplayConfig,
- @Nullable VirtualDisplay.Callback callback,
- @Nullable Executor executor) {
- return mGlobal.createVirtualDisplay(mContext, null /* projection */, virtualDevice,
- virtualDisplayConfig, callback, executor, null);
+ return mGlobal.createVirtualDisplay(mContext, projection, virtualDisplayConfig, callback,
+ executor, windowContext);
}
/**
diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java
index a62bbf623000..74356ddecc76 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -24,7 +24,6 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.PropertyInvalidatedCache;
-import android.companion.virtual.IVirtualDevice;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.pm.ParceledListSlice;
@@ -586,18 +585,28 @@ public final class DisplayManagerGlobal {
}
public VirtualDisplay createVirtualDisplay(@NonNull Context context, MediaProjection projection,
- IVirtualDevice virtualDevice, @NonNull VirtualDisplayConfig virtualDisplayConfig,
- VirtualDisplay.Callback callback, @Nullable Executor executor,
- @Nullable Context windowContext) {
+ @NonNull VirtualDisplayConfig virtualDisplayConfig, VirtualDisplay.Callback callback,
+ @Nullable Executor executor, @Nullable Context windowContext) {
VirtualDisplayCallback callbackWrapper = new VirtualDisplayCallback(callback, executor);
IMediaProjection projectionToken = projection != null ? projection.getProjection() : null;
int displayId;
try {
displayId = mDm.createVirtualDisplay(virtualDisplayConfig, callbackWrapper,
- projectionToken, virtualDevice, context.getPackageName());
+ projectionToken, context.getPackageName());
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
+ return createVirtualDisplayWrapper(virtualDisplayConfig, windowContext, callbackWrapper,
+ displayId);
+ }
+
+ /**
+ * Create a VirtualDisplay wrapper object for a newly created virtual display ; to be called
+ * once the display has been created in system_server.
+ */
+ @Nullable
+ public VirtualDisplay createVirtualDisplayWrapper(VirtualDisplayConfig virtualDisplayConfig,
+ Context windowContext, IVirtualDisplayCallback callbackWrapper, int displayId) {
if (displayId < 0) {
Log.e(TAG, "Could not create virtual display: " + virtualDisplayConfig.getName());
return null;
@@ -1050,7 +1059,10 @@ public final class DisplayManagerGlobal {
}
}
- private final static class VirtualDisplayCallback extends IVirtualDisplayCallback.Stub {
+ /**
+ * Assists in dispatching VirtualDisplay lifecycle event callbacks on a given Executor.
+ */
+ public static final class VirtualDisplayCallback extends IVirtualDisplayCallback.Stub {
@Nullable private final VirtualDisplay.Callback mCallback;
@Nullable private final Executor mExecutor;
@@ -1062,7 +1074,7 @@ public final class DisplayManagerGlobal {
* @param executor The executor to call the {@code callback} on. Must not be {@code null} if
* the callback is not {@code null}.
*/
- VirtualDisplayCallback(VirtualDisplay.Callback callback, Executor executor) {
+ public VirtualDisplayCallback(VirtualDisplay.Callback callback, Executor executor) {
mCallback = callback;
mExecutor = mCallback != null ? Objects.requireNonNull(executor) : null;
}
diff --git a/core/java/android/hardware/display/DisplayManagerInternal.java b/core/java/android/hardware/display/DisplayManagerInternal.java
index be482c9146c9..1c3bec5b52f4 100644
--- a/core/java/android/hardware/display/DisplayManagerInternal.java
+++ b/core/java/android/hardware/display/DisplayManagerInternal.java
@@ -18,6 +18,7 @@ package android.hardware.display;
import android.annotation.IntDef;
import android.annotation.Nullable;
+import android.companion.virtual.IVirtualDevice;
import android.graphics.Point;
import android.hardware.SensorManager;
import android.os.Handler;
@@ -60,6 +61,14 @@ public abstract class DisplayManagerInternal {
Handler handler, SensorManager sensorManager);
/**
+ * Called by the VirtualDeviceManagerService to create a VirtualDisplay owned by a
+ * VirtualDevice.
+ */
+ public abstract int createVirtualDisplay(VirtualDisplayConfig config,
+ IVirtualDisplayCallback callback, IVirtualDevice virtualDevice,
+ DisplayWindowPolicyController dwpc, String packageName);
+
+ /**
* Called by the power manager to request a new power state.
* <p>
* The display power controller makes a copy of the provided object and then
diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl
index ddd18f4502e7..ca3e58094400 100644
--- a/core/java/android/hardware/display/IDisplayManager.aidl
+++ b/core/java/android/hardware/display/IDisplayManager.aidl
@@ -16,7 +16,6 @@
package android.hardware.display;
-import android.companion.virtual.IVirtualDevice;
import android.content.pm.ParceledListSlice;
import android.graphics.Point;
import android.hardware.display.BrightnessConfiguration;
@@ -88,10 +87,10 @@ interface IDisplayManager {
void requestColorMode(int displayId, int colorMode);
// Requires CAPTURE_VIDEO_OUTPUT, CAPTURE_SECURE_VIDEO_OUTPUT, or an appropriate
- // MediaProjection token or VirtualDevice for certain combinations of flags.
+ // MediaProjection token for certain combinations of flags.
int createVirtualDisplay(in VirtualDisplayConfig virtualDisplayConfig,
in IVirtualDisplayCallback callback, in IMediaProjection projectionToken,
- in IVirtualDevice virtualDevice, String packageName);
+ String packageName);
// No permissions required, but must be same Uid as the creator.
void resizeVirtualDisplay(in IVirtualDisplayCallback token,