Display.java revision 4c904a3bf3dbe98607b5e3f706ee8ef8887ee104
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 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
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Display
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specify the default Display
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DEFAULT_DISPLAY = 0;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use the WindowManager interface to create a Display object.
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Display gives you access to some information about a particular display
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * connected to the device.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Display(int display) {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // initalize the statics when this class is first instansiated. This is
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // done here instead of in the static block because Zygote
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStaticInit) {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mInitialized) {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                nativeClassInit();
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInitialized = true;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDisplay = display;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        init(display);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
485cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Returns the index of this display.  This is currently undefined; do
495cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * not use.
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDisplayId() {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDisplay;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
565cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Returns the number of displays connected to the device.  This is
575cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * currently undefined; do not use.
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native static int getDisplayCount();
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
625cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Returns the raw width of the display, in pixels.  Note that this
635cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * should <em>not</em> generally be used for computing layouts, since
645cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * a device will typically have screen decoration (such as a status bar)
655cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * along the edges of the display that reduce the amount of application
665cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * space available from the raw size returned here.  This value is
675cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * adjusted for you based on the current rotation of the display.
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native public int getWidth();
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
725cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Returns the raw height of the display, in pixels.  Note that this
735cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * should <em>not</em> generally be used for computing layouts, since
745cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * a device will typically have screen decoration (such as a status bar)
755cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * along the edges of the display that reduce the amount of application
765cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * space available from the raw size returned here.  This value is
775cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * adjusted for you based on the current rotation of the display.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native public int getHeight();
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
825cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Returns the rotation of the screen from its "natural" orientation.
835cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * The returned value may be {@link Surface#ROTATION_0 Surface.ROTATION_0}
845cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * (no rotation), {@link Surface#ROTATION_90 Surface.ROTATION_90},
855cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * {@link Surface#ROTATION_180 Surface.ROTATION_180}, or
865cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * {@link Surface#ROTATION_270 Surface.ROTATION_270}.  For
875cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * example, if a device has a naturally tall screen, and the user has
885cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * turned it on its side to go into a landscape orientation, the value
895cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * returned here may be either {@link Surface#ROTATION_90 Surface.ROTATION_90}
905cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * or {@link Surface#ROTATION_270 Surface.ROTATION_270} depending on
915cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * the direction it was turned.  The angle is the rotation of the drawn
925cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * graphics on the screen, which is the opposite direction of the physical
935cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * rotation of the device.  For example, if the device is rotated 90
945cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * degrees counter-clockwise, to compensate rendering will be rotated by
955cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * 90 degrees clockwise and thus the returned value here will be
965cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * {@link Surface#ROTATION_90 Surface.ROTATION_90}.
975cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     */
985cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    public int getRotation() {
995cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn        return getOrientation();
1005cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    }
1015cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn
1025cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    /**
1034c904a3bf3dbe98607b5e3f706ee8ef8887ee104Joe Onorato     * @deprecated use {@link #getRotation}
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return orientation of this display.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1065cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    @Deprecated native public int getOrientation();
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1095cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Return the native pixel format of the display.  The returned value
1105cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * may be one of the constants int {@link android.graphics.PixelFormat}.
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getPixelFormat() {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPixelFormat;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1175cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Return the refresh rate of this display in frames per second.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getRefreshRate() {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRefreshRate;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initialize a DisplayMetrics object from this display's data.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outMetrics
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getMetrics(DisplayMetrics outMetrics) {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outMetrics.widthPixels  = getWidth();
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outMetrics.heightPixels = getHeight();
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outMetrics.density      = mDensity;
13211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        outMetrics.densityDpi   = (int)((mDensity*DisplayMetrics.DENSITY_DEFAULT)+.5f);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outMetrics.scaledDensity= outMetrics.density;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outMetrics.xdpi         = mDpiX;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outMetrics.ydpi         = mDpiY;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We use a class initializer to allow the native code to cache some
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * field offsets.
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native private static void nativeClassInit();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void init(int display);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int         mDisplay;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Following fields are initialized from native code
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int         mPixelFormat;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float       mRefreshRate;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float       mDensity;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float       mDpiX;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float       mDpiY;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final Object mStaticInit = new Object();
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static boolean mInitialized = false;
156ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima
157ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima    /**
158ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima     * Returns a display object which uses the metric's width/height instead.
159ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima     * @hide
160ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima     */
161ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima    public static Display createMetricsBasedDisplay(int displayId, DisplayMetrics metrics) {
162ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        return new CompatibleDisplay(displayId, metrics);
163ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima    }
164ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima
165ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima    private static class CompatibleDisplay extends Display {
166ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        private final DisplayMetrics mMetrics;
167ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima
168ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        private CompatibleDisplay(int displayId, DisplayMetrics metrics) {
169ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima            super(displayId);
170ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima            mMetrics = metrics;
171ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        }
172ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima
173ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        @Override
174ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        public int getWidth() {
175ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima            return mMetrics.widthPixels;
176ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        }
177ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima
178ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        @Override
179ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        public int getHeight() {
180ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima            return mMetrics.heightPixels;
181ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        }
182ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima    }
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
185