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