summaryrefslogtreecommitdiff
path: root/android/view/SurfaceControl.java
diff options
context:
space:
mode:
authorJustin Klaassen <justinklaassen@google.com>2017-10-30 17:25:37 -0400
committerJustin Klaassen <justinklaassen@google.com>2017-10-30 17:25:37 -0400
commit46c77c203439b3b37c99d09e326df4b1fe08c10b (patch)
tree70d29abbfbb1106cd0830b33bc7e69e6fb151b1e /android/view/SurfaceControl.java
parent47ed54e5d312f899507d28d6e95ccc18a0de19fe (diff)
downloadandroid-28-46c77c203439b3b37c99d09e326df4b1fe08c10b.tar.gz
Import Android SDK Platform P [4423826]
/google/data/ro/projects/android/fetch_artifact \ --bid 4423826 \ --target sdk_phone_armv7-win_sdk \ sdk-repo-linux-sources-4423826.zip AndroidVersion.ApiLevel has been modified to appear as 28 Change-Id: I45f7bdc9b9c1cdcba75386623ae5f3ead6db4da8
Diffstat (limited to 'android/view/SurfaceControl.java')
-rw-r--r--android/view/SurfaceControl.java248
1 files changed, 222 insertions, 26 deletions
diff --git a/android/view/SurfaceControl.java b/android/view/SurfaceControl.java
index ff027a94..6f8315ae 100644
--- a/android/view/SurfaceControl.java
+++ b/android/view/SurfaceControl.java
@@ -16,27 +16,22 @@
package android.view;
-import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE;
-
import android.annotation.Size;
import android.graphics.Bitmap;
import android.graphics.GraphicBuffer;
-import android.graphics.Point;
-import android.graphics.PointF;
+import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.Region;
-import android.os.Binder;
-import android.os.Debug;
import android.os.IBinder;
+import android.os.Process;
+import android.os.UserHandle;
import android.util.Log;
import android.view.Surface.OutOfResourcesException;
-
import dalvik.system.CloseGuard;
+import libcore.util.NativeAllocationRegistry;
import java.io.Closeable;
-import libcore.util.NativeAllocationRegistry;
-
/**
* SurfaceControl
* @hide
@@ -60,6 +55,8 @@ public class SurfaceControl {
private static native void nativeScreenshot(IBinder displayToken, Surface consumer,
Rect sourceCrop, int width, int height, int minLayer, int maxLayer,
boolean allLayers, boolean useIdentityTransform);
+ private static native void nativeCaptureLayers(IBinder layerHandleToken, Surface consumer,
+ int rotation);
private static native long nativeCreateTransaction();
private static native long nativeGetNativeTransactionFinalizer();
@@ -186,7 +183,7 @@ public class SurfaceControl {
/**
* Surface creation flag: Indicates that the surface must be considered opaque,
- * even if its pixel format is set to translucent. This can be useful if an
+ * even if its pixel format contains an alpha channel. This can be useful if an
* application needs full RGBA 8888 support for instance but will
* still draw every pixel opaque.
* <p>
@@ -307,6 +304,203 @@ public class SurfaceControl {
public static final int WINDOW_TYPE_DONT_SCREENSHOT = 441731;
/**
+ * Builder class for {@link SurfaceControl} objects.
+ */
+ public static class Builder {
+ private SurfaceSession mSession;
+ private int mFlags = HIDDEN;
+ private int mWidth;
+ private int mHeight;
+ private int mFormat = PixelFormat.OPAQUE;
+ private String mName;
+ private SurfaceControl mParent;
+ private int mWindowType;
+ private int mOwnerUid;
+
+ /**
+ * Begin building a SurfaceControl with a given {@link SurfaceSession}.
+ *
+ * @param session The {@link SurfaceSession} with which to eventually construct the surface.
+ */
+ public Builder(SurfaceSession session) {
+ mSession = session;
+ }
+
+ /**
+ * Construct a new {@link SurfaceControl} with the set parameters.
+ */
+ public SurfaceControl build() {
+ if (mWidth <= 0 || mHeight <= 0) {
+ throw new IllegalArgumentException(
+ "width and height must be set");
+ }
+ return new SurfaceControl(mSession, mName, mWidth, mHeight, mFormat,
+ mFlags, mParent, mWindowType, mOwnerUid);
+ }
+
+ /**
+ * Set a debugging-name for the SurfaceControl.
+ *
+ * @param name A name to identify the Surface in debugging.
+ */
+ public Builder setName(String name) {
+ mName = name;
+ return this;
+ }
+
+ /**
+ * Set the initial size of the controlled surface's buffers in pixels.
+ *
+ * @param width The buffer width in pixels.
+ * @param height The buffer height in pixels.
+ */
+ public Builder setSize(int width, int height) {
+ if (width <= 0 || height <= 0) {
+ throw new IllegalArgumentException(
+ "width and height must be positive");
+ }
+ mWidth = width;
+ mHeight = height;
+ return this;
+ }
+
+ /**
+ * Set the pixel format of the controlled surface's buffers, using constants from
+ * {@link android.graphics.PixelFormat}.
+ */
+ public Builder setFormat(@PixelFormat.Format int format) {
+ mFormat = format;
+ return this;
+ }
+
+ /**
+ * Specify if the app requires a hardware-protected path to
+ * an external display sync. If protected content is enabled, but
+ * such a path is not available, then the controlled Surface will
+ * not be displayed.
+ *
+ * @param protectedContent Whether to require a protected sink.
+ */
+ public Builder setProtected(boolean protectedContent) {
+ if (protectedContent) {
+ mFlags |= PROTECTED_APP;
+ } else {
+ mFlags &= ~PROTECTED_APP;
+ }
+ return this;
+ }
+
+ /**
+ * Specify whether the Surface contains secure content. If true, the system
+ * will prevent the surfaces content from being copied by another process. In
+ * particular screenshots and VNC servers will be disabled. This is however
+ * not a complete prevention of readback as {@link #setProtected}.
+ */
+ public Builder setSecure(boolean secure) {
+ if (secure) {
+ mFlags |= SECURE;
+ } else {
+ mFlags &= ~SECURE;
+ }
+ return this;
+ }
+
+ /**
+ * Indicates whether the surface must be considered opaque,
+ * even if its pixel format is set to translucent. This can be useful if an
+ * application needs full RGBA 8888 support for instance but will
+ * still draw every pixel opaque.
+ * <p>
+ * This flag only determines whether opacity will be sampled from the alpha channel.
+ * Plane-alpha from calls to setAlpha() can still result in blended composition
+ * regardless of the opaque setting.
+ *
+ * Combined effects are (assuming a buffer format with an alpha channel):
+ * <ul>
+ * <li>OPAQUE + alpha(1.0) == opaque composition
+ * <li>OPAQUE + alpha(0.x) == blended composition
+ * <li>OPAQUE + alpha(0.0) == no composition
+ * <li>!OPAQUE + alpha(1.0) == blended composition
+ * <li>!OPAQUE + alpha(0.x) == blended composition
+ * <li>!OPAQUE + alpha(0.0) == no composition
+ * </ul>
+ * If the underlying buffer lacks an alpha channel, it is as if setOpaque(true)
+ * were set automatically.
+ * @param opaque Whether the Surface is OPAQUE.
+ */
+ public Builder setOpaque(boolean opaque) {
+ if (opaque) {
+ mFlags |= OPAQUE;
+ } else {
+ mFlags &= ~OPAQUE;
+ }
+ return this;
+ }
+
+ /**
+ * Set a parent surface for our new SurfaceControl.
+ *
+ * Child surfaces are constrained to the onscreen region of their parent.
+ * Furthermore they stack relatively in Z order, and inherit the transformation
+ * of the parent.
+ *
+ * @param parent The parent control.
+ */
+ public Builder setParent(SurfaceControl parent) {
+ mParent = parent;
+ return this;
+ }
+
+ /**
+ * Set surface metadata.
+ *
+ * Currently these are window-types as per {@link WindowManager.LayoutParams} and
+ * owner UIDs. Child surfaces inherit their parents
+ * metadata so only the WindowManager needs to set this on root Surfaces.
+ *
+ * @param windowType A window-type
+ * @param ownerUid UID of the window owner.
+ */
+ public Builder setMetadata(int windowType, int ownerUid) {
+ if (UserHandle.getAppId(Process.myUid()) != Process.SYSTEM_UID) {
+ throw new UnsupportedOperationException(
+ "It only makes sense to set Surface metadata from the WindowManager");
+ }
+ mWindowType = windowType;
+ mOwnerUid = ownerUid;
+ return this;
+ }
+
+ /**
+ * Indicate whether a 'ColorLayer' is to be constructed.
+ *
+ * Color layers will not have an associated BufferQueue and will instead always render a
+ * solid color (that is, solid before plane alpha). Currently that color is black.
+ *
+ * @param isColorLayer Whether to create a color layer.
+ */
+ public Builder setColorLayer(boolean isColorLayer) {
+ if (isColorLayer) {
+ mFlags |= FX_SURFACE_DIM;
+ } else {
+ mFlags &= ~FX_SURFACE_DIM;
+ }
+ return this;
+ }
+
+ /**
+ * Set 'Surface creation flags' such as {@link HIDDEN}, {@link SECURE}.
+ *
+ * TODO: Finish conversion to individual builder methods?
+ * @param flags The combined flags
+ */
+ public Builder setFlags(int flags) {
+ mFlags = flags;
+ return this;
+ }
+ }
+
+ /**
* Create a surface with a name.
* <p>
* The surface creation flags specify what kind of surface to create and
@@ -331,19 +525,7 @@ public class SurfaceControl {
*
* @throws throws OutOfResourcesException If the SurfaceControl cannot be created.
*/
- public SurfaceControl(SurfaceSession session,
- String name, int w, int h, int format, int flags, int windowType, int ownerUid)
- throws OutOfResourcesException {
- this(session, name, w, h, format, flags, null, windowType, ownerUid);
- }
-
- public SurfaceControl(SurfaceSession session,
- String name, int w, int h, int format, int flags)
- throws OutOfResourcesException {
- this(session, name, w, h, format, flags, null, INVALID_WINDOW_TYPE, Binder.getCallingUid());
- }
-
- public SurfaceControl(SurfaceSession session, String name, int w, int h, int format, int flags,
+ private SurfaceControl(SurfaceSession session, String name, int w, int h, int format, int flags,
SurfaceControl parent, int windowType, int ownerUid)
throws OutOfResourcesException {
if (session == null) {
@@ -533,7 +715,7 @@ public class SurfaceControl {
}
}
- public void setRelativeLayer(IBinder relativeTo, int zorder) {
+ public void setRelativeLayer(SurfaceControl relativeTo, int zorder) {
checkNotReleased();
synchronized(SurfaceControl.class) {
sGlobalTransaction.setRelativeLayer(this, relativeTo, zorder);
@@ -970,6 +1152,20 @@ public class SurfaceControl {
minLayer, maxLayer, allLayers, useIdentityTransform);
}
+ /**
+ * Captures a layer and its children into the provided {@link Surface}.
+ *
+ * @param layerHandleToken The root layer to capture.
+ * @param consumer The {@link Surface} to capture the layer into.
+ * @param rotation Apply a custom clockwise rotation to the screenshot, i.e.
+ * Surface.ROTATION_0,90,180,270. Surfaceflinger will always capture in its
+ * native portrait orientation by default, so this is useful for returning
+ * captures that are independent of device orientation.
+ */
+ public static void captureLayers(IBinder layerHandleToken, Surface consumer, int rotation) {
+ nativeCaptureLayers(layerHandleToken, consumer, rotation);
+ }
+
public static class Transaction implements Closeable {
public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry(
Transaction.class.getClassLoader(),
@@ -1035,9 +1231,9 @@ public class SurfaceControl {
return this;
}
- public Transaction setRelativeLayer(SurfaceControl sc, IBinder relativeTo, int z) {
+ public Transaction setRelativeLayer(SurfaceControl sc, SurfaceControl relativeTo, int z) {
nativeSetRelativeLayer(mNativeObject, sc.mNativeObject,
- relativeTo, z);
+ relativeTo.getHandle(), z);
return this;
}