Loading core/api/current.txt +2 −2 Original line number Diff line number Diff line Loading @@ -18345,8 +18345,8 @@ 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 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 public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, int, int, int, @Nullable android.view.Surface, int); method public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, int, int, int, @Nullable android.view.Surface, int, @Nullable android.hardware.display.VirtualDisplay.Callback, @Nullable android.os.Handler); method public android.view.Display getDisplay(int); method public android.view.Display[] getDisplays(); method public android.view.Display[] getDisplays(String); core/api/system-current.txt +1 −1 Original line number Diff line number Diff line Loading @@ -2755,7 +2755,7 @@ package android.companion.virtual { method public void addActivityListener(@NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener, @NonNull java.util.concurrent.Executor); method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void close(); 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, @NonNull java.util.concurrent.Executor, @Nullable android.hardware.display.VirtualDisplay.Callback); 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); core/java/android/companion/virtual/VirtualDeviceManager.java +12 −12 Original line number Diff line number Diff line Loading @@ -16,11 +16,10 @@ package android.companion.virtual; import android.annotation.CallbackExecutor; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; import android.app.Activity; Loading @@ -32,7 +31,6 @@ import android.content.ComponentName; import android.content.Context; import android.graphics.Point; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager.VirtualDisplayFlag; import android.hardware.display.VirtualDisplay; import android.hardware.display.VirtualDisplayConfig; import android.hardware.input.VirtualKeyboard; Loading @@ -48,7 +46,6 @@ import android.os.ResultReceiver; import android.util.ArrayMap; import android.view.Surface; import java.util.Objects; import java.util.concurrent.Executor; /** Loading Loading @@ -213,22 +210,25 @@ public final class VirtualDeviceManager { * {@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 executor The executor on which {@code callback} will be invoked. This is ignored * if {@code callback} is {@code null}. * @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. * @return The newly created virtual display, or {@code null} if the application could * not create the virtual display. * * @see DisplayManager#createVirtualDisplay */ // Suppress "ExecutorRegistration" because DisplayManager.createVirtualDisplay takes a // handler @SuppressLint("ExecutorRegistration") @Nullable public VirtualDisplay createVirtualDisplay( @IntRange(from = 1) int width, @IntRange(from = 1) int height, @IntRange(from = 1) int densityDpi, int width, int height, int densityDpi, @Nullable Surface surface, @VirtualDisplayFlag int flags, @NonNull @CallbackExecutor Executor executor, int flags, @Nullable Handler handler, @Nullable VirtualDisplay.Callback callback) { // TODO(b/205343547): Handle display groups properly instead of creating a new display // group for every new virtual display created using this API. Loading @@ -244,7 +244,7 @@ public final class VirtualDeviceManager { .setFlags(getVirtualDisplayFlags(flags)) .build(), callback, Objects.requireNonNull(executor)); handler); } /** Loading core/java/android/hardware/display/DisplayManager.java +9 −56 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import static android.view.Display.HdrCapabilities.HdrType; import android.Manifest; import android.annotation.FloatRange; import android.annotation.IntDef; import android.annotation.IntRange; import android.annotation.LongDef; import android.annotation.NonNull; import android.annotation.Nullable; Loading @@ -39,8 +38,6 @@ import android.graphics.Point; import android.media.projection.MediaProjection; import android.os.Build; import android.os.Handler; import android.os.HandlerExecutor; import android.os.Looper; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; Loading @@ -51,7 +48,6 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; /** Loading Loading @@ -108,25 +104,6 @@ public final class DisplayManager { public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION"; /** @hide **/ @IntDef(prefix = "VIRTUAL_DISPLAY_FLAG_", flag = true, value = { VIRTUAL_DISPLAY_FLAG_PUBLIC, VIRTUAL_DISPLAY_FLAG_PRESENTATION, VIRTUAL_DISPLAY_FLAG_SECURE, VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY, VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD, VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH, VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT, VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL, VIRTUAL_DISPLAY_FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS, VIRTUAL_DISPLAY_FLAG_TRUSTED, VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP, VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED }) @Retention(RetentionPolicy.SOURCE) public @interface VirtualDisplayFlag {} /** * Virtual display flag: Create a public display. * Loading Loading @@ -843,11 +820,7 @@ public final class DisplayManager { * VirtualDisplay.Callback, Handler) */ public VirtualDisplay createVirtualDisplay(@NonNull String name, @IntRange(from = 1) int width, @IntRange(from = 1) int height, @IntRange(from = 1) int densityDpi, @Nullable Surface surface, @VirtualDisplayFlag int flags) { int width, int height, int densityDpi, @Nullable Surface surface, int flags) { return createVirtualDisplay(name, width, height, densityDpi, surface, flags, null, null); } Loading Loading @@ -895,13 +868,8 @@ public final class DisplayManager { * a virtual display with the specified flags. */ public VirtualDisplay createVirtualDisplay(@NonNull String name, @IntRange(from = 1) int width, @IntRange(from = 1) int height, @IntRange(from = 1) int densityDpi, @Nullable Surface surface, @VirtualDisplayFlag int flags, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) { int width, int height, int densityDpi, @Nullable Surface surface, int flags, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) { final VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder(name, width, height, densityDpi); builder.setFlags(flags); Loading @@ -914,16 +882,9 @@ public final class DisplayManager { // TODO : Remove this hidden API after remove all callers. (Refer to MultiDisplayService) /** @hide */ public VirtualDisplay createVirtualDisplay( @Nullable MediaProjection projection, @NonNull String name, @IntRange(from = 1) int width, @IntRange(from = 1) int height, @IntRange(from = 1) int densityDpi, @Nullable Surface surface, @VirtualDisplayFlag int flags, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler, public VirtualDisplay createVirtualDisplay(@Nullable MediaProjection projection, @NonNull String name, int width, int height, int densityDpi, @Nullable Surface surface, int flags, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler, @Nullable String uniqueId) { final VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder(name, width, height, densityDpi); Loading @@ -943,24 +904,16 @@ public final class DisplayManager { @NonNull VirtualDisplayConfig virtualDisplayConfig, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler, @Nullable Context windowContext) { Executor executor = null; // If callback is null, the executor will not be used. Avoid creating the handler and the // handler executor. if (callback != null) { executor = new HandlerExecutor( Handler.createAsync(handler != null ? handler.getLooper() : Looper.myLooper())); } return mGlobal.createVirtualDisplay(mContext, projection, null /* virtualDevice */, virtualDisplayConfig, callback, executor, windowContext); virtualDisplayConfig, callback, handler, windowContext); } /** @hide */ public VirtualDisplay createVirtualDisplay(@Nullable IVirtualDevice virtualDevice, @NonNull VirtualDisplayConfig virtualDisplayConfig, @Nullable VirtualDisplay.Callback callback, @NonNull Executor executor) { @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) { return mGlobal.createVirtualDisplay(mContext, null /* projection */, virtualDevice, virtualDisplayConfig, callback, executor, null); virtualDisplayConfig, callback, handler, null); } /** Loading core/java/android/hardware/display/DisplayManagerGlobal.java +42 −20 Original line number Diff line number Diff line Loading @@ -56,8 +56,6 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.concurrent.Executor; /** * Manager communication with the display manager service on behalf of Loading Loading @@ -587,9 +585,8 @@ 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) { VirtualDisplayCallback callbackWrapper = new VirtualDisplayCallback(callback, executor); VirtualDisplay.Callback callback, Handler handler, @Nullable Context windowContext) { VirtualDisplayCallback callbackWrapper = new VirtualDisplayCallback(callback, handler); IMediaProjection projectionToken = projection != null ? projection.getProjection() : null; int displayId; try { Loading Loading @@ -1051,36 +1048,61 @@ public final class DisplayManagerGlobal { } private final static class VirtualDisplayCallback extends IVirtualDisplayCallback.Stub { @Nullable private final VirtualDisplay.Callback mCallback; @Nullable private final Executor mExecutor; private VirtualDisplayCallbackDelegate mDelegate; VirtualDisplayCallback(VirtualDisplay.Callback callback, Executor executor) { mCallback = callback; mExecutor = mCallback != null ? Objects.requireNonNull(executor) : null; public VirtualDisplayCallback(VirtualDisplay.Callback callback, Handler handler) { if (callback != null) { mDelegate = new VirtualDisplayCallbackDelegate(callback, handler); } } // These methods are called from the binder thread, but the AIDL is oneway, so it should be // safe to call the callback on arbitrary executors directly without risking blocking // the system. @Override // Binder call public void onPaused() { if (mCallback != null) { mExecutor.execute(mCallback::onPaused); if (mDelegate != null) { mDelegate.sendEmptyMessage(VirtualDisplayCallbackDelegate.MSG_DISPLAY_PAUSED); } } @Override // Binder call public void onResumed() { if (mCallback != null) { mExecutor.execute(mCallback::onResumed); if (mDelegate != null) { mDelegate.sendEmptyMessage(VirtualDisplayCallbackDelegate.MSG_DISPLAY_RESUMED); } } @Override // Binder call public void onStopped() { if (mCallback != null) { mExecutor.execute(mCallback::onStopped); if (mDelegate != null) { mDelegate.sendEmptyMessage(VirtualDisplayCallbackDelegate.MSG_DISPLAY_STOPPED); } } } private final static class VirtualDisplayCallbackDelegate extends Handler { public static final int MSG_DISPLAY_PAUSED = 0; public static final int MSG_DISPLAY_RESUMED = 1; public static final int MSG_DISPLAY_STOPPED = 2; private final VirtualDisplay.Callback mCallback; public VirtualDisplayCallbackDelegate(VirtualDisplay.Callback callback, Handler handler) { super(handler != null ? handler.getLooper() : Looper.myLooper(), null, true /*async*/); mCallback = callback; } @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_DISPLAY_PAUSED: mCallback.onPaused(); break; case MSG_DISPLAY_RESUMED: mCallback.onResumed(); break; case MSG_DISPLAY_STOPPED: mCallback.onStopped(); break; } } } Loading Loading
core/api/current.txt +2 −2 Original line number Diff line number Diff line Loading @@ -18345,8 +18345,8 @@ 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 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 public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, int, int, int, @Nullable android.view.Surface, int); method public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, int, int, int, @Nullable android.view.Surface, int, @Nullable android.hardware.display.VirtualDisplay.Callback, @Nullable android.os.Handler); method public android.view.Display getDisplay(int); method public android.view.Display[] getDisplays(); method public android.view.Display[] getDisplays(String);
core/api/system-current.txt +1 −1 Original line number Diff line number Diff line Loading @@ -2755,7 +2755,7 @@ package android.companion.virtual { method public void addActivityListener(@NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener, @NonNull java.util.concurrent.Executor); method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void close(); 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, @NonNull java.util.concurrent.Executor, @Nullable android.hardware.display.VirtualDisplay.Callback); 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);
core/java/android/companion/virtual/VirtualDeviceManager.java +12 −12 Original line number Diff line number Diff line Loading @@ -16,11 +16,10 @@ package android.companion.virtual; import android.annotation.CallbackExecutor; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; import android.app.Activity; Loading @@ -32,7 +31,6 @@ import android.content.ComponentName; import android.content.Context; import android.graphics.Point; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager.VirtualDisplayFlag; import android.hardware.display.VirtualDisplay; import android.hardware.display.VirtualDisplayConfig; import android.hardware.input.VirtualKeyboard; Loading @@ -48,7 +46,6 @@ import android.os.ResultReceiver; import android.util.ArrayMap; import android.view.Surface; import java.util.Objects; import java.util.concurrent.Executor; /** Loading Loading @@ -213,22 +210,25 @@ public final class VirtualDeviceManager { * {@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 executor The executor on which {@code callback} will be invoked. This is ignored * if {@code callback} is {@code null}. * @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. * @return The newly created virtual display, or {@code null} if the application could * not create the virtual display. * * @see DisplayManager#createVirtualDisplay */ // Suppress "ExecutorRegistration" because DisplayManager.createVirtualDisplay takes a // handler @SuppressLint("ExecutorRegistration") @Nullable public VirtualDisplay createVirtualDisplay( @IntRange(from = 1) int width, @IntRange(from = 1) int height, @IntRange(from = 1) int densityDpi, int width, int height, int densityDpi, @Nullable Surface surface, @VirtualDisplayFlag int flags, @NonNull @CallbackExecutor Executor executor, int flags, @Nullable Handler handler, @Nullable VirtualDisplay.Callback callback) { // TODO(b/205343547): Handle display groups properly instead of creating a new display // group for every new virtual display created using this API. Loading @@ -244,7 +244,7 @@ public final class VirtualDeviceManager { .setFlags(getVirtualDisplayFlags(flags)) .build(), callback, Objects.requireNonNull(executor)); handler); } /** Loading
core/java/android/hardware/display/DisplayManager.java +9 −56 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import static android.view.Display.HdrCapabilities.HdrType; import android.Manifest; import android.annotation.FloatRange; import android.annotation.IntDef; import android.annotation.IntRange; import android.annotation.LongDef; import android.annotation.NonNull; import android.annotation.Nullable; Loading @@ -39,8 +38,6 @@ import android.graphics.Point; import android.media.projection.MediaProjection; import android.os.Build; import android.os.Handler; import android.os.HandlerExecutor; import android.os.Looper; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; Loading @@ -51,7 +48,6 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; /** Loading Loading @@ -108,25 +104,6 @@ public final class DisplayManager { public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION"; /** @hide **/ @IntDef(prefix = "VIRTUAL_DISPLAY_FLAG_", flag = true, value = { VIRTUAL_DISPLAY_FLAG_PUBLIC, VIRTUAL_DISPLAY_FLAG_PRESENTATION, VIRTUAL_DISPLAY_FLAG_SECURE, VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY, VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD, VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH, VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT, VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL, VIRTUAL_DISPLAY_FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS, VIRTUAL_DISPLAY_FLAG_TRUSTED, VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP, VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED }) @Retention(RetentionPolicy.SOURCE) public @interface VirtualDisplayFlag {} /** * Virtual display flag: Create a public display. * Loading Loading @@ -843,11 +820,7 @@ public final class DisplayManager { * VirtualDisplay.Callback, Handler) */ public VirtualDisplay createVirtualDisplay(@NonNull String name, @IntRange(from = 1) int width, @IntRange(from = 1) int height, @IntRange(from = 1) int densityDpi, @Nullable Surface surface, @VirtualDisplayFlag int flags) { int width, int height, int densityDpi, @Nullable Surface surface, int flags) { return createVirtualDisplay(name, width, height, densityDpi, surface, flags, null, null); } Loading Loading @@ -895,13 +868,8 @@ public final class DisplayManager { * a virtual display with the specified flags. */ public VirtualDisplay createVirtualDisplay(@NonNull String name, @IntRange(from = 1) int width, @IntRange(from = 1) int height, @IntRange(from = 1) int densityDpi, @Nullable Surface surface, @VirtualDisplayFlag int flags, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) { int width, int height, int densityDpi, @Nullable Surface surface, int flags, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) { final VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder(name, width, height, densityDpi); builder.setFlags(flags); Loading @@ -914,16 +882,9 @@ public final class DisplayManager { // TODO : Remove this hidden API after remove all callers. (Refer to MultiDisplayService) /** @hide */ public VirtualDisplay createVirtualDisplay( @Nullable MediaProjection projection, @NonNull String name, @IntRange(from = 1) int width, @IntRange(from = 1) int height, @IntRange(from = 1) int densityDpi, @Nullable Surface surface, @VirtualDisplayFlag int flags, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler, public VirtualDisplay createVirtualDisplay(@Nullable MediaProjection projection, @NonNull String name, int width, int height, int densityDpi, @Nullable Surface surface, int flags, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler, @Nullable String uniqueId) { final VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder(name, width, height, densityDpi); Loading @@ -943,24 +904,16 @@ public final class DisplayManager { @NonNull VirtualDisplayConfig virtualDisplayConfig, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler, @Nullable Context windowContext) { Executor executor = null; // If callback is null, the executor will not be used. Avoid creating the handler and the // handler executor. if (callback != null) { executor = new HandlerExecutor( Handler.createAsync(handler != null ? handler.getLooper() : Looper.myLooper())); } return mGlobal.createVirtualDisplay(mContext, projection, null /* virtualDevice */, virtualDisplayConfig, callback, executor, windowContext); virtualDisplayConfig, callback, handler, windowContext); } /** @hide */ public VirtualDisplay createVirtualDisplay(@Nullable IVirtualDevice virtualDevice, @NonNull VirtualDisplayConfig virtualDisplayConfig, @Nullable VirtualDisplay.Callback callback, @NonNull Executor executor) { @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) { return mGlobal.createVirtualDisplay(mContext, null /* projection */, virtualDevice, virtualDisplayConfig, callback, executor, null); virtualDisplayConfig, callback, handler, null); } /** Loading
core/java/android/hardware/display/DisplayManagerGlobal.java +42 −20 Original line number Diff line number Diff line Loading @@ -56,8 +56,6 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.concurrent.Executor; /** * Manager communication with the display manager service on behalf of Loading Loading @@ -587,9 +585,8 @@ 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) { VirtualDisplayCallback callbackWrapper = new VirtualDisplayCallback(callback, executor); VirtualDisplay.Callback callback, Handler handler, @Nullable Context windowContext) { VirtualDisplayCallback callbackWrapper = new VirtualDisplayCallback(callback, handler); IMediaProjection projectionToken = projection != null ? projection.getProjection() : null; int displayId; try { Loading Loading @@ -1051,36 +1048,61 @@ public final class DisplayManagerGlobal { } private final static class VirtualDisplayCallback extends IVirtualDisplayCallback.Stub { @Nullable private final VirtualDisplay.Callback mCallback; @Nullable private final Executor mExecutor; private VirtualDisplayCallbackDelegate mDelegate; VirtualDisplayCallback(VirtualDisplay.Callback callback, Executor executor) { mCallback = callback; mExecutor = mCallback != null ? Objects.requireNonNull(executor) : null; public VirtualDisplayCallback(VirtualDisplay.Callback callback, Handler handler) { if (callback != null) { mDelegate = new VirtualDisplayCallbackDelegate(callback, handler); } } // These methods are called from the binder thread, but the AIDL is oneway, so it should be // safe to call the callback on arbitrary executors directly without risking blocking // the system. @Override // Binder call public void onPaused() { if (mCallback != null) { mExecutor.execute(mCallback::onPaused); if (mDelegate != null) { mDelegate.sendEmptyMessage(VirtualDisplayCallbackDelegate.MSG_DISPLAY_PAUSED); } } @Override // Binder call public void onResumed() { if (mCallback != null) { mExecutor.execute(mCallback::onResumed); if (mDelegate != null) { mDelegate.sendEmptyMessage(VirtualDisplayCallbackDelegate.MSG_DISPLAY_RESUMED); } } @Override // Binder call public void onStopped() { if (mCallback != null) { mExecutor.execute(mCallback::onStopped); if (mDelegate != null) { mDelegate.sendEmptyMessage(VirtualDisplayCallbackDelegate.MSG_DISPLAY_STOPPED); } } } private final static class VirtualDisplayCallbackDelegate extends Handler { public static final int MSG_DISPLAY_PAUSED = 0; public static final int MSG_DISPLAY_RESUMED = 1; public static final int MSG_DISPLAY_STOPPED = 2; private final VirtualDisplay.Callback mCallback; public VirtualDisplayCallbackDelegate(VirtualDisplay.Callback callback, Handler handler) { super(handler != null ? handler.getLooper() : Looper.myLooper(), null, true /*async*/); mCallback = callback; } @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_DISPLAY_PAUSED: mCallback.onPaused(); break; case MSG_DISPLAY_RESUMED: mCallback.onResumed(); break; case MSG_DISPLAY_STOPPED: mCallback.onStopped(); break; } } } Loading