Display.java revision ac8dea12c17aa047e03a358110aeb60401d36aa2
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
19ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.graphics.Point;
20ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.graphics.Rect;
21ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.os.RemoteException;
22ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.os.ServiceManager;
23ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.os.SystemClock;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics;
25ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.util.Slog;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornpublic class Display {
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specify the default Display
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DEFAULT_DISPLAY = 0;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35833533c9292f860e4dfc060a4eba6429cd259ed4Mathias Agopian     * Use {@link android.view.WindowManager#getDefaultDisplay()
36833533c9292f860e4dfc060a4eba6429cd259ed4Mathias Agopian     * WindowManager.getDefaultDisplay()} to create a Display object.
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Display gives you access to some information about a particular display
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * connected to the device.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Display(int display) {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // initalize the statics when this class is first instansiated. This is
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // done here instead of in the static block because Zygote
43ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized (sStaticInit) {
44ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            if (!sInitialized) {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                nativeClassInit();
46ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                sInitialized = true;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDisplay = display;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        init(display);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
545cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Returns the index of this display.  This is currently undefined; do
555cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * not use.
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDisplayId() {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDisplay;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
625cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Returns the number of displays connected to the device.  This is
635cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * currently undefined; do not use.
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native static int getDisplayCount();
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
68ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * Returns the raw size of the display, in pixels.  Note that this
695cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * should <em>not</em> generally be used for computing layouts, since
705cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * a device will typically have screen decoration (such as a status bar)
715cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * along the edges of the display that reduce the amount of application
725cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * space available from the raw size returned here.  This value is
735cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * adjusted for you based on the current rotation of the display.
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
75ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public void getSize(Point outSize) {
76ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        try {
77ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            IWindowManager wm = getWindowManager();
78ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            if (wm != null) {
79ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                wm.getDisplaySize(outSize);
80ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            } else {
81ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                // This is just for boot-strapping, initializing the
82ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                // system process before the window manager is up.
83ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                outSize.y = getRealHeight();
84ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            }
85ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        } catch (RemoteException e) {
86ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            Slog.w("Display", "Unable to get display size", e);
87ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
88ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
91ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * This is just easier for some parts of the framework.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
93ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public void getRectSize(Rect outSize) {
94ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized (mTmpPoint) {
95ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            getSize(mTmpPoint);
96ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            outSize.set(0, 0, mTmpPoint.x, mTmpPoint.y);
97ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
98ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
100ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    /**
101ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * Return the maximum screen size dimension that will happen.  This is
102ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * mostly for wallpapers.
103ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * @hide
104ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     */
105ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public int getMaximumSizeDimension() {
106ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        try {
107ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            IWindowManager wm = getWindowManager();
108ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return wm.getMaximumSizeDimension();
109ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        } catch (RemoteException e) {
110ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            Slog.w("Display", "Unable to get display maximum size dimension", e);
111ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return 0;
112ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
113ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
114ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
115ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    /**
116ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * @deprecated Use {@link #getSize(Point)} instead.
117ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     */
118ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    @Deprecated
119ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public int getWidth() {
120ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized (mTmpPoint) {
121ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            long now = SystemClock.uptimeMillis();
122ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            if (now > (mLastGetTime+20)) {
123ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                getSize(mTmpPoint);
124ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                mLastGetTime = now;
125ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            }
126ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return mTmpPoint.x;
127ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
128ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
129ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
130ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    /**
131ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * @deprecated Use {@link #getSize(Point)} instead.
132ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     */
133ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    @Deprecated
134ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public int getHeight() {
135ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized (mTmpPoint) {
136ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            long now = SystemClock.uptimeMillis();
137ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            if (now > (mLastGetTime+20)) {
138ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                getSize(mTmpPoint);
139ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                mLastGetTime = now;
140ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            }
141ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return mTmpPoint.y;
142ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
143ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
144ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
145ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    /** @hide Returns the actual screen size, not including any decor. */
14699aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn    native public int getRealWidth();
147ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    /** @hide Returns the actual screen size, not including any decor. */
14899aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn    native public int getRealHeight();
149ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
150ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    /** @hide special for when we are faking the screen size. */
151ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    native public int getRawWidth();
152ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    /** @hide special for when we are faking the screen size. */
153ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    native public int getRawHeight();
15499aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1565cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Returns the rotation of the screen from its "natural" orientation.
1575cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * The returned value may be {@link Surface#ROTATION_0 Surface.ROTATION_0}
1585cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * (no rotation), {@link Surface#ROTATION_90 Surface.ROTATION_90},
1595cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * {@link Surface#ROTATION_180 Surface.ROTATION_180}, or
1605cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * {@link Surface#ROTATION_270 Surface.ROTATION_270}.  For
1615cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * example, if a device has a naturally tall screen, and the user has
1625cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * turned it on its side to go into a landscape orientation, the value
1635cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * returned here may be either {@link Surface#ROTATION_90 Surface.ROTATION_90}
1645cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * or {@link Surface#ROTATION_270 Surface.ROTATION_270} depending on
1655cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * the direction it was turned.  The angle is the rotation of the drawn
1665cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * graphics on the screen, which is the opposite direction of the physical
1675cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * rotation of the device.  For example, if the device is rotated 90
1685cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * degrees counter-clockwise, to compensate rendering will be rotated by
1695cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * 90 degrees clockwise and thus the returned value here will be
1705cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * {@link Surface#ROTATION_90 Surface.ROTATION_90}.
1715cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     */
1725cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    public int getRotation() {
1735cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn        return getOrientation();
1745cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    }
1755cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn
1765cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    /**
1774c904a3bf3dbe98607b5e3f706ee8ef8887ee104Joe Onorato     * @deprecated use {@link #getRotation}
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return orientation of this display.
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1805cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    @Deprecated native public int getOrientation();
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1835cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Return the native pixel format of the display.  The returned value
1845cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * may be one of the constants int {@link android.graphics.PixelFormat}.
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getPixelFormat() {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPixelFormat;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1915cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Return the refresh rate of this display in frames per second.
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getRefreshRate() {
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRefreshRate;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initialize a DisplayMetrics object from this display's data.
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outMetrics
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getMetrics(DisplayMetrics outMetrics) {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outMetrics.widthPixels  = getWidth();
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outMetrics.heightPixels = getHeight();
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outMetrics.density      = mDensity;
20611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        outMetrics.densityDpi   = (int)((mDensity*DisplayMetrics.DENSITY_DEFAULT)+.5f);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outMetrics.scaledDensity= outMetrics.density;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outMetrics.xdpi         = mDpiX;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outMetrics.ydpi         = mDpiY;
210e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
211e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        outMetrics.realWidthPixels  = outMetrics.widthPixels;
212e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        outMetrics.realHeightPixels = outMetrics.heightPixels;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
215ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    static IWindowManager getWindowManager() {
216ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized (sStaticInit) {
217ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            if (sWindowManager == null) {
218ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                sWindowManager = IWindowManager.Stub.asInterface(
219ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                        ServiceManager.getService("window"));
220ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            }
221ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return sWindowManager;
222ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
223ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
224ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We use a class initializer to allow the native code to cache some
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * field offsets.
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native private static void nativeClassInit();
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void init(int display);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int         mDisplay;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Following fields are initialized from native code
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int         mPixelFormat;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float       mRefreshRate;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float       mDensity;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float       mDpiX;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float       mDpiY;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
241ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private final Point mTmpPoint = new Point();
242ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private float mLastGetTime;
243ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
244ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private static final Object sStaticInit = new Object();
245ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private static boolean sInitialized = false;
246ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private static IWindowManager sWindowManager;
247ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima
248ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima    /**
249ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima     * Returns a display object which uses the metric's width/height instead.
250ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima     * @hide
251ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima     */
252ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima    public static Display createMetricsBasedDisplay(int displayId, DisplayMetrics metrics) {
253ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        return new CompatibleDisplay(displayId, metrics);
254ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima    }
255ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima
256ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima    private static class CompatibleDisplay extends Display {
257ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        private final DisplayMetrics mMetrics;
258ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima
259ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        private CompatibleDisplay(int displayId, DisplayMetrics metrics) {
260ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima            super(displayId);
261ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima            mMetrics = metrics;
262ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        }
263ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima
264ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        @Override
265ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        public int getWidth() {
266ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima            return mMetrics.widthPixels;
267ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        }
268ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima
269ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        @Override
270ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        public int getHeight() {
271ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima            return mMetrics.heightPixels;
272ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima        }
273ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima    }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
276