Display.java revision bc68a59c024bdb745dac8e2ec7408a9f30595f1a
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";
335fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static final boolean DEBUG_COMPAT = 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            }
1205fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            if (DEBUG_COMPAT && doCompat) Slog.v(TAG, "Returning display size: " + outSize);
121ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        } catch (RemoteException e) {
122ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            Slog.w("Display", "Unable to get display size", e);
123ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
124ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
127bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets the size of the display as a rectangle, in pixels.
128bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     *
129bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @param outSize A {@link Rect} object to receive the size information.
130bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @see #getSize(Point)
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
132ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public void getRectSize(Rect outSize) {
133ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized (mTmpPoint) {
13481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            getSizeInternal(mTmpPoint, true);
135ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            outSize.set(0, 0, mTmpPoint.x, mTmpPoint.y);
136ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
137ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    /**
140ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * Return the maximum screen size dimension that will happen.  This is
141ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * mostly for wallpapers.
142ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * @hide
143ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     */
144ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public int getMaximumSizeDimension() {
145ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        try {
146ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            IWindowManager wm = getWindowManager();
147ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return wm.getMaximumSizeDimension();
148ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        } catch (RemoteException e) {
149ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            Slog.w("Display", "Unable to get display maximum size dimension", e);
150ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return 0;
151ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
152ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
153ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
154ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    /**
155ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * @deprecated Use {@link #getSize(Point)} instead.
156ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     */
157ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    @Deprecated
158ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public int getWidth() {
159ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized (mTmpPoint) {
160ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            long now = SystemClock.uptimeMillis();
161ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            if (now > (mLastGetTime+20)) {
16281e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                getSizeInternal(mTmpPoint, true);
163ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                mLastGetTime = now;
164ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            }
165ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return mTmpPoint.x;
166ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
167ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
168ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
169ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    /**
170ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     * @deprecated Use {@link #getSize(Point)} instead.
171ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn     */
172ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    @Deprecated
173ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public int getHeight() {
174ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized (mTmpPoint) {
175ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            long now = SystemClock.uptimeMillis();
176ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            if (now > (mLastGetTime+20)) {
17781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                getSizeInternal(mTmpPoint, true);
178ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                mLastGetTime = now;
179ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            }
180ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return mTmpPoint.y;
181ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
182ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
183ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
184bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    /**
185bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets the real size of the display without subtracting any window decor or
186bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * applying any compatibility scale factors.
187bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * <p>
188bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The real size may be smaller than the raw size when the window manager
189bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * is emulating a smaller display (using adb shell am display-size).
190bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p><p>
191bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The size is adjusted based on the current rotation of the display.
192bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p>
193bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @hide
194bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     */
195bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    public void getRealSize(Point outSize) {
196bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        try {
197bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            IWindowManager wm = getWindowManager();
198bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            if (wm != null) {
199bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                wm.getRealDisplaySize(outSize);
200bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            } else {
201bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                // This is just for boot-strapping, initializing the
202bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                // system process before the window manager is up.
203bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                outSize.x = getRawWidth();
204bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                outSize.y = getRawHeight();
205bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            }
206bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        } catch (RemoteException e) {
207bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            Slog.w("Display", "Unable to get real display size", e);
208bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        }
209bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    }
210ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
211bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    /**
212bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets the raw width of the display, in pixels.
213bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * <p>
214bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The size is adjusted based on the current rotation of the display.
215bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p>
216bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @hide
217bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     */
218ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    native public int getRawWidth();
219bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown
220bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    /**
221bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets the raw height of the display, in pixels.
222bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * <p>
223bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The size is adjusted based on the current rotation of the display.
224bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p>
225bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @hide
226bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     */
227ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    native public int getRawHeight();
22899aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2305cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Returns the rotation of the screen from its "natural" orientation.
2315cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * The returned value may be {@link Surface#ROTATION_0 Surface.ROTATION_0}
2325cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * (no rotation), {@link Surface#ROTATION_90 Surface.ROTATION_90},
2335cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * {@link Surface#ROTATION_180 Surface.ROTATION_180}, or
2345cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * {@link Surface#ROTATION_270 Surface.ROTATION_270}.  For
2355cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * example, if a device has a naturally tall screen, and the user has
2365cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * turned it on its side to go into a landscape orientation, the value
2375cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * returned here may be either {@link Surface#ROTATION_90 Surface.ROTATION_90}
2385cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * or {@link Surface#ROTATION_270 Surface.ROTATION_270} depending on
2395cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * the direction it was turned.  The angle is the rotation of the drawn
2405cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * graphics on the screen, which is the opposite direction of the physical
2415cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * rotation of the device.  For example, if the device is rotated 90
2425cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * degrees counter-clockwise, to compensate rendering will be rotated by
2435cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * 90 degrees clockwise and thus the returned value here will be
2445cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * {@link Surface#ROTATION_90 Surface.ROTATION_90}.
2455cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     */
2465cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    public int getRotation() {
2475cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn        return getOrientation();
2485cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    }
2495cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn
2505cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    /**
2514c904a3bf3dbe98607b5e3f706ee8ef8887ee104Joe Onorato     * @deprecated use {@link #getRotation}
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return orientation of this display.
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2545cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn    @Deprecated native public int getOrientation();
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2575cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Return the native pixel format of the display.  The returned value
2585cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * may be one of the constants int {@link android.graphics.PixelFormat}.
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getPixelFormat() {
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPixelFormat;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2655cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn     * Return the refresh rate of this display in frames per second.
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getRefreshRate() {
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRefreshRate;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
272bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets display metrics that describe the size and density of this display.
273bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * <p>
274bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The size is adjusted based on the current rotation of the display.
275bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p><p>
276bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * The size returned by this method does not necessarily represent the
277bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * actual raw size (native resolution) of the display.  The returned size may
278bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * be adjusted to exclude certain system decor elements that are always visible.
279bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * It may also be scaled to provide compatibility with older applications that
280bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * were originally designed for smaller displays.
281bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * </p>
282bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     *
283bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @param outMetrics A {@link DisplayMetrics} object to receive the metrics.
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getMetrics(DisplayMetrics outMetrics) {
28668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        synchronized (mTmpPoint) {
28781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            getSizeInternal(mTmpPoint, false);
288bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            getMetricsWithSize(outMetrics, mTmpPoint.x, mTmpPoint.y);
28968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        }
2905be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn
2915fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        CompatibilityInfo ci = mCompatibilityInfo.getIfNeeded();
2925fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (ci != null) {
2935fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            ci.applyToDisplayMetrics(outMetrics);
2945be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        }
2955fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
2965fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (DEBUG_COMPAT) Slog.v(TAG, "Returning DisplayMetrics: " + outMetrics.widthPixels
2975fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                + "x" + outMetrics.heightPixels + " " + outMetrics.density);
29868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn    }
29968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
30068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn    /**
301bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets display metrics based on the real size of this display.
30268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn     * @hide
30368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn     */
30468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn    public void getRealMetrics(DisplayMetrics outMetrics) {
305bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        synchronized (mTmpPoint) {
306bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            getRealSize(mTmpPoint);
307bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            getMetricsWithSize(outMetrics, mTmpPoint.x, mTmpPoint.y);
308bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        }
309bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    }
310bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown
311bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    /**
312bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * If the display is mirrored to an external HDMI display, returns the
313bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * width of that display.
314bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @hide
315bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     */
316bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    public int getRawExternalWidth() {
317bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        return 1280;
318bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    }
319bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown
320bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    /**
321bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * If the display is mirrored to an external HDMI display, returns the
322bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * height of that display.
323bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @hide
324bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     */
325bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    public int getRawExternalHeight() {
326bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        return 720;
32768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn    }
32868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
329bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    /**
330bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * Gets display metrics based on an explicit assumed display size.
331bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     * @hide
332bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown     */
333bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    public void getMetricsWithSize(DisplayMetrics outMetrics,
334bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            int width, int height) {
33511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        outMetrics.densityDpi   = (int)((mDensity*DisplayMetrics.DENSITY_DEFAULT)+.5f);
336e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
337bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        outMetrics.noncompatWidthPixels  = outMetrics.widthPixels = width;
338bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        outMetrics.noncompatHeightPixels = outMetrics.heightPixels = height;
3392b31d53161789358de57fd396716a6503855c5daDianne Hackborn
3402b31d53161789358de57fd396716a6503855c5daDianne Hackborn        outMetrics.density = outMetrics.noncompatDensity = mDensity;
3412b31d53161789358de57fd396716a6503855c5daDianne Hackborn        outMetrics.scaledDensity = outMetrics.noncompatScaledDensity = outMetrics.density;
3422b31d53161789358de57fd396716a6503855c5daDianne Hackborn        outMetrics.xdpi = outMetrics.noncompatXdpi = mDpiX;
3432b31d53161789358de57fd396716a6503855c5daDianne Hackborn        outMetrics.ydpi = outMetrics.noncompatYdpi = mDpiY;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
346ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    static IWindowManager getWindowManager() {
347ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized (sStaticInit) {
348ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            if (sWindowManager == null) {
349ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                sWindowManager = IWindowManager.Stub.asInterface(
350ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                        ServiceManager.getService("window"));
351ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            }
352ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            return sWindowManager;
353ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
354ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
355ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We use a class initializer to allow the native code to cache some
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * field offsets.
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native private static void nativeClassInit();
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void init(int display);
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3645fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    private final CompatibilityInfoHolder mCompatibilityInfo;
3655be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    private final int   mDisplay;
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Following fields are initialized from native code
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int         mPixelFormat;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float       mRefreshRate;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float       mDensity;
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float       mDpiX;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float       mDpiY;
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
373ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private final Point mTmpPoint = new Point();
3745be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn    private final DisplayMetrics mTmpMetrics = new DisplayMetrics();
375ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private float mLastGetTime;
376ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
377ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private static final Object sStaticInit = new Object();
378ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private static boolean sInitialized = false;
379ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    private static IWindowManager sWindowManager;
380ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima
381ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima    /**
382ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima     * Returns a display object which uses the metric's width/height instead.
383ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima     * @hide
384ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima     */
3855fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public static Display createCompatibleDisplay(int displayId, CompatibilityInfoHolder compat) {
3865be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn        return new Display(displayId, compat);
387ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
390