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 android.view;
18fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
19fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.content.res.CompatibilityInfo;
207c72668f19d404b01412abc67937b1b5c660df71Wale Ogunwaleimport android.content.res.Configuration;
21fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.os.Parcel;
22fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.os.Parcelable;
23b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligandimport android.util.ArraySet;
24fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.util.DisplayMetrics;
25fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
264ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownimport libcore.util.Objects;
274ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
2867e2ae86396c6d0f989285275cbf908dee5e71f7Aurimas Liutikasimport java.util.Arrays;
2967e2ae86396c6d0f989285275cbf908dee5e71f7Aurimas Liutikas
30fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/**
31fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Describes the characteristics of a particular logical display.
32fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * @hide
33fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */
34fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownpublic final class DisplayInfo implements Parcelable {
35fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
364ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * The surface flinger layer stack associated with this logical display.
374ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
384ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public int layerStack;
394ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
404ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
41c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown     * Display flags.
42c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown     */
43c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown    public int flags;
44c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown
45c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown    /**
4692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Display type.
4792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     */
4892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    public int type;
4992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
5092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    /**
5192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Display address, or null if none.
5292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     * Interpretation varies by display type.
5392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown     */
5492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    public String address;
5592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown
5692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown    /**
574ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * The human-readable name of the display.
584ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
594ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public String name;
604ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
614ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
62361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale     * Unique identifier for the display. Shouldn't be displayed to the user.
63361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale     */
64361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale    public String uniqueId;
65361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale
66361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale    /**
67fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The width of the portion of the display that is available to applications, in pixels.
68fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * Represents the size of the display minus any system decorations.
69fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
70fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int appWidth;
71fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
72fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
73fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The height of the portion of the display that is available to applications, in pixels.
74fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * Represents the size of the display minus any system decorations.
75fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
76fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int appHeight;
77fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
78fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
79fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The smallest value of {@link #appWidth} that an application is likely to encounter,
80fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * in pixels, excepting cases where the width may be even smaller due to the presence
81fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * of a soft keyboard, for example.
82fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
83fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int smallestNominalAppWidth;
84fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
85fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
86fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The smallest value of {@link #appHeight} that an application is likely to encounter,
87fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * in pixels, excepting cases where the height may be even smaller due to the presence
88fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * of a soft keyboard, for example.
89fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
90fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int smallestNominalAppHeight;
91fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
92fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
93fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The largest value of {@link #appWidth} that an application is likely to encounter,
94fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * in pixels, excepting cases where the width may be even larger due to system decorations
95fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * such as the status bar being hidden, for example.
96fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
97fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int largestNominalAppWidth;
98fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
99fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
100fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The largest value of {@link #appHeight} that an application is likely to encounter,
101fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * in pixels, excepting cases where the height may be even larger due to system decorations
102fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * such as the status bar being hidden, for example.
103fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
104fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int largestNominalAppHeight;
105fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
106fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
107fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The logical width of the display, in pixels.
108fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * Represents the usable size of the display which may be smaller than the
109fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * physical size when the system is emulating a smaller display.
110fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
111fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int logicalWidth;
112fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
113fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
114fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The logical height of the display, in pixels.
115fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * Represents the usable size of the display which may be smaller than the
116fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * physical size when the system is emulating a smaller display.
117fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
118fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int logicalHeight;
119fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
120fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
121c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     * @hide
122c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     * Number of overscan pixels on the left side of the display.
123c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     */
124c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    public int overscanLeft;
125c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
126c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    /**
127c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     * @hide
128c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     * Number of overscan pixels on the top side of the display.
129c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     */
130c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    public int overscanTop;
131c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
132c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    /**
133c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     * @hide
134c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     * Number of overscan pixels on the right side of the display.
135c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     */
136c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    public int overscanRight;
137c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
138c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    /**
139c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     * @hide
140c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     * Number of overscan pixels on the bottom side of the display.
141c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     */
142c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    public int overscanBottom;
143c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
144c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    /**
145fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The rotation of the display relative to its natural orientation.
146fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * May be one of {@link android.view.Surface#ROTATION_0},
147fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * {@link android.view.Surface#ROTATION_90}, {@link android.view.Surface#ROTATION_180},
148fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * {@link android.view.Surface#ROTATION_270}.
149fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * <p>
150fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The value of this field is indeterminate if the logical display is presented on
151fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * more than one physical display.
152fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * </p>
153fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
154d9273d6f289d9b55da3fd0db2f659fdfb48106a8Tor Norbye    @Surface.Rotation
155fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int rotation;
156fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
157fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
158b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     * The active display mode.
159b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     */
160b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    public int modeId;
161b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand
162b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    /**
163b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     * The default display mode.
164fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
165b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    public int defaultModeId;
166fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
167fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
168b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     * The supported modes of this display.
1693f145a2f958320766ae9240c7a57debc20d578aaMichael Wright     */
170b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    public Display.Mode[] supportedModes = Display.Mode.EMPTY_ARRAY;
1713f145a2f958320766ae9240c7a57debc20d578aaMichael Wright
1721c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    /** The active color mode. */
1731c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    public int colorMode;
17458e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright
1751c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    /** The list of supported color modes */
1761c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright    public int[] supportedColorModes = { Display.COLOR_MODE_DEFAULT };
17758e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright
1789ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright    /** The display's HDR capabilities */
1799ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright    public Display.HdrCapabilities hdrCapabilities;
1809ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright
1813f145a2f958320766ae9240c7a57debc20d578aaMichael Wright    /**
182908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn     * The logical display density which is the basis for density-independent
183908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn     * pixels.
184fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
185908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn    public int logicalDensityDpi;
186fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
187fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
188fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The exact physical pixels per inch of the screen in the X dimension.
189fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * <p>
190fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The value of this field is indeterminate if the logical display is presented on
191fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * more than one physical display.
192fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * </p>
193fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
194fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float physicalXDpi;
195fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
196fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
197fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The exact physical pixels per inch of the screen in the Y dimension.
198fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * <p>
199fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The value of this field is indeterminate if the logical display is presented on
200fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * more than one physical display.
201fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * </p>
202fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
203fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float physicalYDpi;
204fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
205a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
206e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * This is a positive value indicating the phase offset of the VSYNC events provided by
207e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * Choreographer relative to the display refresh.  For example, if Choreographer reports
208e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * that the refresh occurred at time N, it actually occurred at (N - appVsyncOffsetNanos).
209e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     */
210e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    public long appVsyncOffsetNanos;
211e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden
212e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    /**
213e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * This is how far in advance a buffer must be queued for presentation at
214e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * a given time.  If you want a buffer to appear on the screen at
215e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * time N, you must submit the buffer before (N - bufferDeadlineNanos).
216e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     */
217e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    public long presentationDeadlineNanos;
218e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden
219e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    /**
220037c33eae74bee2774897d969d48947f9abe254fJeff Brown     * The state of the display, such as {@link android.view.Display#STATE_ON}.
221037c33eae74bee2774897d969d48947f9abe254fJeff Brown     */
222037c33eae74bee2774897d969d48947f9abe254fJeff Brown    public int state;
223037c33eae74bee2774897d969d48947f9abe254fJeff Brown
224037c33eae74bee2774897d969d48947f9abe254fJeff Brown    /**
225a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * The UID of the application that owns this display, or zero if it is owned by the system.
226a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * <p>
227a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * If the display is private, then only the owner can use it.
228a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * </p>
229a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
230a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public int ownerUid;
231a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
232a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
233a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * The package name of the application that owns this display, or null if it is
234a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * owned by the system.
235a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * <p>
236a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * If the display is private, then only the owner can use it.
237a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * </p>
238a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
239a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public String ownerPackageName;
240a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
241250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian    /**
242250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian     * @hide
243250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian     * Get current remove mode of the display - what actions should be performed with the display's
244250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian     * content when it is removed.
245250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian     *
246250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian     * @see Display#getRemoveMode()
247250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian     */
248250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian    public int removeMode = Display.REMOVE_MODE_MOVE_CONTENT_TO_PRIMARY;
249250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian
250fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public static final Creator<DisplayInfo> CREATOR = new Creator<DisplayInfo>() {
25192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        @Override
252fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        public DisplayInfo createFromParcel(Parcel source) {
253fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown            return new DisplayInfo(source);
254fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
255fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
25692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        @Override
257fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        public DisplayInfo[] newArray(int size) {
258fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown            return new DisplayInfo[size];
259fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
260fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    };
261fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
262fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public DisplayInfo() {
263fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
264fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
265bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public DisplayInfo(DisplayInfo other) {
266bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        copyFrom(other);
267bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
268bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
269fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    private DisplayInfo(Parcel source) {
270fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        readFromParcel(source);
271fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
272fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
273fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    @Override
2744ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public boolean equals(Object o) {
2754ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return o instanceof DisplayInfo && equals((DisplayInfo)o);
2764ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
2774ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
2784ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public boolean equals(DisplayInfo other) {
2794ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return other != null
2804ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && layerStack == other.layerStack
28192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                && flags == other.flags
28292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                && type == other.type
28392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                && Objects.equal(address, other.address)
284361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale                && Objects.equal(uniqueId, other.uniqueId)
2854ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && appWidth == other.appWidth
2864ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && appHeight == other.appHeight
2874ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && smallestNominalAppWidth == other.smallestNominalAppWidth
2884ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && smallestNominalAppHeight == other.smallestNominalAppHeight
2894ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && largestNominalAppWidth == other.largestNominalAppWidth
2904ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && largestNominalAppHeight == other.largestNominalAppHeight
2914ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && logicalWidth == other.logicalWidth
2924ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && logicalHeight == other.logicalHeight
293c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                && overscanLeft == other.overscanLeft
294c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                && overscanTop == other.overscanTop
295c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                && overscanRight == other.overscanRight
296c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                && overscanBottom == other.overscanBottom
2974ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && rotation == other.rotation
298b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand                && modeId == other.modeId
299b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand                && defaultModeId == other.defaultModeId
3001c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright                && colorMode == other.colorMode
30116ae0423516ec1146ff191b4e856e1a6f88ea495Michael Wright                && Arrays.equals(supportedColorModes, other.supportedColorModes)
3029ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright                && Objects.equal(hdrCapabilities, other.hdrCapabilities)
3034ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && logicalDensityDpi == other.logicalDensityDpi
3044ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && physicalXDpi == other.physicalXDpi
305a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown                && physicalYDpi == other.physicalYDpi
306e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden                && appVsyncOffsetNanos == other.appVsyncOffsetNanos
307e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden                && presentationDeadlineNanos == other.presentationDeadlineNanos
308037c33eae74bee2774897d969d48947f9abe254fJeff Brown                && state == other.state
309a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown                && ownerUid == other.ownerUid
310250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian                && Objects.equal(ownerPackageName, other.ownerPackageName)
311250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian                && removeMode == other.removeMode;
3124ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
3134ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
3144ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    @Override
3154ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public int hashCode() {
3164ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return 0; // don't care
317fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
318fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
319fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void copyFrom(DisplayInfo other) {
3204ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        layerStack = other.layerStack;
321c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        flags = other.flags;
32292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        type = other.type;
32392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        address = other.address;
3244ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        name = other.name;
325361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        uniqueId = other.uniqueId;
326fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        appWidth = other.appWidth;
327fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        appHeight = other.appHeight;
328fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        smallestNominalAppWidth = other.smallestNominalAppWidth;
329fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        smallestNominalAppHeight = other.smallestNominalAppHeight;
330fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        largestNominalAppWidth = other.largestNominalAppWidth;
331fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        largestNominalAppHeight = other.largestNominalAppHeight;
332fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        logicalWidth = other.logicalWidth;
333fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        logicalHeight = other.logicalHeight;
334c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanLeft = other.overscanLeft;
335c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanTop = other.overscanTop;
336c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanRight = other.overscanRight;
337c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanBottom = other.overscanBottom;
338fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        rotation = other.rotation;
339b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        modeId = other.modeId;
340b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        defaultModeId = other.defaultModeId;
341b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        supportedModes = Arrays.copyOf(other.supportedModes, other.supportedModes.length);
3421c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        colorMode = other.colorMode;
3431c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        supportedColorModes = Arrays.copyOf(
3441c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright                other.supportedColorModes, other.supportedColorModes.length);
3459ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright        hdrCapabilities = other.hdrCapabilities;
346908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        logicalDensityDpi = other.logicalDensityDpi;
347fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        physicalXDpi = other.physicalXDpi;
348fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        physicalYDpi = other.physicalYDpi;
349e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        appVsyncOffsetNanos = other.appVsyncOffsetNanos;
350e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        presentationDeadlineNanos = other.presentationDeadlineNanos;
351037c33eae74bee2774897d969d48947f9abe254fJeff Brown        state = other.state;
352a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        ownerUid = other.ownerUid;
353a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        ownerPackageName = other.ownerPackageName;
354250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian        removeMode = other.removeMode;
355fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
356fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
357fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void readFromParcel(Parcel source) {
3584ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        layerStack = source.readInt();
359c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        flags = source.readInt();
36092130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        type = source.readInt();
36192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        address = source.readString();
3624ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        name = source.readString();
363fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        appWidth = source.readInt();
364fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        appHeight = source.readInt();
365fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        smallestNominalAppWidth = source.readInt();
366fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        smallestNominalAppHeight = source.readInt();
367fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        largestNominalAppWidth = source.readInt();
368fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        largestNominalAppHeight = source.readInt();
369fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        logicalWidth = source.readInt();
370fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        logicalHeight = source.readInt();
371c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanLeft = source.readInt();
372c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanTop = source.readInt();
373c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanRight = source.readInt();
374c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanBottom = source.readInt();
375fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        rotation = source.readInt();
376b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        modeId = source.readInt();
377b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        defaultModeId = source.readInt();
378b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        int nModes = source.readInt();
379b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        supportedModes = new Display.Mode[nModes];
380b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        for (int i = 0; i < nModes; i++) {
381b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand            supportedModes[i] = Display.Mode.CREATOR.createFromParcel(source);
382b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        }
3831c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        colorMode = source.readInt();
3841c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        int nColorModes = source.readInt();
3851c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        supportedColorModes = new int[nColorModes];
3861c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        for (int i = 0; i < nColorModes; i++) {
3871c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright            supportedColorModes[i] = source.readInt();
38858e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright        }
389b0828901491e08db3c9780d0c7af81be1a8dc70aMichael Wright        hdrCapabilities = source.readParcelable(null);
390908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        logicalDensityDpi = source.readInt();
391fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        physicalXDpi = source.readFloat();
392fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        physicalYDpi = source.readFloat();
393e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        appVsyncOffsetNanos = source.readLong();
394e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        presentationDeadlineNanos = source.readLong();
395037c33eae74bee2774897d969d48947f9abe254fJeff Brown        state = source.readInt();
396a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        ownerUid = source.readInt();
397a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        ownerPackageName = source.readString();
398361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        uniqueId = source.readString();
399250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian        removeMode = source.readInt();
400fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
401fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
402fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    @Override
403fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void writeToParcel(Parcel dest, int flags) {
4044ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        dest.writeInt(layerStack);
4053f2ba6220bf74cb5157d6fafee9c76f526acea68Jeff Brown        dest.writeInt(this.flags);
40692130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        dest.writeInt(type);
40792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        dest.writeString(address);
4084ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        dest.writeString(name);
409fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(appWidth);
410fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(appHeight);
411fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(smallestNominalAppWidth);
412fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(smallestNominalAppHeight);
413fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(largestNominalAppWidth);
414fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(largestNominalAppHeight);
415fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(logicalWidth);
416fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(logicalHeight);
417c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        dest.writeInt(overscanLeft);
418c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        dest.writeInt(overscanTop);
419c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        dest.writeInt(overscanRight);
420c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        dest.writeInt(overscanBottom);
421fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(rotation);
422b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        dest.writeInt(modeId);
423b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        dest.writeInt(defaultModeId);
424b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        dest.writeInt(supportedModes.length);
425b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        for (int i = 0; i < supportedModes.length; i++) {
426b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand            supportedModes[i].writeToParcel(dest, flags);
427b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        }
4281c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        dest.writeInt(colorMode);
4291c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        dest.writeInt(supportedColorModes.length);
4301c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        for (int i = 0; i < supportedColorModes.length; i++) {
4311c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright            dest.writeInt(supportedColorModes[i]);
43258e829f71d2c525309e5bb5a1c02dc64397df221Michael Wright        }
433b0828901491e08db3c9780d0c7af81be1a8dc70aMichael Wright        dest.writeParcelable(hdrCapabilities, flags);
434908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        dest.writeInt(logicalDensityDpi);
435fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeFloat(physicalXDpi);
436fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeFloat(physicalYDpi);
437e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        dest.writeLong(appVsyncOffsetNanos);
438e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        dest.writeLong(presentationDeadlineNanos);
439037c33eae74bee2774897d969d48947f9abe254fJeff Brown        dest.writeInt(state);
440a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        dest.writeInt(ownerUid);
441a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        dest.writeString(ownerPackageName);
442361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        dest.writeString(uniqueId);
443250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian        dest.writeInt(removeMode);
444fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
445fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
4464ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    @Override
4474ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public int describeContents() {
4484ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return 0;
4494ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
4504ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
451b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    public Display.Mode getMode() {
452b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        return findMode(modeId);
453b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    }
454b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand
455b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    public Display.Mode getDefaultMode() {
456b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        return findMode(defaultModeId);
457b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    }
458b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand
459b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    private Display.Mode findMode(int id) {
460b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        for (int i = 0; i < supportedModes.length; i++) {
461b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand            if (supportedModes[i].getModeId() == id) {
462b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand                return supportedModes[i];
463b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand            }
464b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        }
465b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        throw new IllegalStateException("Unable to locate mode " + id);
466b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    }
467b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand
468b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    /**
469b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     * Returns the id of the "default" mode with the given refresh rate, or {@code 0} if no suitable
470b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     * mode could be found.
471b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     */
472b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    public int findDefaultModeByRefreshRate(float refreshRate) {
473b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        Display.Mode[] modes = supportedModes;
474b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        Display.Mode defaultMode = getDefaultMode();
475b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        for (int i = 0; i < modes.length; i++) {
476b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand            if (modes[i].matches(
477b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand                    defaultMode.getPhysicalWidth(), defaultMode.getPhysicalHeight(), refreshRate)) {
478b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand                return modes[i].getModeId();
479b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand            }
480b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        }
481b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        return 0;
482b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    }
483b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand
484b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    /**
485b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     * Returns the list of supported refresh rates in the default mode.
486b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand     */
487b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    public float[] getDefaultRefreshRates() {
488b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        Display.Mode[] modes = supportedModes;
489b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        ArraySet<Float> rates = new ArraySet<>();
490b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        Display.Mode defaultMode = getDefaultMode();
491b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        for (int i = 0; i < modes.length; i++) {
492b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand            Display.Mode mode = modes[i];
493b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand            if (mode.getPhysicalWidth() == defaultMode.getPhysicalWidth()
494b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand                    && mode.getPhysicalHeight() == defaultMode.getPhysicalHeight()) {
495b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand                rates.add(mode.getRefreshRate());
496b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand            }
497b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        }
498b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        float[] result = new float[rates.size()];
499b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        int i = 0;
500b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        for (Float rate : rates) {
501b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand            result[i++] = rate;
502b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        }
503b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        return result;
504b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand    }
505b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand
50648d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    public void getAppMetrics(DisplayMetrics outMetrics) {
50748d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner        getAppMetrics(outMetrics, CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, null);
508fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
509fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
51048d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    public void getAppMetrics(DisplayMetrics outMetrics, DisplayAdjustments displayAdjustments) {
51148d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner        getMetricsWithSize(outMetrics, displayAdjustments.getCompatibilityInfo(),
5127c72668f19d404b01412abc67937b1b5c660df71Wale Ogunwale                displayAdjustments.getConfiguration(), appWidth, appHeight);
51348d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    }
51448d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner
5157c72668f19d404b01412abc67937b1b5c660df71Wale Ogunwale    public void getAppMetrics(DisplayMetrics outMetrics, CompatibilityInfo ci,
5167c72668f19d404b01412abc67937b1b5c660df71Wale Ogunwale            Configuration configuration) {
5177c72668f19d404b01412abc67937b1b5c660df71Wale Ogunwale        getMetricsWithSize(outMetrics, ci, configuration, appWidth, appHeight);
51848d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    }
51948d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner
52048d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    public void getLogicalMetrics(DisplayMetrics outMetrics, CompatibilityInfo compatInfo,
5217c72668f19d404b01412abc67937b1b5c660df71Wale Ogunwale            Configuration configuration) {
5227c72668f19d404b01412abc67937b1b5c660df71Wale Ogunwale        getMetricsWithSize(outMetrics, compatInfo, configuration, logicalWidth, logicalHeight);
523fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
524fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
5257f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown    public int getNaturalWidth() {
5267f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown        return rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180 ?
5277f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown                logicalWidth : logicalHeight;
5287f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown    }
5297f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown
5307f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown    public int getNaturalHeight() {
5317f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown        return rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180 ?
5327f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown                logicalHeight : logicalWidth;
5337f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown    }
5347f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown
535408afbf06040ea29d1a9d60e9dc50d1923068de4Romain Guy    public boolean isHdr() {
5364acfd858a4fd300e39ab761838227175d8411361Andrii Kulian        int[] types = hdrCapabilities != null ? hdrCapabilities.getSupportedHdrTypes() : null;
537408afbf06040ea29d1a9d60e9dc50d1923068de4Romain Guy        return types != null && types.length > 0;
538408afbf06040ea29d1a9d60e9dc50d1923068de4Romain Guy    }
539408afbf06040ea29d1a9d60e9dc50d1923068de4Romain Guy
540408afbf06040ea29d1a9d60e9dc50d1923068de4Romain Guy    public boolean isWideColorGamut() {
541408afbf06040ea29d1a9d60e9dc50d1923068de4Romain Guy        for (int colorMode : supportedColorModes) {
542408afbf06040ea29d1a9d60e9dc50d1923068de4Romain Guy            if (colorMode == Display.COLOR_MODE_DCI_P3 || colorMode > Display.COLOR_MODE_SRGB) {
543408afbf06040ea29d1a9d60e9dc50d1923068de4Romain Guy                return true;
544408afbf06040ea29d1a9d60e9dc50d1923068de4Romain Guy            }
545408afbf06040ea29d1a9d60e9dc50d1923068de4Romain Guy        }
546408afbf06040ea29d1a9d60e9dc50d1923068de4Romain Guy        return false;
547408afbf06040ea29d1a9d60e9dc50d1923068de4Romain Guy    }
548408afbf06040ea29d1a9d60e9dc50d1923068de4Romain Guy
549a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
550a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * Returns true if the specified UID has access to this display.
551a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
552a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public boolean hasAccess(int uid) {
553a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        return Display.hasAccess(uid, flags, ownerUid);
554a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    }
555a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
55648d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    private void getMetricsWithSize(DisplayMetrics outMetrics, CompatibilityInfo compatInfo,
5577c72668f19d404b01412abc67937b1b5c660df71Wale Ogunwale            Configuration configuration, int width, int height) {
558908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        outMetrics.densityDpi = outMetrics.noncompatDensityDpi = logicalDensityDpi;
559908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        outMetrics.density = outMetrics.noncompatDensity =
560908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn                logicalDensityDpi * DisplayMetrics.DENSITY_DEFAULT_SCALE;
561fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        outMetrics.scaledDensity = outMetrics.noncompatScaledDensity = outMetrics.density;
562fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        outMetrics.xdpi = outMetrics.noncompatXdpi = physicalXDpi;
563fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        outMetrics.ydpi = outMetrics.noncompatYdpi = physicalYDpi;
564fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
5657566d76c618a48b8dcc981dac3cab1e42f864063Bryce Lee        width = configuration != null && configuration.appBounds != null
5667566d76c618a48b8dcc981dac3cab1e42f864063Bryce Lee                ? configuration.appBounds.width() : width;
5677566d76c618a48b8dcc981dac3cab1e42f864063Bryce Lee        height = configuration != null && configuration.appBounds != null
5687566d76c618a48b8dcc981dac3cab1e42f864063Bryce Lee                ? configuration.appBounds.height() : height;
5697c72668f19d404b01412abc67937b1b5c660df71Wale Ogunwale
5707c72668f19d404b01412abc67937b1b5c660df71Wale Ogunwale        outMetrics.noncompatWidthPixels  = outMetrics.widthPixels = width;
5717c72668f19d404b01412abc67937b1b5c660df71Wale Ogunwale        outMetrics.noncompatHeightPixels = outMetrics.heightPixels = height;
5727c72668f19d404b01412abc67937b1b5c660df71Wale Ogunwale
57348d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner        if (!compatInfo.equals(CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO)) {
57448d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner            compatInfo.applyToDisplayMetrics(outMetrics);
575fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
576fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
577bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown
578bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown    // For debugging purposes
579bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown    @Override
580bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown    public String toString() {
581c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        StringBuilder sb = new StringBuilder();
582c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append("DisplayInfo{\"");
583c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(name);
584361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        sb.append("\", uniqueId \"");
585361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        sb.append(uniqueId);
586c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append("\", app ");
587c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(appWidth);
588c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(" x ");
589c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(appHeight);
590c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(", real ");
591c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(logicalWidth);
592c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(" x ");
593c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(logicalHeight);
594c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        if (overscanLeft != 0 || overscanTop != 0 || overscanRight != 0 || overscanBottom != 0) {
595c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(", overscan (");
596c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(overscanLeft);
597c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(",");
598c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(overscanTop);
599c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(",");
600c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(overscanRight);
601c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(",");
602c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(overscanBottom);
603c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(")");
604c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
605c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(", largest app ");
606c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(largestNominalAppWidth);
607c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(" x ");
608c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(largestNominalAppHeight);
609c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(", smallest app ");
610c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(smallestNominalAppWidth);
611c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(" x ");
612c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(smallestNominalAppHeight);
613b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        sb.append(", mode ");
614b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        sb.append(modeId);
615b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        sb.append(", defaultMode ");
616b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        sb.append(defaultModeId);
617b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        sb.append(", modes ");
618b3b9eb3cfc5b3b3609a5d01258315798b38a5cf9P.Y. Laligand        sb.append(Arrays.toString(supportedModes));
6191c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        sb.append(", colorMode ");
6201c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        sb.append(colorMode);
6211c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        sb.append(", supportedColorModes ");
6221c9977b762b4bac46b4470f04c898bfd17da5d90Michael Wright        sb.append(Arrays.toString(supportedColorModes));
6239ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright        sb.append(", hdrCapabilities ");
6249ff94c0251722c44eece7c3561b4ed36b286d4a8Michael Wright        sb.append(hdrCapabilities);
6253f145a2f958320766ae9240c7a57debc20d578aaMichael Wright        sb.append(", rotation ");
626c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(rotation);
627c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(", density ");
628c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(logicalDensityDpi);
629c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(" (");
630c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(physicalXDpi);
631c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(" x ");
632c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(physicalYDpi);
633c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(") dpi, layerStack ");
634c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(layerStack);
635e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        sb.append(", appVsyncOff ");
636e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        sb.append(appVsyncOffsetNanos);
637e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        sb.append(", presDeadline ");
638e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        sb.append(presentationDeadlineNanos);
639c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(", type ");
640c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(Display.typeToString(type));
641a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if (address != null) {
642a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(", address ").append(address);
643a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
644037c33eae74bee2774897d969d48947f9abe254fJeff Brown        sb.append(", state ");
645037c33eae74bee2774897d969d48947f9abe254fJeff Brown        sb.append(Display.stateToString(state));
646a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if (ownerUid != 0 || ownerPackageName != null) {
647a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(", owner ").append(ownerPackageName);
648a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(" (uid ").append(ownerUid).append(")");
649a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
650c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(flagsToString(flags));
651250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian        sb.append(", removeMode ");
652250d653325ffeeb8ef75e51e3a3d08d6abb8cf9cAndrii Kulian        sb.append(removeMode);
653c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append("}");
654c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        return sb.toString();
655c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown    }
656c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown
657c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown    private static String flagsToString(int flags) {
658c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        StringBuilder result = new StringBuilder();
659f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown        if ((flags & Display.FLAG_SECURE) != 0) {
660f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown            result.append(", FLAG_SECURE");
661f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown        }
66277aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown        if ((flags & Display.FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0) {
66377aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown            result.append(", FLAG_SUPPORTS_PROTECTED_BUFFERS");
664c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        }
665a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if ((flags & Display.FLAG_PRIVATE) != 0) {
666a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            result.append(", FLAG_PRIVATE");
667a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
6687d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown        if ((flags & Display.FLAG_PRESENTATION) != 0) {
6697d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown            result.append(", FLAG_PRESENTATION");
6707d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown        }
671d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown        if ((flags & Display.FLAG_SCALING_DISABLED) != 0) {
672d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown            result.append(", FLAG_SCALING_DISABLED");
673d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown        }
67449e7ff9647e6547c2b852944a5435a05794b9951Adam Powell        if ((flags & Display.FLAG_ROUND) != 0) {
67549e7ff9647e6547c2b852944a5435a05794b9951Adam Powell            result.append(", FLAG_ROUND");
67649e7ff9647e6547c2b852944a5435a05794b9951Adam Powell        }
677c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        return result.toString();
678bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown    }
679fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown}
680