Display.java revision 93de746e5554bc9397ca8109f57875d92e64eabc
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
195be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackbornimport android.content.res.CompatibilityInfo;
20ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.graphics.Point;
21ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.graphics.Rect;
22ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.os.RemoteException;
23ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.os.ServiceManager;
24ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.os.SystemClock;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics;
26ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.util.Slog;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown/**
29bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * Provides information about the display size and density.
30bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown */
31ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornpublic class Display {
325fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static final String TAG = "Display";
3330c845f9ca9e504d4d76099a8be111c99ac669f4Dianne Hackborn    static final boolean DEBUG_DISPLAY_SIZE = false;
345fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The default Display id.
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DEFAULT_DISPLAY = 0;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
41833533c9292f860e4dfc060a4eba6429cd259ed4Mathias Agopian     * Use {@link android.view.WindowManager#getDefaultDisplay()
42833533c9292f860e4dfc060a4eba6429cd259ed4Mathias Agopian     * WindowManager.getDefaultDisplay()} to create a Display object.
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Display gives you access to some information about a particular display
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * connected to the device.
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
465fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    Display(int display, CompatibilityInfoHolder compatInfo) {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // initalize the statics when this class is first instansiated. This is
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // done here instead of in the static block because Zygote
49ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized (sStaticInit) {
50ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            if (!sInitialized) {
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                nativeClassInit();
52ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                sInitialized = true;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
555fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        mCompatibilityInfo = compatInfo != null ? compatInfo : new CompatibilityInfoHolder();
565fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        mDisplay = display;
575fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        init(display);
585fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
595fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
615cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Returns the index of this display.  This is currently undefined; do
625cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * not use.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDisplayId() {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDisplay;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
695cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Returns the number of displays connected to the device.  This is
705cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * currently undefined; do not use.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native static int getDisplayCount();
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
75bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets the size of the display, in pixels.
76bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * <p>
77bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Note that this value should <em>not</em> be used for computing layouts,
78bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * since a device will typically have screen decoration (such as a status bar)
795cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * along the edges of the display that reduce the amount of application
80bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * space available from the size returned here.  Layouts should instead use
81bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * the window size.
82bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p><p>
83bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The size is adjusted based on the current rotation of the display.
84bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p><p>
85bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The size returned by this method does not necessarily represent the
86bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * actual raw size (native resolution) of the display.  The returned size may
87bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * be adjusted to exclude certain system decor elements that are always visible.
88bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * It may also be scaled to provide compatibility with older applications that
89bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * were originally designed for smaller displays.
90bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p>
91bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     *
92bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @param outSize A {@link Point} object to receive the size information.
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
94ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public void getSize(Point outSize) {
9581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        getSizeInternal(outSize, true);
9681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn    }
9781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn
9881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn    private void getSizeInternal(Point outSize, boolean doCompat) {
99ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        try {
100ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            IWindowManager wm = getWindowManager();
101ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            if (wm != null) {
102ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                wm.getDisplaySize(outSize);
1035fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                CompatibilityInfo ci;
1045fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                if (doCompat && (ci=mCompatibilityInfo.getIfNeeded()) != null) {
10581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                    synchronized (mTmpMetrics) {
1062b31d53161789358de57fd396716a6503855c5daDianne Hackborn                        mTmpMetrics.noncompatWidthPixels = outSize.x;
1072b31d53161789358de57fd396716a6503855c5daDianne Hackborn                        mTmpMetrics.noncompatHeightPixels = outSize.y;
10881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                        mTmpMetrics.density = mDensity;
1095fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                        ci.applyToDisplayMetrics(mTmpMetrics);
11081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                        outSize.x = mTmpMetrics.widthPixels;
11181e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                        outSize.y = mTmpMetrics.heightPixels;
11281e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                    }
11381e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                }
114ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            } else {
115ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                // This is just for boot-strapping, initializing the
116ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                // system process before the window manager is up.
117bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                outSize.x = getRawWidth();
118bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                outSize.y = getRawHeight();
119ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            }
12036991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn            if (false) {
12136991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                RuntimeException here = new RuntimeException("here");
12236991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                here.fillInStackTrace();
12336991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                Slog.v(TAG, "Returning display size: " + outSize, here);
12436991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn            }
125ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn            if (DEBUG_DISPLAY_SIZE && doCompat) Slog.v(
126ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn                    TAG, "Returning display size: " + outSize);
127ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        } catch (RemoteException e) {
128ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            Slog.w("Display", "Unable to get display size", e);
129ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
130ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
133bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets the size of the display as a rectangle, in pixels.
134bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     *
135bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @param outSize A {@link Rect} object to receive the size information.
136bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @see #getSize(Point)
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
138ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public void getRectSize(Rect outSize) {
139ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized (mTmpPoint) {
14081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            getSizeInternal(mTmpPoint, true);
141ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            outSize.set(0, 0, mTmpPoint.x, mTmpPoint.y);
142ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
143ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
145ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    /**
14668c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * Return the range of display sizes an application can expect to encounter
14768c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * under normal operation, as long as there is no physical change in screen
14868c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * size.  This is basically the sizes you will see as the orientation
14968c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * changes, taking into account whatever screen decoration there is in
15068c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * each rotation.  For example, the status bar is always at the top of the
15168c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * screen, so it will reduce the height both in landscape and portrait, and
15268c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * the smallest height returned here will be the smaller of the two.
15368c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     *
15468c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * This is intended for applications to get an idea of the range of sizes
15568c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * they will encounter while going through device rotations, to provide a
15668c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * stable UI through rotation.  The sizes here take into account all standard
15768c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * system decorations that reduce the size actually available to the
15868c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * application: the status bar, navigation bar, system bar, etc.  It does
15968c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * <em>not</em> take into account more transient elements like an IME
16068c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * soft keyboard.
16168c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     *
16268c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * @param outSmallestSize Filled in with the smallest width and height
16368c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * that the application will encounter, in pixels (not dp units).  The x
16468c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * (width) dimension here directly corresponds to
16568c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * {@link android.content.res.Configuration#smallestScreenWidthDp
16668c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * Configuration.smallestScreenWidthDp}, except the value here is in raw
16768c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * screen pixels rather than dp units.  Your application may of course
16868c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * still get smaller space yet if, for example, a soft keyboard is
16968c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * being displayed.
17068c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * @param outLargestSize Filled in with the largest width and height
17168c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * that the application will encounter, in pixels (not dp units).  Your
17268c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * application may of course still get larger space than this if,
17368c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     * for example, screen decorations like the status bar are being hidden.
17468c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn     */
17568c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn    public void getCurrentSizeRange(Point outSmallestSize, Point outLargestSize) {
17668c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn        try {
17768c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn            IWindowManager wm = getWindowManager();
17868c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn            wm.getCurrentSizeRange(outSmallestSize, outLargestSize);
17968c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn        } catch (RemoteException e) {
18068c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn            Slog.w("Display", "Unable to get display size range", e);
18168c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn            outSmallestSize.x = 0;
18268c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn            outSmallestSize.y = 0;
18368c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn            outLargestSize.x = 0;
18468c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn            outLargestSize.y = 0;
18568c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn        }
18668c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn    }
18768c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn
18868c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn    /**
189ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * Return the maximum screen size dimension that will happen.  This is
190ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * mostly for wallpapers.
191ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * @hide
192ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     */
193ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public int getMaximumSizeDimension() {
194ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        try {
195ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            IWindowManager wm = getWindowManager();
196ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return wm.getMaximumSizeDimension();
197ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        } catch (RemoteException e) {
198ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            Slog.w("Display", "Unable to get display maximum size dimension", e);
199ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return 0;
200ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
201ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
202ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
203ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    /**
204ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * @deprecated Use {@link #getSize(Point)} instead.
205ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     */
206ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    @Deprecated
207ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public int getWidth() {
208ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized (mTmpPoint) {
209ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            long now = SystemClock.uptimeMillis();
210ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            if (now > (mLastGetTime+20)) {
21181e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                getSizeInternal(mTmpPoint, true);
212ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                mLastGetTime = now;
213ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            }
214ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return mTmpPoint.x;
215ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
216ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
217ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
218ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    /**
219ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * @deprecated Use {@link #getSize(Point)} instead.
220ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     */
221ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    @Deprecated
222ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public int getHeight() {
223ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized (mTmpPoint) {
224ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            long now = SystemClock.uptimeMillis();
225ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            if (now > (mLastGetTime+20)) {
22681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                getSizeInternal(mTmpPoint, true);
227ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                mLastGetTime = now;
228ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            }
229ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return mTmpPoint.y;
230ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
231ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
232ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
233bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    /**
234bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets the real size of the display without subtracting any window decor or
235bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * applying any compatibility scale factors.
236bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * <p>
237bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The real size may be smaller than the raw size when the window manager
238bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * is emulating a smaller display (using adb shell am display-size).
239bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p><p>
240bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The size is adjusted based on the current rotation of the display.
241bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p>
242bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @hide
243bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     */
244bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    public void getRealSize(Point outSize) {
245bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        try {
246bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            IWindowManager wm = getWindowManager();
247bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            if (wm != null) {
248bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                wm.getRealDisplaySize(outSize);
249bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            } else {
250bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                // This is just for boot-strapping, initializing the
251bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                // system process before the window manager is up.
252bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                outSize.x = getRawWidth();
253bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                outSize.y = getRawHeight();
254bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            }
255ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn            if (DEBUG_DISPLAY_SIZE) Slog.v(
256ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn                    TAG, "Returning real display size: " + outSize);
257bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        } catch (RemoteException e) {
258bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            Slog.w("Display", "Unable to get real display size", e);
259bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        }
260bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    }
261ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
262bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    /**
263bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets the raw width of the display, in pixels.
264bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * <p>
265bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The size is adjusted based on the current rotation of the display.
266bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p>
267bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @hide
268bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     */
269ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn    public int getRawWidth() {
270ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn        int w = getRawWidthNative();
271ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn        if (DEBUG_DISPLAY_SIZE) Slog.v(
272ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn                TAG, "Returning raw display width: " + w);
273ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn        return w;
274ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn    }
275ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn    private native int getRawWidthNative();
276bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown
277bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    /**
278bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets the raw height of the display, in pixels.
279bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * <p>
280bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The size is adjusted based on the current rotation of the display.
281bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p>
282bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @hide
283bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     */
284ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn    public int getRawHeight() {
285ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn        int h = getRawHeightNative();
286ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn        if (DEBUG_DISPLAY_SIZE) Slog.v(
287ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn                TAG, "Returning raw display height: " + h);
288ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn        return h;
289ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn    }
290ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn    private native int getRawHeightNative();
29199aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2935cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Returns the rotation of the screen from its "natural" orientation.
2945cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * The returned value may be {@link Surface#ROTATION_0 Surface.ROTATION_0}
2955cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * (no rotation), {@link Surface#ROTATION_90 Surface.ROTATION_90},
2965cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * {@link Surface#ROTATION_180 Surface.ROTATION_180}, or
2975cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * {@link Surface#ROTATION_270 Surface.ROTATION_270}.  For
2985cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * example, if a device has a naturally tall screen, and the user has
2995cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * turned it on its side to go into a landscape orientation, the value
3005cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * returned here may be either {@link Surface#ROTATION_90 Surface.ROTATION_90}
3015cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * or {@link Surface#ROTATION_270 Surface.ROTATION_270} depending on
3025cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * the direction it was turned.  The angle is the rotation of the drawn
3035cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * graphics on the screen, which is the opposite direction of the physical
3045cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * rotation of the device.  For example, if the device is rotated 90
3055cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * degrees counter-clockwise, to compensate rendering will be rotated by
3065cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * 90 degrees clockwise and thus the returned value here will be
3075cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * {@link Surface#ROTATION_90 Surface.ROTATION_90}.
3085cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     */
3095cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    public int getRotation() {
3105cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn        return getOrientation();
3115cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    }
3125cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn
3135cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    /**
3144c904a3bf3dbe98607b5e3f706ee8ef8887ee104Joe Onorato     * @deprecated use {@link #getRotation}
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return orientation of this display.
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3175cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    @Deprecated native public int getOrientation();
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3205cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Return the native pixel format of the display.  The returned value
3215cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * may be one of the constants int {@link android.graphics.PixelFormat}.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getPixelFormat() {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPixelFormat;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3285cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Return the refresh rate of this display in frames per second.
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getRefreshRate() {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRefreshRate;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
335bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets display metrics that describe the size and density of this display.
336bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * <p>
337bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The size is adjusted based on the current rotation of the display.
338bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p><p>
339bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The size returned by this method does not necessarily represent the
340bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * actual raw size (native resolution) of the display.  The returned size may
341bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * be adjusted to exclude certain system decor elements that are always visible.
342bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * It may also be scaled to provide compatibility with older applications that
343bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * were originally designed for smaller displays.
344bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p>
345bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     *
346bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @param outMetrics A {@link DisplayMetrics} object to receive the metrics.
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getMetrics(DisplayMetrics outMetrics) {
34968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        synchronized (mTmpPoint) {
35081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            getSizeInternal(mTmpPoint, false);
351bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            getMetricsWithSize(outMetrics, mTmpPoint.x, mTmpPoint.y);
35268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        }
3535be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
3545fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        CompatibilityInfo ci = mCompatibilityInfo.getIfNeeded();
3555fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (ci != null) {
3565fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            ci.applyToDisplayMetrics(outMetrics);
3575be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        }
3585fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
359ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn        if (DEBUG_DISPLAY_SIZE) Slog.v(TAG, "Returning DisplayMetrics: "
360ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn                + outMetrics.widthPixels + "x" + outMetrics.heightPixels
361ec537457cd2869e52b9b2c99e8c01dd96a9682e2Dianne Hackborn                + " " + outMetrics.density);
36268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn    }
36368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
36468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn    /**
365bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets display metrics based on the real size of this display.
36668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn     * @hide
36768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn     */
36868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn    public void getRealMetrics(DisplayMetrics outMetrics) {
369bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        synchronized (mTmpPoint) {
370bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            getRealSize(mTmpPoint);
371bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            getMetricsWithSize(outMetrics, mTmpPoint.x, mTmpPoint.y);
372bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        }
373bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    }
374bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown
375bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    /**
376bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * If the display is mirrored to an external HDMI display, returns the
377bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * width of that display.
378bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @hide
379bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     */
380bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    public int getRawExternalWidth() {
381bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        return 1280;
382bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    }
383bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown
384bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    /**
385bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * If the display is mirrored to an external HDMI display, returns the
386bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * height of that display.
387bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @hide
388bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     */
389bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    public int getRawExternalHeight() {
390bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        return 720;
39168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn    }
39268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
393bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    /**
39493de746e5554bc9397ca8109f57875d92e64eabcJeff Brown     * If the display is mirrored to an external HDMI display, returns the
39593de746e5554bc9397ca8109f57875d92e64eabcJeff Brown     * rotation of that display relative to its natural orientation.
39693de746e5554bc9397ca8109f57875d92e64eabcJeff Brown     * @hide
39793de746e5554bc9397ca8109f57875d92e64eabcJeff Brown     */
39893de746e5554bc9397ca8109f57875d92e64eabcJeff Brown    public int getExternalRotation() {
39993de746e5554bc9397ca8109f57875d92e64eabcJeff Brown        return Surface.ROTATION_0;
40093de746e5554bc9397ca8109f57875d92e64eabcJeff Brown    }
40193de746e5554bc9397ca8109f57875d92e64eabcJeff Brown
40293de746e5554bc9397ca8109f57875d92e64eabcJeff Brown    /**
403bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets display metrics based on an explicit assumed display size.
404bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @hide
405bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     */
406bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    public void getMetricsWithSize(DisplayMetrics outMetrics,
407bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            int width, int height) {
40811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        outMetrics.densityDpi   = (int)((mDensity*DisplayMetrics.DENSITY_DEFAULT)+.5f);
409e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
410bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        outMetrics.noncompatWidthPixels  = outMetrics.widthPixels = width;
411bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        outMetrics.noncompatHeightPixels = outMetrics.heightPixels = height;
4122b31d53161789358de57fd396716a6503855c5daDianne Hackborn
4132b31d53161789358de57fd396716a6503855c5daDianne Hackborn        outMetrics.density = outMetrics.noncompatDensity = mDensity;
4142b31d53161789358de57fd396716a6503855c5daDianne Hackborn        outMetrics.scaledDensity = outMetrics.noncompatScaledDensity = outMetrics.density;
4152b31d53161789358de57fd396716a6503855c5daDianne Hackborn        outMetrics.xdpi = outMetrics.noncompatXdpi = mDpiX;
4162b31d53161789358de57fd396716a6503855c5daDianne Hackborn        outMetrics.ydpi = outMetrics.noncompatYdpi = mDpiY;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    static IWindowManager getWindowManager() {
420ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized (sStaticInit) {
421ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            if (sWindowManager == null) {
422ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                sWindowManager = IWindowManager.Stub.asInterface(
423ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                        ServiceManager.getService("window"));
424ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            }
425ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return sWindowManager;
426ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
427ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
428ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We use a class initializer to allow the native code to cache some
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * field offsets.
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native private static void nativeClassInit();
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void init(int display);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4375fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    private final CompatibilityInfoHolder mCompatibilityInfo;
4385be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    private final int   mDisplay;
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Following fields are initialized from native code
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int         mPixelFormat;
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float       mRefreshRate;
4427f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet    /*package*/ float   mDensity;
4437f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet    /*package*/ float   mDpiX;
4447f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet    /*package*/ float   mDpiY;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
446ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private final Point mTmpPoint = new Point();
4475be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    private final DisplayMetrics mTmpMetrics = new DisplayMetrics();
448ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private float mLastGetTime;
449ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
450ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private static final Object sStaticInit = new Object();
451ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private static boolean sInitialized = false;
452ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private static IWindowManager sWindowManager;
453ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima
454ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima    /**
455ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima     * Returns a display object which uses the metric's width/height instead.
456ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima     * @hide
457ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima     */
4585fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public static Display createCompatibleDisplay(int displayId, CompatibilityInfoHolder compat) {
4595be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        return new Display(displayId, compat);
460ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima    }
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
463