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;
204ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brownimport android.hardware.display.DisplayViewport;
2164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownimport android.os.IBinder;
22b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligandimport android.view.Display;
234ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownimport android.view.Surface;
243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.view.SurfaceControl;
254ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
264ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownimport java.io.PrintWriter;
2764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
28fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/**
29fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Represents a physical display device such as the built-in display
30848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown * an external monitor, or a WiFi display.
31bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * <p>
324ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Display devices are guarded by the {@link DisplayManagerService.SyncRoot} lock.
33bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * </p>
34fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */
354ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownabstract class DisplayDevice {
36bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final DisplayAdapter mDisplayAdapter;
37bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private final IBinder mDisplayToken;
38361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale    private final String mUniqueId;
39bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
404ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    // The display device does not manage these properties itself, they are set by
414ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    // the display manager service.  The display device shouldn't really be looking at these.
424ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    private int mCurrentLayerStack = -1;
434ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    private int mCurrentOrientation = -1;
4463f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian    private Rect mCurrentLayerStackRect;
4563f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian    private Rect mCurrentDisplayRect;
464ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
47cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    // The display device owns its surface, but it should only set it
484ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    // within a transaction from performTraversalInTransactionLocked.
49cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    private Surface mCurrentSurface;
504ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
5110acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown    // DEBUG STATE: Last device info which was written to the log, or null if none.
5210acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown    // Do not use for any other purpose.
5310acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown    DisplayDeviceInfo mDebugLastLoggedDeviceInfo;
5410acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown
55361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale    public DisplayDevice(DisplayAdapter displayAdapter, IBinder displayToken, String uniqueId) {
56bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mDisplayAdapter = displayAdapter;
57bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        mDisplayToken = displayToken;
58361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        mUniqueId = uniqueId;
59bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
60bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
61848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    /**
62bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown     * Gets the display adapter that owns the display device.
63848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     *
64848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     * @return The display adapter.
65848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     */
664ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public final DisplayAdapter getAdapterLocked() {
67bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        return mDisplayAdapter;
68bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
69848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown
70848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    /**
7164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * Gets the Surface Flinger display token for this display.
7264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     *
7364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * @return The display token, or null if the display is not being managed
7464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     * by Surface Flinger.
7564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown     */
764ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public final IBinder getDisplayTokenLocked() {
77bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        return mDisplayToken;
78bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
7964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
8064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /**
814ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Gets the name of the display device.
824ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     *
834ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * @return The display device name.
844ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
854ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public final String getNameLocked() {
864ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return getDisplayDeviceInfoLocked().name;
874ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
884ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
894ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
90361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale     * Returns the unique id of the display device.
91361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale     */
92361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale    public final String getUniqueId() {
93361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        return mUniqueId;
94361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale    }
95361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale
96361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale    /**
97848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     * Gets information about the display device.
98848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     *
994ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * The information returned should not change between calls unless the display
1004ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * adapter sent a {@link DisplayAdapter#DISPLAY_DEVICE_EVENT_CHANGED} event and
1014ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * {@link #applyPendingDisplayDeviceInfoChangesLocked()} has been called to apply
1024ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * the pending changes.
1034ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     *
1044ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * @return The display device info, which should be treated as immutable by the caller.
1054ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * The display device should allocate a new display device info object whenever
1064ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * the data changes.
1074ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
1084ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public abstract DisplayDeviceInfo getDisplayDeviceInfoLocked();
1094ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
1104ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
1114ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Applies any pending changes to the observable state of the display device
1124ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * if the display adapter sent a {@link DisplayAdapter#DISPLAY_DEVICE_EVENT_CHANGED} event.
1134ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
1144ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public void applyPendingDisplayDeviceInfoChangesLocked() {
1154ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
1164ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
1174ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
1184ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Gives the display device a chance to update its properties while in a transaction.
1194ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
1204ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public void performTraversalInTransactionLocked() {
1214ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
1224ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
1234ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
124037c33eae74bee2774897d969d48947f9abe254fJeff Brown     * Sets the display state, if supported.
125e75926d6dc49878682631508c996e472d79a8d41Jeff Brown     *
1265d6443bf7c087167e47ea39b13e6af09cb43ad97Jeff Brown     * @param state The new display state.
1275d6443bf7c087167e47ea39b13e6af09cb43ad97Jeff Brown     * @param brightness The new display brightness.
128e75926d6dc49878682631508c996e472d79a8d41Jeff Brown     * @return A runnable containing work to be deferred until after we have
129e75926d6dc49878682631508c996e472d79a8d41Jeff Brown     * exited the critical section, or null if none.
1309e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown     */
1315d6443bf7c087167e47ea39b13e6af09cb43ad97Jeff Brown    public Runnable requestDisplayStateLocked(int state, int brightness) {
132e75926d6dc49878682631508c996e472d79a8d41Jeff Brown        return null;
1339e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    }
1349e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown
1359e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown    /**
136b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     * Sets the mode, if supported.
1373f145a2f958320766ae9240c7a57debc20d578aaMichael Wright     */
13858e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright    public void requestColorTransformAndModeInTransactionLocked(int colorTransformId, int modeId) {
1393f145a2f958320766ae9240c7a57debc20d578aaMichael Wright    }
1403f145a2f958320766ae9240c7a57debc20d578aaMichael Wright
1413f145a2f958320766ae9240c7a57debc20d578aaMichael Wright    /**
1424ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Sets the display layer stack while in a transaction.
1434ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
1444ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public final void setLayerStackInTransactionLocked(int layerStack) {
145cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        if (mCurrentLayerStack != layerStack) {
146cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            mCurrentLayerStack = layerStack;
1473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            SurfaceControl.setDisplayLayerStack(mDisplayToken, layerStack);
1484ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        }
1494ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
1504ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
1514ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
15263f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     * Sets the display projection while in a transaction.
15363f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     *
15463f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     * @param orientation defines the display's orientation
15563f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     * @param layerStackRect defines which area of the window manager coordinate
15663f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     *            space will be used
15763f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     * @param displayRect defines where on the display will layerStackRect be
15863f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     *            mapped to. displayRect is specified post-orientation, that is
15963f1c43fbef157397869475ef30d23e631b88bbeMathias Agopian     *            it uses the orientation seen by the end-user
1604ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
161cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    public final void setProjectionInTransactionLocked(int orientation,
162cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            Rect layerStackRect, Rect displayRect) {
163cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        if (mCurrentOrientation != orientation
164cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                || mCurrentLayerStackRect == null
165cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                || !mCurrentLayerStackRect.equals(layerStackRect)
166cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                || mCurrentDisplayRect == null
167cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                || !mCurrentDisplayRect.equals(displayRect)) {
168cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            mCurrentOrientation = orientation;
169d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
170cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            if (mCurrentLayerStackRect == null) {
171cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                mCurrentLayerStackRect = new Rect();
172cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            }
173cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            mCurrentLayerStackRect.set(layerStackRect);
174d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
175cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            if (mCurrentDisplayRect == null) {
176cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                mCurrentDisplayRect = new Rect();
177cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            }
178cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            mCurrentDisplayRect.set(displayRect);
179d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
1803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            SurfaceControl.setDisplayProjection(mDisplayToken,
181cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                    orientation, layerStackRect, displayRect);
1824ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        }
1834ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
1844ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
1854ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
186cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * Sets the display surface while in a transaction.
1874ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
188cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    public final void setSurfaceInTransactionLocked(Surface surface) {
189cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        if (mCurrentSurface != surface) {
190cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            mCurrentSurface = surface;
1913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            SurfaceControl.setDisplaySurface(mDisplayToken, surface);
1924ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        }
1934ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
1944ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
1954ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
196d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     * Populates the specified viewport object with orientation,
197d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     * physical and logical rects based on the display's current projection.
198d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     */
199d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    public final void populateViewportLocked(DisplayViewport viewport) {
200d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        viewport.orientation = mCurrentOrientation;
201d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
202d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        if (mCurrentLayerStackRect != null) {
203d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            viewport.logicalFrame.set(mCurrentLayerStackRect);
204d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        } else {
205d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            viewport.logicalFrame.setEmpty();
206d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        }
207d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
208d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        if (mCurrentDisplayRect != null) {
209d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            viewport.physicalFrame.set(mCurrentDisplayRect);
210d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        } else {
211d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            viewport.physicalFrame.setEmpty();
212d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        }
21383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown
21483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        boolean isRotated = (mCurrentOrientation == Surface.ROTATION_90
21583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                || mCurrentOrientation == Surface.ROTATION_270);
21683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        DisplayDeviceInfo info = getDisplayDeviceInfoLocked();
21783d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        viewport.deviceWidth = isRotated ? info.height : info.width;
21883d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        viewport.deviceHeight = isRotated ? info.width : info.height;
219d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    }
220d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
221d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    /**
2224ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Dumps the local state of the display device.
2234ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Does not need to dump the display device info because that is already dumped elsewhere.
224848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     */
2254ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public void dumpLocked(PrintWriter pw) {
2264ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        pw.println("mAdapter=" + mDisplayAdapter.getName());
227361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        pw.println("mUniqueId=" + mUniqueId);
228cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        pw.println("mDisplayToken=" + mDisplayToken);
2294ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        pw.println("mCurrentLayerStack=" + mCurrentLayerStack);
2304ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        pw.println("mCurrentOrientation=" + mCurrentOrientation);
231cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        pw.println("mCurrentLayerStackRect=" + mCurrentLayerStackRect);
232cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        pw.println("mCurrentDisplayRect=" + mCurrentDisplayRect);
233cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        pw.println("mCurrentSurface=" + mCurrentSurface);
234bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
235fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown}
236