Loading core/java/android/hardware/display/DisplayManager.java +11 −2 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ 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; Loading Loading @@ -902,8 +903,16 @@ public final class DisplayManager { @NonNull VirtualDisplayConfig virtualDisplayConfig, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler, @Nullable Context windowContext) { return mGlobal.createVirtualDisplay(mContext, projection, virtualDisplayConfig, callback, handler, windowContext); return mGlobal.createVirtualDisplay(mContext, projection, null /* virtualDevice */, virtualDisplayConfig, callback, handler, windowContext); } /** @hide */ public VirtualDisplay createVirtualDisplay(@Nullable IVirtualDevice virtualDevice, @NonNull VirtualDisplayConfig virtualDisplayConfig, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) { return mGlobal.createVirtualDisplay(mContext, null /* projection */, virtualDevice, virtualDisplayConfig, callback, handler, null); } /** Loading core/java/android/hardware/display/DisplayManagerGlobal.java +4 −3 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ 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; Loading Loading @@ -582,14 +583,14 @@ public final class DisplayManagerGlobal { } public VirtualDisplay createVirtualDisplay(@NonNull Context context, MediaProjection projection, @NonNull VirtualDisplayConfig virtualDisplayConfig, VirtualDisplay.Callback callback, Handler handler, @Nullable Context windowContext) { IVirtualDevice virtualDevice, @NonNull VirtualDisplayConfig virtualDisplayConfig, VirtualDisplay.Callback callback, Handler handler, @Nullable Context windowContext) { VirtualDisplayCallback callbackWrapper = new VirtualDisplayCallback(callback, handler); IMediaProjection projectionToken = projection != null ? projection.getProjection() : null; int displayId; try { displayId = mDm.createVirtualDisplay(virtualDisplayConfig, callbackWrapper, projectionToken, context.getPackageName()); projectionToken, virtualDevice, context.getPackageName()); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } Loading core/java/android/hardware/display/DisplayManagerInternal.java +0 −26 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.Nullable; import android.graphics.Point; import android.hardware.SensorManager; import android.media.projection.IMediaProjection; import android.os.Handler; import android.os.IBinder; import android.os.PowerManager; Loading Loading @@ -380,31 +379,6 @@ public abstract class DisplayManagerInternal { */ public abstract void onEarlyInteractivityChange(boolean interactive); /** * A special API for creates a virtual display with a DisplayPolicyController in system_server. * <p> * If this method is called without original calling uid, the caller must enforce the * corresponding permissions according to the flags. * {@link android.Manifest.permission#CAPTURE_VIDEO_OUTPUT} * {@link android.Manifest.permission#CAPTURE_SECURE_VIDEO_OUTPUT} * {@link android.Manifest.permission#ADD_TRUSTED_DISPLAY} * {@link android.Manifest.permission#INTERNAL_SYSTEM_WINDOW} * </p> * * @param virtualDisplayConfig The arguments for the virtual display configuration. See * {@link VirtualDisplayConfig} for using it. * @param callback Callback to call when the virtual display's state changes, or null if none. * @param projection MediaProjection token. * @param packageName The package name of the app. * @param controller The DisplayWindowPolicyControl that can control what contents are * allowed to be displayed. * @return The newly created virtual display id , or {@link Display#INVALID_DISPLAY} if the * virtual display cannot be created. */ public abstract int createVirtualDisplay(VirtualDisplayConfig virtualDisplayConfig, IVirtualDisplayCallback callback, IMediaProjection projection, String packageName, DisplayWindowPolicyController controller); /** * Get {@link DisplayWindowPolicyController} associated to the {@link DisplayInfo#displayId} * Loading core/java/android/hardware/display/IDisplayManager.aidl +3 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.hardware.display; import android.companion.virtual.IVirtualDevice; import android.content.pm.ParceledListSlice; import android.graphics.Point; import android.hardware.display.BrightnessConfiguration; Loading Loading @@ -86,10 +87,10 @@ interface IDisplayManager { void requestColorMode(int displayId, int colorMode); // Requires CAPTURE_VIDEO_OUTPUT, CAPTURE_SECURE_VIDEO_OUTPUT, or an appropriate // MediaProjection token for certain combinations of flags. // MediaProjection token or VirtualDevice for certain combinations of flags. int createVirtualDisplay(in VirtualDisplayConfig virtualDisplayConfig, in IVirtualDisplayCallback callback, in IMediaProjection projectionToken, String packageName); in IVirtualDevice virtualDevice, String packageName); // No permissions required, but must be same Uid as the creator. void resizeVirtualDisplay(in IVirtualDisplayCallback token, Loading services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java +52 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.os.RemoteException; import android.util.ExceptionUtils; import android.util.Slog; import android.util.SparseArray; import android.window.DisplayWindowPolicyController; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.DumpUtils; Loading @@ -38,11 +39,11 @@ import com.android.server.SystemService; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; /** @hide */ @SuppressLint("LongLogTag") public class VirtualDeviceManagerService extends SystemService { Loading Loading @@ -84,6 +85,15 @@ public class VirtualDeviceManagerService extends SystemService { publishLocalService(VirtualDeviceManagerInternal.class, new LocalService()); } @GuardedBy("mVirtualDeviceManagerLock") private boolean isValidVirtualDeviceLocked(IVirtualDevice virtualDevice) { try { return mVirtualDevices.contains(virtualDevice.getAssociationId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } @Override public void onUserStarting(@NonNull TargetUser user) { super.onUserStarting(user); Loading Loading @@ -121,6 +131,7 @@ public class VirtualDeviceManagerService extends SystemService { private final AssociationInfo mAssociationInfo; private final int mOwnerUid; private final ArrayList<Integer> mDisplayIds = new ArrayList<>(); private VirtualDeviceImpl(int ownerUid, IBinder token, AssociationInfo associationInfo) { mOwnerUid = ownerUid; Loading Loading @@ -149,6 +160,24 @@ public class VirtualDeviceManagerService extends SystemService { public void binderDied() { close(); } DisplayWindowPolicyController onVirtualDisplayCreatedLocked(int displayId) { if (mDisplayIds.contains(displayId)) { throw new IllegalStateException( "Virtual device already have a virtual display with ID " + displayId); } mDisplayIds.add(displayId); // TODO(b/201712607): Return the corresponding DisplayWindowPolicyController. return null; } void onVirtualDisplayRemovedLocked(int displayId) { if (!mDisplayIds.contains(displayId)) { throw new IllegalStateException( "Virtual device doesn't have a virtual display with ID " + displayId); } mDisplayIds.remove(displayId); } } class VirtualDeviceManagerImpl extends IVirtualDeviceManager.Stub { Loading Loading @@ -229,6 +258,28 @@ public class VirtualDeviceManagerService extends SystemService { private final class LocalService extends VirtualDeviceManagerInternal { @Override public boolean isValidVirtualDevice(IVirtualDevice virtualDevice) { synchronized (mVirtualDeviceManagerLock) { return isValidVirtualDeviceLocked(virtualDevice); } } @Override public DisplayWindowPolicyController onVirtualDisplayCreated(IVirtualDevice virtualDevice, int displayId) { synchronized (mVirtualDeviceManagerLock) { return ((VirtualDeviceImpl) virtualDevice).onVirtualDisplayCreatedLocked(displayId); } } @Override public void onVirtualDisplayRemoved(IVirtualDevice virtualDevice, int displayId) { synchronized (mVirtualDeviceManagerLock) { ((VirtualDeviceImpl) virtualDevice).onVirtualDisplayRemovedLocked(displayId); } } @Override public boolean isAppOwnerOfAnyVirtualDevice(int uid) { synchronized (mVirtualDeviceManagerLock) { Loading Loading
core/java/android/hardware/display/DisplayManager.java +11 −2 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ 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; Loading Loading @@ -902,8 +903,16 @@ public final class DisplayManager { @NonNull VirtualDisplayConfig virtualDisplayConfig, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler, @Nullable Context windowContext) { return mGlobal.createVirtualDisplay(mContext, projection, virtualDisplayConfig, callback, handler, windowContext); return mGlobal.createVirtualDisplay(mContext, projection, null /* virtualDevice */, virtualDisplayConfig, callback, handler, windowContext); } /** @hide */ public VirtualDisplay createVirtualDisplay(@Nullable IVirtualDevice virtualDevice, @NonNull VirtualDisplayConfig virtualDisplayConfig, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) { return mGlobal.createVirtualDisplay(mContext, null /* projection */, virtualDevice, virtualDisplayConfig, callback, handler, null); } /** Loading
core/java/android/hardware/display/DisplayManagerGlobal.java +4 −3 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ 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; Loading Loading @@ -582,14 +583,14 @@ public final class DisplayManagerGlobal { } public VirtualDisplay createVirtualDisplay(@NonNull Context context, MediaProjection projection, @NonNull VirtualDisplayConfig virtualDisplayConfig, VirtualDisplay.Callback callback, Handler handler, @Nullable Context windowContext) { IVirtualDevice virtualDevice, @NonNull VirtualDisplayConfig virtualDisplayConfig, VirtualDisplay.Callback callback, Handler handler, @Nullable Context windowContext) { VirtualDisplayCallback callbackWrapper = new VirtualDisplayCallback(callback, handler); IMediaProjection projectionToken = projection != null ? projection.getProjection() : null; int displayId; try { displayId = mDm.createVirtualDisplay(virtualDisplayConfig, callbackWrapper, projectionToken, context.getPackageName()); projectionToken, virtualDevice, context.getPackageName()); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } Loading
core/java/android/hardware/display/DisplayManagerInternal.java +0 −26 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.Nullable; import android.graphics.Point; import android.hardware.SensorManager; import android.media.projection.IMediaProjection; import android.os.Handler; import android.os.IBinder; import android.os.PowerManager; Loading Loading @@ -380,31 +379,6 @@ public abstract class DisplayManagerInternal { */ public abstract void onEarlyInteractivityChange(boolean interactive); /** * A special API for creates a virtual display with a DisplayPolicyController in system_server. * <p> * If this method is called without original calling uid, the caller must enforce the * corresponding permissions according to the flags. * {@link android.Manifest.permission#CAPTURE_VIDEO_OUTPUT} * {@link android.Manifest.permission#CAPTURE_SECURE_VIDEO_OUTPUT} * {@link android.Manifest.permission#ADD_TRUSTED_DISPLAY} * {@link android.Manifest.permission#INTERNAL_SYSTEM_WINDOW} * </p> * * @param virtualDisplayConfig The arguments for the virtual display configuration. See * {@link VirtualDisplayConfig} for using it. * @param callback Callback to call when the virtual display's state changes, or null if none. * @param projection MediaProjection token. * @param packageName The package name of the app. * @param controller The DisplayWindowPolicyControl that can control what contents are * allowed to be displayed. * @return The newly created virtual display id , or {@link Display#INVALID_DISPLAY} if the * virtual display cannot be created. */ public abstract int createVirtualDisplay(VirtualDisplayConfig virtualDisplayConfig, IVirtualDisplayCallback callback, IMediaProjection projection, String packageName, DisplayWindowPolicyController controller); /** * Get {@link DisplayWindowPolicyController} associated to the {@link DisplayInfo#displayId} * Loading
core/java/android/hardware/display/IDisplayManager.aidl +3 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.hardware.display; import android.companion.virtual.IVirtualDevice; import android.content.pm.ParceledListSlice; import android.graphics.Point; import android.hardware.display.BrightnessConfiguration; Loading Loading @@ -86,10 +87,10 @@ interface IDisplayManager { void requestColorMode(int displayId, int colorMode); // Requires CAPTURE_VIDEO_OUTPUT, CAPTURE_SECURE_VIDEO_OUTPUT, or an appropriate // MediaProjection token for certain combinations of flags. // MediaProjection token or VirtualDevice for certain combinations of flags. int createVirtualDisplay(in VirtualDisplayConfig virtualDisplayConfig, in IVirtualDisplayCallback callback, in IMediaProjection projectionToken, String packageName); in IVirtualDevice virtualDevice, String packageName); // No permissions required, but must be same Uid as the creator. void resizeVirtualDisplay(in IVirtualDisplayCallback token, Loading
services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java +52 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.os.RemoteException; import android.util.ExceptionUtils; import android.util.Slog; import android.util.SparseArray; import android.window.DisplayWindowPolicyController; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.DumpUtils; Loading @@ -38,11 +39,11 @@ import com.android.server.SystemService; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; /** @hide */ @SuppressLint("LongLogTag") public class VirtualDeviceManagerService extends SystemService { Loading Loading @@ -84,6 +85,15 @@ public class VirtualDeviceManagerService extends SystemService { publishLocalService(VirtualDeviceManagerInternal.class, new LocalService()); } @GuardedBy("mVirtualDeviceManagerLock") private boolean isValidVirtualDeviceLocked(IVirtualDevice virtualDevice) { try { return mVirtualDevices.contains(virtualDevice.getAssociationId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } @Override public void onUserStarting(@NonNull TargetUser user) { super.onUserStarting(user); Loading Loading @@ -121,6 +131,7 @@ public class VirtualDeviceManagerService extends SystemService { private final AssociationInfo mAssociationInfo; private final int mOwnerUid; private final ArrayList<Integer> mDisplayIds = new ArrayList<>(); private VirtualDeviceImpl(int ownerUid, IBinder token, AssociationInfo associationInfo) { mOwnerUid = ownerUid; Loading Loading @@ -149,6 +160,24 @@ public class VirtualDeviceManagerService extends SystemService { public void binderDied() { close(); } DisplayWindowPolicyController onVirtualDisplayCreatedLocked(int displayId) { if (mDisplayIds.contains(displayId)) { throw new IllegalStateException( "Virtual device already have a virtual display with ID " + displayId); } mDisplayIds.add(displayId); // TODO(b/201712607): Return the corresponding DisplayWindowPolicyController. return null; } void onVirtualDisplayRemovedLocked(int displayId) { if (!mDisplayIds.contains(displayId)) { throw new IllegalStateException( "Virtual device doesn't have a virtual display with ID " + displayId); } mDisplayIds.remove(displayId); } } class VirtualDeviceManagerImpl extends IVirtualDeviceManager.Stub { Loading Loading @@ -229,6 +258,28 @@ public class VirtualDeviceManagerService extends SystemService { private final class LocalService extends VirtualDeviceManagerInternal { @Override public boolean isValidVirtualDevice(IVirtualDevice virtualDevice) { synchronized (mVirtualDeviceManagerLock) { return isValidVirtualDeviceLocked(virtualDevice); } } @Override public DisplayWindowPolicyController onVirtualDisplayCreated(IVirtualDevice virtualDevice, int displayId) { synchronized (mVirtualDeviceManagerLock) { return ((VirtualDeviceImpl) virtualDevice).onVirtualDisplayCreatedLocked(displayId); } } @Override public void onVirtualDisplayRemoved(IVirtualDevice virtualDevice, int displayId) { synchronized (mVirtualDeviceManagerLock) { ((VirtualDeviceImpl) virtualDevice).onVirtualDisplayRemovedLocked(displayId); } } @Override public boolean isAppOwnerOfAnyVirtualDevice(int uid) { synchronized (mVirtualDeviceManagerLock) { Loading