13866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian/*
23866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Copyright (C) 2013 The Android Open Source Project
33866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian *
43866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
53866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * you may not use this file except in compliance with the License.
63866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * You may obtain a copy of the License at
73866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian *
83866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
93866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian *
103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Unless required by applicable law or agreed to in writing, software
113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
123866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * See the License for the specific language governing permissions and
143866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * limitations under the License.
153866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */
163866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianpackage android.view;
183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
19e4338f843b234b8651d20aef15c901cbd6847bfcAlbert Chaulkimport static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE;
20e4338f843b234b8651d20aef15c901cbd6847bfcAlbert Chaulk
213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.graphics.Bitmap;
226486d31dcbffb7179127a72ceefa11a1e726271fRobert Carrimport android.graphics.GraphicBuffer;
233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.graphics.Rect;
243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.graphics.Region;
25e4338f843b234b8651d20aef15c901cbd6847bfcAlbert Chaulkimport android.os.Binder;
263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.os.IBinder;
273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.util.Log;
28a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkinimport android.view.Surface.OutOfResourcesException;
293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
3067e2ae86396c6d0f989285275cbf908dee5e71f7Aurimas Liutikasimport dalvik.system.CloseGuard;
3167e2ae86396c6d0f989285275cbf908dee5e71f7Aurimas Liutikas
323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian/**
333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * SurfaceControl
343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian *  @hide
353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian */
363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianpublic class SurfaceControl {
373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    private static final String TAG = "SurfaceControl";
3829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian
3936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    private static native long nativeCreate(SurfaceSession session, String name,
403bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk            int w, int h, int format, int flags, long parentObject, int windowType, int ownerUid)
4129479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian            throws OutOfResourcesException;
4236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    private static native void nativeRelease(long nativeObject);
4336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    private static native void nativeDestroy(long nativeObject);
4447e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang    private static native void nativeDisconnect(long nativeObject);
4529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian
4629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian    private static native Bitmap nativeScreenshot(IBinder displayToken,
479890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza            Rect sourceCrop, int width, int height, int minLayer, int maxLayer,
481d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews            boolean allLayers, boolean useIdentityTransform, int rotation);
496486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr    private static native GraphicBuffer nativeScreenshotToBuffer(IBinder displayToken,
506486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr            Rect sourceCrop, int width, int height, int minLayer, int maxLayer,
516486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr            boolean allLayers, boolean useIdentityTransform, int rotation);
520449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian    private static native void nativeScreenshot(IBinder displayToken, Surface consumer,
539890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza            Rect sourceCrop, int width, int height, int minLayer, int maxLayer,
549890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza            boolean allLayers, boolean useIdentityTransform);
5529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian
5629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian    private static native void nativeOpenTransaction();
57e9953b1752a583058e639ef3de456988ab6ef7bfRobert Carr    private static native void nativeCloseTransaction(boolean sync);
5829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian    private static native void nativeSetAnimationTransaction();
5929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian
6036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    private static native void nativeSetLayer(long nativeObject, int zorder);
61af422a8c5b902831cbd2c97c71bbeed71604dd2eRobert Carr    private static native void nativeSetRelativeLayer(long nativeObject, IBinder relativeTo,
62af422a8c5b902831cbd2c97c71bbeed71604dd2eRobert Carr            int zorder);
6336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    private static native void nativeSetPosition(long nativeObject, float x, float y);
646da3cc0237d2483ead16a7013d1326bccc5112afRobert Carr    private static native void nativeSetGeometryAppliesWithResize(long nativeObject);
6536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    private static native void nativeSetSize(long nativeObject, int w, int h);
6636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    private static native void nativeSetTransparentRegionHint(long nativeObject, Region region);
6736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    private static native void nativeSetAlpha(long nativeObject, float alpha);
6836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    private static native void nativeSetMatrix(long nativeObject, float dsdx, float dtdx, float dsdy, float dtdy);
6936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    private static native void nativeSetFlags(long nativeObject, int flags, int mask);
7036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    private static native void nativeSetWindowCrop(long nativeObject, int l, int t, int r, int b);
7127982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos    private static native void nativeSetFinalCrop(long nativeObject, int l, int t, int r, int b);
7236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    private static native void nativeSetLayerStack(long nativeObject, int layerStack);
7329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian
741376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav    private static native boolean nativeClearContentFrameStats(long nativeObject);
751376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav    private static native boolean nativeGetContentFrameStats(long nativeObject, WindowContentFrameStats outStats);
761376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav    private static native boolean nativeClearAnimationFrameStats();
771376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav    private static native boolean nativeGetAnimationFrameStats(WindowAnimationFrameStats outStats);
781376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav
7929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian    private static native IBinder nativeGetBuiltInDisplay(int physicalDisplayId);
8029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian    private static native IBinder nativeCreateDisplay(String name, boolean secure);
816a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall    private static native void nativeDestroyDisplay(IBinder displayToken);
8229479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian    private static native void nativeSetDisplaySurface(
8336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat            IBinder displayToken, long nativeSurfaceObject);
8429479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian    private static native void nativeSetDisplayLayerStack(
8529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian            IBinder displayToken, int layerStack);
8629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian    private static native void nativeSetDisplayProjection(
8729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian            IBinder displayToken, int orientation,
886a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall            int l, int t, int r, int b,
8929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian            int L, int T, int R, int B);
9001e840ff9441e005153d799e71d65b38bcb21902Michael Wright    private static native void nativeSetDisplaySize(IBinder displayToken, int width, int height);
9100101052b5bf99a29acea3525864ed64b709c16cDan Stoza    private static native SurfaceControl.PhysicalDisplayInfo[] nativeGetDisplayConfigs(
9200101052b5bf99a29acea3525864ed64b709c16cDan Stoza            IBinder displayToken);
9300101052b5bf99a29acea3525864ed64b709c16cDan Stoza    private static native int nativeGetActiveConfig(IBinder displayToken);
9400101052b5bf99a29acea3525864ed64b709c16cDan Stoza    private static native boolean nativeSetActiveConfig(IBinder displayToken, int id);
951c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    private static native int[] nativeGetDisplayColorModes(IBinder displayToken);
961c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    private static native int nativeGetActiveColorMode(IBinder displayToken);
971c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    private static native boolean nativeSetActiveColorMode(IBinder displayToken,
981c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright            int colorMode);
99c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani    private static native void nativeSetDisplayPowerMode(
100c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani            IBinder displayToken, int mode);
10164e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carr    private static native void nativeDeferTransactionUntil(long nativeObject,
10264e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carr            IBinder handle, long frame);
103d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr    private static native void nativeDeferTransactionUntilSurface(long nativeObject,
104d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr            long surfaceObject, long frame);
105d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr    private static native void nativeReparentChildren(long nativeObject,
106d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr            IBinder handle);
107d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr    private static native void nativeSeverChildren(long nativeObject);
1081ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr    private static native void nativeSetOverrideScalingMode(long nativeObject,
1091ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr            int scalingMode);
11064e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carr    private static native IBinder nativeGetHandle(long nativeObject);
1116da3cc0237d2483ead16a7013d1326bccc5112afRobert Carr    private static native boolean nativeGetTransformToDisplayInverse(long nativeObject);
1126da3cc0237d2483ead16a7013d1326bccc5112afRobert Carr
1139ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright    private static native Display.HdrCapabilities nativeGetHdrCapabilities(IBinder displayToken);
11429479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian
11529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian
1163866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    private final CloseGuard mCloseGuard = CloseGuard.get();
117a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkin    private final String mName;
11836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    long mNativeObject; // package visibility only for Surface.java access
1193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
1203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /* flags used in constructor (keep in sync with ISurfaceComposerClient.h) */
1213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
1223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
1233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Surface creation flag: Surface is created hidden
1243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
1253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static final int HIDDEN = 0x00000004;
1263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
1273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
1283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Surface creation flag: The surface contains secure content, special
1293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * measures will be taken to disallow the surface's content to be copied
1303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * from another process. In particular, screenshots and VNC servers will
1313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * be disabled, but other measures can take place, for instance the
1326a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall     * surface might not be hardware accelerated.
1333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     *
1343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
1353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static final int SECURE = 0x00000080;
1363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
1373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
1383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Surface creation flag: Creates a surface where color components are interpreted
1393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * as "non pre-multiplied" by their alpha channel. Of course this flag is
1403866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * meaningless for surfaces without an alpha channel. By default
1413866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * surfaces are pre-multiplied, which means that each color component is
1423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * already multiplied by its alpha value. In this case the blending
1433866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * equation used is:
144314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * <p>
145314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     *    <code>DEST = SRC + DEST * (1-SRC_ALPHA)</code>
146314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * <p>
1473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * By contrast, non pre-multiplied surfaces use the following equation:
148314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * <p>
149314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     *    <code>DEST = SRC * SRC_ALPHA * DEST * (1-SRC_ALPHA)</code>
150314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * <p>
1513866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * pre-multiplied surfaces must always be used if transparent pixels are
1523866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * composited on top of each-other into the surface. A pre-multiplied
1533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * surface can never lower the value of the alpha component of a given
1543866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * pixel.
155314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * <p>
1563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * In some rare situations, a non pre-multiplied surface is preferable.
1573866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     *
1583866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
1593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static final int NON_PREMULTIPLIED = 0x00000100;
1603866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
1613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
1623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Surface creation flag: Indicates that the surface must be considered opaque,
1633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * even if its pixel format is set to translucent. This can be useful if an
1643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * application needs full RGBA 8888 support for instance but will
1653866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * still draw every pixel opaque.
166314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * <p>
167314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * This flag is ignored if setAlpha() is used to make the surface non-opaque.
168314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * Combined effects are (assuming a buffer format with an alpha channel):
169314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * <ul>
170314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * <li>OPAQUE + alpha(1.0) == opaque composition
171314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * <li>OPAQUE + alpha(0.x) == blended composition
172314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * <li>!OPAQUE + alpha(1.0) == blended composition
173314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * <li>!OPAQUE + alpha(0.x) == blended composition
174314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * </ul>
175314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * If the underlying buffer lacks an alpha channel, the OPAQUE flag is effectively
176314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * set automatically.
1773866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
1783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static final int OPAQUE = 0x00000400;
1793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
1803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
1813866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Surface creation flag: Application requires a hardware-protected path to an
1823866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * external display sink. If a hardware-protected path is not available,
1833866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * then this surface will not be displayed on the external sink.
1843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     *
1853866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
1863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static final int PROTECTED_APP = 0x00000800;
1873866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
1883866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    // 0x1000 is reserved for an independent DRM protected flag in framework
1893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
1903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
19168eccdade2aad22b7eb34a28572c204dcd54f7b9Riley Andrews     * Surface creation flag: Window represents a cursor glyph.
19268eccdade2aad22b7eb34a28572c204dcd54f7b9Riley Andrews     */
19368eccdade2aad22b7eb34a28572c204dcd54f7b9Riley Andrews    public static final int CURSOR_WINDOW = 0x00002000;
19468eccdade2aad22b7eb34a28572c204dcd54f7b9Riley Andrews
19568eccdade2aad22b7eb34a28572c204dcd54f7b9Riley Andrews    /**
1963866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Surface creation flag: Creates a normal surface.
1973866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * This is the default.
1983866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     *
1993866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
2003866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static final int FX_SURFACE_NORMAL   = 0x00000000;
2013866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
2023866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
2033866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Surface creation flag: Creates a Dim surface.
2043866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Everything behind this surface is dimmed by the amount specified
2053866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * in {@link #setAlpha}.  It is an error to lock a Dim surface, since it
2063866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * doesn't have a backing store.
2073866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     *
2083866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
2093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static final int FX_SURFACE_DIM = 0x00020000;
2103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
2113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
2123866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Mask used for FX values above.
2133866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     *
2143866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
2153866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static final int FX_SURFACE_MASK = 0x000F0000;
2163866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
2173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /* flags used with setFlags() (keep in sync with ISurfaceComposer.h) */
2183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
2193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
2203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Surface flag: Hide the surface.
2213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Equivalent to calling hide().
222314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * Updates the value set during Surface creation (see {@link #HIDDEN}).
2233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
22440b9ef1e2d91615cba6fb5d9527f81090a705026Andy McFadden    private static final int SURFACE_HIDDEN = 0x01;
2253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
226314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden    /**
227314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * Surface flag: composite without blending when possible.
228314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * Updates the value set during Surface creation (see {@link #OPAQUE}).
229314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     */
23040b9ef1e2d91615cba6fb5d9527f81090a705026Andy McFadden    private static final int SURFACE_OPAQUE = 0x02;
231314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden
2323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
2333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /* built-in physical display ids (keep in sync with ISurfaceComposer.h)
2343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * these are different from the logical display ids used elsewhere in the framework */
2353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
2363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
2373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Built-in physical display id: Main display.
23840b9ef1e2d91615cba6fb5d9527f81090a705026Andy McFadden     * Use only with {@link SurfaceControl#getBuiltInDisplay(int)}.
2393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
2403866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static final int BUILT_IN_DISPLAY_ID_MAIN = 0;
2413866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
2423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
2433866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Built-in physical display id: Attached HDMI display.
24440b9ef1e2d91615cba6fb5d9527f81090a705026Andy McFadden     * Use only with {@link SurfaceControl#getBuiltInDisplay(int)}.
2453866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
2463866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static final int BUILT_IN_DISPLAY_ID_HDMI = 1;
2473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
248c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani    /* Display power modes * /
249c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani
250c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani    /**
251c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani     * Display power mode off: used while blanking the screen.
2525dc219142a756d57355b511c8f8ab913c01710daJeff Brown     * Use only with {@link SurfaceControl#setDisplayPowerMode}.
253c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani     */
254c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani    public static final int POWER_MODE_OFF = 0;
255c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani
256c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani    /**
257c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani     * Display power mode doze: used while putting the screen into low power mode.
2585dc219142a756d57355b511c8f8ab913c01710daJeff Brown     * Use only with {@link SurfaceControl#setDisplayPowerMode}.
259c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani     */
260c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani    public static final int POWER_MODE_DOZE = 1;
261c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani
262c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani    /**
263c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani     * Display power mode normal: used while unblanking the screen.
2645dc219142a756d57355b511c8f8ab913c01710daJeff Brown     * Use only with {@link SurfaceControl#setDisplayPowerMode}.
265c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani     */
266c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani    public static final int POWER_MODE_NORMAL = 2;
2673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
2685dc219142a756d57355b511c8f8ab913c01710daJeff Brown    /**
2695dc219142a756d57355b511c8f8ab913c01710daJeff Brown     * Display power mode doze: used while putting the screen into a suspended
2705dc219142a756d57355b511c8f8ab913c01710daJeff Brown     * low power mode.  Use only with {@link SurfaceControl#setDisplayPowerMode}.
2715dc219142a756d57355b511c8f8ab913c01710daJeff Brown     */
2725dc219142a756d57355b511c8f8ab913c01710daJeff Brown    public static final int POWER_MODE_DOZE_SUSPEND = 3;
2733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
2743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
2753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Create a surface with a name.
276314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * <p>
2773866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * The surface creation flags specify what kind of surface to create and
2783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * certain options such as whether the surface can be assumed to be opaque
2793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * and whether it should be initially hidden.  Surfaces should always be
2803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * created with the {@link #HIDDEN} flag set to ensure that they are not
2813866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * made visible prematurely before all of the surface's properties have been
2823866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * configured.
283314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * <p>
2843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Good practice is to first create the surface with the {@link #HIDDEN} flag
2853866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * specified, open a transaction, set the surface layer, layer stack, alpha,
2863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * and position, call {@link #show} if appropriate, and close the transaction.
2873866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     *
2883866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * @param session The surface session, must not be null.
2893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * @param name The surface name, must not be null.
2903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * @param w The surface initial width.
2913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * @param h The surface initial height.
2923866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * @param flags The surface creation flags.  Should always include {@link #HIDDEN}
2933866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * in the creation flags.
2943bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk     * @param windowType The type of the window as specified in WindowManager.java.
2953bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk     * @param ownerUid A unique per-app ID.
296a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkin     *
297a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkin     * @throws throws OutOfResourcesException If the SurfaceControl cannot be created.
2983866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
2993866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public SurfaceControl(SurfaceSession session,
3003bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk            String name, int w, int h, int format, int flags, int windowType, int ownerUid)
3013866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                    throws OutOfResourcesException {
3023bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk        this(session, name, w, h, format, flags, null, windowType, ownerUid);
303838120c9db673d5ad5a614ad1fa9a2cf8030b8ebRobert Carr    }
304838120c9db673d5ad5a614ad1fa9a2cf8030b8ebRobert Carr
305838120c9db673d5ad5a614ad1fa9a2cf8030b8ebRobert Carr    public SurfaceControl(SurfaceSession session,
3063bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk            String name, int w, int h, int format, int flags)
3073bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk                    throws OutOfResourcesException {
308e4338f843b234b8651d20aef15c901cbd6847bfcAlbert Chaulk        this(session, name, w, h, format, flags, null, INVALID_WINDOW_TYPE, Binder.getCallingUid());
3093bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk    }
3103bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk
3113bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk    public SurfaceControl(SurfaceSession session, String name, int w, int h, int format, int flags,
3123bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk            SurfaceControl parent, int windowType, int ownerUid)
313838120c9db673d5ad5a614ad1fa9a2cf8030b8ebRobert Carr                    throws OutOfResourcesException {
3143866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (session == null) {
3153866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            throw new IllegalArgumentException("session must not be null");
3163866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
3173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (name == null) {
3183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            throw new IllegalArgumentException("name must not be null");
3193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
3203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
3213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if ((flags & SurfaceControl.HIDDEN) == 0) {
3223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            Log.w(TAG, "Surfaces should always be created with the HIDDEN flag set "
3233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                    + "to ensure that they are not made visible prematurely before "
3243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                    + "all of the surface's properties have been configured.  "
3253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                    + "Set the other properties and make the surface visible within "
3263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                    + "a transaction.  New surface name: " + name,
3273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                    new Throwable());
3283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
3293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
3303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        mName = name;
3313bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk        mNativeObject = nativeCreate(session, name, w, h, format, flags,
3323bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk            parent != null ? parent.mNativeObject : 0, windowType, ownerUid);
3333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (mNativeObject == 0) {
3343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            throw new OutOfResourcesException(
3353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                    "Couldn't allocate SurfaceControl native object");
3363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
3376a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall
3383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        mCloseGuard.open("release");
3393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
3406a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall
3413b716249cc2f94aa9842576b618998c28593be90Robert Carr    // This is a transfer constructor, useful for transferring a live SurfaceControl native
3423b716249cc2f94aa9842576b618998c28593be90Robert Carr    // object to another Java wrapper which could have some different behavior, e.g.
3433b716249cc2f94aa9842576b618998c28593be90Robert Carr    // event logging.
3443b716249cc2f94aa9842576b618998c28593be90Robert Carr    public SurfaceControl(SurfaceControl other) {
3453b716249cc2f94aa9842576b618998c28593be90Robert Carr        mName = other.mName;
3463b716249cc2f94aa9842576b618998c28593be90Robert Carr        mNativeObject = other.mNativeObject;
3473b716249cc2f94aa9842576b618998c28593be90Robert Carr        other.mCloseGuard.close();
3483b716249cc2f94aa9842576b618998c28593be90Robert Carr        other.mNativeObject = 0;
3493b716249cc2f94aa9842576b618998c28593be90Robert Carr        mCloseGuard.open("release");
3503b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
3513b716249cc2f94aa9842576b618998c28593be90Robert Carr
3523866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    @Override
3533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    protected void finalize() throws Throwable {
3543866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        try {
3553866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            if (mCloseGuard != null) {
3563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                mCloseGuard.warnIfOpen();
3573866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            }
3583866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            if (mNativeObject != 0) {
3593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                nativeRelease(mNativeObject);
3603866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            }
3613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        } finally {
3623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            super.finalize();
3633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
3643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
3653866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
3663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    @Override
3673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public String toString() {
3683866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        return "Surface(name=" + mName + ")";
3693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
3703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
3713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
3723866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Release the local reference to the server-side surface.
3733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Always call release() when you're done with a Surface.
3743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * This will make the surface invalid.
3753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
3763866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public void release() {
3773866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (mNativeObject != 0) {
3783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            nativeRelease(mNativeObject);
3793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            mNativeObject = 0;
3803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
3813866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        mCloseGuard.close();
3823866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
3833866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
3843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
3853866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Free all server-side state associated with this surface and
3863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * release this object's reference.  This method can only be
3873866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * called from the process that created the service.
3883866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
3893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public void destroy() {
3903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (mNativeObject != 0) {
3913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            nativeDestroy(mNativeObject);
3923866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            mNativeObject = 0;
3933866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
3943866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        mCloseGuard.close();
3953866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
3963866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
39747e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang    /**
39847e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang     * Disconnect any client still connected to the surface.
39947e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang     */
40047e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang    public void disconnect() {
40147e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang        if (mNativeObject != 0) {
40247e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang            nativeDisconnect(mNativeObject);
40347e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang        }
40447e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang    }
40547e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang
4063866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    private void checkNotReleased() {
4073866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (mNativeObject == 0) throw new NullPointerException(
4083866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                "mNativeObject is null. Have you called release() already?");
4093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
4106a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall
4113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /*
4123866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * set surface parameters.
4133866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * needs to be inside open/closeTransaction block
4143866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
4153866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
4163866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /** start a transaction */
4173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static void openTransaction() {
4183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        nativeOpenTransaction();
4193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
4203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
4213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /** end a transaction */
4223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static void closeTransaction() {
423e9953b1752a583058e639ef3de456988ab6ef7bfRobert Carr        nativeCloseTransaction(false);
424e9953b1752a583058e639ef3de456988ab6ef7bfRobert Carr    }
425e9953b1752a583058e639ef3de456988ab6ef7bfRobert Carr
426e9953b1752a583058e639ef3de456988ab6ef7bfRobert Carr    public static void closeTransactionSync() {
427e9953b1752a583058e639ef3de456988ab6ef7bfRobert Carr        nativeCloseTransaction(true);
4283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
4293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
43064e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carr    public void deferTransactionUntil(IBinder handle, long frame) {
431d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr        if (frame > 0) {
432d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr            nativeDeferTransactionUntil(mNativeObject, handle, frame);
433d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr        }
434d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr    }
435d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr
436d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr    public void deferTransactionUntil(Surface barrier, long frame) {
437d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr        if (frame > 0) {
438d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr            nativeDeferTransactionUntilSurface(mNativeObject, barrier.mNativeObject, frame);
439d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr        }
440d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr    }
441d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr
442d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr    public void reparentChildren(IBinder newParentHandle) {
443d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr        nativeReparentChildren(mNativeObject, newParentHandle);
444d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr    }
445d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr
446d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr    public void detachChildren() {
447d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr        nativeSeverChildren(mNativeObject);
44864e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carr    }
44964e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carr
4501ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr    public void setOverrideScalingMode(int scalingMode) {
4511ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr        checkNotReleased();
4521ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr        nativeSetOverrideScalingMode(mNativeObject, scalingMode);
4531ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr    }
4541ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr
45564e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carr    public IBinder getHandle() {
45664e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carr        return nativeGetHandle(mNativeObject);
45764e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carr    }
45864e516f5fa56d71bf6b5076e5620c30dc5810ba1Rob Carr
4593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /** flag the transaction as an animation */
4603866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static void setAnimationTransaction() {
4613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        nativeSetAnimationTransaction();
4623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
4633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
4643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public void setLayer(int zorder) {
4653866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        checkNotReleased();
4663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        nativeSetLayer(mNativeObject, zorder);
4673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
4683866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
469af422a8c5b902831cbd2c97c71bbeed71604dd2eRobert Carr    public void setRelativeLayer(IBinder relativeTo, int zorder) {
470af422a8c5b902831cbd2c97c71bbeed71604dd2eRobert Carr        checkNotReleased();
471af422a8c5b902831cbd2c97c71bbeed71604dd2eRobert Carr        nativeSetRelativeLayer(mNativeObject, relativeTo, zorder);
472af422a8c5b902831cbd2c97c71bbeed71604dd2eRobert Carr    }
473af422a8c5b902831cbd2c97c71bbeed71604dd2eRobert Carr
4743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public void setPosition(float x, float y) {
4753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        checkNotReleased();
4763866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        nativeSetPosition(mNativeObject, x, y);
4773866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
4783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
479a9408d4a4809dd229fb7fb8f9594cb6db4b1da64Robert Carr    /**
4806da3cc0237d2483ead16a7013d1326bccc5112afRobert Carr     * If the buffer size changes in this transaction, position and crop updates specified
481a9408d4a4809dd229fb7fb8f9594cb6db4b1da64Robert Carr     * in this transaction will not complete until a buffer of the new size
4826da3cc0237d2483ead16a7013d1326bccc5112afRobert Carr     * arrives. As transform matrix and size are already frozen in this fashion,
4836da3cc0237d2483ead16a7013d1326bccc5112afRobert Carr     * this enables totally freezing the surface until the resize has completed
4846da3cc0237d2483ead16a7013d1326bccc5112afRobert Carr     * (at which point the geometry influencing aspects of this transaction will then occur)
485a9408d4a4809dd229fb7fb8f9594cb6db4b1da64Robert Carr     */
4866da3cc0237d2483ead16a7013d1326bccc5112afRobert Carr    public void setGeometryAppliesWithResize() {
487a9408d4a4809dd229fb7fb8f9594cb6db4b1da64Robert Carr        checkNotReleased();
4886da3cc0237d2483ead16a7013d1326bccc5112afRobert Carr        nativeSetGeometryAppliesWithResize(mNativeObject);
489a9408d4a4809dd229fb7fb8f9594cb6db4b1da64Robert Carr    }
490a9408d4a4809dd229fb7fb8f9594cb6db4b1da64Robert Carr
4913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public void setSize(int w, int h) {
4923866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        checkNotReleased();
4933866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        nativeSetSize(mNativeObject, w, h);
4943866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
4953866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
4963866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public void hide() {
4973866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        checkNotReleased();
4983866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        nativeSetFlags(mNativeObject, SURFACE_HIDDEN, SURFACE_HIDDEN);
4993866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
5003866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
5013866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public void show() {
5023866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        checkNotReleased();
5033866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        nativeSetFlags(mNativeObject, 0, SURFACE_HIDDEN);
5043866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
5053866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
5063866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public void setTransparentRegionHint(Region region) {
5073866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        checkNotReleased();
5083866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        nativeSetTransparentRegionHint(mNativeObject, region);
5093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
5103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
5111376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav    public boolean clearContentFrameStats() {
5121376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav        checkNotReleased();
5131376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav        return nativeClearContentFrameStats(mNativeObject);
5141376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav    }
5151376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav
5161376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav    public boolean getContentFrameStats(WindowContentFrameStats outStats) {
5171376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav        checkNotReleased();
5181376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav        return nativeGetContentFrameStats(mNativeObject, outStats);
5191376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav    }
5201376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav
5211376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav    public static boolean clearAnimationFrameStats() {
5221376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav        return nativeClearAnimationFrameStats();
5231376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav    }
5241376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav
5251376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav    public static boolean getAnimationFrameStats(WindowAnimationFrameStats outStats) {
5261376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav        return nativeGetAnimationFrameStats(outStats);
5271376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav    }
5281376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav
529314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden    /**
530314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * Sets an alpha value for the entire Surface.  This value is combined with the
531314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * per-pixel alpha.  It may be used with opaque Surfaces.
532314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     */
5333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public void setAlpha(float alpha) {
5343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        checkNotReleased();
5353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        nativeSetAlpha(mNativeObject, alpha);
5363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
5373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
5380edf18f34c4dc81e45580bc0a3b3b9b072caa725Robert Carr    public void setMatrix(float dsdx, float dtdx, float dtdy, float dsdy) {
5393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        checkNotReleased();
5400edf18f34c4dc81e45580bc0a3b3b9b072caa725Robert Carr        nativeSetMatrix(mNativeObject, dsdx, dtdx, dtdy, dsdy);
5413866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
5423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
5433866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public void setWindowCrop(Rect crop) {
5443866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        checkNotReleased();
5453866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (crop != null) {
5466a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall            nativeSetWindowCrop(mNativeObject,
5473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                crop.left, crop.top, crop.right, crop.bottom);
5483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        } else {
5493866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            nativeSetWindowCrop(mNativeObject, 0, 0, 0, 0);
5503866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
5513866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
5523866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
55327982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos    public void setFinalCrop(Rect crop) {
55427982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos        checkNotReleased();
55527982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos        if (crop != null) {
55627982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos            nativeSetFinalCrop(mNativeObject,
55727982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos                crop.left, crop.top, crop.right, crop.bottom);
55827982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos        } else {
55927982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos            nativeSetFinalCrop(mNativeObject, 0, 0, 0, 0);
56027982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos        }
56127982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos    }
56227982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos
5633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public void setLayerStack(int layerStack) {
5643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        checkNotReleased();
5653866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        nativeSetLayerStack(mNativeObject, layerStack);
5663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
5673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
568314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden    /**
569314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * Sets the opacity of the surface.  Setting the flag is equivalent to creating the
570314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     * Surface with the {@link #OPAQUE} flag.
571314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden     */
572314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden    public void setOpaque(boolean isOpaque) {
573314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden        checkNotReleased();
574314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden        if (isOpaque) {
575314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden            nativeSetFlags(mNativeObject, SURFACE_OPAQUE, SURFACE_OPAQUE);
576314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden        } else {
577314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden            nativeSetFlags(mNativeObject, 0, SURFACE_OPAQUE);
578314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden        }
579314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden    }
580314405bf891904d1bbeeaf0f9fc387c1a1aded9aAndy McFadden
581f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale    /**
582f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale     * Sets the security of the surface.  Setting the flag is equivalent to creating the
583f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale     * Surface with the {@link #SECURE} flag.
584f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale     */
585f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale    public void setSecure(boolean isSecure) {
586f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale        checkNotReleased();
587f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale        if (isSecure) {
588f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale            nativeSetFlags(mNativeObject, SECURE, SECURE);
589f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale        } else {
590f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale            nativeSetFlags(mNativeObject, 0, SECURE);
591f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale        }
592f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale    }
593f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale
5943866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /*
5953866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * set display parameters.
5963866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * needs to be inside open/closeTransaction block
5973866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
5983866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
5993866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
6003866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Describes the properties of a physical display known to surface flinger.
6013866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
6023866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static final class PhysicalDisplayInfo {
6033866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        public int width;
6043866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        public int height;
6053866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        public float refreshRate;
6063866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        public float density;
6073866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        public float xDpi;
6083866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        public float yDpi;
6093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        public boolean secure;
610e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        public long appVsyncOffsetNanos;
611e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        public long presentationDeadlineNanos;
6126a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall
6133866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        public PhysicalDisplayInfo() {
6143866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
6156a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall
6163866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        public PhysicalDisplayInfo(PhysicalDisplayInfo other) {
6173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            copyFrom(other);
6183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
6196a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall
6203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        @Override
6213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        public boolean equals(Object o) {
6223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            return o instanceof PhysicalDisplayInfo && equals((PhysicalDisplayInfo)o);
6233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
6246a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall
6253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        public boolean equals(PhysicalDisplayInfo other) {
6263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            return other != null
6273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                    && width == other.width
6283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                    && height == other.height
6293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                    && refreshRate == other.refreshRate
6303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                    && density == other.density
6313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                    && xDpi == other.xDpi
6323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                    && yDpi == other.yDpi
633e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden                    && secure == other.secure
634e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden                    && appVsyncOffsetNanos == other.appVsyncOffsetNanos
6351c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright                    && presentationDeadlineNanos == other.presentationDeadlineNanos;
6363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
6376a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall
6383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        @Override
6393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        public int hashCode() {
6403866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            return 0; // don't care
6413866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
6426a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall
6433866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        public void copyFrom(PhysicalDisplayInfo other) {
6443866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            width = other.width;
6453866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            height = other.height;
6463866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            refreshRate = other.refreshRate;
6473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            density = other.density;
6483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            xDpi = other.xDpi;
6493866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            yDpi = other.yDpi;
6503866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            secure = other.secure;
651e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden            appVsyncOffsetNanos = other.appVsyncOffsetNanos;
652e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden            presentationDeadlineNanos = other.presentationDeadlineNanos;
6533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
6546a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall
6553866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        // For debugging purposes
6563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        @Override
6573866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        public String toString() {
6583866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            return "PhysicalDisplayInfo{" + width + " x " + height + ", " + refreshRate + " fps, "
6593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                    + "density " + density + ", " + xDpi + " x " + yDpi + " dpi, secure " + secure
660e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden                    + ", appVsyncOffset " + appVsyncOffsetNanos
6611c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright                    + ", bufferDeadline " + presentationDeadlineNanos + "}";
6623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
6633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
6643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
665c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani    public static void setDisplayPowerMode(IBinder displayToken, int mode) {
6663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (displayToken == null) {
6673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            throw new IllegalArgumentException("displayToken must not be null");
6683866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
669c55929a2a5686fe456b19cd54a73b8bde2a4332bPrashant Malani        nativeSetDisplayPowerMode(displayToken, mode);
6703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
6713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
67200101052b5bf99a29acea3525864ed64b709c16cDan Stoza    public static SurfaceControl.PhysicalDisplayInfo[] getDisplayConfigs(IBinder displayToken) {
6733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (displayToken == null) {
6743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            throw new IllegalArgumentException("displayToken must not be null");
6753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
67600101052b5bf99a29acea3525864ed64b709c16cDan Stoza        return nativeGetDisplayConfigs(displayToken);
67700101052b5bf99a29acea3525864ed64b709c16cDan Stoza    }
67800101052b5bf99a29acea3525864ed64b709c16cDan Stoza
67900101052b5bf99a29acea3525864ed64b709c16cDan Stoza    public static int getActiveConfig(IBinder displayToken) {
68000101052b5bf99a29acea3525864ed64b709c16cDan Stoza        if (displayToken == null) {
68100101052b5bf99a29acea3525864ed64b709c16cDan Stoza            throw new IllegalArgumentException("displayToken must not be null");
68200101052b5bf99a29acea3525864ed64b709c16cDan Stoza        }
68300101052b5bf99a29acea3525864ed64b709c16cDan Stoza        return nativeGetActiveConfig(displayToken);
68400101052b5bf99a29acea3525864ed64b709c16cDan Stoza    }
68500101052b5bf99a29acea3525864ed64b709c16cDan Stoza
68600101052b5bf99a29acea3525864ed64b709c16cDan Stoza    public static boolean setActiveConfig(IBinder displayToken, int id) {
68700101052b5bf99a29acea3525864ed64b709c16cDan Stoza        if (displayToken == null) {
68800101052b5bf99a29acea3525864ed64b709c16cDan Stoza            throw new IllegalArgumentException("displayToken must not be null");
6893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
69000101052b5bf99a29acea3525864ed64b709c16cDan Stoza        return nativeSetActiveConfig(displayToken, id);
6913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
6923866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
6931c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    public static int[] getDisplayColorModes(IBinder displayToken) {
6941c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        if (displayToken == null) {
6951c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright            throw new IllegalArgumentException("displayToken must not be null");
6961c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        }
6971c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        return nativeGetDisplayColorModes(displayToken);
6981c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    }
6991c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright
7001c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    public static int getActiveColorMode(IBinder displayToken) {
7011c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        if (displayToken == null) {
7021c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright            throw new IllegalArgumentException("displayToken must not be null");
7031c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        }
7041c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        return nativeGetActiveColorMode(displayToken);
7051c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    }
7061c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright
7071c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    public static boolean setActiveColorMode(IBinder displayToken, int colorMode) {
7081c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        if (displayToken == null) {
7091c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright            throw new IllegalArgumentException("displayToken must not be null");
7101c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        }
7111c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        return nativeSetActiveColorMode(displayToken, colorMode);
7121c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    }
7131c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright
7143866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static void setDisplayProjection(IBinder displayToken,
7153866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            int orientation, Rect layerStackRect, Rect displayRect) {
7163866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (displayToken == null) {
7173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            throw new IllegalArgumentException("displayToken must not be null");
7183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
7193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (layerStackRect == null) {
7203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            throw new IllegalArgumentException("layerStackRect must not be null");
7213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
7223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (displayRect == null) {
7233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            throw new IllegalArgumentException("displayRect must not be null");
7243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
7253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        nativeSetDisplayProjection(displayToken, orientation,
7266a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall                layerStackRect.left, layerStackRect.top, layerStackRect.right, layerStackRect.bottom,
7273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                displayRect.left, displayRect.top, displayRect.right, displayRect.bottom);
7283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
7293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
7303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static void setDisplayLayerStack(IBinder displayToken, int layerStack) {
7313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (displayToken == null) {
7323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            throw new IllegalArgumentException("displayToken must not be null");
7333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
7343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        nativeSetDisplayLayerStack(displayToken, layerStack);
7353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
7363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
7373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static void setDisplaySurface(IBinder displayToken, Surface surface) {
7383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (displayToken == null) {
7393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            throw new IllegalArgumentException("displayToken must not be null");
7403866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
741fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown
742fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown        if (surface != null) {
743fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown            synchronized (surface.mLock) {
744fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown                nativeSetDisplaySurface(displayToken, surface.mNativeObject);
745fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown            }
746fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown        } else {
747fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown            nativeSetDisplaySurface(displayToken, 0);
748fc0ebd7d379ff63c00ebf78ca252fab5070213daJeff Brown        }
7493866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
7503866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
75101e840ff9441e005153d799e71d65b38bcb21902Michael Wright    public static void setDisplaySize(IBinder displayToken, int width, int height) {
75201e840ff9441e005153d799e71d65b38bcb21902Michael Wright        if (displayToken == null) {
75301e840ff9441e005153d799e71d65b38bcb21902Michael Wright            throw new IllegalArgumentException("displayToken must not be null");
75401e840ff9441e005153d799e71d65b38bcb21902Michael Wright        }
75501e840ff9441e005153d799e71d65b38bcb21902Michael Wright        if (width <= 0 || height <= 0) {
75601e840ff9441e005153d799e71d65b38bcb21902Michael Wright            throw new IllegalArgumentException("width and height must be positive");
75701e840ff9441e005153d799e71d65b38bcb21902Michael Wright        }
75801e840ff9441e005153d799e71d65b38bcb21902Michael Wright
75901e840ff9441e005153d799e71d65b38bcb21902Michael Wright        nativeSetDisplaySize(displayToken, width, height);
76001e840ff9441e005153d799e71d65b38bcb21902Michael Wright    }
76101e840ff9441e005153d799e71d65b38bcb21902Michael Wright
7629ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright    public static Display.HdrCapabilities getHdrCapabilities(IBinder displayToken) {
7639ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright        if (displayToken == null) {
7649ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright            throw new IllegalArgumentException("displayToken must not be null");
7659ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright        }
7669ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright        return nativeGetHdrCapabilities(displayToken);
7679ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright    }
7689ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright
7693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static IBinder createDisplay(String name, boolean secure) {
7703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (name == null) {
7713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            throw new IllegalArgumentException("name must not be null");
7723866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        }
7733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        return nativeCreateDisplay(name, secure);
7743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
7753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
7766a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall    public static void destroyDisplay(IBinder displayToken) {
7776a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall        if (displayToken == null) {
7786a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall            throw new IllegalArgumentException("displayToken must not be null");
7796a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall        }
7806a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall        nativeDestroyDisplay(displayToken);
7816a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall    }
7826a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall
7833866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static IBinder getBuiltInDisplay(int builtInDisplayId) {
7843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        return nativeGetBuiltInDisplay(builtInDisplayId);
7853866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
7863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
7870449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian    /**
7880449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * Copy the current screen contents into the provided {@link Surface}
7890449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     *
7900449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * @param display The display to take the screenshot of.
7910449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * @param consumer The {@link Surface} to take the screenshot into.
7920449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * @param width The desired width of the returned bitmap; the raw
7930449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * screen will be scaled down to this size.
7940449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * @param height The desired height of the returned bitmap; the raw
7950449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * screen will be scaled down to this size.
7960449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * @param minLayer The lowest (bottom-most Z order) surface layer to
7970449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * include in the screenshot.
7980449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * @param maxLayer The highest (top-most Z order) surface layer to
7990449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * include in the screenshot.
80016ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza     * @param useIdentityTransform Replace whatever transformation (rotation,
80116ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza     * scaling, translation) the surface layers are currently using with the
80216ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza     * identity transformation while taking the screenshot.
8030449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     */
8040449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian    public static void screenshot(IBinder display, Surface consumer,
80516ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza            int width, int height, int minLayer, int maxLayer,
80616ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza            boolean useIdentityTransform) {
8079890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza        screenshot(display, consumer, new Rect(), width, height, minLayer, maxLayer,
8089890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza                false, useIdentityTransform);
8090449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian    }
8100449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian
8110449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian    /**
8120449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * Copy the current screen contents into the provided {@link Surface}
8130449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     *
8140449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * @param display The display to take the screenshot of.
8150449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * @param consumer The {@link Surface} to take the screenshot into.
8160449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * @param width The desired width of the returned bitmap; the raw
8170449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * screen will be scaled down to this size.
8180449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * @param height The desired height of the returned bitmap; the raw
8190449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * screen will be scaled down to this size.
8200449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     */
8210449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian    public static void screenshot(IBinder display, Surface consumer,
8220449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian            int width, int height) {
8239890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza        screenshot(display, consumer, new Rect(), width, height, 0, 0, true, false);
8240449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian    }
8250449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian
8260449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian    /**
8270449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * Copy the current screen contents into the provided {@link Surface}
8280449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     *
8290449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * @param display The display to take the screenshot of.
8300449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * @param consumer The {@link Surface} to take the screenshot into.
8310449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     */
8320449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian    public static void screenshot(IBinder display, Surface consumer) {
8339890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza        screenshot(display, consumer, new Rect(), 0, 0, 0, 0, true, false);
8340449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian    }
8350449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian
8363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
8373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * Copy the current screen contents into a bitmap and return it.
8383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     *
8390449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * CAVEAT: Versions of screenshot that return a {@link Bitmap} can
8400449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * be extremely slow; avoid use unless absolutely necessary; prefer
8410449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * the versions that use a {@link Surface} instead, such as
8420449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     * {@link SurfaceControl#screenshot(IBinder, Surface)}.
8430449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian     *
8449890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza     * @param sourceCrop The portion of the screen to capture into the Bitmap;
8459890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza     * caller may pass in 'new Rect()' if no cropping is desired.
8463866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * @param width The desired width of the returned bitmap; the raw
8473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * screen will be scaled down to this size.
8483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * @param height The desired height of the returned bitmap; the raw
8493866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * screen will be scaled down to this size.
8503866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * @param minLayer The lowest (bottom-most Z order) surface layer to
8513866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * include in the screenshot.
8523866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * @param maxLayer The highest (top-most Z order) surface layer to
8533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * include in the screenshot.
85416ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza     * @param useIdentityTransform Replace whatever transformation (rotation,
85516ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza     * scaling, translation) the surface layers are currently using with the
85616ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza     * identity transformation while taking the screenshot.
8571d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews     * @param rotation Apply a custom clockwise rotation to the screenshot, i.e.
8581d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews     * Surface.ROTATION_0,90,180,270. Surfaceflinger will always take
8591d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews     * screenshots in its native portrait orientation by default, so this is
8601d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews     * useful for returning screenshots that are independent of device
8611d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews     * orientation.
8623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     * @return Returns a Bitmap containing the screen contents, or null
86349ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian     * if an error occurs. Make sure to call Bitmap.recycle() as soon as
86449ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian     * possible, once its content is not needed anymore.
8653866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
8669890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza    public static Bitmap screenshot(Rect sourceCrop, int width, int height,
8671d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews            int minLayer, int maxLayer, boolean useIdentityTransform,
8681d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews            int rotation) {
8693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        // TODO: should take the display as a parameter
8700449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian        IBinder displayToken = SurfaceControl.getBuiltInDisplay(
8710449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian                SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN);
8729890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza        return nativeScreenshot(displayToken, sourceCrop, width, height,
8731d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews                minLayer, maxLayer, false, useIdentityTransform, rotation);
8743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
8753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian
8763866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    /**
8776486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr     * Like {@link SurfaceControl#screenshot(Rect, int, int, int, int, boolean, int)}
8786486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr     * but returns a GraphicBuffer.
8796486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr     */
8806486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr    public static GraphicBuffer screenshotToBuffer(Rect sourceCrop, int width, int height,
8816486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr            int minLayer, int maxLayer, boolean useIdentityTransform,
8826486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr            int rotation) {
8836486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr        IBinder displayToken = SurfaceControl.getBuiltInDisplay(
8846486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr                SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN);
8856486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr        return nativeScreenshotToBuffer(displayToken, sourceCrop, width, height,
8866486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr                minLayer, maxLayer, false, useIdentityTransform, rotation);
8876486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr    }
8886486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr
8896486d31dcbffb7179127a72ceefa11a1e726271fRobert Carr    /**
8901376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav     * Like {@link SurfaceControl#screenshot(int, int, int, int, boolean)} but
8911376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav     * includes all Surfaces in the screenshot.
89249ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian     *
89349ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian     * @param width The desired width of the returned bitmap; the raw
89449ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian     * screen will be scaled down to this size.
89549ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian     * @param height The desired height of the returned bitmap; the raw
89649ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian     * screen will be scaled down to this size.
89749ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian     * @return Returns a Bitmap containing the screen contents, or null
89849ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian     * if an error occurs. Make sure to call Bitmap.recycle() as soon as
89949ff2c615e53cd9c3e8b5e4792a68026fb079671Mathias Agopian     * possible, once its content is not needed anymore.
9003866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian     */
9013866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    public static Bitmap screenshot(int width, int height) {
9023866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        // TODO: should take the display as a parameter
9030449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian        IBinder displayToken = SurfaceControl.getBuiltInDisplay(
9040449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian                SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN);
9051d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews        return nativeScreenshot(displayToken, new Rect(), width, height, 0, 0, true,
9061d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews                false, Surface.ROTATION_0);
9073866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    }
9086a6bc216d15293886ad088bb0ca99aadb7df85dcJesse Hall
9099890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza    private static void screenshot(IBinder display, Surface consumer, Rect sourceCrop,
91016ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza            int width, int height, int minLayer, int maxLayer, boolean allLayers,
91116ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza            boolean useIdentityTransform) {
9120449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian        if (display == null) {
9130449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian            throw new IllegalArgumentException("displayToken must not be null");
9140449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian        }
9150449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian        if (consumer == null) {
9160449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian            throw new IllegalArgumentException("consumer must not be null");
9170449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian        }
9189890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza        nativeScreenshot(display, consumer, sourceCrop, width, height,
9199890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza                minLayer, maxLayer, allLayers, useIdentityTransform);
9200449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian    }
9213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian}
922