1fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/* 2fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Copyright (C) 2012 The Android Open Source Project 3fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * 4fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 5fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * you may not use this file except in compliance with the License. 6fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * You may obtain a copy of the License at 7fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * 8fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 9fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * 10fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Unless required by applicable law or agreed to in writing, software 11fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 12fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * See the License for the specific language governing permissions and 14fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * limitations under the License. 15fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */ 16fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 17fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownpackage com.android.server.display; 18fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 194ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownimport android.graphics.Rect; 2064a55af0ac700baecb0877235eb42caac59a3560Jeff Brownimport android.os.IBinder; 214ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownimport android.view.Surface; 224ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown 234ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownimport java.io.PrintWriter; 2464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown 25fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/** 26fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Represents a physical display device such as the built-in display 27848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * an external monitor, or a WiFi display. 28bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * <p> 294ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Display devices are guarded by the {@link DisplayManagerService.SyncRoot} lock. 30bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * </p> 31fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */ 324ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownabstract class DisplayDevice { 33bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown private final DisplayAdapter mDisplayAdapter; 34bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown private final IBinder mDisplayToken; 35bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 364ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown // The display device does not manage these properties itself, they are set by 374ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown // the display manager service. The display device shouldn't really be looking at these. 384ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown private int mCurrentLayerStack = -1; 394ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown private int mCurrentOrientation = -1; 4063f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian private Rect mCurrentLayerStackRect; 4163f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian private Rect mCurrentDisplayRect; 424ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown 43cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown // The display device owns its surface, but it should only set it 444ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown // within a transaction from performTraversalInTransactionLocked. 45cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown private Surface mCurrentSurface; 464ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown 47bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public DisplayDevice(DisplayAdapter displayAdapter, IBinder displayToken) { 48bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mDisplayAdapter = displayAdapter; 49bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mDisplayToken = displayToken; 50bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 51bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 52848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown /** 53bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * Gets the display adapter that owns the display device. 54848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * 55848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * @return The display adapter. 56848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown */ 574ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public final DisplayAdapter getAdapterLocked() { 58bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown return mDisplayAdapter; 59bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 60848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown 61848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown /** 6264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown * Gets the Surface Flinger display token for this display. 6364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown * 6464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown * @return The display token, or null if the display is not being managed 6564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown * by Surface Flinger. 6664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown */ 674ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public final IBinder getDisplayTokenLocked() { 68bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown return mDisplayToken; 69bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 7064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown 7164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown /** 724ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Gets the name of the display device. 734ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * 744ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * @return The display device name. 754ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown */ 764ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public final String getNameLocked() { 774ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown return getDisplayDeviceInfoLocked().name; 784ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 794ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown 804ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown /** 81848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * Gets information about the display device. 82848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * 834ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * The information returned should not change between calls unless the display 844ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * adapter sent a {@link DisplayAdapter#DISPLAY_DEVICE_EVENT_CHANGED} event and 854ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * {@link #applyPendingDisplayDeviceInfoChangesLocked()} has been called to apply 864ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * the pending changes. 874ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * 884ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * @return The display device info, which should be treated as immutable by the caller. 894ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * The display device should allocate a new display device info object whenever 904ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * the data changes. 914ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown */ 924ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public abstract DisplayDeviceInfo getDisplayDeviceInfoLocked(); 934ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown 944ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown /** 954ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Applies any pending changes to the observable state of the display device 964ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * if the display adapter sent a {@link DisplayAdapter#DISPLAY_DEVICE_EVENT_CHANGED} event. 974ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown */ 984ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public void applyPendingDisplayDeviceInfoChangesLocked() { 994ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 1004ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown 1014ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown /** 1024ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Gives the display device a chance to update its properties while in a transaction. 1034ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown */ 1044ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public void performTraversalInTransactionLocked() { 1054ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 1064ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown 1074ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown /** 1089e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown * Blanks the display, if supported. 1099e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown */ 1109e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown public void blankLocked() { 1119e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown } 1129e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown 1139e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown /** 1149e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown * Unblanks the display, if supported. 1159e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown */ 1169e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown public void unblankLocked() { 1179e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown } 1189e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown 1199e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown /** 1204ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Sets the display layer stack while in a transaction. 1214ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown */ 1224ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public final void setLayerStackInTransactionLocked(int layerStack) { 123cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown if (mCurrentLayerStack != layerStack) { 124cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown mCurrentLayerStack = layerStack; 125cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown Surface.setDisplayLayerStack(mDisplayToken, layerStack); 1264ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 1274ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 1284ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown 1294ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown /** 13063f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian * Sets the display projection while in a transaction. 13163f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian * 13263f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian * @param orientation defines the display's orientation 13363f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian * @param layerStackRect defines which area of the window manager coordinate 13463f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian * space will be used 13563f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian * @param displayRect defines where on the display will layerStackRect be 13663f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian * mapped to. displayRect is specified post-orientation, that is 13763f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian * it uses the orientation seen by the end-user 1384ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown */ 139cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown public final void setProjectionInTransactionLocked(int orientation, 140cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown Rect layerStackRect, Rect displayRect) { 141cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown if (mCurrentOrientation != orientation 142cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown || mCurrentLayerStackRect == null 143cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown || !mCurrentLayerStackRect.equals(layerStackRect) 144cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown || mCurrentDisplayRect == null 145cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown || !mCurrentDisplayRect.equals(displayRect)) { 146cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown mCurrentOrientation = orientation; 147d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown 148cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown if (mCurrentLayerStackRect == null) { 149cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown mCurrentLayerStackRect = new Rect(); 150cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown } 151cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown mCurrentLayerStackRect.set(layerStackRect); 152d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown 153cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown if (mCurrentDisplayRect == null) { 154cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown mCurrentDisplayRect = new Rect(); 155cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown } 156cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown mCurrentDisplayRect.set(displayRect); 157d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown 158cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown Surface.setDisplayProjection(mDisplayToken, 159cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown orientation, layerStackRect, displayRect); 1604ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 1614ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 1624ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown 1634ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown /** 164cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown * Sets the display surface while in a transaction. 1654ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown */ 166cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown public final void setSurfaceInTransactionLocked(Surface surface) { 167cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown if (mCurrentSurface != surface) { 168cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown mCurrentSurface = surface; 169cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown Surface.setDisplaySurface(mDisplayToken, surface); 1704ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 1714ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 1724ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown 1734ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown /** 174d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown * Populates the specified viewport object with orientation, 175d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown * physical and logical rects based on the display's current projection. 176d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown */ 177d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown public final void populateViewportLocked(DisplayViewport viewport) { 178d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown viewport.orientation = mCurrentOrientation; 179d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown 180d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown if (mCurrentLayerStackRect != null) { 181d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown viewport.logicalFrame.set(mCurrentLayerStackRect); 182d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown } else { 183d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown viewport.logicalFrame.setEmpty(); 184d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown } 185d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown 186d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown if (mCurrentDisplayRect != null) { 187d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown viewport.physicalFrame.set(mCurrentDisplayRect); 188d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown } else { 189d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown viewport.physicalFrame.setEmpty(); 190d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown } 19183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown 19283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown boolean isRotated = (mCurrentOrientation == Surface.ROTATION_90 19383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown || mCurrentOrientation == Surface.ROTATION_270); 19483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown DisplayDeviceInfo info = getDisplayDeviceInfoLocked(); 19583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown viewport.deviceWidth = isRotated ? info.height : info.width; 19683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown viewport.deviceHeight = isRotated ? info.width : info.height; 197d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown } 198d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown 199d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown /** 2004ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Dumps the local state of the display device. 2014ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Does not need to dump the display device info because that is already dumped elsewhere. 202848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown */ 2034ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public void dumpLocked(PrintWriter pw) { 2044ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown pw.println("mAdapter=" + mDisplayAdapter.getName()); 205cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown pw.println("mDisplayToken=" + mDisplayToken); 2064ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown pw.println("mCurrentLayerStack=" + mCurrentLayerStack); 2074ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown pw.println("mCurrentOrientation=" + mCurrentOrientation); 208cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown pw.println("mCurrentLayerStackRect=" + mCurrentLayerStackRect); 209cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown pw.println("mCurrentDisplayRect=" + mCurrentDisplayRect); 210cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown pw.println("mCurrentSurface=" + mCurrentSurface); 211bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 212fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown} 213