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    /**
1211c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright     * Diff result: The color mode fields differ.
1221c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright     */
1231c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    public static final int DIFF_COLOR_MODE = 1 << 2;
1241c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright
1251c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    /**
126361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale     * Gets the name of the display device, which may be derived from EDID or
127361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale     * other sources. The name may be localized and displayed to the user.
128848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown     */
129848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    public String name;
130848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown
131848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    /**
132361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale     * Unique Id of display device.
133361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale     */
134361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale    public String uniqueId;
135361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale
136361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale    /**
137fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The width of the display in its natural orientation, in pixels.
138fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * This value is not affected by display rotation.
139fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
140fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int width;
141fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
142fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
143fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The height of the display in its natural orientation, in pixels.
144fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * This value is not affected by display rotation.
145fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
146fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int height;
147fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
148cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
149b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     * The active mode of the display.
150cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
151b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    public int modeId;
152cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
153cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
154b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     * The default mode of the display.
1553f145a2f958320766ae9240c7a57debc20d578aaMichael Wright     */
156b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    public int defaultModeId;
157b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand
158b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    /**
159b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     * The supported modes of the display.
160b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     */
161b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    public Display.Mode[] supportedModes = Display.Mode.EMPTY_ARRAY;
1623f145a2f958320766ae9240c7a57debc20d578aaMichael Wright
1631c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    /** The active color mode of the display */
1641c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    public int colorMode;
16558e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright
1661c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    /** The supported color modes of the display */
1671c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    public int[] supportedColorModes = { Display.COLOR_MODE_DEFAULT };
16858e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright
1693f145a2f958320766ae9240c7a57debc20d578aaMichael Wright    /**
1709ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright     * The HDR capabilities this display claims to support.
1719ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright     */
1729ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright    public Display.HdrCapabilities hdrCapabilities;
1739ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright
1749ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright    /**
175cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * The nominal apparent density of the display in DPI used for layout calculations.
176cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * This density is sensitive to the viewing distance.  A big TV and a tablet may have
177cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * the same apparent density even though the pixels on the TV are much bigger than
178cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * those on the tablet.
179cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
180908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn    public int densityDpi;
181cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
182cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
183cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * The physical density of the display in DPI in the X direction.
184cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * This density should specify the physical size of each pixel.
185cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
186fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float xDpi;
187cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
188cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
189cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * The physical density of the display in DPI in the X direction.
190cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * This density should specify the physical size of each pixel.
191cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
192fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float yDpi;
193fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
194cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
195e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * This is a positive value indicating the phase offset of the VSYNC events provided by
196e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * Choreographer relative to the display refresh.  For example, if Choreographer reports
197e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * that the refresh occurred at time N, it actually occurred at (N - appVsyncOffsetNanos).
198e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     */
199e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    public long appVsyncOffsetNanos;
200e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden
201e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    /**
202e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * This is how far in advance a buffer must be queued for presentation at
203e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * a given time.  If you want a buffer to appear on the screen at
204e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * time N, you must submit the buffer before (N - bufferDeadlineNanos).
205e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     */
206e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    public long presentationDeadlineNanos;
207e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden
208e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    /**
209cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * Display flags.
210cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
211bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public int flags;
212bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
213d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    /**
214d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     * The touch attachment, per {@link DisplayViewport#touch}.
215d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown     */
216d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    public int touch;
217d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
21827f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown    /**
21927f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * The additional rotation to apply to all content presented on the display device
22027f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * relative to its physical coordinate system.  Default is {@link Surface#ROTATION_0}.
22127f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * <p>
22227f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * This field can be used to compensate for the fact that the display has been
22327f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * physically rotated relative to its natural orientation such as an HDMI monitor
22427f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * that has been mounted sideways to appear to be portrait rather than landscape.
22527f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     * </p>
22627f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown     */
22727f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown    public int rotation = Surface.ROTATION_0;
22827f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown
22992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    /**
23092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Display type.
23192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     */
23292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    public int type;
23392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
23492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    /**
23592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Display address, or null if none.
23692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Interpretation varies by display type.
23792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     */
23892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    public String address;
23992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
240a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
241037c33eae74bee2774897d969d48947f9abe254fJeff Brown     * Display state.
242037c33eae74bee2774897d969d48947f9abe254fJeff Brown     */
243037c33eae74bee2774897d969d48947f9abe254fJeff Brown    public int state = Display.STATE_ON;
244037c33eae74bee2774897d969d48947f9abe254fJeff Brown
245037c33eae74bee2774897d969d48947f9abe254fJeff Brown    /**
246a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * The UID of the application that owns this display, or zero if it is owned by the system.
247a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * <p>
248a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * If the display is private, then only the owner can use it.
249a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * </p>
250a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
251a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public int ownerUid;
252a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
253a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
254a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * The package name of the application that owns this display, or null if it is
255a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * owned by the system.
256a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * <p>
257a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * If the display is private, then only the owner can use it.
258a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * </p>
259a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
260a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public String ownerPackageName;
261a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
262cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    public void setAssumedDensityForExternalDisplay(int width, int height) {
263cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        densityDpi = Math.min(width, height) * DisplayMetrics.DENSITY_XHIGH / 1080;
264cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        // Technically, these values should be smaller than the apparent density
265cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        // but we don't know the physical size of the display.
266cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        xDpi = densityDpi;
267cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        yDpi = densityDpi;
268cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    }
269cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
2704ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    @Override
2714ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public boolean equals(Object o) {
2724ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return o instanceof DisplayDeviceInfo && equals((DisplayDeviceInfo)o);
2734ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
2744ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
2754ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public boolean equals(DisplayDeviceInfo other) {
27610acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown        return other != null && diff(other) == 0;
27710acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown    }
27810acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown
27910acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown    /**
28010acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown     * Computes the difference between display device infos.
28110acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown     * Assumes other is not null.
28210acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown     */
28310acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown    public int diff(DisplayDeviceInfo other) {
28410acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown        int diff = 0;
28510acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown        if (state != other.state) {
28610acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown            diff |= DIFF_STATE;
28710acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown        }
2881c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        if (colorMode != other.colorMode) {
2891c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright            diff |= DIFF_COLOR_MODE;
2901c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        }
29110acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown        if (!Objects.equal(name, other.name)
29210acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || !Objects.equal(uniqueId, other.uniqueId)
29310acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || width != other.width
29410acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || height != other.height
295b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand                || modeId != other.modeId
296b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand                || defaultModeId != other.defaultModeId
297b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand                || !Arrays.equals(supportedModes, other.supportedModes)
2981c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright                || !Arrays.equals(supportedColorModes, other.supportedColorModes)
2999ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright                || !Objects.equal(hdrCapabilities, other.hdrCapabilities)
30010acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || densityDpi != other.densityDpi
30110acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || xDpi != other.xDpi
30210acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || yDpi != other.yDpi
30310acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || appVsyncOffsetNanos != other.appVsyncOffsetNanos
30410acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || presentationDeadlineNanos != other.presentationDeadlineNanos
30510acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || flags != other.flags
30610acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || touch != other.touch
30710acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || rotation != other.rotation
30810acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || type != other.type
30910acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || !Objects.equal(address, other.address)
31010acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || ownerUid != other.ownerUid
31110acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown                || !Objects.equal(ownerPackageName, other.ownerPackageName)) {
31210acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown            diff |= DIFF_OTHER;
31310acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown        }
31410acf6d3efde60977d2d2e82b90c53d722d9d357Jeff Brown        return diff;
3154ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
3164ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
3174ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    @Override
3184ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public int hashCode() {
3194ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return 0; // don't care
3204ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
3214ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
322fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void copyFrom(DisplayDeviceInfo other) {
323848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown        name = other.name;
324361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        uniqueId = other.uniqueId;
325fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        width = other.width;
326fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        height = other.height;
327b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        modeId = other.modeId;
328b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        defaultModeId = other.defaultModeId;
329b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        supportedModes = other.supportedModes;
3301c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        colorMode = other.colorMode;
3311c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        supportedColorModes = other.supportedColorModes;
3329ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright        hdrCapabilities = other.hdrCapabilities;
333908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        densityDpi = other.densityDpi;
334fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        xDpi = other.xDpi;
335fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        yDpi = other.yDpi;
336e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        appVsyncOffsetNanos = other.appVsyncOffsetNanos;
337e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        presentationDeadlineNanos = other.presentationDeadlineNanos;
338bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        flags = other.flags;
339d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        touch = other.touch;
34027f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown        rotation = other.rotation;
34192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        type = other.type;
34292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        address = other.address;
343037c33eae74bee2774897d969d48947f9abe254fJeff Brown        state = other.state;
344a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        ownerUid = other.ownerUid;
345a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        ownerPackageName = other.ownerPackageName;
346fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
347fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
348848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    // For debugging purposes
349fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    @Override
350fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public String toString() {
351a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        StringBuilder sb = new StringBuilder();
352a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append("DisplayDeviceInfo{\"");
353361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        sb.append(name).append("\": uniqueId=\"").append(uniqueId).append("\", ");
354361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        sb.append(width).append(" x ").append(height);
355b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        sb.append(", modeId ").append(modeId);
356b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        sb.append(", defaultModeId ").append(defaultModeId);
357b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        sb.append(", supportedModes ").append(Arrays.toString(supportedModes));
3581c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        sb.append(", colorMode ").append(colorMode);
3591c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        sb.append(", supportedColorModes ").append(Arrays.toString(supportedColorModes));
3609ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright        sb.append(", HdrCapabilities ").append(hdrCapabilities);
3613f145a2f958320766ae9240c7a57debc20d578aaMichael Wright        sb.append(", density ").append(densityDpi);
362a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(", ").append(xDpi).append(" x ").append(yDpi).append(" dpi");
363e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        sb.append(", appVsyncOff ").append(appVsyncOffsetNanos);
364e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        sb.append(", presDeadline ").append(presentationDeadlineNanos);
365a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(", touch ").append(touchToString(touch));
366a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(", rotation ").append(rotation);
367a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(", type ").append(Display.typeToString(type));
368a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if (address != null) {
369a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(", address ").append(address);
370a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
371037c33eae74bee2774897d969d48947f9abe254fJeff Brown        sb.append(", state ").append(Display.stateToString(state));
372a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if (ownerUid != 0 || ownerPackageName != null) {
373a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(", owner ").append(ownerPackageName);
374a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(" (uid ").append(ownerUid).append(")");
375a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
376a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append(flagsToString(flags));
377a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        sb.append("}");
378a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        return sb.toString();
379d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    }
380d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
381d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    private static String touchToString(int touch) {
382d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        switch (touch) {
383d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            case TOUCH_NONE:
384d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                return "NONE";
385d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            case TOUCH_INTERNAL:
386d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                return "INTERNAL";
387d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            case TOUCH_EXTERNAL:
388d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                return "EXTERNAL";
389d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            default:
390d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                return Integer.toString(touch);
391d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        }
392bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
393bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
394bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private static String flagsToString(int flags) {
395bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        StringBuilder msg = new StringBuilder();
396bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        if ((flags & FLAG_DEFAULT_DISPLAY) != 0) {
397bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            msg.append(", FLAG_DEFAULT_DISPLAY");
398bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
39927f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown        if ((flags & FLAG_ROTATES_WITH_CONTENT) != 0) {
40027f1d674bf9fb53af7facdcb746912e036d5bf75Jeff Brown            msg.append(", FLAG_ROTATES_WITH_CONTENT");
401c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        }
40277aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown        if ((flags & FLAG_SECURE) != 0) {
40377aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown            msg.append(", FLAG_SECURE");
40477aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown        }
40577aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown        if ((flags & FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0) {
40677aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown            msg.append(", FLAG_SUPPORTS_PROTECTED_BUFFERS");
407bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        }
408a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if ((flags & FLAG_PRIVATE) != 0) {
409a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            msg.append(", FLAG_PRIVATE");
410a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
411a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if ((flags & FLAG_NEVER_BLANK) != 0) {
412a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            msg.append(", FLAG_NEVER_BLANK");
413a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
4147d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown        if ((flags & FLAG_PRESENTATION) != 0) {
4157d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown            msg.append(", FLAG_PRESENTATION");
4167d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown        }
417d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown        if ((flags & FLAG_OWN_CONTENT_ONLY) != 0) {
418d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown            msg.append(", FLAG_OWN_CONTENT_ONLY");
419d14c8c9039c0056e1f30ad5d410c8fde20d63df5Jeff Brown        }
42049e7ff9647e6547c2b852944a5435a05794b9951Adam Powell        if ((flags & FLAG_ROUND) != 0) {
42149e7ff9647e6547c2b852944a5435a05794b9951Adam Powell            msg.append(", FLAG_ROUND");
42249e7ff9647e6547c2b852944a5435a05794b9951Adam Powell        }
423bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        return msg.toString();
424fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
425fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown}
426