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 android.content.Context; 20bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport android.os.Handler; 21b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligandimport android.view.Display; 22bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 23bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport java.io.PrintWriter; 24b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligandimport java.util.concurrent.atomic.AtomicInteger; 25bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 26fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/** 27848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * A display adapter makes zero or more display devices available to the system 28848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * and provides facilities for discovering when displays are connected or disconnected. 29fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <p> 30fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * For now, all display adapters are registered in the system server but 31fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * in principle it could be done from other processes. 32bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * </p><p> 334ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Display adapters are guarded by the {@link DisplayManagerService.SyncRoot} lock. 34fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p> 35fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */ 364ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownabstract class DisplayAdapter { 374ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown private final DisplayManagerService.SyncRoot mSyncRoot; 38bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown private final Context mContext; 39bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown private final Handler mHandler; 404ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown private final Listener mListener; 414ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown private final String mName; 42bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 43bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public static final int DISPLAY_DEVICE_EVENT_ADDED = 1; 44bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public static final int DISPLAY_DEVICE_EVENT_CHANGED = 2; 45bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public static final int DISPLAY_DEVICE_EVENT_REMOVED = 3; 46bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 47b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand /** 48b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand * Used to generate globally unique display mode ids. 49b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand */ 50b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand private static final AtomicInteger NEXT_DISPLAY_MODE_ID = new AtomicInteger(1); // 0 = no mode. 51b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand 5266692500344cab2f53cdb6ee1545c567fff7cb16Jeff Brown // Called with SyncRoot lock held. 534ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public DisplayAdapter(DisplayManagerService.SyncRoot syncRoot, 544ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown Context context, Handler handler, Listener listener, String name) { 554ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown mSyncRoot = syncRoot; 56bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mContext = context; 574ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown mHandler = handler; 584ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown mListener = listener; 59bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mName = name; 60bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 61bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 624ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown /** 634ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Gets the object that the display adapter should synchronize on when handling 644ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * calls that come in from outside of the display manager service. 654ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown */ 664ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public final DisplayManagerService.SyncRoot getSyncRoot() { 674ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown return mSyncRoot; 684ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 694ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown 704ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown /** 714ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Gets the display adapter's context. 724ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown */ 73bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public final Context getContext() { 74bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown return mContext; 75bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 76bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 774ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown /** 784ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Gets a handler that the display adapter may use to post asynchronous messages. 794ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown */ 80bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public final Handler getHandler() { 81bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown return mHandler; 82bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 83bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 84fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown /** 85848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * Gets the display adapter name for debugging purposes. 86fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */ 87bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public final String getName() { 88bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown return mName; 89bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 90fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 91848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown /** 92848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * Registers the display adapter with the display manager. 93848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * 944ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * The display adapter should register any built-in display devices as soon as possible. 954ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * The boot process will wait for the default display to be registered. 964ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Other display devices can be registered dynamically later. 97bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown */ 984ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public void registerLocked() { 99bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 100bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 101bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown /** 102bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * Dumps the local state of the display adapter. 103bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown */ 1044ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public void dumpLocked(PrintWriter pw) { 105bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 106bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 107bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown /** 1084ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Sends a display device event to the display adapter listener asynchronously. 109848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown */ 1104ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown protected final void sendDisplayDeviceEventLocked( 1114ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown final DisplayDevice device, final int event) { 1124ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown mHandler.post(new Runnable() { 1134ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown @Override 1144ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public void run() { 1154ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown mListener.onDisplayDeviceEvent(device, event); 1164ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 1174ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown }); 118bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 119bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown 120bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown /** 1214ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Sends a request to perform traversals. 122bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown */ 1234ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown protected final void sendTraversalRequestLocked() { 124bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown mHandler.post(new Runnable() { 125bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown @Override 126bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public void run() { 1274ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown mListener.onTraversalRequested(); 128bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 129bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown }); 130bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown } 131848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown 132b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand public static Display.Mode createMode(int width, int height, float refreshRate) { 133b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand return new Display.Mode( 134b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand NEXT_DISPLAY_MODE_ID.getAndIncrement(), width, height, refreshRate); 135b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand } 136b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand 137848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown public interface Listener { 138bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public void onDisplayDeviceEvent(DisplayDevice device, int event); 1394ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public void onTraversalRequested(); 140848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown } 141fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown} 142