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
194ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownimport android.graphics.Rect;
2064a55af0ac700baecb0877235eb42caac59a3560Jeff Brownimport android.os.IBinder;
214ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownimport android.view.Surface;
224ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
234ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownimport java.io.PrintWriter;
2464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
25fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/**
26fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Represents a physical display device such as the built-in display
27848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * an external monitor, or a WiFi display.
28bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * <p>
294ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Display devices are guarded by the {@link DisplayManagerService.SyncRoot} lock.
30bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * </p>
31fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */
324ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownabstract class DisplayDevice {
33bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final DisplayAdapter mDisplayAdapter;
34bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final IBinder mDisplayToken;
35bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
364ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    // The display device does not manage these properties itself, they are set by
374ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    // the display manager service.  The display device shouldn't really be looking at these.
384ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    private int mCurrentLayerStack = -1;
394ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    private int mCurrentOrientation = -1;
4063f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian    private Rect mCurrentLayerStackRect;
4163f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian    private Rect mCurrentDisplayRect;
424ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
43cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    // The display device owns its surface, but it should only set it
444ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    // within a transaction from performTraversalInTransactionLocked.
45cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    private Surface mCurrentSurface;
464ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
47bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public DisplayDevice(DisplayAdapter displayAdapter, IBinder displayToken) {
48bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mDisplayAdapter = displayAdapter;
49bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mDisplayToken = displayToken;
50bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
51bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
52848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    /**
53bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * Gets the display adapter that owns the display device.
54848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     *
55848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     * @return The display adapter.
56848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     */
574ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public final DisplayAdapter getAdapterLocked() {
58bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        return mDisplayAdapter;
59bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
60848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown
61848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    /**
6264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Gets the Surface Flinger display token for this display.
6364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
6464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @return The display token, or null if the display is not being managed
6564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * by Surface Flinger.
6664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
674ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public final IBinder getDisplayTokenLocked() {
68bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        return mDisplayToken;
69bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
7064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
7164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
724ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Gets the name of the display device.
734ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     *
744ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * @return The display device name.
754ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
764ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public final String getNameLocked() {
774ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return getDisplayDeviceInfoLocked().name;
784ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
794ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
804ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
81848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     * Gets information about the display device.
82848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     *
834ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * The information returned should not change between calls unless the display
844ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * adapter sent a {@link DisplayAdapter#DISPLAY_DEVICE_EVENT_CHANGED} event and
854ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * {@link #applyPendingDisplayDeviceInfoChangesLocked()} has been called to apply
864ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * the pending changes.
874ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     *
884ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * @return The display device info, which should be treated as immutable by the caller.
894ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * The display device should allocate a new display device info object whenever
904ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * the data changes.
914ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
924ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public abstract DisplayDeviceInfo getDisplayDeviceInfoLocked();
934ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
944ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
954ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Applies any pending changes to the observable state of the display device
964ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * if the display adapter sent a {@link DisplayAdapter#DISPLAY_DEVICE_EVENT_CHANGED} event.
974ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
984ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public void applyPendingDisplayDeviceInfoChangesLocked() {
994ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
1004ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
1014ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
1024ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Gives the display device a chance to update its properties while in a transaction.
1034ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
1044ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public void performTraversalInTransactionLocked() {
1054ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
1064ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
1074ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
1089e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown     * Blanks the display, if supported.
1099e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown     */
1109e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    public void blankLocked() {
1119e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    }
1129e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown
1139e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    /**
1149e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown     * Unblanks the display, if supported.
1159e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown     */
1169e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    public void unblankLocked() {
1179e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    }
1189e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown
1199e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    /**
1204ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Sets the display layer stack while in a transaction.
1214ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
1224ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public final void setLayerStackInTransactionLocked(int layerStack) {
123cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        if (mCurrentLayerStack != layerStack) {
124cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            mCurrentLayerStack = layerStack;
125cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            Surface.setDisplayLayerStack(mDisplayToken, layerStack);
1264ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        }
1274ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
1284ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
1294ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
13063f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     * Sets the display projection while in a transaction.
13163f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     *
13263f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     * @param orientation defines the display's orientation
13363f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     * @param layerStackRect defines which area of the window manager coordinate
13463f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     *            space will be used
13563f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     * @param displayRect defines where on the display will layerStackRect be
13663f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     *            mapped to. displayRect is specified post-orientation, that is
13763f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     *            it uses the orientation seen by the end-user
1384ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
139cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    public final void setProjectionInTransactionLocked(int orientation,
140cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            Rect layerStackRect, Rect displayRect) {
141cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        if (mCurrentOrientation != orientation
142cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                || mCurrentLayerStackRect == null
143cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                || !mCurrentLayerStackRect.equals(layerStackRect)
144cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                || mCurrentDisplayRect == null
145cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                || !mCurrentDisplayRect.equals(displayRect)) {
146cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            mCurrentOrientation = orientation;
147d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
148cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            if (mCurrentLayerStackRect == null) {
149cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                mCurrentLayerStackRect = new Rect();
150cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            }
151cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            mCurrentLayerStackRect.set(layerStackRect);
152d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
153cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            if (mCurrentDisplayRect == null) {
154cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                mCurrentDisplayRect = new Rect();
155cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            }
156cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            mCurrentDisplayRect.set(displayRect);
157d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
158cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            Surface.setDisplayProjection(mDisplayToken,
159cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                    orientation, layerStackRect, displayRect);
1604ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        }
1614ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
1624ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
1634ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
164cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * Sets the display surface while in a transaction.
1654ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
166cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    public final void setSurfaceInTransactionLocked(Surface surface) {
167cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        if (mCurrentSurface != surface) {
168cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            mCurrentSurface = surface;
169cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            Surface.setDisplaySurface(mDisplayToken, surface);
1704ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        }
1714ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
1724ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
1734ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
174d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     * Populates the specified viewport object with orientation,
175d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     * physical and logical rects based on the display's current projection.
176d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     */
177d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    public final void populateViewportLocked(DisplayViewport viewport) {
178d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        viewport.orientation = mCurrentOrientation;
179d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
180d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        if (mCurrentLayerStackRect != null) {
181d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            viewport.logicalFrame.set(mCurrentLayerStackRect);
182d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        } else {
183d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            viewport.logicalFrame.setEmpty();
184d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        }
185d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
186d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        if (mCurrentDisplayRect != null) {
187d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            viewport.physicalFrame.set(mCurrentDisplayRect);
188d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        } else {
189d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            viewport.physicalFrame.setEmpty();
190d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        }
19183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown
19283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        boolean isRotated = (mCurrentOrientation == Surface.ROTATION_90
19383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                || mCurrentOrientation == Surface.ROTATION_270);
19483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        DisplayDeviceInfo info = getDisplayDeviceInfoLocked();
19583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        viewport.deviceWidth = isRotated ? info.height : info.width;
19683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        viewport.deviceHeight = isRotated ? info.width : info.height;
197d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    }
198d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
199d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    /**
2004ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Dumps the local state of the display device.
2014ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Does not need to dump the display device info because that is already dumped elsewhere.
202848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     */
2034ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public void dumpLocked(PrintWriter pw) {
2044ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        pw.println("mAdapter=" + mDisplayAdapter.getName());
205cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        pw.println("mDisplayToken=" + mDisplayToken);
2064ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        pw.println("mCurrentLayerStack=" + mCurrentLayerStack);
2074ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        pw.println("mCurrentOrientation=" + mCurrentOrientation);
208cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        pw.println("mCurrentLayerStackRect=" + mCurrentLayerStackRect);
209cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        pw.println("mCurrentDisplayRect=" + mCurrentDisplayRect);
210cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        pw.println("mCurrentSurface=" + mCurrentSurface);
211bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
212fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown}
213