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;
2048d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautnerimport android.os.IBinder;
21fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.os.Parcel;
22fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.os.Parcelable;
23fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.util.DisplayMetrics;
24fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
253f145a2f958320766ae9240c7a57debc20d578aaMichael Wrightimport java.util.Arrays;
263f145a2f958320766ae9240c7a57debc20d578aaMichael Wright
273f145a2f958320766ae9240c7a57debc20d578aaMichael Wrightimport libcore.util.EmptyArray;
284ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownimport libcore.util.Objects;
294ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
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    /**
158fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The refresh rate of this display in frames per second.
159fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * <p>
160fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The value of this field is indeterminate if the logical display is presented on
161fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * more than one physical display.
162fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * </p>
163fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
164fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float refreshRate;
165fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
166fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
1673f145a2f958320766ae9240c7a57debc20d578aaMichael Wright     * The supported refresh rates of this display at the current resolution in frames per second.
1683f145a2f958320766ae9240c7a57debc20d578aaMichael Wright     */
1693f145a2f958320766ae9240c7a57debc20d578aaMichael Wright    public float[] supportedRefreshRates = EmptyArray.FLOAT;
1703f145a2f958320766ae9240c7a57debc20d578aaMichael Wright
1713f145a2f958320766ae9240c7a57debc20d578aaMichael Wright    /**
172908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn     * The logical display density which is the basis for density-independent
173908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn     * pixels.
174fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
175908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn    public int logicalDensityDpi;
176fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
177fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
178fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The exact physical pixels per inch of the screen in the X dimension.
179fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * <p>
180fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The value of this field is indeterminate if the logical display is presented on
181fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * more than one physical display.
182fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * </p>
183fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
184fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float physicalXDpi;
185fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
186fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
187fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The exact physical pixels per inch of the screen in the Y dimension.
188fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * <p>
189fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The value of this field is indeterminate if the logical display is presented on
190fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * more than one physical display.
191fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * </p>
192fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
193fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float physicalYDpi;
194fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
195a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
196e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * This is a positive value indicating the phase offset of the VSYNC events provided by
197e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * Choreographer relative to the display refresh.  For example, if Choreographer reports
198e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * that the refresh occurred at time N, it actually occurred at (N - appVsyncOffsetNanos).
199e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     */
200e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    public long appVsyncOffsetNanos;
201e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden
202e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    /**
203e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * This is how far in advance a buffer must be queued for presentation at
204e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * a given time.  If you want a buffer to appear on the screen at
205e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     * time N, you must submit the buffer before (N - bufferDeadlineNanos).
206e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden     */
207e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    public long presentationDeadlineNanos;
208e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden
209e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden    /**
210037c33eae74bee2774897d969d48947f9abe254fJeff Brown     * The state of the display, such as {@link android.view.Display#STATE_ON}.
211037c33eae74bee2774897d969d48947f9abe254fJeff Brown     */
212037c33eae74bee2774897d969d48947f9abe254fJeff Brown    public int state;
213037c33eae74bee2774897d969d48947f9abe254fJeff Brown
214037c33eae74bee2774897d969d48947f9abe254fJeff Brown    /**
215a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * The UID of the application that owns this display, or zero if it is owned by the system.
216a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * <p>
217a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * If the display is private, then only the owner can use it.
218a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * </p>
219a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
220a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public int ownerUid;
221a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
222a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
223a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * The package name of the application that owns this display, or null if it is
224a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * owned by the system.
225a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * <p>
226a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * If the display is private, then only the owner can use it.
227a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * </p>
228a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
229a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public String ownerPackageName;
230a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
231fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public static final Creator<DisplayInfo> CREATOR = new Creator<DisplayInfo>() {
23292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        @Override
233fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        public DisplayInfo createFromParcel(Parcel source) {
234fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown            return new DisplayInfo(source);
235fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
236fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
23792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        @Override
238fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        public DisplayInfo[] newArray(int size) {
239fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown            return new DisplayInfo[size];
240fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
241fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    };
242fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
243fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public DisplayInfo() {
244fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
245fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
246bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public DisplayInfo(DisplayInfo other) {
247bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        copyFrom(other);
248bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
249bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
250fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    private DisplayInfo(Parcel source) {
251fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        readFromParcel(source);
252fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
253fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
254fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    @Override
2554ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public boolean equals(Object o) {
2564ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return o instanceof DisplayInfo && equals((DisplayInfo)o);
2574ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
2584ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
2594ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public boolean equals(DisplayInfo other) {
2604ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return other != null
2614ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && layerStack == other.layerStack
26292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                && flags == other.flags
26392130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                && type == other.type
26492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                && Objects.equal(address, other.address)
265361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale                && Objects.equal(uniqueId, other.uniqueId)
2664ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && appWidth == other.appWidth
2674ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && appHeight == other.appHeight
2684ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && smallestNominalAppWidth == other.smallestNominalAppWidth
2694ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && smallestNominalAppHeight == other.smallestNominalAppHeight
2704ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && largestNominalAppWidth == other.largestNominalAppWidth
2714ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && largestNominalAppHeight == other.largestNominalAppHeight
2724ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && logicalWidth == other.logicalWidth
2734ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && logicalHeight == other.logicalHeight
274c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                && overscanLeft == other.overscanLeft
275c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                && overscanTop == other.overscanTop
276c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                && overscanRight == other.overscanRight
277c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                && overscanBottom == other.overscanBottom
2784ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && rotation == other.rotation
2794ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && refreshRate == other.refreshRate
2804ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && logicalDensityDpi == other.logicalDensityDpi
2814ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && physicalXDpi == other.physicalXDpi
282a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown                && physicalYDpi == other.physicalYDpi
283e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden                && appVsyncOffsetNanos == other.appVsyncOffsetNanos
284e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden                && presentationDeadlineNanos == other.presentationDeadlineNanos
285037c33eae74bee2774897d969d48947f9abe254fJeff Brown                && state == other.state
286a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown                && ownerUid == other.ownerUid
287a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown                && Objects.equal(ownerPackageName, other.ownerPackageName);
2884ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
2894ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
2904ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    @Override
2914ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public int hashCode() {
2924ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return 0; // don't care
293fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
294fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
295fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void copyFrom(DisplayInfo other) {
2964ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        layerStack = other.layerStack;
297c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        flags = other.flags;
29892130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        type = other.type;
29992130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        address = other.address;
3004ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        name = other.name;
301361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        uniqueId = other.uniqueId;
302fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        appWidth = other.appWidth;
303fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        appHeight = other.appHeight;
304fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        smallestNominalAppWidth = other.smallestNominalAppWidth;
305fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        smallestNominalAppHeight = other.smallestNominalAppHeight;
306fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        largestNominalAppWidth = other.largestNominalAppWidth;
307fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        largestNominalAppHeight = other.largestNominalAppHeight;
308fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        logicalWidth = other.logicalWidth;
309fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        logicalHeight = other.logicalHeight;
310c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanLeft = other.overscanLeft;
311c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanTop = other.overscanTop;
312c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanRight = other.overscanRight;
313c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanBottom = other.overscanBottom;
314fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        rotation = other.rotation;
315fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        refreshRate = other.refreshRate;
3163f145a2f958320766ae9240c7a57debc20d578aaMichael Wright        supportedRefreshRates = Arrays.copyOf(
3173f145a2f958320766ae9240c7a57debc20d578aaMichael Wright                other.supportedRefreshRates, other.supportedRefreshRates.length);
318908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        logicalDensityDpi = other.logicalDensityDpi;
319fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        physicalXDpi = other.physicalXDpi;
320fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        physicalYDpi = other.physicalYDpi;
321e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        appVsyncOffsetNanos = other.appVsyncOffsetNanos;
322e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        presentationDeadlineNanos = other.presentationDeadlineNanos;
323037c33eae74bee2774897d969d48947f9abe254fJeff Brown        state = other.state;
324a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        ownerUid = other.ownerUid;
325a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        ownerPackageName = other.ownerPackageName;
326fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
327fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
328fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void readFromParcel(Parcel source) {
3294ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        layerStack = source.readInt();
330c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        flags = source.readInt();
33192130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        type = source.readInt();
33292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        address = source.readString();
3334ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        name = source.readString();
334fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        appWidth = source.readInt();
335fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        appHeight = source.readInt();
336fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        smallestNominalAppWidth = source.readInt();
337fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        smallestNominalAppHeight = source.readInt();
338fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        largestNominalAppWidth = source.readInt();
339fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        largestNominalAppHeight = source.readInt();
340fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        logicalWidth = source.readInt();
341fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        logicalHeight = source.readInt();
342c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanLeft = source.readInt();
343c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanTop = source.readInt();
344c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanRight = source.readInt();
345c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        overscanBottom = source.readInt();
346fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        rotation = source.readInt();
347fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        refreshRate = source.readFloat();
3483f145a2f958320766ae9240c7a57debc20d578aaMichael Wright        supportedRefreshRates = source.createFloatArray();
349908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        logicalDensityDpi = source.readInt();
350fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        physicalXDpi = source.readFloat();
351fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        physicalYDpi = source.readFloat();
352e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        appVsyncOffsetNanos = source.readLong();
353e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        presentationDeadlineNanos = source.readLong();
354037c33eae74bee2774897d969d48947f9abe254fJeff Brown        state = source.readInt();
355a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        ownerUid = source.readInt();
356a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        ownerPackageName = source.readString();
357361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        uniqueId = source.readString();
358fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
359fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
360fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    @Override
361fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void writeToParcel(Parcel dest, int flags) {
3624ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        dest.writeInt(layerStack);
3633f2ba6220bf74cb5157d6fafee9c76f526acea68Jeff Brown        dest.writeInt(this.flags);
36492130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        dest.writeInt(type);
36592130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown        dest.writeString(address);
3664ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        dest.writeString(name);
367fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(appWidth);
368fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(appHeight);
369fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(smallestNominalAppWidth);
370fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(smallestNominalAppHeight);
371fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(largestNominalAppWidth);
372fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(largestNominalAppHeight);
373fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(logicalWidth);
374fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(logicalHeight);
375c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        dest.writeInt(overscanLeft);
376c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        dest.writeInt(overscanTop);
377c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        dest.writeInt(overscanRight);
378c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        dest.writeInt(overscanBottom);
379fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(rotation);
380fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeFloat(refreshRate);
3813f145a2f958320766ae9240c7a57debc20d578aaMichael Wright        dest.writeFloatArray(supportedRefreshRates);
382908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        dest.writeInt(logicalDensityDpi);
383fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeFloat(physicalXDpi);
384fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeFloat(physicalYDpi);
385e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        dest.writeLong(appVsyncOffsetNanos);
386e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        dest.writeLong(presentationDeadlineNanos);
387037c33eae74bee2774897d969d48947f9abe254fJeff Brown        dest.writeInt(state);
388a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        dest.writeInt(ownerUid);
389a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        dest.writeString(ownerPackageName);
390361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        dest.writeString(uniqueId);
391fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
392fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
3934ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    @Override
3944ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public int describeContents() {
3954ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return 0;
3964ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
3974ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
39848d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    public void getAppMetrics(DisplayMetrics outMetrics) {
39948d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner        getAppMetrics(outMetrics, CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, null);
400fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
401fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
40248d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    public void getAppMetrics(DisplayMetrics outMetrics, DisplayAdjustments displayAdjustments) {
40348d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner        getMetricsWithSize(outMetrics, displayAdjustments.getCompatibilityInfo(),
40448d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner                displayAdjustments.getActivityToken(), appWidth, appHeight);
40548d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    }
40648d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner
40748d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    public void getAppMetrics(DisplayMetrics outMetrics, CompatibilityInfo ci, IBinder token) {
40848d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner        getMetricsWithSize(outMetrics, ci, token, appWidth, appHeight);
40948d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    }
41048d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner
41148d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    public void getLogicalMetrics(DisplayMetrics outMetrics, CompatibilityInfo compatInfo,
41248d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner            IBinder token) {
41348d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner        getMetricsWithSize(outMetrics, compatInfo, token, logicalWidth, logicalHeight);
414fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
415fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
4167f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown    public int getNaturalWidth() {
4177f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown        return rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180 ?
4187f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown                logicalWidth : logicalHeight;
4197f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown    }
4207f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown
4217f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown    public int getNaturalHeight() {
4227f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown        return rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180 ?
4237f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown                logicalHeight : logicalWidth;
4247f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown    }
4257f3994ec2a5dce1a037f04714b1f25cab85affb6Jeff Brown
426a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    /**
427a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     * Returns true if the specified UID has access to this display.
428a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown     */
429a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    public boolean hasAccess(int uid) {
430a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        return Display.hasAccess(uid, flags, ownerUid);
431a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown    }
432a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown
43348d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner    private void getMetricsWithSize(DisplayMetrics outMetrics, CompatibilityInfo compatInfo,
43448d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner            IBinder token, int width, int height) {
435908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        outMetrics.densityDpi = outMetrics.noncompatDensityDpi = logicalDensityDpi;
436fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        outMetrics.noncompatWidthPixels  = outMetrics.widthPixels = width;
437fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        outMetrics.noncompatHeightPixels = outMetrics.heightPixels = height;
438fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
439908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        outMetrics.density = outMetrics.noncompatDensity =
440908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn                logicalDensityDpi * DisplayMetrics.DENSITY_DEFAULT_SCALE;
441fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        outMetrics.scaledDensity = outMetrics.noncompatScaledDensity = outMetrics.density;
442fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        outMetrics.xdpi = outMetrics.noncompatXdpi = physicalXDpi;
443fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        outMetrics.ydpi = outMetrics.noncompatYdpi = physicalYDpi;
444fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
44548d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner        if (!compatInfo.equals(CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO)) {
44648d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner            compatInfo.applyToDisplayMetrics(outMetrics);
447fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
448fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
449bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown
450bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown    // For debugging purposes
451bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown    @Override
452bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown    public String toString() {
453c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        StringBuilder sb = new StringBuilder();
454c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append("DisplayInfo{\"");
455c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(name);
456361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        sb.append("\", uniqueId \"");
457361ca21acc0831a9f8bbb259bb30218c252a2aa0Wale Ogunwale        sb.append(uniqueId);
458c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append("\", app ");
459c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(appWidth);
460c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(" x ");
461c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(appHeight);
462c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(", real ");
463c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(logicalWidth);
464c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(" x ");
465c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(logicalHeight);
466c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        if (overscanLeft != 0 || overscanTop != 0 || overscanRight != 0 || overscanBottom != 0) {
467c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(", overscan (");
468c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(overscanLeft);
469c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(",");
470c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(overscanTop);
471c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(",");
472c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(overscanRight);
473c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(",");
474c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(overscanBottom);
475c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            sb.append(")");
476c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
477c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(", largest app ");
478c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(largestNominalAppWidth);
479c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(" x ");
480c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(largestNominalAppHeight);
481c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(", smallest app ");
482c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(smallestNominalAppWidth);
483c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(" x ");
484c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(smallestNominalAppHeight);
485c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(", ");
486c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(refreshRate);
4873f145a2f958320766ae9240c7a57debc20d578aaMichael Wright        sb.append(" fps, supportedRefreshRates ");
4883f145a2f958320766ae9240c7a57debc20d578aaMichael Wright        sb.append(Arrays.toString(supportedRefreshRates));
4893f145a2f958320766ae9240c7a57debc20d578aaMichael Wright        sb.append(", rotation ");
490c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(rotation);
491c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(", density ");
492c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(logicalDensityDpi);
493c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(" (");
494c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(physicalXDpi);
495c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(" x ");
496c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(physicalYDpi);
497c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(") dpi, layerStack ");
498c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(layerStack);
499e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        sb.append(", appVsyncOff ");
500e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        sb.append(appVsyncOffsetNanos);
501e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        sb.append(", presDeadline ");
502e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden        sb.append(presentationDeadlineNanos);
503c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(", type ");
504c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(Display.typeToString(type));
505a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if (address != null) {
506a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(", address ").append(address);
507a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
508037c33eae74bee2774897d969d48947f9abe254fJeff Brown        sb.append(", state ");
509037c33eae74bee2774897d969d48947f9abe254fJeff Brown        sb.append(Display.stateToString(state));
510a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if (ownerUid != 0 || ownerPackageName != null) {
511a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(", owner ").append(ownerPackageName);
512a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            sb.append(" (uid ").append(ownerUid).append(")");
513a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
514c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append(flagsToString(flags));
515c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        sb.append("}");
516c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        return sb.toString();
517c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown    }
518c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown
519c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown    private static String flagsToString(int flags) {
520c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        StringBuilder result = new StringBuilder();
521f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown        if ((flags & Display.FLAG_SECURE) != 0) {
522f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown            result.append(", FLAG_SECURE");
523f0681b34dffc1510cbd9c3da5c3a7e695553fa8dJeff Brown        }
52477aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown        if ((flags & Display.FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0) {
52577aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown            result.append(", FLAG_SUPPORTS_PROTECTED_BUFFERS");
526c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        }
527a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        if ((flags & Display.FLAG_PRIVATE) != 0) {
528a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown            result.append(", FLAG_PRIVATE");
529a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown        }
5307d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown        if ((flags & Display.FLAG_PRESENTATION) != 0) {
5317d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown            result.append(", FLAG_PRESENTATION");
5327d00affce6e25b22fd8fc135933b3bf6b547a0dcJeff Brown        }
533c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        return result.toString();
534bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown    }
535fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown}
536