diff options
Diffstat (limited to 'core/java/android')
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, |
