DisplayDeviceInfo.java revision 58e829f71d2c525309e5bb5a1c02dc64397df221
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
264ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownimport libcore.util.Objects;
274ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
28fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/**
29fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Describes the characteristics of a physical display device.
30fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */
314ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownfinal class DisplayDeviceInfo {
324ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
334ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * Flag: Indicates that this display device should be considered the default display
344ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * device of the system.
354ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
36bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public static final int FLAG_DEFAULT_DISPLAY = 1 << 0;
374ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
384ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
3927f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * Flag: Indicates that the orientation of this display device is coupled to the
4027f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * rotation of its associated logical display.
4127f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * <p>
4227f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * This flag should be applied to the default display to indicate that the user
4327f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * physically rotates the display when content is presented in a different orientation.
4427f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * The display manager will apply a coordinate transformation assuming that the
4527f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * physical orientation of the display matches the logical orientation of its content.
4627f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * </p><p>
4727f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * The flag should not be set when the display device is mounted in a fixed orientation
4827f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * such as on a desk.  The display manager will apply a coordinate transformation
4927f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * such as a scale and translation to letterbox or pillarbox format under the
5027f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * assumption that the physical orientation of the display is invariant.
5127f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * </p>
524ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
5327f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown    public static final int FLAG_ROTATES_WITH_CONTENT = 1 << 1;
54c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown
55c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown    /**
5677aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown     * Flag: Indicates that this display device has secure video output, such as HDCP.
57c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown     */
5877aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown    public static final int FLAG_SECURE = 1 << 2;
5977aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown
6077aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown    /**
6177aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown     * Flag: Indicates that this display device supports compositing
6277aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown     * from gralloc protected buffers.
6377aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown     */
6477aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown    public static final int FLAG_SUPPORTS_PROTECTED_BUFFERS = 1 << 3;
654ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
664ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
67a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * Flag: Indicates that the display device is owned by a particular application
68a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * and that no other application should be able to interact with it.
69d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * Should typically be used together with {@link #FLAG_OWN_CONTENT_ONLY}.
70a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
71a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public static final int FLAG_PRIVATE = 1 << 4;
72a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
73a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
74a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * Flag: Indicates that the display device is not blanked automatically by
75a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * the power manager.
76a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
77a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public static final int FLAG_NEVER_BLANK = 1 << 5;
78a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
79a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
807d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     * Flag: Indicates that the display is suitable for presentations.
817d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown     */
827d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown    public static final int FLAG_PRESENTATION = 1 << 6;
837d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown
847d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown    /**
85d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * Flag: Only show this display's own content; do not mirror
86d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     * the content of another display.
87d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown     */
88d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown    public static final int FLAG_OWN_CONTENT_ONLY = 1 << 7;
89d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown
90d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown    /**
9149e7ff9647e6547c2b852944a5435a05794b9951Adam Powell     * Flag: This display device has a round shape.
9249e7ff9647e6547c2b852944a5435a05794b9951Adam Powell     */
9349e7ff9647e6547c2b852944a5435a05794b9951Adam Powell    public static final int FLAG_ROUND = 1 << 8;
9449e7ff9647e6547c2b852944a5435a05794b9951Adam Powell
9549e7ff9647e6547c2b852944a5435a05794b9951Adam Powell    /**
96d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     * Touch attachment: Display does not receive touch.
97d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     */
98d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    public static final int TOUCH_NONE = 0;
99d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
100d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    /**
101d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     * Touch attachment: Touch input is via the internal interface.
102d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     */
103d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    public static final int TOUCH_INTERNAL = 1;
104d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
105d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    /**
106d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     * Touch attachment: Touch input is via an external interface, such as USB.
107d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     */
108d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    public static final int TOUCH_EXTERNAL = 2;
109d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
110d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    /**
11110acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown     * Diff result: The {@link #state} fields differ.
11210acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown     */
11310acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown    public static final int DIFF_STATE = 1 << 0;
11410acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown
11510acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown    /**
11610acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown     * Diff result: Other fields differ.
11710acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown     */
11810acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown    public static final int DIFF_OTHER = 1 << 1;
11910acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown
12010acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown    /**
121361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale     * Gets the name of the display device, which may be derived from EDID or
122361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale     * other sources. The name may be localized and displayed to the user.
123848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     */
124848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    public String name;
125848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown
126848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    /**
127361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale     * Unique Id of display device.
128361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale     */
129361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale    public String uniqueId;
130361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale
131361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale    /**
132fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The width of the display in its natural orientation, in pixels.
133fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * This value is not affected by display rotation.
134fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
135fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int width;
136fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
137fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
138fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The height of the display in its natural orientation, in pixels.
139fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * This value is not affected by display rotation.
140fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
141fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int height;
142fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
143cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
144b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     * The active mode of the display.
145cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
146b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    public int modeId;
147cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
148cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
149b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     * The default mode of the display.
1503f145a2f958320766ae9240c7a57debc20d578aaMichael Wright     */
151b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    public int defaultModeId;
152b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand
153b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    /**
154b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     * The supported modes of the display.
155b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     */
156b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    public Display.Mode[] supportedModes = Display.Mode.EMPTY_ARRAY;
1573f145a2f958320766ae9240c7a57debc20d578aaMichael Wright
15858e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright    /** The active color transform of the display */
15958e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright    public int colorTransformId;
16058e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright
16158e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright    /** The default color transform of the display */
16258e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright    public int defaultColorTransformId;
16358e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright
16458e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright    /** The supported color transforms of the display */
16558e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright    public Display.ColorTransform[] supportedColorTransforms = Display.ColorTransform.EMPTY_ARRAY;
16658e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright
1673f145a2f958320766ae9240c7a57debc20d578aaMichael Wright    /**
168cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * The nominal apparent density of the display in DPI used for layout calculations.
169cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * This density is sensitive to the viewing distance.  A big TV and a tablet may have
170cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * the same apparent density even though the pixels on the TV are much bigger than
171cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * those on the tablet.
172cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
173908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn    public int densityDpi;
174cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
175cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
176cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * The physical density of the display in DPI in the X direction.
177cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * This density should specify the physical size of each pixel.
178cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
179fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float xDpi;
180cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
181cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
182cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * The physical density of the display in DPI in the X direction.
183cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * This density should specify the physical size of each pixel.
184cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
185fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float yDpi;
186fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
187cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
188e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * This is a positive value indicating the phase offset of the VSYNC events provided by
189e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * Choreographer relative to the display refresh.  For example, if Choreographer reports
190e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * that the refresh occurred at time N, it actually occurred at (N - appVsyncOffsetNanos).
191e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     */
192e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    public long appVsyncOffsetNanos;
193e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden
194e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    /**
195e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * This is how far in advance a buffer must be queued for presentation at
196e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * a given time.  If you want a buffer to appear on the screen at
197e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * time N, you must submit the buffer before (N - bufferDeadlineNanos).
198e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     */
199e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    public long presentationDeadlineNanos;
200e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden
201e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    /**
202cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * Display flags.
203cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
204bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public int flags;
205bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
206d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    /**
207d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     * The touch attachment, per {@link DisplayViewport#touch}.
208d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     */
209d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    public int touch;
210d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
21127f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown    /**
21227f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * The additional rotation to apply to all content presented on the display device
21327f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * relative to its physical coordinate system.  Default is {@link Surface#ROTATION_0}.
21427f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * <p>
21527f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * This field can be used to compensate for the fact that the display has been
21627f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * physically rotated relative to its natural orientation such as an HDMI monitor
21727f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * that has been mounted sideways to appear to be portrait rather than landscape.
21827f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * </p>
21927f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     */
22027f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown    public int rotation = Surface.ROTATION_0;
22127f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown
22292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    /**
22392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Display type.
22492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     */
22592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    public int type;
22692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
22792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    /**
22892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Display address, or null if none.
22992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Interpretation varies by display type.
23092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     */
23192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    public String address;
23292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
233a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
234037c33eae74bee2774897d969d48947f9abe254fJeff Brown     * Display state.
235037c33eae74bee2774897d969d48947f9abe254fJeff Brown     */
236037c33eae74bee2774897d969d48947f9abe254fJeff Brown    public int state = Display.STATE_ON;
237037c33eae74bee2774897d969d48947f9abe254fJeff Brown
238037c33eae74bee2774897d969d48947f9abe254fJeff Brown    /**
239a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * The UID of the application that owns this display, or zero if it is owned by the system.
240a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * <p>
241a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * If the display is private, then only the owner can use it.
242a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * </p>
243a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
244a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public int ownerUid;
245a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
246a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
247a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * The package name of the application that owns this display, or null if it is
248a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * owned by the system.
249a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * <p>
250a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * If the display is private, then only the owner can use it.
251a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * </p>
252a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
253a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public String ownerPackageName;
254a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
255cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    public void setAssumedDensityForExternalDisplay(int width, int height) {
256cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        densityDpi = Math.min(width, height) * DisplayMetrics.DENSITY_XHIGH / 1080;
257cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        // Technically, these values should be smaller than the apparent density
258cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        // but we don't know the physical size of the display.
259cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        xDpi = densityDpi;
260cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        yDpi = densityDpi;
261cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    }
262cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
2634ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    @Override
2644ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public boolean equals(Object o) {
2654ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return o instanceof DisplayDeviceInfo && equals((DisplayDeviceInfo)o);
2664ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
2674ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
2684ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public boolean equals(DisplayDeviceInfo other) {
26910acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown        return other != null && diff(other) == 0;
27010acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown    }
27110acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown
27210acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown    /**
27310acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown     * Computes the difference between display device infos.
27410acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown     * Assumes other is not null.
27510acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown     */
27610acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown    public int diff(DisplayDeviceInfo other) {
27710acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown        int diff = 0;
27810acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown        if (state != other.state) {
27910acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown            diff |= DIFF_STATE;
28010acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown        }
28110acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown        if (!Objects.equal(name, other.name)
28210acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || !Objects.equal(uniqueId, other.uniqueId)
28310acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || width != other.width
28410acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || height != other.height
285b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand                || modeId != other.modeId
286b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand                || defaultModeId != other.defaultModeId
287b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand                || !Arrays.equals(supportedModes, other.supportedModes)
28858e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright                || colorTransformId != other.colorTransformId
28958e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright                || defaultColorTransformId != other.defaultColorTransformId
29058e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright                || !Arrays.equals(supportedColorTransforms, other.supportedColorTransforms)
29110acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || densityDpi != other.densityDpi
29210acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || xDpi != other.xDpi
29310acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || yDpi != other.yDpi
29410acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || appVsyncOffsetNanos != other.appVsyncOffsetNanos
29510acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || presentationDeadlineNanos != other.presentationDeadlineNanos
29610acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || flags != other.flags
29710acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || touch != other.touch
29810acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || rotation != other.rotation
29910acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || type != other.type
30010acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || !Objects.equal(address, other.address)
30110acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || ownerUid != other.ownerUid
30210acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || !Objects.equal(ownerPackageName, other.ownerPackageName)) {
30310acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown            diff |= DIFF_OTHER;
30410acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown        }
30510acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown        return diff;
3064ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
3074ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
3084ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    @Override
3094ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public int hashCode() {
3104ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return 0; // don't care
3114ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
3124ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
313fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void copyFrom(DisplayDeviceInfo other) {
314848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown        name = other.name;
315361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        uniqueId = other.uniqueId;
316fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        width = other.width;
317fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        height = other.height;
318b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        modeId = other.modeId;
319b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        defaultModeId = other.defaultModeId;
320b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        supportedModes = other.supportedModes;
32158e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright        colorTransformId = other.colorTransformId;
32258e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright        defaultColorTransformId = other.defaultColorTransformId;
32358e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright        supportedColorTransforms = other.supportedColorTransforms;
324908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        densityDpi = other.densityDpi;
325fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        xDpi = other.xDpi;
326fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        yDpi = other.yDpi;
327e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        appVsyncOffsetNanos = other.appVsyncOffsetNanos;
328e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        presentationDeadlineNanos = other.presentationDeadlineNanos;
329bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        flags = other.flags;
330d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        touch = other.touch;
33127f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown        rotation = other.rotation;
33292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        type = other.type;
33392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        address = other.address;
334037c33eae74bee2774897d969d48947f9abe254fJeff Brown        state = other.state;
335a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        ownerUid = other.ownerUid;
336a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        ownerPackageName = other.ownerPackageName;
337fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
338fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
339848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    // For debugging purposes
340fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    @Override
341fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public String toString() {
342a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        StringBuilder sb = new StringBuilder();
343a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append("DisplayDeviceInfo{\"");
344361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        sb.append(name).append("\": uniqueId=\"").append(uniqueId).append("\", ");
345361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        sb.append(width).append(" x ").append(height);
346b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        sb.append(", modeId ").append(modeId);
347b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        sb.append(", defaultModeId ").append(defaultModeId);
348b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        sb.append(", supportedModes ").append(Arrays.toString(supportedModes));
34958e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright        sb.append(", colorTransformId ").append(colorTransformId);
35058e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright        sb.append(", defaultColorTransformId ").append(defaultColorTransformId);
35158e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright        sb.append(", supportedColorTransforms ").append(Arrays.toString(supportedColorTransforms));
3523f145a2f958320766ae9240c7a57debc20d578aaMichael Wright        sb.append(", density ").append(densityDpi);
353a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(", ").append(xDpi).append(" x ").append(yDpi).append(" dpi");
354e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        sb.append(", appVsyncOff ").append(appVsyncOffsetNanos);
355e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        sb.append(", presDeadline ").append(presentationDeadlineNanos);
356a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(", touch ").append(touchToString(touch));
357a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(", rotation ").append(rotation);
358a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(", type ").append(Display.typeToString(type));
359a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if (address != null) {
360a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(", address ").append(address);
361a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
362037c33eae74bee2774897d969d48947f9abe254fJeff Brown        sb.append(", state ").append(Display.stateToString(state));
363a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if (ownerUid != 0 || ownerPackageName != null) {
364a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(", owner ").append(ownerPackageName);
365a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(" (uid ").append(ownerUid).append(")");
366a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
367a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(flagsToString(flags));
368a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append("}");
369a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        return sb.toString();
370d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    }
371d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
372d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    private static String touchToString(int touch) {
373d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        switch (touch) {
374d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            case TOUCH_NONE:
375d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                return "NONE";
376d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            case TOUCH_INTERNAL:
377d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                return "INTERNAL";
378d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            case TOUCH_EXTERNAL:
379d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                return "EXTERNAL";
380d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            default:
381d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                return Integer.toString(touch);
382d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        }
383bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
384bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
385bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private static String flagsToString(int flags) {
386bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        StringBuilder msg = new StringBuilder();
387bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        if ((flags & FLAG_DEFAULT_DISPLAY) != 0) {
388bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            msg.append(", FLAG_DEFAULT_DISPLAY");
389bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
39027f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown        if ((flags & FLAG_ROTATES_WITH_CONTENT) != 0) {
39127f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown            msg.append(", FLAG_ROTATES_WITH_CONTENT");
392c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        }
39377aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown        if ((flags & FLAG_SECURE) != 0) {
39477aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown            msg.append(", FLAG_SECURE");
39577aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown        }
39677aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown        if ((flags & FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0) {
39777aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown            msg.append(", FLAG_SUPPORTS_PROTECTED_BUFFERS");
398bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
399a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if ((flags & FLAG_PRIVATE) != 0) {
400a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            msg.append(", FLAG_PRIVATE");
401a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
402a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if ((flags & FLAG_NEVER_BLANK) != 0) {
403a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            msg.append(", FLAG_NEVER_BLANK");
404a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
4057d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown        if ((flags & FLAG_PRESENTATION) != 0) {
4067d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown            msg.append(", FLAG_PRESENTATION");
4077d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown        }
408d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown        if ((flags & FLAG_OWN_CONTENT_ONLY) != 0) {
409d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown            msg.append(", FLAG_OWN_CONTENT_ONLY");
410d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown        }
41149e7ff9647e6547c2b852944a5435a05794b9951Adam Powell        if ((flags & FLAG_ROUND) != 0) {
41249e7ff9647e6547c2b852944a5435a05794b9951Adam Powell            msg.append(", FLAG_ROUND");
41349e7ff9647e6547c2b852944a5435a05794b9951Adam Powell        }
414bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        return msg.toString();
415fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
416fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown}
417