summaryrefslogtreecommitdiff
path: root/packages/Shell/src
diff options
context:
space:
mode:
author Chavi Weingarten <chaviw@google.com> 2022-09-14 17:15:22 +0000
committer Chavi Weingarten <chaviw@google.com> 2022-09-22 17:53:01 +0000
commit5ae620bd98551e800aa7fd0b86ce2be711e6b2c0 (patch)
tree53672905bfd7964905f82b454f8b0e4470f0b441 /packages/Shell/src
parentddd124e8b0c5de2daf7800bd990eaf12ee3875cd (diff)
Replace screenshots using internal displayToken with new API
In order to remove SurfaceControl.getInternalDisplayToken, we need to replace all usages of it. The primary use is for screen capturing since you could call directly into SF via ScreenCapture.captureDisplay if you had a display token. However, this isn't scalable with multi-display since you need to be explicity which display to capture. The change provides a new API into WMS to capture a display using the displayId. This is still a privilege call so only processes with READ_FRAME_BUFFER can use it. In most cases, the replacement for now is to use DEFAULT_DISPLAY, but they can be modified later to send the desired display. Test: power + volume down Test: assistant screencapture Test: SurfaceViewTests Bug: 242714168 Change-Id: I9b406b699d48ae34c6ffd91c34941f1580f38d28
Diffstat (limited to 'packages/Shell/src')
-rw-r--r--packages/Shell/src/com/android/shell/Screenshooter.java25
1 files changed, 17 insertions, 8 deletions
diff --git a/packages/Shell/src/com/android/shell/Screenshooter.java b/packages/Shell/src/com/android/shell/Screenshooter.java
index d55eda0c7062..baaddf53bcab 100644
--- a/packages/Shell/src/com/android/shell/Screenshooter.java
+++ b/packages/Shell/src/com/android/shell/Screenshooter.java
@@ -16,11 +16,17 @@
package com.android.shell;
+import static android.view.Display.DEFAULT_DISPLAY;
+
import android.graphics.Bitmap;
-import android.os.IBinder;
+import android.os.RemoteException;
import android.util.Log;
-import android.view.SurfaceControl;
+import android.util.Pair;
+import android.view.WindowManagerGlobal;
import android.window.ScreenCapture;
+import android.window.ScreenCapture.ScreenCaptureListener;
+import android.window.ScreenCapture.ScreenshotHardwareBuffer;
+import android.window.ScreenCapture.ScreenshotSync;
/**
* Helper class used to take screenshots.
@@ -40,12 +46,15 @@ final class Screenshooter {
static Bitmap takeScreenshot() {
Log.d(TAG, "Taking fullscreen screenshot");
// Take the screenshot
- final IBinder displayToken = SurfaceControl.getInternalDisplayToken();
- final ScreenCapture.DisplayCaptureArgs captureArgs =
- new ScreenCapture.DisplayCaptureArgs.Builder(displayToken)
- .build();
- final ScreenCapture.ScreenshotHardwareBuffer screenshotBuffer =
- ScreenCapture.captureDisplay(captureArgs);
+ final Pair<ScreenCaptureListener, ScreenshotSync> syncScreenCapture =
+ ScreenCapture.createSyncCaptureListener();
+ try {
+ WindowManagerGlobal.getWindowManagerService().captureDisplay(DEFAULT_DISPLAY, null,
+ syncScreenCapture.first);
+ } catch (RemoteException e) {
+ e.rethrowAsRuntimeException();
+ }
+ final ScreenshotHardwareBuffer screenshotBuffer = syncScreenCapture.second.get();
final Bitmap screenShot = screenshotBuffer == null ? null : screenshotBuffer.asBitmap();
if (screenShot == null) {
Log.e(TAG, "Failed to take fullscreen screenshot");