DisplayManagerService.java revision 848c2dc93b6795e171f3dd6f64ea0be65e2762ca
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 19fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.Manifest; 20fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.content.Context; 21fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.content.pm.PackageManager; 22fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.hardware.display.IDisplayManager; 23fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.os.Binder; 24fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.os.SystemProperties; 25fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.view.Display; 26fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.view.DisplayInfo; 27fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.view.Surface; 28fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 29fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport java.io.FileDescriptor; 30fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport java.io.PrintWriter; 31fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport java.util.ArrayList; 32fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 33fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/** 34fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Manages the properties, media routing and power state of attached displays. 35fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <p> 36fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * The display manager service does not own or directly control the displays. 37fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Instead, other components in the system register their display adapters with the 38fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * display manager service which acts as a central controller. 39fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p> 40fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */ 41fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownpublic final class DisplayManagerService extends IDisplayManager.Stub { 42fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private static final String TAG = "DisplayManagerService"; 43fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 44fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private static final String SYSTEM_HEADLESS = "ro.config.headless"; 45fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 46fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private final Object mLock = new Object(); 47fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 48848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown private final Context mContext; 49fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private final boolean mHeadless; 504f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner 51fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown private final ArrayList<DisplayAdapter> mDisplayAdapters = new ArrayList<DisplayAdapter>(); 52848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown private final DisplayInfo mDefaultDisplayInfo = new DisplayInfo(); 53fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 54848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown public DisplayManagerService(Context context) { 55848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown mContext = context; 56fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown mHeadless = SystemProperties.get(SYSTEM_HEADLESS).equals("1"); 57848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown 584f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner registerDefaultDisplayAdapter(); 59fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 60fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 614f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner private void registerDefaultDisplayAdapter() { 624f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner if (mHeadless) { 63848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown registerDisplayAdapter(new HeadlessDisplayAdapter(mContext)); 644f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner } else { 65848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown registerDisplayAdapter(new SurfaceFlingerDisplayAdapter(mContext)); 664f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner } 67fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 68fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 69fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown // FIXME: this isn't the right API for the long term 70fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown public void getDefaultExternalDisplayDeviceInfo(DisplayDeviceInfo info) { 71fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown // hardcoded assuming 720p touch screen plugged into HDMI and USB 72fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown // need to redesign this 73fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown info.width = 1280; 74fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown info.height = 720; 75fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 76fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 77848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown /** 78848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * Returns true if the device is headless. 79848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * 80848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * @return True if the device is headless. 81848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown */ 82fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown public boolean isHeadless() { 83fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return mHeadless; 84fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 85fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 864f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner /** 874f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner * Save away new DisplayInfo data. 884f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner * @param displayId The local DisplayInfo to store the new data in. 894f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner * @param info The new data to be stored. 904f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner */ 914f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner public void setDisplayInfo(int displayId, DisplayInfo info) { 924f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner synchronized (mLock) { 93848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown if (displayId != Display.DEFAULT_DISPLAY) { 94848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown throw new UnsupportedOperationException(); 954f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner } 96848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown mDefaultDisplayInfo.copyFrom(info); 974f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner } 984f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner } 994f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner 1004f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner /** 1014f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner * Return requested DisplayInfo. 1024f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner * @param displayId The data to retrieve. 1034f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner * @param outInfo The structure to receive the data. 1044f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner */ 105fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown @Override // Binder call 106fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown public boolean getDisplayInfo(int displayId, DisplayInfo outInfo) { 107fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown synchronized (mLock) { 108848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown if (displayId != Display.DEFAULT_DISPLAY) { 1094f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner return false; 1104f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner } 111848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown outInfo.copyFrom(mDefaultDisplayInfo); 1124f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner return true; 1134f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner } 1144f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner } 1154f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner 116848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown private void registerDisplayAdapter(DisplayAdapter adapter) { 117848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown mDisplayAdapters.add(adapter); 118848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown adapter.register(new DisplayAdapter.Listener() { 119848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown @Override 120848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown public void onDisplayDeviceAdded(DisplayDevice device) { 121848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo(); 122848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown device.getInfo(deviceInfo); 123848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown copyDisplayInfoFromDeviceInfo(mDefaultDisplayInfo, deviceInfo); 1244f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner } 1254f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner 126848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown @Override 127848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown public void onDisplayDeviceRemoved(DisplayDevice device) { 1284f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner } 129848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown }); 1309de4936c99b979f6010440b043edc6d6142d1980Craig Mautner } 1319de4936c99b979f6010440b043edc6d6142d1980Craig Mautner 132848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown private void copyDisplayInfoFromDeviceInfo( 133848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown DisplayInfo displayInfo, DisplayDeviceInfo deviceInfo) { 1344f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner // Bootstrap the logical display using the physical display. 1354f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner displayInfo.appWidth = deviceInfo.width; 1364f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner displayInfo.appHeight = deviceInfo.height; 1374f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner displayInfo.logicalWidth = deviceInfo.width; 1384f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner displayInfo.logicalHeight = deviceInfo.height; 1394f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner displayInfo.rotation = Surface.ROTATION_0; 1404f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner displayInfo.refreshRate = deviceInfo.refreshRate; 1414f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner displayInfo.logicalDensityDpi = deviceInfo.densityDpi; 1424f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner displayInfo.physicalXDpi = deviceInfo.xDpi; 1434f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner displayInfo.physicalYDpi = deviceInfo.yDpi; 1444f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner displayInfo.smallestNominalAppWidth = deviceInfo.width; 1454f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner displayInfo.smallestNominalAppHeight = deviceInfo.height; 1464f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner displayInfo.largestNominalAppWidth = deviceInfo.width; 1474f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner displayInfo.largestNominalAppHeight = deviceInfo.height; 1484f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner } 1494f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner 150fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown @Override // Binder call 151fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 152fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown if (mContext == null 153fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown || mContext.checkCallingOrSelfPermission(Manifest.permission.DUMP) 154fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown != PackageManager.PERMISSION_GRANTED) { 155fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown pw.println("Permission Denial: can't dump DisplayManager from from pid=" 156fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()); 157fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown return; 158fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown } 159fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 160fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown pw.println("DISPLAY MANAGER (dumpsys display)\n"); 161fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 162fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown pw.println("Headless: " + mHeadless); 163fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 164848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown synchronized (mLock) { 165848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown for (DisplayAdapter adapter : mDisplayAdapters) { 166848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown pw.println("Adapter: " + adapter.getName()); 167848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown } 1689de4936c99b979f6010440b043edc6d6142d1980Craig Mautner 169848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown pw.println("Default display: " + mDefaultDisplayInfo); 170848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown } 1719de4936c99b979f6010440b043edc6d6142d1980Craig Mautner } 172fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown} 173