DisplayDeviceInfo.java revision 3f145a2f958320766ae9240c7a57debc20d578aa
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
194ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brownimport android.hardware.display.DisplayViewport;
20cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brownimport android.util.DisplayMetrics;
2192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brownimport android.view.Display;
2227f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brownimport android.view.Surface;
23cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
243f145a2f958320766ae9240c7a57debc20d578aaMichael Wrightimport java.util.Arrays;
253f145a2f958320766ae9240c7a57debc20d578aaMichael Wright
263f145a2f958320766ae9240c7a57debc20d578aaMichael Wrightimport libcore.util.EmptyArray;
274ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownimport libcore.util.Objects;
284ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
29fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/**
30fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Describes the characteristics of a physical display device.
31fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */
324ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownfinal class DisplayDeviceInfo {
334ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
344ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Flag: Indicates that this display device should be considered the default display
354ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * device of the system.
364ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
37bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public static final int FLAG_DEFAULT_DISPLAY = 1 << 0;
384ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
394ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
4027f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * Flag: Indicates that the orientation of this display device is coupled to the
4127f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * rotation of its associated logical display.
4227f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * <p>
4327f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * This flag should be applied to the default display to indicate that the user
4427f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * physically rotates the display when content is presented in a different orientation.
4527f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * The display manager will apply a coordinate transformation assuming that the
4627f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * physical orientation of the display matches the logical orientation of its content.
4727f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * </p><p>
4827f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * The flag should not be set when the display device is mounted in a fixed orientation
4927f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * such as on a desk.  The display manager will apply a coordinate transformation
5027f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * such as a scale and translation to letterbox or pillarbox format under the
5127f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * assumption that the physical orientation of the display is invariant.
5227f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * </p>
534ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
5427f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown    public static final int FLAG_ROTATES_WITH_CONTENT = 1 << 1;
55c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown
56c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown    /**
5777aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown     * Flag: Indicates that this display device has secure video output, such as HDCP.
58c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown     */
5977aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown    public static final int FLAG_SECURE = 1 << 2;
6077aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown
6177aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown    /**
6277aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown     * Flag: Indicates that this display device supports compositing
6377aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown     * from gralloc protected buffers.
6477aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown     */
6577aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown    public static final int FLAG_SUPPORTS_PROTECTED_BUFFERS = 1 << 3;
664ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
674ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
68a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * Flag: Indicates that the display device is owned by a particular application
69a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * and that no other application should be able to interact with it.
70d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * Should typically be used together with {@link #FLAG_OWN_CONTENT_ONLY}.
71a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
72a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public static final int FLAG_PRIVATE = 1 << 4;
73a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
74a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
75a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * Flag: Indicates that the display device is not blanked automatically by
76a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * the power manager.
77a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
78a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public static final int FLAG_NEVER_BLANK = 1 << 5;
79a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
80a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
817d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * Flag: Indicates that the display is suitable for presentations.
827d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     */
837d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown    public static final int FLAG_PRESENTATION = 1 << 6;
847d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown
857d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown    /**
86d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * Flag: Only show this display's own content; do not mirror
87d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * the content of another display.
88d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     */
89d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown    public static final int FLAG_OWN_CONTENT_ONLY = 1 << 7;
90d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown
91d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown    /**
92d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     * Touch attachment: Display does not receive touch.
93d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     */
94d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    public static final int TOUCH_NONE = 0;
95d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
96d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    /**
97d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     * Touch attachment: Touch input is via the internal interface.
98d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     */
99d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    public static final int TOUCH_INTERNAL = 1;
100d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
101d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    /**
102d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     * Touch attachment: Touch input is via an external interface, such as USB.
103d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     */
104d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    public static final int TOUCH_EXTERNAL = 2;
105d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
106d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    /**
107848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     * Gets the name of the display device, which may be derived from
108848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     * EDID or other sources.  The name may be displayed to the user.
109848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     */
110848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    public String name;
111848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown
112848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    /**
113fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The width of the display in its natural orientation, in pixels.
114fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * This value is not affected by display rotation.
115fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
116fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int width;
117fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
118fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
119fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The height of the display in its natural orientation, in pixels.
120fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * This value is not affected by display rotation.
121fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
122fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int height;
123fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
124cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
125e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * The refresh rate of the display, in frames per second.
126cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
127fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float refreshRate;
128cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
129cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
1303f145a2f958320766ae9240c7a57debc20d578aaMichael Wright     * The supported refresh rates of the display at the current resolution in frames per second.
1313f145a2f958320766ae9240c7a57debc20d578aaMichael Wright     */
1323f145a2f958320766ae9240c7a57debc20d578aaMichael Wright    public float[] supportedRefreshRates = EmptyArray.FLOAT;
1333f145a2f958320766ae9240c7a57debc20d578aaMichael Wright
1343f145a2f958320766ae9240c7a57debc20d578aaMichael Wright    /**
135cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * The nominal apparent density of the display in DPI used for layout calculations.
136cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * This density is sensitive to the viewing distance.  A big TV and a tablet may have
137cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * the same apparent density even though the pixels on the TV are much bigger than
138cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * those on the tablet.
139cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
140908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn    public int densityDpi;
141cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
142cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
143cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * The physical density of the display in DPI in the X direction.
144cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * This density should specify the physical size of each pixel.
145cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
146fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float xDpi;
147cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
148cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
149cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * The physical density of the display in DPI in the X direction.
150cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * This density should specify the physical size of each pixel.
151cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
152fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float yDpi;
153fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
154cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
155e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * This is a positive value indicating the phase offset of the VSYNC events provided by
156e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * Choreographer relative to the display refresh.  For example, if Choreographer reports
157e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * that the refresh occurred at time N, it actually occurred at (N - appVsyncOffsetNanos).
158e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     */
159e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    public long appVsyncOffsetNanos;
160e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden
161e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    /**
162e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * This is how far in advance a buffer must be queued for presentation at
163e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * a given time.  If you want a buffer to appear on the screen at
164e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * time N, you must submit the buffer before (N - bufferDeadlineNanos).
165e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     */
166e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    public long presentationDeadlineNanos;
167e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden
168e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    /**
169cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * Display flags.
170cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
171bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public int flags;
172bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
173d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    /**
174d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     * The touch attachment, per {@link DisplayViewport#touch}.
175d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     */
176d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    public int touch;
177d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
17827f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown    /**
17927f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * The additional rotation to apply to all content presented on the display device
18027f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * relative to its physical coordinate system.  Default is {@link Surface#ROTATION_0}.
18127f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * <p>
18227f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * This field can be used to compensate for the fact that the display has been
18327f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * physically rotated relative to its natural orientation such as an HDMI monitor
18427f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * that has been mounted sideways to appear to be portrait rather than landscape.
18527f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * </p>
18627f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     */
18727f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown    public int rotation = Surface.ROTATION_0;
18827f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown
18992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    /**
19092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Display type.
19192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     */
19292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    public int type;
19392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
19492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    /**
19592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Display address, or null if none.
19692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Interpretation varies by display type.
19792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     */
19892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    public String address;
19992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
200a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
201037c33eae74bee2774897d969d48947f9abe254fJeff Brown     * Display state.
202037c33eae74bee2774897d969d48947f9abe254fJeff Brown     */
203037c33eae74bee2774897d969d48947f9abe254fJeff Brown    public int state = Display.STATE_ON;
204037c33eae74bee2774897d969d48947f9abe254fJeff Brown
205037c33eae74bee2774897d969d48947f9abe254fJeff Brown    /**
206a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * The UID of the application that owns this display, or zero if it is owned by the system.
207a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * <p>
208a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * If the display is private, then only the owner can use it.
209a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * </p>
210a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
211a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public int ownerUid;
212a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
213a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
214a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * The package name of the application that owns this display, or null if it is
215a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * owned by the system.
216a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * <p>
217a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * If the display is private, then only the owner can use it.
218a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * </p>
219a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
220a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public String ownerPackageName;
221a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
222cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    public void setAssumedDensityForExternalDisplay(int width, int height) {
223cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        densityDpi = Math.min(width, height) * DisplayMetrics.DENSITY_XHIGH / 1080;
224cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        // Technically, these values should be smaller than the apparent density
225cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        // but we don't know the physical size of the display.
226cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        xDpi = densityDpi;
227cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        yDpi = densityDpi;
228cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    }
229cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
2304ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    @Override
2314ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public boolean equals(Object o) {
2324ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return o instanceof DisplayDeviceInfo && equals((DisplayDeviceInfo)o);
2334ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
2344ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
2354ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public boolean equals(DisplayDeviceInfo other) {
2364ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return other != null
2374ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && Objects.equal(name, other.name)
2384ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && width == other.width
2394ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && height == other.height
2404ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && refreshRate == other.refreshRate
2413f145a2f958320766ae9240c7a57debc20d578aaMichael Wright                && Arrays.equals(supportedRefreshRates, other.supportedRefreshRates)
2424ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && densityDpi == other.densityDpi
2434ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && xDpi == other.xDpi
2444ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && yDpi == other.yDpi
245e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden                && appVsyncOffsetNanos == other.appVsyncOffsetNanos
246e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden                && presentationDeadlineNanos == other.presentationDeadlineNanos
247d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                && flags == other.flags
24827f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown                && touch == other.touch
24992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                && rotation == other.rotation
25092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                && type == other.type
251a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown                && Objects.equal(address, other.address)
252037c33eae74bee2774897d969d48947f9abe254fJeff Brown                && state == other.state
253a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown                && ownerUid == other.ownerUid
254a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown                && Objects.equal(ownerPackageName, other.ownerPackageName);
2554ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
2564ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
2574ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    @Override
2584ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public int hashCode() {
2594ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return 0; // don't care
2604ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
2614ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
262fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void copyFrom(DisplayDeviceInfo other) {
263848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown        name = other.name;
264fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        width = other.width;
265fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        height = other.height;
266fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        refreshRate = other.refreshRate;
2673f145a2f958320766ae9240c7a57debc20d578aaMichael Wright        supportedRefreshRates = other.supportedRefreshRates;
268908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        densityDpi = other.densityDpi;
269fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        xDpi = other.xDpi;
270fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        yDpi = other.yDpi;
271e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        appVsyncOffsetNanos = other.appVsyncOffsetNanos;
272e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        presentationDeadlineNanos = other.presentationDeadlineNanos;
273bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        flags = other.flags;
274d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        touch = other.touch;
27527f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown        rotation = other.rotation;
27692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        type = other.type;
27792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        address = other.address;
278037c33eae74bee2774897d969d48947f9abe254fJeff Brown        state = other.state;
279a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        ownerUid = other.ownerUid;
280a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        ownerPackageName = other.ownerPackageName;
281fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
282fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
283848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    // For debugging purposes
284fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    @Override
285fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public String toString() {
286a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        StringBuilder sb = new StringBuilder();
287a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append("DisplayDeviceInfo{\"");
288a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(name).append("\": ").append(width).append(" x ").append(height);
2893f145a2f958320766ae9240c7a57debc20d578aaMichael Wright        sb.append(", ").append(refreshRate).append(" fps");
2903f145a2f958320766ae9240c7a57debc20d578aaMichael Wright        sb.append(", supportedRefreshRates ").append(Arrays.toString(supportedRefreshRates));
2913f145a2f958320766ae9240c7a57debc20d578aaMichael Wright        sb.append(", density ").append(densityDpi);
292a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(", ").append(xDpi).append(" x ").append(yDpi).append(" dpi");
293e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        sb.append(", appVsyncOff ").append(appVsyncOffsetNanos);
294e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        sb.append(", presDeadline ").append(presentationDeadlineNanos);
295a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(", touch ").append(touchToString(touch));
296a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(", rotation ").append(rotation);
297a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(", type ").append(Display.typeToString(type));
298a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if (address != null) {
299a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(", address ").append(address);
300a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
301037c33eae74bee2774897d969d48947f9abe254fJeff Brown        sb.append(", state ").append(Display.stateToString(state));
302a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if (ownerUid != 0 || ownerPackageName != null) {
303a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(", owner ").append(ownerPackageName);
304a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(" (uid ").append(ownerUid).append(")");
305a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
306a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(flagsToString(flags));
307a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append("}");
308a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        return sb.toString();
309d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    }
310d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
311d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    private static String touchToString(int touch) {
312d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        switch (touch) {
313d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            case TOUCH_NONE:
314d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                return "NONE";
315d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            case TOUCH_INTERNAL:
316d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                return "INTERNAL";
317d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            case TOUCH_EXTERNAL:
318d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                return "EXTERNAL";
319d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            default:
320d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                return Integer.toString(touch);
321d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        }
322bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
323bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
324bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private static String flagsToString(int flags) {
325bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        StringBuilder msg = new StringBuilder();
326bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        if ((flags & FLAG_DEFAULT_DISPLAY) != 0) {
327bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            msg.append(", FLAG_DEFAULT_DISPLAY");
328bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
32927f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown        if ((flags & FLAG_ROTATES_WITH_CONTENT) != 0) {
33027f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown            msg.append(", FLAG_ROTATES_WITH_CONTENT");
331c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        }
33277aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown        if ((flags & FLAG_SECURE) != 0) {
33377aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown            msg.append(", FLAG_SECURE");
33477aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown        }
33577aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown        if ((flags & FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0) {
33677aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown            msg.append(", FLAG_SUPPORTS_PROTECTED_BUFFERS");
337bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
338a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if ((flags & FLAG_PRIVATE) != 0) {
339a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            msg.append(", FLAG_PRIVATE");
340a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
341a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if ((flags & FLAG_NEVER_BLANK) != 0) {
342a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            msg.append(", FLAG_NEVER_BLANK");
343a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
3447d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown        if ((flags & FLAG_PRESENTATION) != 0) {
3457d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown            msg.append(", FLAG_PRESENTATION");
3467d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown        }
347d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown        if ((flags & FLAG_OWN_CONTENT_ONLY) != 0) {
348d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown            msg.append(", FLAG_OWN_CONTENT_ONLY");
349d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown        }
350bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        return msg.toString();
351fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
352fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown}
353