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;
21bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
22bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brownimport java.io.PrintWriter;
23bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
24fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/**
25848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * A display adapter makes zero or more display devices available to the system
26848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * and provides facilities for discovering when displays are connected or disconnected.
27fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * <p>
28fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * For now, all display adapters are registered in the system server but
29fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * in principle it could be done from other processes.
30bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * </p><p>
314ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Display adapters are guarded by the {@link DisplayManagerService.SyncRoot} lock.
32fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * </p>
33fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */
344ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownabstract class DisplayAdapter {
354ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    private final DisplayManagerService.SyncRoot mSyncRoot;
36bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final Context mContext;
37bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final Handler mHandler;
384ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    private final Listener mListener;
394ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    private final String mName;
40bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
41bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public static final int DISPLAY_DEVICE_EVENT_ADDED = 1;
42bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public static final int DISPLAY_DEVICE_EVENT_CHANGED = 2;
43bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public static final int DISPLAY_DEVICE_EVENT_REMOVED = 3;
44bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
4566692500344cab2f53cdb6ee1545c567fff7cb16Jeff Brown    // Called with SyncRoot lock held.
464ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public DisplayAdapter(DisplayManagerService.SyncRoot syncRoot,
474ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            Context context, Handler handler, Listener listener, String name) {
484ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        mSyncRoot = syncRoot;
49bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mContext = context;
504ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        mHandler = handler;
514ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        mListener = listener;
52bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mName = name;
53bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
54bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
554ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
564ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Gets the object that the display adapter should synchronize on when handling
574ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * calls that come in from outside of the display manager service.
584ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
594ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public final DisplayManagerService.SyncRoot getSyncRoot() {
604ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return mSyncRoot;
614ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
624ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
634ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
644ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Gets the display adapter's context.
654ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
66bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public final Context getContext() {
67bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        return mContext;
68bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
69bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
704ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
714ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Gets a handler that the display adapter may use to post asynchronous messages.
724ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
73bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public final Handler getHandler() {
74bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        return mHandler;
75bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
76bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
77fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
78848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     * Gets the display adapter name for debugging purposes.
79fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
80bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public final String getName() {
81bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        return mName;
82bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
83fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
84848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    /**
85848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     * Registers the display adapter with the display manager.
86848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     *
874ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * The display adapter should register any built-in display devices as soon as possible.
884ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * The boot process will wait for the default display to be registered.
894ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Other display devices can be registered dynamically later.
90bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     */
914ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public void registerLocked() {
92bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
93bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
94bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    /**
95bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * Dumps the local state of the display adapter.
96bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     */
974ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public void dumpLocked(PrintWriter pw) {
98bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
99bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
100bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    /**
1014ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Sends a display device event to the display adapter listener asynchronously.
102848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     */
1034ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    protected final void sendDisplayDeviceEventLocked(
1044ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            final DisplayDevice device, final int event) {
1054ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        mHandler.post(new Runnable() {
1064ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            @Override
1074ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            public void run() {
1084ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                mListener.onDisplayDeviceEvent(device, event);
1094ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            }
1104ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        });
111bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
112bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
113bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    /**
1144ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Sends a request to perform traversals.
115bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     */
1164ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    protected final void sendTraversalRequestLocked() {
117bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mHandler.post(new Runnable() {
118bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            @Override
119bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            public void run() {
1204ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                mListener.onTraversalRequested();
121bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            }
122bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        });
123bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
124848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown
125848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    public interface Listener {
126bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        public void onDisplayDeviceEvent(DisplayDevice device, int event);
1274ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        public void onTraversalRequested();
128848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    }
129fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown}
130