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 /** 17392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Display type: Unknown display type. 17492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 17592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 17692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public static final int TYPE_UNKNOWN = 0; 17792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 17892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 17992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Display type: Built-in display. 18092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 18192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 18292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public static final int TYPE_BUILT_IN = 1; 18392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 18492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 18592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Display type: HDMI display. 18692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 18792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 18892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public static final int TYPE_HDMI = 2; 18992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 19092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 19192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Display type: WiFi display. 19292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 19392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 19492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public static final int TYPE_WIFI = 3; 19592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 19692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 19792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Display type: Overlay display. 19892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 19992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 20092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public static final int TYPE_OVERLAY = 4; 20192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 20292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 203a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * Display type: Virtual display. 204a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * @hide 205a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown */ 206a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown public static final int TYPE_VIRTUAL = 5; 207a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown 208a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown /** 209037c33eae74bee2774897d969d48947f9abe254fJeff Brown * Display state: The display state is unknown. 210037c33eae74bee2774897d969d48947f9abe254fJeff Brown * 211037c33eae74bee2774897d969d48947f9abe254fJeff Brown * @see #getState 212037c33eae74bee2774897d969d48947f9abe254fJeff Brown */ 213037c33eae74bee2774897d969d48947f9abe254fJeff Brown public static final int STATE_UNKNOWN = 0; 214037c33eae74bee2774897d969d48947f9abe254fJeff Brown 215037c33eae74bee2774897d969d48947f9abe254fJeff Brown /** 216037c33eae74bee2774897d969d48947f9abe254fJeff Brown * Display state: The display is off. 217037c33eae74bee2774897d969d48947f9abe254fJeff Brown * 218037c33eae74bee2774897d969d48947f9abe254fJeff Brown * @see #getState 219037c33eae74bee2774897d969d48947f9abe254fJeff Brown */ 220037c33eae74bee2774897d969d48947f9abe254fJeff Brown public static final int STATE_OFF = 1; 221037c33eae74bee2774897d969d48947f9abe254fJeff Brown 222037c33eae74bee2774897d969d48947f9abe254fJeff Brown /** 223037c33eae74bee2774897d969d48947f9abe254fJeff Brown * Display state: The display is on. 224037c33eae74bee2774897d969d48947f9abe254fJeff Brown * 225037c33eae74bee2774897d969d48947f9abe254fJeff Brown * @see #getState 226037c33eae74bee2774897d969d48947f9abe254fJeff Brown */ 227037c33eae74bee2774897d969d48947f9abe254fJeff Brown public static final int STATE_ON = 2; 228037c33eae74bee2774897d969d48947f9abe254fJeff Brown 229037c33eae74bee2774897d969d48947f9abe254fJeff Brown /** 2305dc219142a756d57355b511c8f8ab913c01710daJeff Brown * Display state: The display is dozing in a low power state; it is still 2315dc219142a756d57355b511c8f8ab913c01710daJeff Brown * on but is optimized for showing system-provided content while the 2325dc219142a756d57355b511c8f8ab913c01710daJeff Brown * device is non-interactive. 233037c33eae74bee2774897d969d48947f9abe254fJeff Brown * 234037c33eae74bee2774897d969d48947f9abe254fJeff Brown * @see #getState 235037c33eae74bee2774897d969d48947f9abe254fJeff Brown * @see android.os.PowerManager#isInteractive 236037c33eae74bee2774897d969d48947f9abe254fJeff Brown */ 2375dc219142a756d57355b511c8f8ab913c01710daJeff Brown public static final int STATE_DOZE = 3; 2385dc219142a756d57355b511c8f8ab913c01710daJeff Brown 2395dc219142a756d57355b511c8f8ab913c01710daJeff Brown /** 2405dc219142a756d57355b511c8f8ab913c01710daJeff Brown * Display state: The display is dozing in a suspended low power state; it is still 2415dc219142a756d57355b511c8f8ab913c01710daJeff Brown * on but is optimized for showing static system-provided content while the device 2425dc219142a756d57355b511c8f8ab913c01710daJeff Brown * is non-interactive. This mode may be used to conserve even more power by allowing 2435dc219142a756d57355b511c8f8ab913c01710daJeff Brown * the hardware to stop applying frame buffer updates from the graphics subsystem or 2445dc219142a756d57355b511c8f8ab913c01710daJeff Brown * to take over the display and manage it autonomously to implement low power always-on 2455dc219142a756d57355b511c8f8ab913c01710daJeff Brown * display functionality. 2465dc219142a756d57355b511c8f8ab913c01710daJeff Brown * 2475dc219142a756d57355b511c8f8ab913c01710daJeff Brown * @see #getState 2485dc219142a756d57355b511c8f8ab913c01710daJeff Brown * @see android.os.PowerManager#isInteractive 2495dc219142a756d57355b511c8f8ab913c01710daJeff Brown */ 2505dc219142a756d57355b511c8f8ab913c01710daJeff Brown public static final int STATE_DOZE_SUSPEND = 4; 251037c33eae74bee2774897d969d48947f9abe254fJeff Brown 252037c33eae74bee2774897d969d48947f9abe254fJeff Brown /** 253fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Internal method to create a display. 254fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Applications should use {@link android.view.WindowManager#getDefaultDisplay()} 25598365d7663cbd82979a5700faf0050220b01084dJeff Brown * or {@link android.hardware.display.DisplayManager#getDisplay} 25698365d7663cbd82979a5700faf0050220b01084dJeff Brown * to get a display object. 257fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * 258fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * @hide 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 260bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public Display(DisplayManagerGlobal global, 261bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown int displayId, DisplayInfo displayInfo /*not null*/, 26248d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner DisplayAdjustments daj) { 263bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mGlobal = global; 264fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown mDisplayId = displayId; 265bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mDisplayInfo = displayInfo; 2661abaa53dccccc5c94a395bad5fa54cf6783b6974Craig Mautner mDisplayAdjustments = new DisplayAdjustments(daj); 267bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mIsValid = true; 26892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 26992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown // Cache properties that cannot change as long as the display is valid. 27092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown mLayerStack = displayInfo.layerStack; 27192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown mFlags = displayInfo.flags; 27292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown mType = displayInfo.type; 27392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown mAddress = displayInfo.address; 274a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown mOwnerUid = displayInfo.ownerUid; 275a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown mOwnerPackageName = displayInfo.ownerPackageName; 2765fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 2775fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 279fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Gets the display id. 280fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <p> 281fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Each logical display has a unique id. 282fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * The default display has id {@link #DEFAULT_DISPLAY}. 283fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p> 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDisplayId() { 286fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return mDisplayId; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 290bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * Returns true if this display is still valid, false if the display has been removed. 291bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * 292bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * If the display is invalid, then the methods of this class will 293bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * continue to report the most recently observed display information. 294bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * However, it is unwise (and rather fruitless) to continue using a 295bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * {@link Display} object after the display's demise. 296bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * 297bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * It's possible for a display that was previously invalid to become 298bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * valid again if a display with the same id is reconnected. 299bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * 300bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * @return True if the display is still valid. 301bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown */ 302bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public boolean isValid() { 303bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown synchronized (this) { 304bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown updateDisplayInfoLocked(); 305bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown return mIsValid; 306bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 307bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 308bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 309bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown /** 3102ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown * Gets a full copy of the display information. 3112ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown * 3122ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown * @param outDisplayInfo The object to receive the copy of the display information. 313bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * @return True if the display is still valid. 3142ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown * @hide 3152ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown */ 316bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public boolean getDisplayInfo(DisplayInfo outDisplayInfo) { 3172ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown synchronized (this) { 3182ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown updateDisplayInfoLocked(); 3192ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown outDisplayInfo.copyFrom(mDisplayInfo); 320bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown return mIsValid; 3212ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown } 3222ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown } 3232ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown 3242ab1b7d9abc1b720b63ae01abcf1df0dc780eed4Jeff Brown /** 32598365d7663cbd82979a5700faf0050220b01084dJeff Brown * Gets the display's layer stack. 32698365d7663cbd82979a5700faf0050220b01084dJeff Brown * 32798365d7663cbd82979a5700faf0050220b01084dJeff Brown * Each display has its own independent layer stack upon which surfaces 32898365d7663cbd82979a5700faf0050220b01084dJeff Brown * are placed to be managed by surface flinger. 32998365d7663cbd82979a5700faf0050220b01084dJeff Brown * 3304ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * @return The display's layer stack number. 33198365d7663cbd82979a5700faf0050220b01084dJeff Brown * @hide 33298365d7663cbd82979a5700faf0050220b01084dJeff Brown */ 33398365d7663cbd82979a5700faf0050220b01084dJeff Brown public int getLayerStack() { 3344ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown return mLayerStack; 33598365d7663cbd82979a5700faf0050220b01084dJeff Brown } 33698365d7663cbd82979a5700faf0050220b01084dJeff Brown 33798365d7663cbd82979a5700faf0050220b01084dJeff Brown /** 338c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown * Returns a combination of flags that describe the capabilities of the display. 339c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown * 340c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown * @return The display flags. 341c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown * 34277aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown * @see #FLAG_SUPPORTS_PROTECTED_BUFFERS 343f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown * @see #FLAG_SECURE 344a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * @see #FLAG_PRIVATE 345c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown */ 346c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown public int getFlags() { 34792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return mFlags; 34892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown } 34992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 35092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 35192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Gets the display type. 35292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * 35392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @return The display type. 35492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * 35592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @see #TYPE_UNKNOWN 35692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @see #TYPE_BUILT_IN 35792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @see #TYPE_HDMI 35892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @see #TYPE_WIFI 35992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @see #TYPE_OVERLAY 360a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * @see #TYPE_VIRTUAL 36192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 36292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 36392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public int getType() { 36492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return mType; 36592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown } 36692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 36792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 36892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Gets the display address, or null if none. 36992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Interpretation varies by display type. 37092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * 37192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @return The display address. 37292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 37392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 37492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public String getAddress() { 37592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return mAddress; 376c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown } 377c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown 378c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown /** 379a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * Gets the UID of the application that owns this display, or zero if it is 380a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * owned by the system. 381a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * <p> 382a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * If the display is private, then only the owner can use it. 383a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * </p> 384a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * 385a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * @hide 386a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown */ 387a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown public int getOwnerUid() { 388a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown return mOwnerUid; 389a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown } 390a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown 391a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown /** 392a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * Gets the package name of the application that owns this display, or null if it is 393a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * owned by the system. 394a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * <p> 395a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * If the display is private, then only the owner can use it. 396a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * </p> 397a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * 398a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * @hide 399a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown */ 400a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown public String getOwnerPackageName() { 401a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown return mOwnerPackageName; 402a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown } 403a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown 404a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown /** 40598365d7663cbd82979a5700faf0050220b01084dJeff Brown * Gets the compatibility info used by this display instance. 40698365d7663cbd82979a5700faf0050220b01084dJeff Brown * 40748d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner * @return The display adjustments holder, or null if none is required. 40898365d7663cbd82979a5700faf0050220b01084dJeff Brown * @hide 40998365d7663cbd82979a5700faf0050220b01084dJeff Brown */ 41048d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner public DisplayAdjustments getDisplayAdjustments() { 41148d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner return mDisplayAdjustments; 41298365d7663cbd82979a5700faf0050220b01084dJeff Brown } 41398365d7663cbd82979a5700faf0050220b01084dJeff Brown 41498365d7663cbd82979a5700faf0050220b01084dJeff Brown /** 4154ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Gets the name of the display. 41692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * <p> 41792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * Note that some displays may be renamed by the user. 41892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * </p> 41992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * 4204ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * @return The display's name. 4214ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown */ 4224ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public String getName() { 42392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown synchronized (this) { 42492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown updateDisplayInfoLocked(); 42592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return mDisplayInfo.name; 42692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown } 4274ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 4284ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown 4294ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown /** 430bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * Gets the size of the display, in pixels. 431bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * <p> 432bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * Note that this value should <em>not</em> be used for computing layouts, 433bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * since a device will typically have screen decoration (such as a status bar) 4345cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * along the edges of the display that reduce the amount of application 435bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * space available from the size returned here. Layouts should instead use 436bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * the window size. 437bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * </p><p> 438bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * The size is adjusted based on the current rotation of the display. 439bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * </p><p> 440bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * The size returned by this method does not necessarily represent the 441bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * actual raw size (native resolution) of the display. The returned size may 442fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * be adjusted to exclude certain system decoration elements that are always visible. 443bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * It may also be scaled to provide compatibility with older applications that 444bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * were originally designed for smaller displays. 445bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * </p> 446bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * 447bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * @param outSize A {@link Point} object to receive the size information. 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 449ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn public void getSize(Point outSize) { 450fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 451fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 45248d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments); 453fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outSize.x = mTempMetrics.widthPixels; 454fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outSize.y = mTempMetrics.heightPixels; 455ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 456ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 457fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 459bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * Gets the size of the display as a rectangle, in pixels. 460bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * 461bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * @param outSize A {@link Rect} object to receive the size information. 462bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * @see #getSize(Point) 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 464ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn public void getRectSize(Rect outSize) { 465fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 466fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 46748d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments); 468fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outSize.set(0, 0, mTempMetrics.widthPixels, mTempMetrics.heightPixels); 469ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 470ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 472ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn /** 47368c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * Return the range of display sizes an application can expect to encounter 47468c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * under normal operation, as long as there is no physical change in screen 47568c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * size. This is basically the sizes you will see as the orientation 47668c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * changes, taking into account whatever screen decoration there is in 47768c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * each rotation. For example, the status bar is always at the top of the 47868c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * screen, so it will reduce the height both in landscape and portrait, and 47968c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * the smallest height returned here will be the smaller of the two. 48068c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * 48168c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * This is intended for applications to get an idea of the range of sizes 48268c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * they will encounter while going through device rotations, to provide a 48368c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * stable UI through rotation. The sizes here take into account all standard 48468c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * system decorations that reduce the size actually available to the 48568c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * application: the status bar, navigation bar, system bar, etc. It does 48668c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * <em>not</em> take into account more transient elements like an IME 48768c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * soft keyboard. 48868c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * 48968c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * @param outSmallestSize Filled in with the smallest width and height 49068c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * that the application will encounter, in pixels (not dp units). The x 49168c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * (width) dimension here directly corresponds to 49268c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * {@link android.content.res.Configuration#smallestScreenWidthDp 49368c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * Configuration.smallestScreenWidthDp}, except the value here is in raw 49468c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * screen pixels rather than dp units. Your application may of course 49568c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * still get smaller space yet if, for example, a soft keyboard is 49668c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * being displayed. 49768c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * @param outLargestSize Filled in with the largest width and height 49868c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * that the application will encounter, in pixels (not dp units). Your 49968c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * application may of course still get larger space than this if, 50068c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn * for example, screen decorations like the status bar are being hidden. 50168c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn */ 50268c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn public void getCurrentSizeRange(Point outSmallestSize, Point outLargestSize) { 503fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 504fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 505fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outSmallestSize.x = mDisplayInfo.smallestNominalAppWidth; 506fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outSmallestSize.y = mDisplayInfo.smallestNominalAppHeight; 507fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outLargestSize.x = mDisplayInfo.largestNominalAppWidth; 508fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outLargestSize.y = mDisplayInfo.largestNominalAppHeight; 50968c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn } 51068c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn } 51168c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn 51268c33ca7ce1f142eb5f1e1f90118aeba4c9db1e3Dianne Hackborn /** 513ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn * Return the maximum screen size dimension that will happen. This is 514ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn * mostly for wallpapers. 515ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn * @hide 516ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn */ 517ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn public int getMaximumSizeDimension() { 518fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 519fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 520fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return Math.max(mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight); 521ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 522ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 523ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn 524ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn /** 525ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn * @deprecated Use {@link #getSize(Point)} instead. 526ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn */ 527ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn @Deprecated 528ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn public int getWidth() { 529fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 530fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateCachedAppSizeIfNeededLocked(); 531fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return mCachedAppWidthCompat; 532ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 533ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 534ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn 535ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn /** 536ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn * @deprecated Use {@link #getSize(Point)} instead. 537ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn */ 538ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn @Deprecated 539ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn public int getHeight() { 540fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 541fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateCachedAppSizeIfNeededLocked(); 542fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return mCachedAppHeightCompat; 543bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown } 544bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown } 545ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn 546bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown /** 547c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn * @hide 548c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn * Return a rectangle defining the insets of the overscan region of the display. 549c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn * Each field of the rectangle is the number of pixels the overscan area extends 550c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn * into the display on that side. 551c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn */ 552c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn public void getOverscanInsets(Rect outRect) { 553c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn synchronized (this) { 554c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn updateDisplayInfoLocked(); 555c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn outRect.set(mDisplayInfo.overscanLeft, mDisplayInfo.overscanTop, 556c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn mDisplayInfo.overscanRight, mDisplayInfo.overscanBottom); 557c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 558c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 559c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 560c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn /** 5615cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * Returns the rotation of the screen from its "natural" orientation. 5625cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * The returned value may be {@link Surface#ROTATION_0 Surface.ROTATION_0} 5635cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * (no rotation), {@link Surface#ROTATION_90 Surface.ROTATION_90}, 5645cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * {@link Surface#ROTATION_180 Surface.ROTATION_180}, or 5655cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * {@link Surface#ROTATION_270 Surface.ROTATION_270}. For 5665cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * example, if a device has a naturally tall screen, and the user has 5675cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * turned it on its side to go into a landscape orientation, the value 5685cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * returned here may be either {@link Surface#ROTATION_90 Surface.ROTATION_90} 5695cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * or {@link Surface#ROTATION_270 Surface.ROTATION_270} depending on 5705cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * the direction it was turned. The angle is the rotation of the drawn 5715cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * graphics on the screen, which is the opposite direction of the physical 5725cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * rotation of the device. For example, if the device is rotated 90 5735cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * degrees counter-clockwise, to compensate rendering will be rotated by 5745cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * 90 degrees clockwise and thus the returned value here will be 5755cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * {@link Surface#ROTATION_90 Surface.ROTATION_90}. 5765cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn */ 577d9273d6f289d9b55da3fd0db2f659fdfb48106a8Tor Norbye @Surface.Rotation 5785cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn public int getRotation() { 579fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 580fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 581fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return mDisplayInfo.rotation; 582fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 5835cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn } 584fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 5855cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn /** 5864c904a3bf3dbe98607b5e3f706ee8ef8887ee104Joe Onorato * @deprecated use {@link #getRotation} 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return orientation of this display. 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 589fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown @Deprecated 590d9273d6f289d9b55da3fd0db2f659fdfb48106a8Tor Norbye @Surface.Rotation 591fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown public int getOrientation() { 592fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return getRotation(); 593fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 596fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Gets the pixel format of the display. 597fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * @return One of the constants defined in {@link android.graphics.PixelFormat}. 598fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * 599fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * @deprecated This method is no longer supported. 600fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * The result is always {@link PixelFormat#RGBA_8888}. 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 602fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown @Deprecated 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPixelFormat() { 604fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return PixelFormat.RGBA_8888; 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 606fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 608fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Gets the refresh rate of this display in frames per second. 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getRefreshRate() { 611fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 612fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 613fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return mDisplayInfo.refreshRate; 614fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 616fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6183f145a2f958320766ae9240c7a57debc20d578aaMichael Wright * Get the supported refresh rates of this display in frames per second. 6193f145a2f958320766ae9240c7a57debc20d578aaMichael Wright */ 6203f145a2f958320766ae9240c7a57debc20d578aaMichael Wright public float[] getSupportedRefreshRates() { 6213f145a2f958320766ae9240c7a57debc20d578aaMichael Wright synchronized (this) { 6223f145a2f958320766ae9240c7a57debc20d578aaMichael Wright updateDisplayInfoLocked(); 6233f145a2f958320766ae9240c7a57debc20d578aaMichael Wright final float[] refreshRates = mDisplayInfo.supportedRefreshRates; 6243f145a2f958320766ae9240c7a57debc20d578aaMichael Wright return Arrays.copyOf(refreshRates, refreshRates.length); 6253f145a2f958320766ae9240c7a57debc20d578aaMichael Wright } 6263f145a2f958320766ae9240c7a57debc20d578aaMichael Wright } 6273f145a2f958320766ae9240c7a57debc20d578aaMichael Wright 6283f145a2f958320766ae9240c7a57debc20d578aaMichael Wright /** 629e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * Gets the app VSYNC offset, in nanoseconds. This is a positive value indicating 630e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * the phase offset of the VSYNC events provided by Choreographer relative to the 631e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * display refresh. For example, if Choreographer reports that the refresh occurred 632e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * at time N, it actually occurred at (N - appVsyncOffset). 633e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * <p> 634e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * Apps generally do not need to be aware of this. It's only useful for fine-grained 635e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * A/V synchronization. 636e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden */ 637e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden public long getAppVsyncOffsetNanos() { 638e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden synchronized (this) { 639e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden updateDisplayInfoLocked(); 640e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden return mDisplayInfo.appVsyncOffsetNanos; 641e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden } 642e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden } 643e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden 644e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden /** 645e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * This is how far in advance a buffer must be queued for presentation at 646e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * a given time. If you want a buffer to appear on the screen at 647e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * time N, you must submit the buffer before (N - presentationDeadline). 648e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * <p> 649e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * The desired presentation time for GLES rendering may be set with 650e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * {@link android.opengl.EGLExt#eglPresentationTimeANDROID}. For video decoding, use 651e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * {@link android.media.MediaCodec#releaseOutputBuffer(int, long)}. Times are 652e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * expressed in nanoseconds, using the system monotonic clock 653e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden * ({@link System#nanoTime}). 654e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden */ 655e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden public long getPresentationDeadlineNanos() { 656e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden synchronized (this) { 657e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden updateDisplayInfoLocked(); 658e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden return mDisplayInfo.presentationDeadlineNanos; 659e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden } 660e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden } 661e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden 662e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden /** 663bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * Gets display metrics that describe the size and density of this display. 664bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * <p> 665bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * The size is adjusted based on the current rotation of the display. 666bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * </p><p> 667bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * The size returned by this method does not necessarily represent the 668bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * actual raw size (native resolution) of the display. The returned size may 669bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * be adjusted to exclude certain system decor elements that are always visible. 670bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * It may also be scaled to provide compatibility with older applications that 671bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * were originally designed for smaller displays. 672bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * </p> 673bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * 674bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown * @param outMetrics A {@link DisplayMetrics} object to receive the metrics. 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void getMetrics(DisplayMetrics outMetrics) { 677fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 678fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 67948d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner mDisplayInfo.getAppMetrics(outMetrics, mDisplayAdjustments); 68068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 68168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 68268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn 68368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn /** 684fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Gets the real size of the display without subtracting any window decor or 685fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * applying any compatibility scale factors. 686fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <p> 687fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * The size is adjusted based on the current rotation of the display. 688fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p><p> 689fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * The real size may be smaller than the physical size of the screen when the 690fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * window manager is emulating a smaller display (using adb shell am display-size). 691fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p> 692fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * 693fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * @param outSize Set to the real size of the display. 69468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn */ 695fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown public void getRealSize(Point outSize) { 696fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 697fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 698fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outSize.x = mDisplayInfo.logicalWidth; 699fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown outSize.y = mDisplayInfo.logicalHeight; 700bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown } 701bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown } 702bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown 703bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown /** 704fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Gets display metrics based on the real size of this display. 705fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <p> 706fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * The size is adjusted based on the current rotation of the display. 707fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p><p> 708fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * The real size may be smaller than the physical size of the screen when the 709fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * window manager is emulating a smaller display (using adb shell am display-size). 710fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p> 711fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * 712fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * @param outMetrics A {@link DisplayMetrics} object to receive the metrics. 71393de746e5554bc9397ca8109f57875d92e64eabcJeff Brown */ 714fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown public void getRealMetrics(DisplayMetrics outMetrics) { 715fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (this) { 716fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 71748d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner mDisplayInfo.getLogicalMetrics(outMetrics, 71848d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, 71948d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner mDisplayAdjustments.getActivityToken()); 720fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 72193de746e5554bc9397ca8109f57875d92e64eabcJeff Brown } 72293de746e5554bc9397ca8109f57875d92e64eabcJeff Brown 723a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown /** 724037c33eae74bee2774897d969d48947f9abe254fJeff Brown * Gets the state of the display, such as whether it is on or off. 725037c33eae74bee2774897d969d48947f9abe254fJeff Brown * 726037c33eae74bee2774897d969d48947f9abe254fJeff Brown * @return The state of the display: one of {@link #STATE_OFF}, {@link #STATE_ON}, 7275dc219142a756d57355b511c8f8ab913c01710daJeff Brown * {@link #STATE_DOZE}, {@link #STATE_DOZE_SUSPEND}, or {@link #STATE_UNKNOWN}. 728037c33eae74bee2774897d969d48947f9abe254fJeff Brown */ 729037c33eae74bee2774897d969d48947f9abe254fJeff Brown public int getState() { 730037c33eae74bee2774897d969d48947f9abe254fJeff Brown synchronized (this) { 731037c33eae74bee2774897d969d48947f9abe254fJeff Brown updateDisplayInfoLocked(); 732037c33eae74bee2774897d969d48947f9abe254fJeff Brown return mIsValid ? mDisplayInfo.state : STATE_UNKNOWN; 733037c33eae74bee2774897d969d48947f9abe254fJeff Brown } 734037c33eae74bee2774897d969d48947f9abe254fJeff Brown } 735037c33eae74bee2774897d969d48947f9abe254fJeff Brown 736037c33eae74bee2774897d969d48947f9abe254fJeff Brown /** 737a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * Returns true if the specified UID has access to this display. 738a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * @hide 739a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown */ 740a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown public boolean hasAccess(int uid) { 741a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown return Display.hasAccess(uid, mFlags, mOwnerUid); 742a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown } 743a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown 744a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown /** @hide */ 745a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown public static boolean hasAccess(int uid, int flags, int ownerUid) { 746a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown return (flags & Display.FLAG_PRIVATE) == 0 747a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown || uid == ownerUid 748a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown || uid == Process.SYSTEM_UID 749a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown || uid == 0; 750a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown } 751a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown 75269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown /** 75369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown * Returns true if the display is a public presentation display. 75469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown * @hide 75569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown */ 75669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown public boolean isPublicPresentation() { 75769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown return (mFlags & (Display.FLAG_PRIVATE | Display.FLAG_PRESENTATION)) == 75869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown Display.FLAG_PRESENTATION; 75969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown } 76069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown 761fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private void updateDisplayInfoLocked() { 762bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown // Note: The display manager caches display info objects on our behalf. 763bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown DisplayInfo newInfo = mGlobal.getDisplayInfo(mDisplayId); 764bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown if (newInfo == null) { 765bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown // Preserve the old mDisplayInfo after the display is removed. 766bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown if (mIsValid) { 767bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mIsValid = false; 768bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown if (DEBUG) { 769bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown Log.d(TAG, "Logical display " + mDisplayId + " was removed."); 770bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 771bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 772bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } else { 773bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown // Use the new display info. (It might be the same object if nothing changed.) 774bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mDisplayInfo = newInfo; 775bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown if (!mIsValid) { 776bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mIsValid = true; 777bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown if (DEBUG) { 778bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown Log.d(TAG, "Logical display " + mDisplayId + " was recreated."); 779bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 780bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 781fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 784fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private void updateCachedAppSizeIfNeededLocked() { 785fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown long now = SystemClock.uptimeMillis(); 786fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown if (now > mLastCachedAppSizeUpdate + CACHED_APP_SIZE_DURATION_MILLIS) { 787fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown updateDisplayInfoLocked(); 78848d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments); 789fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown mCachedAppWidthCompat = mTempMetrics.widthPixels; 790fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown mCachedAppHeightCompat = mTempMetrics.heightPixels; 791fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown mLastCachedAppSizeUpdate = now; 792fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 793ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 794bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown 795bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown // For debugging purposes 796bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown @Override 797bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown public String toString() { 798bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown synchronized (this) { 799bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown updateDisplayInfoLocked(); 80048d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments); 801bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown return "Display id " + mDisplayId + ": " + mDisplayInfo 802bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown + ", " + mTempMetrics + ", isValid=" + mIsValid; 803bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown } 804bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown } 80592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown 80692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown /** 80792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown * @hide 80892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown */ 80992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown public static String typeToString(int type) { 81092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown switch (type) { 81192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown case TYPE_UNKNOWN: 81292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return "UNKNOWN"; 81392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown case TYPE_BUILT_IN: 81492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return "BUILT_IN"; 81592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown case TYPE_HDMI: 81692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return "HDMI"; 81792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown case TYPE_WIFI: 81892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return "WIFI"; 81992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown case TYPE_OVERLAY: 82092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return "OVERLAY"; 821a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown case TYPE_VIRTUAL: 822a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown return "VIRTUAL"; 82392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown default: 82492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown return Integer.toString(type); 82592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown } 82692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown } 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 828037c33eae74bee2774897d969d48947f9abe254fJeff Brown /** 829037c33eae74bee2774897d969d48947f9abe254fJeff Brown * @hide 830037c33eae74bee2774897d969d48947f9abe254fJeff Brown */ 831037c33eae74bee2774897d969d48947f9abe254fJeff Brown public static String stateToString(int state) { 832037c33eae74bee2774897d969d48947f9abe254fJeff Brown switch (state) { 833037c33eae74bee2774897d969d48947f9abe254fJeff Brown case STATE_UNKNOWN: 834037c33eae74bee2774897d969d48947f9abe254fJeff Brown return "UNKNOWN"; 835037c33eae74bee2774897d969d48947f9abe254fJeff Brown case STATE_OFF: 836037c33eae74bee2774897d969d48947f9abe254fJeff Brown return "OFF"; 837037c33eae74bee2774897d969d48947f9abe254fJeff Brown case STATE_ON: 838037c33eae74bee2774897d969d48947f9abe254fJeff Brown return "ON"; 8395dc219142a756d57355b511c8f8ab913c01710daJeff Brown case STATE_DOZE: 8405dc219142a756d57355b511c8f8ab913c01710daJeff Brown return "DOZE"; 8415dc219142a756d57355b511c8f8ab913c01710daJeff Brown case STATE_DOZE_SUSPEND: 8425dc219142a756d57355b511c8f8ab913c01710daJeff Brown return "DOZE_SUSPEND"; 843037c33eae74bee2774897d969d48947f9abe254fJeff Brown default: 844037c33eae74bee2774897d969d48947f9abe254fJeff Brown return Integer.toString(state); 845037c33eae74bee2774897d969d48947f9abe254fJeff Brown } 846037c33eae74bee2774897d969d48947f9abe254fJeff Brown } 847970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown 848970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown /** 849970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * Returns true if display updates may be suspended while in the specified 850970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * display power state. 851970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @hide 852970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown */ 853970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown public static boolean isSuspendedState(int state) { 854970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown return state == STATE_OFF || state == STATE_DOZE_SUSPEND; 855970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown } 856037c33eae74bee2774897d969d48947f9abe254fJeff Brown} 857