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