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