Added takeScreenshot API to WindowOrganizer
Added requests to take screenshot of a Window that's organized
by the client. The resulting screenshot will be attached to a
SurfaceControl and reparented to the requested window's parent. The
client will be responsible for showing, setting z order, etc. They can
also re-parent to another place in the hierarchy. The default is to
parent to the window's parent since that's usually where a screenshot is
placed.
Test: Builds
Bug: 152114574
Change-Id: I5c829e029f3528fdb382842e9f0474097e01cb2e
Merged-In: I5c829e029f3528fdb382842e9f0474097e01cb2e
diff --git a/core/java/android/window/IWindowOrganizerController.aidl b/core/java/android/window/IWindowOrganizerController.aidl
index 7f4b26d..7e9c783 100644
--- a/core/java/android/window/IWindowOrganizerController.aidl
+++ b/core/java/android/window/IWindowOrganizerController.aidl
@@ -16,9 +16,12 @@
package android.window;
+import android.view.SurfaceControl;
+
import android.window.IDisplayAreaOrganizerController;
import android.window.ITaskOrganizerController;
import android.window.IWindowContainerTransactionCallback;
+import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
/** @hide */
@@ -47,4 +50,15 @@
/** @return An interface enabling the management of display area organizers. */
IDisplayAreaOrganizerController getDisplayAreaOrganizerController();
+
+ /**
+ * Take a screenshot of the requested Window token and place the content of the screenshot into
+ * outSurfaceControl. The SurfaceControl will be a child of the token's parent, so it will be
+ * a sibling of the token's window
+ * @param token The token for the WindowContainer that should get a screenshot taken.
+ * @param outSurfaceControl The SurfaceControl where the screenshot will be attached.
+ *
+ * @return true if the screenshot was successful, false otherwise.
+ */
+ boolean takeScreenshot(in WindowContainerToken token, out SurfaceControl outSurfaceControl);
}
diff --git a/core/java/android/window/WindowOrganizer.java b/core/java/android/window/WindowOrganizer.java
index 4578271..ff40dda 100644
--- a/core/java/android/window/WindowOrganizer.java
+++ b/core/java/android/window/WindowOrganizer.java
@@ -17,11 +17,13 @@
package android.window;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.TestApi;
import android.app.ActivityTaskManager;
import android.os.RemoteException;
import android.util.Singleton;
+import android.view.SurfaceControl;
/**
* Base class for organizing specific types of windows like Tasks and DisplayAreas
@@ -63,6 +65,28 @@
}
}
+ /**
+ * Take a screenshot for a specified Window
+ * @param token The token for the WindowContainer that should get a screenshot taken.
+ * @return A SurfaceControl where the screenshot will be attached, or null if failed.
+ *
+ * @hide
+ */
+ @Nullable
+ @RequiresPermission(android.Manifest.permission.READ_FRAME_BUFFER)
+ public static SurfaceControl takeScreenshot(@NonNull WindowContainerToken token) {
+ try {
+ SurfaceControl surfaceControl = new SurfaceControl();
+ if (getWindowOrganizerController().takeScreenshot(token, surfaceControl)) {
+ return surfaceControl;
+ } else {
+ return null;
+ }
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
@RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
static IWindowOrganizerController getWindowOrganizerController() {
return IWindowOrganizerControllerSingleton.get();