Surface.java revision 5d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshimaimport android.content.res.CompatibilityInfo.Translator;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.*;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
2338ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshimaimport android.util.DisplayMetrics;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handle on to a raw buffer that is being managed by the screen compositor.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Surface implements Parcelable {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String LOG_TAG = "Surface";
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* flags used in constructor (keep in sync with ISurfaceComposer.h) */
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Surface is created hidden */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int HIDDEN              = 0x00000004;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37317a6280cc109e873646e4652be1582d870eedfdMathias Agopian    /** The surface is to be used by hardware accelerators or DMA engines
38317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     * @deprecated this is ignored, this value is set automatically when needed.
39317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     */
40317a6280cc109e873646e4652be1582d870eedfdMathias Agopian    @Deprecated
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int HARDWARE            = 0x00000010;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implies "HARDWARE", the surface is to be used by the GPU
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * additionally the backbuffer is never preserved for these
45317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     * surfaces.
46317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     * @deprecated this is ignored, this value is set automatically when needed.
47317a6280cc109e873646e4652be1582d870eedfdMathias Agopian     */
48317a6280cc109e873646e4652be1582d870eedfdMathias Agopian    @Deprecated
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int GPU                 = 0x00000028;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The surface contains secure content, special measures will
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be taken to disallow the surface's content to be copied from
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * another process. In particular, screenshots and VNC servers will
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be disabled, but other measures can take place, for instance the
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * surface might not be hardware accelerated. */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SECURE              = 0x00000080;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a surface where color components are interpreted as
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  "non pre-multiplied" by their alpha channel. Of course this flag is
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  meaningless for surfaces without an alpha channel. By default
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  surfaces are pre-multiplied, which means that each color component is
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  already multiplied by its alpha value. In this case the blending
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  equation used is:
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *    DEST = SRC + DEST * (1-SRC_ALPHA)
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  By contrast, non pre-multiplied surfaces use the following equation:
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *    DEST = SRC * SRC_ALPHA * DEST * (1-SRC_ALPHA)
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  pre-multiplied surfaces must always be used if transparent pixels are
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  composited on top of each-other into the surface. A pre-multiplied
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  surface can never lower the value of the alpha component of a given
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  pixel.
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  In some rare situations, a non pre-multiplied surface is preferable.
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int NON_PREMULTIPLIED   = 0x00000100;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a surface without a rendering buffer. Instead, the content
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the surface must be pushed by an external entity. This is type
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of surface can be used for efficient camera preview or movie
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * play back.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int PUSH_BUFFERS        = 0x00000200;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a normal surface. This is the default */
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_NORMAL   = 0x00000000;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a Blur surface. Everything behind this surface is blurred
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by some amount. The quality and refresh speed of the blur effect
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is not settable or guaranteed.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is an error to lock a Blur surface, since it doesn't have
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a backing store.
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_BLUR     = 0x00010000;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a Dim surface. Everything behind this surface is dimmed
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by the amount specified in setAlpha().
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It is an error to lock a Dim surface, since it doesn't have
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a backing store.
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_DIM     = 0x00020000;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Mask used for FX values above */
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FX_SURFACE_MASK     = 0x000F0000;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* flags used with setFlags() (keep in sync with ISurfaceComposer.h) */
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Hide the surface. Equivalent to calling hide() */
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SURFACE_HIDDEN    = 0x01;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Freeze the surface. Equivalent to calling freeze() */
116c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian    public static final int SURFACE_FROZEN     = 0x02;
117c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian
118c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian    /**
119c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian     * @deprecated use {@link #SURFACE_FROZEN} instead.
120c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian     */
121c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian    @Deprecated
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SURACE_FROZEN     = 0x02;
123c87c4a3e3b3c3949ae3c6f8fd245b71691d5ca3bMathias Agopian
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Enable dithering when compositing this surface */
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SURFACE_DITHER    = 0x04;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SURFACE_BLUR_FREEZE= 0x10;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* orientations for setOrientation() */
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ROTATION_0       = 0;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ROTATION_90      = 1;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ROTATION_180     = 2;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ROTATION_270     = 3;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
135eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    /**
136eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * Disable the orientation animation
137eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * {@hide}
138eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     */
139eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    public static final int FLAGS_ORIENTATION_ANIMATION_DISABLE = 0x000000001;
140eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mSurface;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
14417f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    private int mSurfaceControl;
14517f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    @SuppressWarnings("unused")
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mSaveCount;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Canvas mCanvas;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15038ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima    // The display metrics used to provide the pseudo canvas size for applications
151240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    // running in compatibility mode. This is set to null for non compatibility mode.
152240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    private DisplayMetrics mCompatibleDisplayMetrics;
153240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
154240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    // A matrix to scale the matrix set by application. This is set to null for
155240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    // non compatibility mode.
156240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    private Matrix mCompatibleMatrix;
15738ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Exception thrown when a surface couldn't be created or resized
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class OutOfResourcesException extends Exception {
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public OutOfResourcesException() {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public OutOfResourcesException(String name) {
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(name);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We use a class initializer to allow the native code to cache some
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * field offsets.
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native private static void nativeClassInit();
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static { nativeClassInit(); }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * create a surface
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Surface(SurfaceSession s,
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid, int display, int w, int h, int format, int flags)
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws OutOfResourcesException {
1840586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn        mCanvas = new CompatibleCanvas();
1855d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        init(s,pid,null,display,w,h,format,flags);
1865d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian    }
1875d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian
1885d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian    /**
1895d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian     * create a surface with a name
1905d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian     * {@hide}
1915d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian     */
1925d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian    public Surface(SurfaceSession s,
1935d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            int pid, String name, int display, int w, int h, int format, int flags)
1945d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        throws OutOfResourcesException {
1955d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        mCanvas = new CompatibleCanvas();
1965d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian        init(s,pid,name,display,w,h,format,flags);
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create an empty surface, which will later be filled in by
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * readFromParcel().
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Surface() {
205240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        mCanvas = new CompatibleCanvas();
206240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    }
207240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
208240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    /**
209240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     * A Canvas class that can handle the compatibility mode. This does two things differently.
210240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     * <ul>
211240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     *  <li> Returns the width and height of the target metrics, rather than native.
212240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     *  For example, the canvas returns 320x480 even if an app is running in WVGA high density.
213240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     *  <li> Scales the matrix in setMatrix by the application scale, except if the matrix looks
214240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     *  like obtained from getMatrix. This is a hack to handle the case that an application
215240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     *  uses getMatrix to keep the original matrix, set matrix of its own, then set the original
216240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     *  matrix back. There is no perfect solution that works for all cases, and there are a lot of
217240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     *  cases that this model dose not work, but we hope this works for many apps.
218240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     * </ul>
219240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima     */
220240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    private class CompatibleCanvas extends Canvas {
221240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        // A temp matrix to remember what an application obtained via {@link getMatrix}
222240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        private Matrix mOrigMatrix = null;
223240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
224240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
225240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public int getWidth() {
226240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            return mCompatibleDisplayMetrics == null ?
227240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                    super.getWidth() : mCompatibleDisplayMetrics.widthPixels;
228240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
229240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
230240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
231240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public int getHeight() {
232240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            return mCompatibleDisplayMetrics == null ?
233240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                    super.getHeight() : mCompatibleDisplayMetrics.heightPixels;
234240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
235240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
236240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
237240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public void setMatrix(Matrix matrix) {
238240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            if (mCompatibleMatrix == null || mOrigMatrix == null || mOrigMatrix.equals(matrix)) {
239240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                // don't scale the matrix if it's not compatibility mode, or
240240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                // the matrix was obtained from getMatrix.
241240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                super.setMatrix(matrix);
242240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            } else {
243240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                Matrix m = new Matrix(mCompatibleMatrix);
244240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                m.preConcat(matrix);
245240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                super.setMatrix(m);
24638ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima            }
247240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
248240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima
249240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        @Override
250240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        public void getMatrix(Matrix m) {
251240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            super.getMatrix(m);
252240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            if (mOrigMatrix == null) {
253240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima                mOrigMatrix = new Matrix();
25438ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima            }
255240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mOrigMatrix.set(m);
256240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
257240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    };
25838ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
25938ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima    /**
260b2f8450db8dfbc05724624f93d9ec5e65f0b7e54Mathias Agopian     * Sets the display metrics used to provide canva's width/height in compatibility mode.
26138ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima     */
262240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima    void setCompatibleDisplayMetrics(DisplayMetrics metrics, Translator translator) {
263240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        mCompatibleDisplayMetrics = metrics;
264240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        if (translator != null) {
265240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            float appScale = translator.applicationScale;
266240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mCompatibleMatrix = new Matrix();
267240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima            mCompatibleMatrix.setScale(appScale, appScale);
268240f8a7532a024e36998bdbe87cff2ef080d75deMitsuru Oshima        }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Copy another surface to this one.  This surface now holds a reference
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the same data as the original surface, and is -not- the owner.
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void copyFrom(Surface o);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Does this object hold a valid surface?  Returns true if it holds
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a physical surface, so lockCanvas() will succeed.  Otherwise
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns false.
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   boolean isValid();
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2850586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    /** Free all server-side state associated with this surface and
2860586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn     * release this object's reference. {@hide} */
2870586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    public native void destroy();
2880586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn
2890586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    /** Release the local reference to the server-side surface. @hide */
2900586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    public native void release();
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** draw into a surface */
293b2f8450db8dfbc05724624f93d9ec5e65f0b7e54Mathias Agopian    public Canvas lockCanvas(Rect dirty) throws OutOfResourcesException, IllegalArgumentException
294b2f8450db8dfbc05724624f93d9ec5e65f0b7e54Mathias Agopian    {
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* the dirty rectangle may be expanded to the surface's size, if
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * for instance it has been resized or if the bits were lost, since
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the last call.
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return lockCanvasNative(dirty);
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native Canvas lockCanvasNative(Rect dirty);
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** unlock the surface and asks a page flip */
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void unlockCanvasAndPost(Canvas canvas);
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unlock the surface. the screen won't be updated until
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * post() or postAll() is called
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void unlockCanvas(Canvas canvas);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** start/end a transaction {@hide} */
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native   void openTransaction();
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native   void closeTransaction();
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Freezes the specified display, No updating of the screen will occur
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * until unfreezeDisplay() is called. Everything else works as usual though,
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in particular transactions.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native   void freezeDisplay(int display);
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resume updating the specified display.
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native   void unfreezeDisplay(int display);
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set the orientation of the given display.
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param display
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param orientation
338eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * @param flags
339eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * {@hide}
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
341eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    public static native   void setOrientation(int display, int orientation, int flags);
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
344eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * set the orientation of the given display.
345eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * @param display
346eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     * @param orientation
347eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian     */
348eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    public static void setOrientation(int display, int orientation) {
349eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian        setOrientation(display, orientation, 0);
350eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    }
351eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian
352eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    /**
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set surface parameters.
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * needs to be inside open/closeTransaction block
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setLayer(int zorder);
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setPosition(int x, int y);
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setSize(int w, int h);
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void hide();
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void show();
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setTransparentRegionHint(Region region);
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setAlpha(float alpha);
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setMatrix(float dsdx, float dtdx,
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                   float dsdy, float dtdy);
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void freeze();
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void unfreeze();
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setFreezeTint(int tint);
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void setFlags(int flags, int mask);
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
37617f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian        return "Surface(native-token=" + mSurfaceControl + ")";
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Surface(Parcel source) throws OutOfResourcesException {
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        init(source);
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void readFromParcel(Parcel source);
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native   void writeToParcel(Parcel dest, int flags);
389402c34649f514669517c2208e35caa58ff8bb2b9Mathias Agopian
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<Surface> CREATOR
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<Surface>()
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Surface createFromParcel(Parcel source) {
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Surface(source);
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(LOG_TAG, "Exception creating surface from parcel", e);
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Surface[] newArray(int size) {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Surface[size];
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* no user serviceable parts here ... */
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
410402c34649f514669517c2208e35caa58ff8bb2b9Mathias Agopian        release();
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void init(SurfaceSession s,
4145d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            int pid, String name, int display, int w, int h, int format, int flags)
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws OutOfResourcesException;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void init(Parcel source);
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
419