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