DisplayManagerService.java revision bd6e1500aedc5461e832f69e76341bff0e55fa2b
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
19bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport com.android.internal.util.IndentingPrintWriter;
20bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
21fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.Manifest;
22fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.content.Context;
23fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.content.pm.PackageManager;
24bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport android.hardware.display.DisplayManagerGlobal;
25fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.hardware.display.IDisplayManager;
26bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport android.hardware.display.IDisplayManagerCallback;
27fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.os.Binder;
28bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport android.os.Handler;
2964a55af0ac700baecb0877235eb42caac59a3560Jeff Brownimport android.os.IBinder;
30bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport android.os.Looper;
31bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport android.os.Message;
32bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport android.os.RemoteException;
33bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport android.os.SystemClock;
34fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.os.SystemProperties;
35bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport android.util.Slog;
36bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport android.util.SparseArray;
37fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.view.Display;
38fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.view.DisplayInfo;
39fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.view.Surface;
40fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
41fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport java.io.FileDescriptor;
42fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport java.io.PrintWriter;
43bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport java.io.StringWriter;
44fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport java.util.ArrayList;
45fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
46fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/**
47bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * Manages attached displays.
48fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <p>
49bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * The {@link DisplayManagerService} manages the global lifecycle of displays,
50bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * decides how to configure logical displays based on the physical display devices currently
51bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * attached, sends notifications to the system and to applications when the state
52bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * changes, and so on.
53bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * </p><p>
54bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * The display manager service relies on a collection of {@link DisplayAdapter} components,
55bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * for discovering and configuring physical display devices attached to the system.
56bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * There are separate display adapters for each manner that devices are attached:
57bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * one display adapter for built-in local displays, one for simulated non-functional
58bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * displays when the system is headless, one for simulated overlay displays used for
59bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * development, one for wifi displays, etc.
60bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * </p><p>
61bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * Display adapters are only weakly coupled to the display manager service.
62bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * Display adapters communicate changes in display device state to the display manager
63bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * service asynchronously via a {@link DisplayAdapter.DisplayAdapterListener} registered
64bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * by the display manager service.  This separation of concerns is important for
65bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * two main reasons.  First, it neatly encapsulates the responsibilities of these
66bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * two classes: display adapters handle individual display devices whereas
67bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * the display manager service handles the global state.  Second, it eliminates
68bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * the potential for deadlocks resulting from asynchronous display device discovery.
69bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * </p><p>
70bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * To keep things simple, display adapters and display devices are single-threaded
71bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * and are only accessed on the display manager's handler thread.  Of course, the
72bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * display manager must be accessible by multiple thread (especially for
73bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * incoming binder calls) so all of the display manager's state is synchronized
74bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * and guarded by a lock.
75fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p>
76fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */
77fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownpublic final class DisplayManagerService extends IDisplayManager.Stub {
78fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    private static final String TAG = "DisplayManagerService";
79bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private static final boolean DEBUG = false;
80fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
81fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    private static final String SYSTEM_HEADLESS = "ro.config.headless";
82bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private static final long WAIT_FOR_DEFAULT_DISPLAY_TIMEOUT = 10000;
83bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
84bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private static final int MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER = 1;
85bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private static final int MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS = 2;
86bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private static final int MSG_DELIVER_DISPLAY_EVENT = 3;
87fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
88fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    private final Object mLock = new Object();
89fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
90848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    private final Context mContext;
91fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    private final boolean mHeadless;
924f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner
93bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final DisplayManagerHandler mHandler;
94bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final DisplayAdapterListener mDisplayAdapterListener = new DisplayAdapterListener();
95bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final SparseArray<CallbackRecord> mCallbacks =
96bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            new SparseArray<CallbackRecord>();
97bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
98bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // List of all currently registered display adapters.
99fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    private final ArrayList<DisplayAdapter> mDisplayAdapters = new ArrayList<DisplayAdapter>();
100fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
101bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // List of all currently connected display devices.
102bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final ArrayList<DisplayDevice> mDisplayDevices = new ArrayList<DisplayDevice>();
103bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
104bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // List of all logical displays, indexed by logical display id.
105bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final SparseArray<LogicalDisplay> mLogicalDisplays = new SparseArray<LogicalDisplay>();
106bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private int mNextNonDefaultDisplayId = Display.DEFAULT_DISPLAY + 1;
107bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
108bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // True if in safe mode.
109bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // This option may disable certain display adapters.
110bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private boolean mSafeMode;
111bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
112bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // True if we are in a special boot mode where only core applications and
113bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // services should be started.  This option may disable certain display adapters.
114bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private boolean mOnlyCore;
115bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
116bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // Temporary callback list, used when sending display events to applications.
117bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private ArrayList<CallbackRecord> mTempCallbacks = new ArrayList<CallbackRecord>();
118bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
119bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public DisplayManagerService(Context context, Handler uiHandler) {
120848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown        mContext = context;
121fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        mHeadless = SystemProperties.get(SYSTEM_HEADLESS).equals("1");
122848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown
123bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mHandler = new DisplayManagerHandler(uiHandler.getLooper());
124bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mHandler.sendEmptyMessage(MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER);
125bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
126bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
127bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    /**
128bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * Pauses the boot process to wait for the first display to be initialized.
129bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     */
130bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public boolean waitForDefaultDisplay() {
131bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
132bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            long timeout = SystemClock.uptimeMillis() + WAIT_FOR_DEFAULT_DISPLAY_TIMEOUT;
133bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            while (mLogicalDisplays.get(Display.DEFAULT_DISPLAY) == null) {
134bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                long delay = timeout - SystemClock.uptimeMillis();
135bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                if (delay <= 0) {
136bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    return false;
137bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                }
138bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                if (DEBUG) {
139bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    Slog.d(TAG, "waitForDefaultDisplay: waiting, timeout=" + delay);
140bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                }
141bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                try {
142bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    mLock.wait(delay);
143bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                } catch (InterruptedException ex) {
144bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                }
145bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
146bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
147bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        return true;
148bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
149bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
150bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    /**
151bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * Called when the system is ready to go.
152bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     */
153bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public void systemReady(boolean safeMode, boolean onlyCore) {
154bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
155bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mSafeMode = safeMode;
156bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mOnlyCore = onlyCore;
157bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
158bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mHandler.sendEmptyMessage(MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS);
159fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
160fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
161bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // Runs on handler.
1624f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner    private void registerDefaultDisplayAdapter() {
163bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        // Register default display adapter.
1644f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner        if (mHeadless) {
165848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown            registerDisplayAdapter(new HeadlessDisplayAdapter(mContext));
1664f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner        } else {
16764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            registerDisplayAdapter(new LocalDisplayAdapter(mContext));
1684f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner        }
169fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
170fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
171bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // Runs on handler.
172bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private void registerAdditionalDisplayAdapters() {
173bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        if (shouldRegisterNonEssentialDisplayAdapters()) {
174bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            registerDisplayAdapter(new OverlayDisplayAdapter(mContext));
175bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
176bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
177bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
178bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private boolean shouldRegisterNonEssentialDisplayAdapters() {
179bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        // In safe mode, we disable non-essential display adapters to give the user
180bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        // an opportunity to fix broken settings or other problems that might affect
181bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        // system stability.
182bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        // In only-core mode, we disable non-essential display adapters to minimize
183bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        // the number of dependencies that are started while in this mode and to
184bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        // prevent problems that might occur due to the device being encrypted.
185bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
186bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            return !mSafeMode && !mOnlyCore;
187bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
188bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
189bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
190bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // Runs on handler.
191bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private void registerDisplayAdapter(DisplayAdapter adapter) {
192bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
193bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mDisplayAdapters.add(adapter);
194bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
195bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
196bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        adapter.register(mDisplayAdapterListener);
197bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
198bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
199fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    // FIXME: this isn't the right API for the long term
200fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void getDefaultExternalDisplayDeviceInfo(DisplayDeviceInfo info) {
201fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        // hardcoded assuming 720p touch screen plugged into HDMI and USB
202fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        // need to redesign this
203fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        info.width = 1280;
204fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        info.height = 720;
205fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
206fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
207848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    /**
208848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     * Returns true if the device is headless.
209848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     *
210848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     * @return True if the device is headless.
211848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     */
212fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public boolean isHeadless() {
213fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        return mHeadless;
214fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
215fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
2164f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner    /**
217bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * Sets the new logical display orientation.
218bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     *
21964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @param displayId The logical display id.
22064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @param orientation One of the Surface.ROTATION_* constants.
22164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
22264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    public void setDisplayOrientation(int displayId, int orientation) {
22364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        synchronized (mLock) {
224bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            // TODO: update mirror transforms
225bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            LogicalDisplay display = mLogicalDisplays.get(displayId);
226bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            if (display != null && display.mPrimaryDisplayDevice != null) {
227bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                IBinder displayToken = display.mPrimaryDisplayDevice.getDisplayToken();
228bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                if (displayToken != null) {
229bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    Surface.openTransaction();
230bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    try {
231bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                        Surface.setDisplayOrientation(displayToken, orientation);
232bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    } finally {
233bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                        Surface.closeTransaction();
234bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    }
23564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown                }
236bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
237bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                display.mBaseDisplayInfo.rotation = orientation;
238bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                sendDisplayEventLocked(displayId, DisplayManagerGlobal.EVENT_DISPLAY_CHANGED);
23964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            }
24064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
24164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    }
24264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
24364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
244bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * Overrides the display information of a particular logical display.
245bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * This is used by the window manager to control the size and characteristics
246bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * of the default display.
247bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     *
24864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @param displayId The logical display id.
2494f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner     * @param info The new data to be stored.
2504f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner     */
251bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public void setDisplayInfoOverrideFromWindowManager(int displayId, DisplayInfo info) {
2524f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner        synchronized (mLock) {
253bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            LogicalDisplay display = mLogicalDisplays.get(displayId);
254bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            if (display != null) {
255bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                if (info != null) {
256bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    if (display.mOverrideDisplayInfo == null) {
257bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                        display.mOverrideDisplayInfo = new DisplayInfo();
258bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    }
259bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    display.mOverrideDisplayInfo.copyFrom(info);
260bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                } else {
261bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    display.mOverrideDisplayInfo = null;
262bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                }
263bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
264bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                sendDisplayEventLocked(displayId, DisplayManagerGlobal.EVENT_DISPLAY_CHANGED);
2654f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner            }
2664f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner        }
2674f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner    }
2684f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner
2694f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner    /**
270bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * Returns information about the specified logical display.
271bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     *
272bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * @param displayId The logical display id.
273bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * @param The logical display info, or null if the display does not exist.
2744f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner     */
275fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    @Override // Binder call
276bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public DisplayInfo getDisplayInfo(int displayId) {
277fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        synchronized (mLock) {
278bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            LogicalDisplay display = mLogicalDisplays.get(displayId);
279bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            if (display != null) {
280bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                if (display.mOverrideDisplayInfo != null) {
281bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    return new DisplayInfo(display.mOverrideDisplayInfo);
282bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                }
283bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                return new DisplayInfo(display.mBaseDisplayInfo);
2844f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner            }
285bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            return null;
2864f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner        }
2874f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner    }
2884f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner
289bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    @Override // Binder call
290bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public int[] getDisplayIds() {
291bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
292bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            final int count = mLogicalDisplays.size();
293bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            int[] displayIds = new int[count];
294bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            for (int i = 0; i > count; i++) {
295bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                displayIds[i] = mLogicalDisplays.keyAt(i);
2964f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner            }
297bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            return displayIds;
298bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
299bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
3004f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner
301bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    @Override // Binder call
302bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public void registerCallback(IDisplayManagerCallback callback) {
303bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        if (callback == null) {
304bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            throw new IllegalArgumentException("listener must not be null");
305bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
306bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
307bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
308bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            int callingPid = Binder.getCallingPid();
309bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            if (mCallbacks.get(callingPid) != null) {
310bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                throw new SecurityException("The calling process has already "
311bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                        + "registered an IDisplayManagerCallback.");
3124f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner            }
313bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
314bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            CallbackRecord record = new CallbackRecord(callingPid, callback);
315bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            try {
316bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                IBinder binder = callback.asBinder();
317bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                binder.linkToDeath(record, 0);
318bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            } catch (RemoteException ex) {
319bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                // give up
320bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                throw new RuntimeException(ex);
321bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
322bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
323bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mCallbacks.put(callingPid, record);
324bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
3259de4936c99b979f6010440b043edc6d6142d1980Craig Mautner    }
3269de4936c99b979f6010440b043edc6d6142d1980Craig Mautner
327bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private void onCallbackDied(int pid) {
328bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
329bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mCallbacks.remove(pid);
330bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
331bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
332bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
333bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // Runs on handler.
334bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private void handleDisplayDeviceAdded(DisplayDevice device) {
335bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
336bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            if (mDisplayDevices.contains(device)) {
337bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                Slog.w(TAG, "Attempted to add already added display device: " + device);
338bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                return;
339bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
340bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
341bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mDisplayDevices.add(device);
342bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
343bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            LogicalDisplay display = new LogicalDisplay(device);
344bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            display.updateFromPrimaryDisplayDevice();
345bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
346bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            boolean isDefault = (display.mPrimaryDisplayDeviceInfo.flags
347bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    & DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY) != 0;
348bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            if (isDefault && mLogicalDisplays.get(Display.DEFAULT_DISPLAY) != null) {
349bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                Slog.w(TAG, "Attempted to add a second default device: " + device);
350bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                isDefault = false;
351bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
352bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
353bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            int displayId = isDefault ? Display.DEFAULT_DISPLAY : mNextNonDefaultDisplayId++;
354bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mLogicalDisplays.put(displayId, display);
355bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
356bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            sendDisplayEventLocked(displayId, DisplayManagerGlobal.EVENT_DISPLAY_ADDED);
357bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
358bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            // Wake up waitForDefaultDisplay.
359bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            if (isDefault) {
360bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                mLock.notifyAll();
361bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
362bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
363bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
364bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
365bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // Runs on handler.
366bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private void handleDisplayDeviceChanged(DisplayDevice device) {
367bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
368bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            if (!mDisplayDevices.contains(device)) {
369bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                Slog.w(TAG, "Attempted to change non-existent display device: " + device);
370bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                return;
371bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
372bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
373bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            for (int i = mLogicalDisplays.size(); i-- > 0; ) {
374bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                LogicalDisplay display = mLogicalDisplays.valueAt(i);
375bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                if (display.mPrimaryDisplayDevice == device) {
376bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    final int displayId = mLogicalDisplays.keyAt(i);
377bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    display.updateFromPrimaryDisplayDevice();
378bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    sendDisplayEventLocked(displayId, DisplayManagerGlobal.EVENT_DISPLAY_CHANGED);
379bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                }
380bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
381bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
382bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
383bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
384bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // Runs on handler.
385bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private void handleDisplayDeviceRemoved(DisplayDevice device) {
386bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
387bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            if (!mDisplayDevices.remove(device)) {
388bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                Slog.w(TAG, "Attempted to remove non-existent display device: " + device);
389bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                return;
390bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
391bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
392bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            for (int i = mLogicalDisplays.size(); i-- > 0; ) {
393bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                LogicalDisplay display = mLogicalDisplays.valueAt(i);
394bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                if (display.mPrimaryDisplayDevice == device) {
395bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    final int displayId = mLogicalDisplays.keyAt(i);
396bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    mLogicalDisplays.removeAt(i);
397bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    sendDisplayEventLocked(displayId, DisplayManagerGlobal.EVENT_DISPLAY_REMOVED);
398bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                }
399bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
400bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
401bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
402bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
403bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // Posts a message to send a display event at the next opportunity.
404bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private void sendDisplayEventLocked(int displayId, int event) {
405bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        Message msg = mHandler.obtainMessage(MSG_DELIVER_DISPLAY_EVENT, displayId, event);
406bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mHandler.sendMessage(msg);
407bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
408bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
409bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // Runs on handler.
410bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // This method actually sends display event notifications.
411bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // Note that it must be very careful not to be holding the lock while sending
412bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // is in progress.
413bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private void deliverDisplayEvent(int displayId, int event) {
414bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        if (DEBUG) {
415bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            Slog.d(TAG, "Delivering display event: displayId=" + displayId + ", event=" + event);
416bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
417bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
418bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        final int count;
419bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        synchronized (mLock) {
420bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            count = mCallbacks.size();
421bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mTempCallbacks.clear();
422bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            for (int i = 0; i < count; i++) {
423bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                mTempCallbacks.add(mCallbacks.valueAt(i));
424bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
425bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
426bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
427bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        for (int i = 0; i < count; i++) {
428bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mTempCallbacks.get(i).notifyDisplayEventAsync(displayId, event);
429bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
430bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mTempCallbacks.clear();
4314f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner    }
4324f67ba6ba4e861b287a3ff0323c107aa77f66264Craig Mautner
433fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    @Override // Binder call
434bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) {
435fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        if (mContext == null
436fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown                || mContext.checkCallingOrSelfPermission(Manifest.permission.DUMP)
437fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown                        != PackageManager.PERMISSION_GRANTED) {
438fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown            pw.println("Permission Denial: can't dump DisplayManager from from pid="
439fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown                    + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid());
440fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown            return;
441fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
442fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
443bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        pw.println("DISPLAY MANAGER (dumpsys display)");
444bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        pw.println("  mHeadless=" + mHeadless);
445fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
446bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mHandler.runWithScissors(new Runnable() {
447bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            @Override
448bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            public void run() {
449bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                dumpLocal(pw);
450bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
451bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        });
452bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
453fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
454bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    // Runs on handler.
455bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private void dumpLocal(PrintWriter pw) {
456848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown        synchronized (mLock) {
457bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "    ");
458bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
459bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            pw.println();
460bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            pw.println("Display Adapters: size=" + mDisplayAdapters.size());
461848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown            for (DisplayAdapter adapter : mDisplayAdapters) {
462bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                pw.println("  " + adapter.getName());
463bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                adapter.dump(ipw);
464848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown            }
4659de4936c99b979f6010440b043edc6d6142d1980Craig Mautner
466bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            pw.println();
467bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            pw.println("Display Devices: size=" + mDisplayDevices.size());
468bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            for (DisplayDevice device : mDisplayDevices) {
469bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                pw.println("  " + device);
470bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
471bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
472bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            final int logicalDisplayCount = mLogicalDisplays.size();
473bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            pw.println();
474bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            pw.println("Logical Displays: size=" + logicalDisplayCount);
475bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            for (int i = 0; i < logicalDisplayCount; i++) {
476bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                int displayId = mLogicalDisplays.keyAt(i);
477bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                LogicalDisplay display = mLogicalDisplays.valueAt(i);
478bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                pw.println("  Display " + displayId + ":");
479bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                pw.println("    mPrimaryDisplayDevice=" + display.mPrimaryDisplayDevice);
480bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                pw.println("    mBaseDisplayInfo=" + display.mBaseDisplayInfo);
481bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                pw.println("    mOverrideDisplayInfo="
482bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                        + display.mOverrideDisplayInfo);
483bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
484bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
485bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
486bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
487bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final class DisplayManagerHandler extends Handler {
488bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        public DisplayManagerHandler(Looper looper) {
489bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            super(looper, null, true /*async*/);
490848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown        }
491bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown
492bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        @Override
493bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        public void handleMessage(Message msg) {
494bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            switch (msg.what) {
495bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                case MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER:
496bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    registerDefaultDisplayAdapter();
497bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    break;
498bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
499bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                case MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS:
500bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    registerAdditionalDisplayAdapters();
501bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    break;
502bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
503bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                case MSG_DELIVER_DISPLAY_EVENT:
504bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    deliverDisplayEvent(msg.arg1, msg.arg2);
505bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    break;
506bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
507bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
508bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
509bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
510bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final class DisplayAdapterListener implements DisplayAdapter.Listener {
511bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        @Override
512bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        public void onDisplayDeviceEvent(DisplayDevice device, int event) {
513bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            switch (event) {
514bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                case DisplayAdapter.DISPLAY_DEVICE_EVENT_ADDED:
515bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    handleDisplayDeviceAdded(device);
516bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    break;
517bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
518bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                case DisplayAdapter.DISPLAY_DEVICE_EVENT_CHANGED:
519bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    handleDisplayDeviceChanged(device);
520bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    break;
521bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
522bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                case DisplayAdapter.DISPLAY_DEVICE_EVENT_REMOVED:
523bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    handleDisplayDeviceRemoved(device);
524bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                    break;
525bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
526bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
527bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
528bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
529bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final class CallbackRecord implements DeathRecipient {
530bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        private final int mPid;
531bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        private final IDisplayManagerCallback mCallback;
532bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
533bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        public CallbackRecord(int pid, IDisplayManagerCallback callback) {
534bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mPid = pid;
535bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mCallback = callback;
536bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
537bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
538bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        @Override
539bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        public void binderDied() {
540bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            if (DEBUG) {
541bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                Slog.d(TAG, "Display listener for pid " + mPid + " died.");
542bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
543bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            onCallbackDied(mPid);
544bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
545bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
546bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        public void notifyDisplayEventAsync(int displayId, int event) {
547bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            try {
548bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                mCallback.onDisplayEvent(displayId, event);
549bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            } catch (RemoteException ex) {
550bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                Slog.w(TAG, "Failed to notify process "
551bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                        + mPid + " that displays changed, assuming it died.", ex);
552bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown                binderDied();
553bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
554bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
555bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
556bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
557bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    /**
558bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * Each logical display is primarily associated with one display device.
559bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * The primary display device is nominally responsible for the basic properties
560bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * of the logical display such as its size, refresh rate, and dpi.
561bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     *
562bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * A logical display may be mirrored onto other display devices besides its
563bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * primary display device, but it always remains bound to its primary.
564bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * Note that the contents of a logical display may not always be visible, even
565bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * on its primary display device, such as in the case where the logical display's
566bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * primary display device is currently mirroring content from a different logical display.
567bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     */
568bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final static class LogicalDisplay {
569bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        public final DisplayInfo mBaseDisplayInfo = new DisplayInfo();
570bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        public DisplayInfo mOverrideDisplayInfo; // set by the window manager
571bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
572bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        public final DisplayDevice mPrimaryDisplayDevice;
573bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        public final DisplayDeviceInfo mPrimaryDisplayDeviceInfo = new DisplayDeviceInfo();
574bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
575bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        public LogicalDisplay(DisplayDevice primaryDisplayDevice) {
576bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mPrimaryDisplayDevice = primaryDisplayDevice;
577bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
578bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
579bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        public void updateFromPrimaryDisplayDevice() {
580bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            // Bootstrap the logical display using its associated primary physical display.
581bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mPrimaryDisplayDevice.getInfo(mPrimaryDisplayDeviceInfo);
582bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
583bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mBaseDisplayInfo.appWidth = mPrimaryDisplayDeviceInfo.width;
584bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mBaseDisplayInfo.appHeight = mPrimaryDisplayDeviceInfo.height;
585bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mBaseDisplayInfo.logicalWidth = mPrimaryDisplayDeviceInfo.width;
586bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mBaseDisplayInfo.logicalHeight = mPrimaryDisplayDeviceInfo.height;
587bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mBaseDisplayInfo.rotation = Surface.ROTATION_0;
588bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mBaseDisplayInfo.refreshRate = mPrimaryDisplayDeviceInfo.refreshRate;
589bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mBaseDisplayInfo.logicalDensityDpi = mPrimaryDisplayDeviceInfo.densityDpi;
590bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mBaseDisplayInfo.physicalXDpi = mPrimaryDisplayDeviceInfo.xDpi;
591bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mBaseDisplayInfo.physicalYDpi = mPrimaryDisplayDeviceInfo.yDpi;
592bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mBaseDisplayInfo.smallestNominalAppWidth = mPrimaryDisplayDeviceInfo.width;
593bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mBaseDisplayInfo.smallestNominalAppHeight = mPrimaryDisplayDeviceInfo.height;
594bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mBaseDisplayInfo.largestNominalAppWidth = mPrimaryDisplayDeviceInfo.width;
595bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            mBaseDisplayInfo.largestNominalAppHeight = mPrimaryDisplayDeviceInfo.height;
596bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
5979de4936c99b979f6010440b043edc6d6142d1980Craig Mautner    }
598fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown}
599