Display.java revision d46747a1c64b6ca3282e8841833980ab91829436
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 1948d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautnerimport android.content.res.CompatibilityInfo; 20fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.graphics.PixelFormat; 21ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.graphics.Point; 22ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.graphics.Rect; 23bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport android.hardware.display.DisplayManagerGlobal; 24a506a6ec94863a35acca9feb165db76ddac3892cJeff Brownimport android.os.Process; 25ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.os.SystemClock; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics; 27fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.util.Log; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 293f145a2f958320766ae9240c7a57debc20d578aaMichael Wrightimport java.util.Arrays; 303f145a2f958320766ae9240c7a57debc20d578aaMichael Wright 31bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown/** 32fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Provides information about the size and density of a logical display. 33fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <p> 34fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * The display area is described in two different ways. 35fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <ul> 36fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <li>The application display area specifies the part of the display that may contain 37fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * an application window, excluding the system decorations. The application display area may 38fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * be smaller than the real display area because the system subtracts the space needed 39fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * for decor elements such as the status bar. Use the following methods to query the 40fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * application display area: {@link #getSize}, {@link #getRectSize} and {@link #getMetrics}.</li> 41fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <li>The real display area specifies the part of the display that contains content 42fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * including the system decorations. Even so, the real display area may be smaller than the 43fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * physical size of the display if the window manager is emulating a smaller display 44fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * using (adb shell am display-size). Use the following methods to query the 45fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * real display area: {@link #getRealSize}, {@link #getRealMetrics}.</li> 46fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </ul> 47fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p><p> 48fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * A logical display does not necessarily represent a particular physical display device 49fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * such as the built-in screen or an external monitor. The contents of a logical 50fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * display may be presented on one or more physical displays according to the devices 51fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * that are currently attached and whether mirroring has been enabled. 52fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p> 53bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown */ 54fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownpublic final class Display { 55fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private static final String TAG = "Display"; 56bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown private static final boolean DEBUG = false; 57fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 58bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown private final DisplayManagerGlobal mGlobal; 59fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private final int mDisplayId; 604ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown private final int mLayerStack; 6192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown private final int mFlags; 6292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown private final int mType; 6392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown private final String mAddress; 64a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown private final int mOwnerUid; 65a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown private final String mOwnerPackageName; 6648d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner private final DisplayAdjustments mDisplayAdjustments; 67bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 68bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown private DisplayInfo mDisplayInfo; // never null 69bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown private boolean mIsValid; 70fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 71fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown // Temporary display metrics structure used for compatibility mode. 72fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private final DisplayMetrics mTempMetrics = new DisplayMetrics(); 73fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 74fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown // We cache the app width and height properties briefly between calls 75fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown // to getHeight() and getWidth() to ensure that applications perceive 76fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown // consistent results when the size changes (most of the time). 77fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown // Applications should now be using getSize() instead. 78fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private static final int CACHED_APP_SIZE_DURATION_MILLIS = 20; 79fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private long mLastCachedAppSizeUpdate; 80fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private int mCachedAppWidthCompat; 81fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private int mCachedAppHeightCompat; 825fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8498365d7663cbd82979a5700faf0050220b01084dJeff Brown * The default Display id, which is the id of the built-in primary display 8598365d7663cbd82979a5700faf0050220b01084dJeff Brown * assuming there is one. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int DEFAULT_DISPLAY = 0; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9077aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown * Display flag: Indicates that the display supports compositing content 9177aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown * that is stored in protected graphics buffers. 92c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown * <p> 93f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * If this flag is set then the display device supports compositing protected buffers. 94f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * </p><p> 95f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * If this flag is not set then the display device may not support compositing 96f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * protected buffers; the user may see a blank region on the screen instead of 97f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * the protected content. 98f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * </p><p> 9977aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown * Secure (DRM) video decoders may allocate protected graphics buffers to request that 10077aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown * a hardware-protected path be provided between the video decoder and the external 10177aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown * display sink. If a hardware-protected path is not available, then content stored 10277aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown * in protected graphics buffers may not be composited. 103c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown * </p><p> 104f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * An application can use the absence of this flag as a hint that it should not use protected 105f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * buffers for this display because the content may not be visible. For example, 106f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * if the flag is not set then the application may choose not to show content on this 107f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * display, show an informative error message, select an alternate content stream 108f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * or adopt a different strategy for decoding content that does not rely on 109f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * protected buffers. 110c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown * </p> 111f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * 112f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * @see #getFlags 113c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown */ 11477aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown public static final int FLAG_SUPPORTS_PROTECTED_BUFFERS = 1 << 0; 115c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown 116c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown /** 117f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * Display flag: Indicates that the display has a secure video output and 118f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * supports compositing secure surfaces. 119f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * <p> 120f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * If this flag is set then the display device has a secure video output 121f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * and is capable of showing secure surfaces. It may also be capable of 122f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * showing {@link #FLAG_SUPPORTS_PROTECTED_BUFFERS protected buffers}. 123f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * </p><p> 124f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * If this flag is not set then the display device may not have a secure video 125f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * output; the user may see a blank region on the screen instead of 126f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * the contents of secure surfaces or protected buffers. 127f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * </p><p> 128f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * Secure surfaces are used to prevent content rendered into those surfaces 129f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * by applications from appearing in screenshots or from being viewed 130f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * on non-secure displays. Protected buffers are used by secure video decoders 131f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * for a similar purpose. 132f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * </p><p> 133f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * An application creates a window with a secure surface by specifying the 134f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * {@link WindowManager.LayoutParams#FLAG_SECURE} window flag. 135f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * Likewise, an application creates a {@link SurfaceView} with a secure surface 136f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * by calling {@link SurfaceView#setSecure} before attaching the secure view to 137f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * its containing window. 138f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * </p><p> 139f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * An application can use the absence of this flag as a hint that it should not create 140f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * secure surfaces or protected buffers on this display because the content may 141f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * not be visible. For example, if the flag is not set then the application may 142f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * choose not to show content on this display, show an informative error message, 143f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * select an alternate content stream or adopt a different strategy for decoding 144f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * content that does not rely on secure surfaces or protected buffers. 145f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * </p> 146f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * 147f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * @see #getFlags 148f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown */ 149f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown public static final int FLAG_SECURE = 1 << 1; 150f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown 151f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown /** 152a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * Display flag: Indicates that the display is private. Only the application that 153a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * owns the display can create windows on it. 1547d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown * 1557d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown * @see #getFlags 1567d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown */ 1577d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown public static final int FLAG_PRIVATE = 1 << 2; 1587d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown 1597d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown /** 1607d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown * Display flag: Indicates that the display is a presentation display. 161a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * <p> 1627d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown * This flag identifies secondary displays that are suitable for 1637d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown * use as presentation displays such as HDMI or Wireless displays. Applications 1647d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown * may automatically project their content to presentation displays to provide 1657d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown * richer second screen experiences. 166a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * </p> 167a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * 168a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * @see #getFlags 169a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown */ 1707d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown public static final int FLAG_PRESENTATION = 1 << 3; 171a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown 172a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown /** 173d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown * Display flag: Indicates that the contents of the display should not be scaled 174d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown * to fit the physical screen dimensions. Used for development only to emulate 175d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown * devices with smaller physicals screens while preserving density. 176d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown * 177d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown * @hide 178d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown */ 179d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown public static final int FLAG_SCALING_DISABLED = 1 << 30; 180d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown 181d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown /** 18292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Display type: Unknown display type. 18392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 18492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 18592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public static final int TYPE_UNKNOWN = 0; 18692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 18792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 18892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Display type: Built-in display. 18992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 19092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 19192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public static final int TYPE_BUILT_IN = 1; 19292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 19392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 19492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Display type: HDMI display. 19592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 19692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 19792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public static final int TYPE_HDMI = 2; 19892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 19992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 20092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Display type: WiFi display. 20192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 20292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 20392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public static final int TYPE_WIFI = 3; 20492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 20592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 20692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Display type: Overlay display. 20792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 20892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 20992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public static final int TYPE_OVERLAY = 4; 21092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 21192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 212a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * Display type: Virtual display. 213a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * @hide 214a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown */ 215a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown public static final int TYPE_VIRTUAL = 5; 216a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown 217a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown /** 218037c33eae74bee2774897d969d48947f9abe254fJeff Brown * Display state: The display state is unknown. 219037c33eae74bee2774897d969d48947f9abe254fJeff Brown * 220037c33eae74bee2774897d969d48947f9abe254fJeff Brown * @see #getState 221037c33eae74bee2774897d969d48947f9abe254fJeff Brown */ 222037c33eae74bee2774897d969d48947f9abe254fJeff Brown public static final int STATE_UNKNOWN = 0; 223037c33eae74bee2774897d969d48947f9abe254fJeff Brown 224037c33eae74bee2774897d969d48947f9abe254fJeff Brown /** 225037c33eae74bee2774897d969d48947f9abe254fJeff Brown * Display state: The display is off. 226037c33eae74bee2774897d969d48947f9abe254fJeff Brown * 227037c33eae74bee2774897d969d48947f9abe254fJeff Brown * @see #getState 228037c33eae74bee2774897d969d48947f9abe254fJeff Brown */ 229037c33eae74bee2774897d969d48947f9abe254fJeff Brown public static final int STATE_OFF = 1; 230037c33eae74bee2774897d969d48947f9abe254fJeff Brown 231037c33eae74bee2774897d969d48947f9abe254fJeff Brown /** 232037c33eae74bee2774897d969d48947f9abe254fJeff Brown * Display state: The display is on. 233037c33eae74bee2774897d969d48947f9abe254fJeff Brown * 234037c33eae74bee2774897d969d48947f9abe254fJeff Brown * @see #getState 235037c33eae74bee2774897d969d48947f9abe254fJeff Brown */ 236037c33eae74bee2774897d969d48947f9abe254fJeff Brown public static final int STATE_ON = 2; 237037c33eae74bee2774897d969d48947f9abe254fJeff Brown 238037c33eae74bee2774897d969d48947f9abe254fJeff Brown /** 2395dc219142a756d57355b511c8f8ab913c01710daJeff Brown * Display state: The display is dozing in a low power state; it is still 2405dc219142a756d57355b511c8f8ab913c01710daJeff Brown * on but is optimized for showing system-provided content while the 2415dc219142a756d57355b511c8f8ab913c01710daJeff Brown * device is non-interactive. 242037c33eae74bee2774897d969d48947f9abe254fJeff Brown * 243037c33eae74bee2774897d969d48947f9abe254fJeff Brown * @see #getState 244037c33eae74bee2774897d969d48947f9abe254fJeff Brown * @see android.os.PowerManager#isInteractive 245037c33eae74bee2774897d969d48947f9abe254fJeff Brown */ 2465dc219142a756d57355b511c8f8ab913c01710daJeff Brown public static final int STATE_DOZE = 3; 2475dc219142a756d57355b511c8f8ab913c01710daJeff Brown 2485dc219142a756d57355b511c8f8ab913c01710daJeff Brown /** 2495dc219142a756d57355b511c8f8ab913c01710daJeff Brown * Display state: The display is dozing in a suspended low power state; it is still 2505dc219142a756d57355b511c8f8ab913c01710daJeff Brown * on but is optimized for showing static system-provided content while the device 2515dc219142a756d57355b511c8f8ab913c01710daJeff Brown * is non-interactive. This mode may be used to conserve even more power by allowing 2525dc219142a756d57355b511c8f8ab913c01710daJeff Brown * the hardware to stop applying frame buffer updates from the graphics subsystem or 2535dc219142a756d57355b511c8f8ab913c01710daJeff Brown * to take over the display and manage it autonomously to implement low power always-on 2545dc219142a756d57355b511c8f8ab913c01710daJeff Brown * display functionality. 2555dc219142a756d57355b511c8f8ab913c01710daJeff Brown * 2565dc219142a756d57355b511c8f8ab913c01710daJeff Brown * @see #getState 2575dc219142a756d57355b511c8f8ab913c01710daJeff Brown * @see android.os.PowerManager#isInteractive 2585dc219142a756d57355b511c8f8ab913c01710daJeff Brown */ 2595dc219142a756d57355b511c8f8ab913c01710daJeff Brown public static final int STATE_DOZE_SUSPEND = 4; 260037c33eae74bee2774897d969d48947f9abe254fJeff Brown 261037c33eae74bee2774897d969d48947f9abe254fJeff Brown /** 262fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Internal method to create a display. 263fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Applications should use {@link android.view.WindowManager#getDefaultDisplay()} 26498365d7663cbd82979a5700faf0050220b01084dJeff Brown * or {@link android.hardware.display.DisplayManager#getDisplay} 26598365d7663cbd82979a5700faf0050220b01084dJeff Brown * to get a display object. 266fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * 267fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * @hide 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 269bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public Display(DisplayManagerGlobal global, 270bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown int displayId, DisplayInfo displayInfo /*not null*/, 27148d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner DisplayAdjustments daj) { 272bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mGlobal = global; 273fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown mDisplayId = displayId; 274bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mDisplayInfo = displayInfo; 2751abaa53dccccc5c94a395bad5fa54cf6783b6974Craig Mautner mDisplayAdjustments = new DisplayAdjustments(daj); 276bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mIsValid = true; 27792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 27892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown // Cache properties that cannot change as long as the display is valid. 27992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown mLayerStack = displayInfo.layerStack; 28092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown mFlags = displayInfo.flags; 28192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown mType = displayInfo.type; 28292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown mAddress = displayInfo.address; 283a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown mOwnerUid = displayInfo.ownerUid; 284a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown mOwnerPackageName = displayInfo.ownerPackageName; 2855fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 2865fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 288fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Gets the display id. 289fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <p> 290fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Each logical display has a unique id. 291fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * The default display has id {@link #DEFAULT_DISPLAY}. 292fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p> 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDisplayId() { 295fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return mDisplayId; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 299bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * Returns true if this display is still valid, false if the display has been removed. 300bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * 301bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * If the display is invalid, then the methods of this class will 302bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * continue to report the most recently observed display information. 303bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * However, it is unwise (and rather fruitless) to continue using a 304bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * {@link Display} object after the display's demise. 305bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * 306bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * It's possible for a display that was previously invalid to become 307bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * valid again if a display with the same id is reconnected. 308bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * 309bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * @return True if the display is still valid. 310bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown */ 311bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public boolean isValid() { 312bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown synchronized (this) { 313bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown updateDisplayInfoLocked(); 314bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown return mIsValid; 315bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 316bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 317bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 318bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown /** 3192ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown * Gets a full copy of the display information. 3202ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown * 3212ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown * @param outDisplayInfo The object to receive the copy of the display information. 322bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * @return True if the display is still valid. 3232ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown * @hide 3242ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown */ 325bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public boolean getDisplayInfo(DisplayInfo outDisplayInfo) { 3262ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown synchronized (this) { 3272ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown updateDisplayInfoLocked(); 3282ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown outDisplayInfo.copyFrom(mDisplayInfo); 329bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown return mIsValid; 3302ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown } 3312ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown } 3322ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown 3332ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown /** 33498365d7663cbd82979a5700faf0050220b01084dJeff Brown * Gets the display's layer stack. 33598365d7663cbd82979a5700faf0050220b01084dJeff Brown * 33698365d7663cbd82979a5700faf0050220b01084dJeff Brown * Each display has its own independent layer stack upon which surfaces 33798365d7663cbd82979a5700faf0050220b01084dJeff Brown * are placed to be managed by surface flinger. 33898365d7663cbd82979a5700faf0050220b01084dJeff Brown * 3394ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * @return The display's layer stack number. 34098365d7663cbd82979a5700faf0050220b01084dJeff Brown * @hide 34198365d7663cbd82979a5700faf0050220b01084dJeff Brown */ 34298365d7663cbd82979a5700faf0050220b01084dJeff Brown public int getLayerStack() { 3434ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown return mLayerStack; 34498365d7663cbd82979a5700faf0050220b01084dJeff Brown } 34598365d7663cbd82979a5700faf0050220b01084dJeff Brown 34698365d7663cbd82979a5700faf0050220b01084dJeff Brown /** 347c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown * Returns a combination of flags that describe the capabilities of the display. 348c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown * 349c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown * @return The display flags. 350c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown * 35177aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown * @see #FLAG_SUPPORTS_PROTECTED_BUFFERS 352f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * @see #FLAG_SECURE 353a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * @see #FLAG_PRIVATE 354c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown */ 355c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown public int getFlags() { 35692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return mFlags; 35792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown } 35892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 35992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 36092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Gets the display type. 36192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * 36292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @return The display type. 36392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * 36492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @see #TYPE_UNKNOWN 36592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @see #TYPE_BUILT_IN 36692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @see #TYPE_HDMI 36792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @see #TYPE_WIFI 36892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @see #TYPE_OVERLAY 369a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * @see #TYPE_VIRTUAL 37092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 37192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 37292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public int getType() { 37392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return mType; 37492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown } 37592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 37692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 37792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Gets the display address, or null if none. 37892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Interpretation varies by display type. 37992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * 38092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @return The display address. 38192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 38292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 38392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public String getAddress() { 38492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return mAddress; 385c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown } 386c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown 387c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown /** 388a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * Gets the UID of the application that owns this display, or zero if it is 389a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * owned by the system. 390a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * <p> 391a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * If the display is private, then only the owner can use it. 392a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * </p> 393a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * 394a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * @hide 395a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown */ 396a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown public int getOwnerUid() { 397a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown return mOwnerUid; 398a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown } 399a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown 400a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown /** 401a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * Gets the package name of the application that owns this display, or null if it is 402a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * owned by the system. 403a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * <p> 404a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * If the display is private, then only the owner can use it. 405a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * </p> 406a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * 407a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * @hide 408a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown */ 409a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown public String getOwnerPackageName() { 410a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown return mOwnerPackageName; 411a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown } 412a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown 413a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown /** 41498365d7663cbd82979a5700faf0050220b01084dJeff Brown * Gets the compatibility info used by this display instance. 41598365d7663cbd82979a5700faf0050220b01084dJeff Brown * 41648d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner * @return The display adjustments holder, or null if none is required. 41798365d7663cbd82979a5700faf0050220b01084dJeff Brown * @hide 41898365d7663cbd82979a5700faf0050220b01084dJeff Brown */ 41948d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner public DisplayAdjustments getDisplayAdjustments() { 42048d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner return mDisplayAdjustments; 42198365d7663cbd82979a5700faf0050220b01084dJeff Brown } 42298365d7663cbd82979a5700faf0050220b01084dJeff Brown 42398365d7663cbd82979a5700faf0050220b01084dJeff Brown /** 4244ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Gets the name of the display. 42592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * <p> 42692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Note that some displays may be renamed by the user. 42792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * </p> 42892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * 4294ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * @return The display's name. 4304ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown */ 4314ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public String getName() { 43292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown synchronized (this) { 43392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown updateDisplayInfoLocked(); 43492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return mDisplayInfo.name; 43592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown } 4364ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 4374ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown 4384ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown /** 439bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * Gets the size of the display, in pixels. 440bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * <p> 441bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * Note that this value should <em>not</em> be used for computing layouts, 442bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * since a device will typically have screen decoration (such as a status bar) 4435cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * along the edges of the display that reduce the amount of application 444bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * space available from the size returned here. Layouts should instead use 445bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * the window size. 446bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * </p><p> 447bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * The size is adjusted based on the current rotation of the display. 448bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * </p><p> 449bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * The size returned by this method does not necessarily represent the 450bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * actual raw size (native resolution) of the display. The returned size may 451fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * be adjusted to exclude certain system decoration elements that are always visible. 452bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * It may also be scaled to provide compatibility with older applications that 453bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * were originally designed for smaller displays. 454bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * </p> 455bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * 456bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * @param outSize A {@link Point} object to receive the size information. 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 458ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn public void getSize(Point outSize) { 459fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 460fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 46148d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments); 462fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outSize.x = mTempMetrics.widthPixels; 463fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outSize.y = mTempMetrics.heightPixels; 464ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 465ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 466fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 468bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * Gets the size of the display as a rectangle, in pixels. 469bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * 470bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * @param outSize A {@link Rect} object to receive the size information. 471bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * @see #getSize(Point) 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 473ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn public void getRectSize(Rect outSize) { 474fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 475fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 47648d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments); 477fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outSize.set(0, 0, mTempMetrics.widthPixels, mTempMetrics.heightPixels); 478ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 479ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 481ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn /** 48268c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * Return the range of display sizes an application can expect to encounter 48368c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * under normal operation, as long as there is no physical change in screen 48468c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * size. This is basically the sizes you will see as the orientation 48568c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * changes, taking into account whatever screen decoration there is in 48668c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * each rotation. For example, the status bar is always at the top of the 48768c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * screen, so it will reduce the height both in landscape and portrait, and 48868c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * the smallest height returned here will be the smaller of the two. 48968c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * 49068c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * This is intended for applications to get an idea of the range of sizes 49168c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * they will encounter while going through device rotations, to provide a 49268c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * stable UI through rotation. The sizes here take into account all standard 49368c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * system decorations that reduce the size actually available to the 49468c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * application: the status bar, navigation bar, system bar, etc. It does 49568c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * <em>not</em> take into account more transient elements like an IME 49668c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * soft keyboard. 49768c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * 49868c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * @param outSmallestSize Filled in with the smallest width and height 49968c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * that the application will encounter, in pixels (not dp units). The x 50068c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * (width) dimension here directly corresponds to 50168c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * {@link android.content.res.Configuration#smallestScreenWidthDp 50268c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * Configuration.smallestScreenWidthDp}, except the value here is in raw 50368c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * screen pixels rather than dp units. Your application may of course 50468c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * still get smaller space yet if, for example, a soft keyboard is 50568c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * being displayed. 50668c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * @param outLargestSize Filled in with the largest width and height 50768c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * that the application will encounter, in pixels (not dp units). Your 50868c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * application may of course still get larger space than this if, 50968c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * for example, screen decorations like the status bar are being hidden. 51068c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn */ 51168c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn public void getCurrentSizeRange(Point outSmallestSize, Point outLargestSize) { 512fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 513fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 514fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outSmallestSize.x = mDisplayInfo.smallestNominalAppWidth; 515fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outSmallestSize.y = mDisplayInfo.smallestNominalAppHeight; 516fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outLargestSize.x = mDisplayInfo.largestNominalAppWidth; 517fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outLargestSize.y = mDisplayInfo.largestNominalAppHeight; 51868c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn } 51968c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn } 52068c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn 52168c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn /** 522ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn * Return the maximum screen size dimension that will happen. This is 523ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn * mostly for wallpapers. 524ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn * @hide 525ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn */ 526ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn public int getMaximumSizeDimension() { 527fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 528fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 529fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return Math.max(mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight); 530ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 531ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 532ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn 533ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn /** 534ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn * @deprecated Use {@link #getSize(Point)} instead. 535ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn */ 536ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn @Deprecated 537ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn public int getWidth() { 538fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 539fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateCachedAppSizeIfNeededLocked(); 540fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return mCachedAppWidthCompat; 541ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 542ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 543ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn 544ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn /** 545ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn * @deprecated Use {@link #getSize(Point)} instead. 546ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn */ 547ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn @Deprecated 548ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn public int getHeight() { 549fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 550fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateCachedAppSizeIfNeededLocked(); 551fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return mCachedAppHeightCompat; 552bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown } 553bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown } 554ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn 555bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown /** 556c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn * @hide 557c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn * Return a rectangle defining the insets of the overscan region of the display. 558c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn * Each field of the rectangle is the number of pixels the overscan area extends 559c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn * into the display on that side. 560c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn */ 561c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn public void getOverscanInsets(Rect outRect) { 562c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn synchronized (this) { 563c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn updateDisplayInfoLocked(); 564c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn outRect.set(mDisplayInfo.overscanLeft, mDisplayInfo.overscanTop, 565c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn mDisplayInfo.overscanRight, mDisplayInfo.overscanBottom); 566c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 567c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 568c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 569c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn /** 5705cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * Returns the rotation of the screen from its "natural" orientation. 5715cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * The returned value may be {@link Surface#ROTATION_0 Surface.ROTATION_0} 5725cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * (no rotation), {@link Surface#ROTATION_90 Surface.ROTATION_90}, 5735cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * {@link Surface#ROTATION_180 Surface.ROTATION_180}, or 5745cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * {@link Surface#ROTATION_270 Surface.ROTATION_270}. For 5755cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * example, if a device has a naturally tall screen, and the user has 5765cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * turned it on its side to go into a landscape orientation, the value 5775cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * returned here may be either {@link Surface#ROTATION_90 Surface.ROTATION_90} 5785cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * or {@link Surface#ROTATION_270 Surface.ROTATION_270} depending on 5795cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * the direction it was turned. The angle is the rotation of the drawn 5805cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * graphics on the screen, which is the opposite direction of the physical 5815cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * rotation of the device. For example, if the device is rotated 90 5825cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * degrees counter-clockwise, to compensate rendering will be rotated by 5835cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * 90 degrees clockwise and thus the returned value here will be 5845cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * {@link Surface#ROTATION_90 Surface.ROTATION_90}. 5855cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn */ 586d9273d6f289d9b55da3fd0db2f659fdfb48106a8Tor Norbye @Surface.Rotation 5875cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn public int getRotation() { 588fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 589fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 590fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return mDisplayInfo.rotation; 591fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 5925cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn } 593fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 5945cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn /** 5954c904a3bf3dbe98607b5e3f706ee8ef8887ee104Joe Onorato * @deprecated use {@link #getRotation} 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return orientation of this display. 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 598fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown @Deprecated 599d9273d6f289d9b55da3fd0db2f659fdfb48106a8Tor Norbye @Surface.Rotation 600fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown public int getOrientation() { 601fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return getRotation(); 602fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 605fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Gets the pixel format of the display. 606fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * @return One of the constants defined in {@link android.graphics.PixelFormat}. 607fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * 608fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * @deprecated This method is no longer supported. 609fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * The result is always {@link PixelFormat#RGBA_8888}. 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 611fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown @Deprecated 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPixelFormat() { 613fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return PixelFormat.RGBA_8888; 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 615fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 617fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Gets the refresh rate of this display in frames per second. 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getRefreshRate() { 620fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 621fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 622fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return mDisplayInfo.refreshRate; 623fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 625fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6273f145a2f958320766ae9240c7a57debc20d578aaMichael Wright * Get the supported refresh rates of this display in frames per second. 6283f145a2f958320766ae9240c7a57debc20d578aaMichael Wright */ 6293f145a2f958320766ae9240c7a57debc20d578aaMichael Wright public float[] getSupportedRefreshRates() { 6303f145a2f958320766ae9240c7a57debc20d578aaMichael Wright synchronized (this) { 6313f145a2f958320766ae9240c7a57debc20d578aaMichael Wright updateDisplayInfoLocked(); 6323f145a2f958320766ae9240c7a57debc20d578aaMichael Wright final float[] refreshRates = mDisplayInfo.supportedRefreshRates; 6333f145a2f958320766ae9240c7a57debc20d578aaMichael Wright return Arrays.copyOf(refreshRates, refreshRates.length); 6343f145a2f958320766ae9240c7a57debc20d578aaMichael Wright } 6353f145a2f958320766ae9240c7a57debc20d578aaMichael Wright } 6363f145a2f958320766ae9240c7a57debc20d578aaMichael Wright 6373f145a2f958320766ae9240c7a57debc20d578aaMichael Wright /** 638e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * Gets the app VSYNC offset, in nanoseconds. This is a positive value indicating 639e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * the phase offset of the VSYNC events provided by Choreographer relative to the 640e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * display refresh. For example, if Choreographer reports that the refresh occurred 641e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * at time N, it actually occurred at (N - appVsyncOffset). 642e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * <p> 643e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * Apps generally do not need to be aware of this. It's only useful for fine-grained 644e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * A/V synchronization. 645e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden */ 646e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden public long getAppVsyncOffsetNanos() { 647e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden synchronized (this) { 648e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden updateDisplayInfoLocked(); 649e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden return mDisplayInfo.appVsyncOffsetNanos; 650e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden } 651e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden } 652e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden 653e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden /** 654e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * This is how far in advance a buffer must be queued for presentation at 655e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * a given time. If you want a buffer to appear on the screen at 656e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * time N, you must submit the buffer before (N - presentationDeadline). 657e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * <p> 658e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * The desired presentation time for GLES rendering may be set with 659e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * {@link android.opengl.EGLExt#eglPresentationTimeANDROID}. For video decoding, use 660e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * {@link android.media.MediaCodec#releaseOutputBuffer(int, long)}. Times are 661e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * expressed in nanoseconds, using the system monotonic clock 662e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * ({@link System#nanoTime}). 663e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden */ 664e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden public long getPresentationDeadlineNanos() { 665e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden synchronized (this) { 666e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden updateDisplayInfoLocked(); 667e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden return mDisplayInfo.presentationDeadlineNanos; 668e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden } 669e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden } 670e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden 671e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden /** 672bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * Gets display metrics that describe the size and density of this display. 673bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * <p> 674bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * The size is adjusted based on the current rotation of the display. 675bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * </p><p> 676bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * The size returned by this method does not necessarily represent the 677bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * actual raw size (native resolution) of the display. The returned size may 678bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * be adjusted to exclude certain system decor elements that are always visible. 679bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * It may also be scaled to provide compatibility with older applications that 680bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * were originally designed for smaller displays. 681bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * </p> 682bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * 683bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * @param outMetrics A {@link DisplayMetrics} object to receive the metrics. 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void getMetrics(DisplayMetrics outMetrics) { 686fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 687fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 68848d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner mDisplayInfo.getAppMetrics(outMetrics, mDisplayAdjustments); 68968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 69068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 69168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn 69268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn /** 693fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Gets the real size of the display without subtracting any window decor or 694fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * applying any compatibility scale factors. 695fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <p> 696fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * The size is adjusted based on the current rotation of the display. 697fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p><p> 698fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * The real size may be smaller than the physical size of the screen when the 699fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * window manager is emulating a smaller display (using adb shell am display-size). 700fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p> 701fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * 702fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * @param outSize Set to the real size of the display. 70368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn */ 704fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown public void getRealSize(Point outSize) { 705fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 706fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 707fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outSize.x = mDisplayInfo.logicalWidth; 708fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outSize.y = mDisplayInfo.logicalHeight; 709bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown } 710bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown } 711bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown 712bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown /** 713fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Gets display metrics based on the real size of this display. 714fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <p> 715fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * The size is adjusted based on the current rotation of the display. 716fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p><p> 717fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * The real size may be smaller than the physical size of the screen when the 718fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * window manager is emulating a smaller display (using adb shell am display-size). 719fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p> 720fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * 721fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * @param outMetrics A {@link DisplayMetrics} object to receive the metrics. 72293de746e5554bc9397ca8109f57875d92e64eabcJeff Brown */ 723fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown public void getRealMetrics(DisplayMetrics outMetrics) { 724fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 725fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 72648d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner mDisplayInfo.getLogicalMetrics(outMetrics, 72748d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, 7287c72668f19d404b01412abc67937b1b5c660df71Wale Ogunwale mDisplayAdjustments.getConfiguration()); 729fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 73093de746e5554bc9397ca8109f57875d92e64eabcJeff Brown } 73193de746e5554bc9397ca8109f57875d92e64eabcJeff Brown 732a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown /** 733037c33eae74bee2774897d969d48947f9abe254fJeff Brown * Gets the state of the display, such as whether it is on or off. 734037c33eae74bee2774897d969d48947f9abe254fJeff Brown * 735037c33eae74bee2774897d969d48947f9abe254fJeff Brown * @return The state of the display: one of {@link #STATE_OFF}, {@link #STATE_ON}, 7365dc219142a756d57355b511c8f8ab913c01710daJeff Brown * {@link #STATE_DOZE}, {@link #STATE_DOZE_SUSPEND}, or {@link #STATE_UNKNOWN}. 737037c33eae74bee2774897d969d48947f9abe254fJeff Brown */ 738037c33eae74bee2774897d969d48947f9abe254fJeff Brown public int getState() { 739037c33eae74bee2774897d969d48947f9abe254fJeff Brown synchronized (this) { 740037c33eae74bee2774897d969d48947f9abe254fJeff Brown updateDisplayInfoLocked(); 741037c33eae74bee2774897d969d48947f9abe254fJeff Brown return mIsValid ? mDisplayInfo.state : STATE_UNKNOWN; 742037c33eae74bee2774897d969d48947f9abe254fJeff Brown } 743037c33eae74bee2774897d969d48947f9abe254fJeff Brown } 744037c33eae74bee2774897d969d48947f9abe254fJeff Brown 745037c33eae74bee2774897d969d48947f9abe254fJeff Brown /** 746a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * Returns true if the specified UID has access to this display. 747a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * @hide 748a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown */ 749a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown public boolean hasAccess(int uid) { 750a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown return Display.hasAccess(uid, mFlags, mOwnerUid); 751a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown } 752a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown 753a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown /** @hide */ 754a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown public static boolean hasAccess(int uid, int flags, int ownerUid) { 755a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown return (flags & Display.FLAG_PRIVATE) == 0 756a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown || uid == ownerUid 757a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown || uid == Process.SYSTEM_UID 758a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown || uid == 0; 759a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown } 760a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown 76169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown /** 76269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown * Returns true if the display is a public presentation display. 76369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown * @hide 76469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown */ 76569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown public boolean isPublicPresentation() { 76669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown return (mFlags & (Display.FLAG_PRIVATE | Display.FLAG_PRESENTATION)) == 76769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown Display.FLAG_PRESENTATION; 76869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown } 76969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown 770fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private void updateDisplayInfoLocked() { 771bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown // Note: The display manager caches display info objects on our behalf. 772bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown DisplayInfo newInfo = mGlobal.getDisplayInfo(mDisplayId); 773bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown if (newInfo == null) { 774bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown // Preserve the old mDisplayInfo after the display is removed. 775bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown if (mIsValid) { 776bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mIsValid = false; 777bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown if (DEBUG) { 778bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown Log.d(TAG, "Logical display " + mDisplayId + " was removed."); 779bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 780bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 781bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } else { 782bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown // Use the new display info. (It might be the same object if nothing changed.) 783bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mDisplayInfo = newInfo; 784bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown if (!mIsValid) { 785bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mIsValid = true; 786bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown if (DEBUG) { 787bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown Log.d(TAG, "Logical display " + mDisplayId + " was recreated."); 788bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 789bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 790fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 793fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private void updateCachedAppSizeIfNeededLocked() { 794fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown long now = SystemClock.uptimeMillis(); 795fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown if (now > mLastCachedAppSizeUpdate + CACHED_APP_SIZE_DURATION_MILLIS) { 796fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 79748d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments); 798fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown mCachedAppWidthCompat = mTempMetrics.widthPixels; 799fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown mCachedAppHeightCompat = mTempMetrics.heightPixels; 800fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown mLastCachedAppSizeUpdate = now; 801fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 802ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 803bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown 804bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown // For debugging purposes 805bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown @Override 806bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown public String toString() { 807bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown synchronized (this) { 808bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown updateDisplayInfoLocked(); 80948d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments); 810bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown return "Display id " + mDisplayId + ": " + mDisplayInfo 811bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown + ", " + mTempMetrics + ", isValid=" + mIsValid; 812bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown } 813bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown } 81492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 81592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 81692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 81792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 81892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public static String typeToString(int type) { 81992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown switch (type) { 82092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown case TYPE_UNKNOWN: 82192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return "UNKNOWN"; 82292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown case TYPE_BUILT_IN: 82392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return "BUILT_IN"; 82492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown case TYPE_HDMI: 82592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return "HDMI"; 82692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown case TYPE_WIFI: 82792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return "WIFI"; 82892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown case TYPE_OVERLAY: 82992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return "OVERLAY"; 830a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown case TYPE_VIRTUAL: 831a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown return "VIRTUAL"; 83292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown default: 83392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return Integer.toString(type); 83492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown } 83592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown } 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 837037c33eae74bee2774897d969d48947f9abe254fJeff Brown /** 838037c33eae74bee2774897d969d48947f9abe254fJeff Brown * @hide 839037c33eae74bee2774897d969d48947f9abe254fJeff Brown */ 840037c33eae74bee2774897d969d48947f9abe254fJeff Brown public static String stateToString(int state) { 841037c33eae74bee2774897d969d48947f9abe254fJeff Brown switch (state) { 842037c33eae74bee2774897d969d48947f9abe254fJeff Brown case STATE_UNKNOWN: 843037c33eae74bee2774897d969d48947f9abe254fJeff Brown return "UNKNOWN"; 844037c33eae74bee2774897d969d48947f9abe254fJeff Brown case STATE_OFF: 845037c33eae74bee2774897d969d48947f9abe254fJeff Brown return "OFF"; 846037c33eae74bee2774897d969d48947f9abe254fJeff Brown case STATE_ON: 847037c33eae74bee2774897d969d48947f9abe254fJeff Brown return "ON"; 8485dc219142a756d57355b511c8f8ab913c01710daJeff Brown case STATE_DOZE: 8495dc219142a756d57355b511c8f8ab913c01710daJeff Brown return "DOZE"; 8505dc219142a756d57355b511c8f8ab913c01710daJeff Brown case STATE_DOZE_SUSPEND: 8515dc219142a756d57355b511c8f8ab913c01710daJeff Brown return "DOZE_SUSPEND"; 852037c33eae74bee2774897d969d48947f9abe254fJeff Brown default: 853037c33eae74bee2774897d969d48947f9abe254fJeff Brown return Integer.toString(state); 854037c33eae74bee2774897d969d48947f9abe254fJeff Brown } 855037c33eae74bee2774897d969d48947f9abe254fJeff Brown } 856970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown 857970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown /** 858970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * Returns true if display updates may be suspended while in the specified 859970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * display power state. 860970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @hide 861970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown */ 862970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown public static boolean isSuspendedState(int state) { 863970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown return state == STATE_OFF || state == STATE_DOZE_SUSPEND; 864970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown } 865037c33eae74bee2774897d969d48947f9abe254fJeff Brown} 866