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