DisplayInfo.java revision 3f2ba6220bf74cb5157d6fafee9c76f526acea68
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;
20fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.os.Parcel;
21fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.os.Parcelable;
22fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.util.DisplayMetrics;
23fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
244ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownimport libcore.util.Objects;
254ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
26fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/**
27fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Describes the characteristics of a particular logical display.
28fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * @hide
29fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */
30fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownpublic final class DisplayInfo implements Parcelable {
31fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
324ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * The surface flinger layer stack associated with this logical display.
334ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
344ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public int layerStack;
354ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
364ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
37c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown     * Display flags.
38c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown     */
39c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown    public int flags;
40c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown
41c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown    /**
424ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     * The human-readable name of the display.
434ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown     */
444ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public String name;
454ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
464ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    /**
47fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The width of the portion of the display that is available to applications, in pixels.
48fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * Represents the size of the display minus any system decorations.
49fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
50fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int appWidth;
51fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
52fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
53fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The height of the portion of the display that is available to applications, in pixels.
54fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * Represents the size of the display minus any system decorations.
55fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
56fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int appHeight;
57fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
58fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
59fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The smallest value of {@link #appWidth} that an application is likely to encounter,
60fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * in pixels, excepting cases where the width may be even smaller due to the presence
61fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * of a soft keyboard, for example.
62fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
63fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int smallestNominalAppWidth;
64fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
65fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
66fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The smallest value of {@link #appHeight} that an application is likely to encounter,
67fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * in pixels, excepting cases where the height may be even smaller due to the presence
68fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * of a soft keyboard, for example.
69fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
70fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int smallestNominalAppHeight;
71fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
72fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
73fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The largest value of {@link #appWidth} that an application is likely to encounter,
74fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * in pixels, excepting cases where the width may be even larger due to system decorations
75fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * such as the status bar being hidden, for example.
76fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
77fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int largestNominalAppWidth;
78fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
79fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
80fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The largest value of {@link #appHeight} that an application is likely to encounter,
81fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * in pixels, excepting cases where the height may be even larger due to system decorations
82fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * such as the status bar being hidden, for example.
83fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
84fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int largestNominalAppHeight;
85fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
86fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
87fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The logical width of the display, in pixels.
88fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * Represents the usable size of the display which may be smaller than the
89fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * physical size when the system is emulating a smaller display.
90fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
91fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int logicalWidth;
92fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
93fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
94fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The logical height of the display, in pixels.
95fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * Represents the usable size of the display which may be smaller than the
96fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * physical size when the system is emulating a smaller display.
97fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
98fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int logicalHeight;
99fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
100fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
101fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The rotation of the display relative to its natural orientation.
102fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * May be one of {@link android.view.Surface#ROTATION_0},
103fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * {@link android.view.Surface#ROTATION_90}, {@link android.view.Surface#ROTATION_180},
104fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * {@link android.view.Surface#ROTATION_270}.
105fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * <p>
106fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The value of this field is indeterminate if the logical display is presented on
107fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * more than one physical display.
108fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * </p>
109fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
110fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public int rotation;
111fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
112fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
113fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The refresh rate of this display in frames per second.
114fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * <p>
115fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The value of this field is indeterminate if the logical display is presented on
116fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * more than one physical display.
117fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * </p>
118fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
119fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float refreshRate;
120fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
121fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
122908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn     * The logical display density which is the basis for density-independent
123908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn     * pixels.
124fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
125908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn    public int logicalDensityDpi;
126fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
127fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
128fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The exact physical pixels per inch of the screen in the X dimension.
129fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * <p>
130fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The value of this field is indeterminate if the logical display is presented on
131fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * more than one physical display.
132fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * </p>
133fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
134fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float physicalXDpi;
135fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
136fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    /**
137fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The exact physical pixels per inch of the screen in the Y dimension.
138fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * <p>
139fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * The value of this field is indeterminate if the logical display is presented on
140fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * more than one physical display.
141fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     * </p>
142fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown     */
143fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public float physicalYDpi;
144fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
145fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public static final Creator<DisplayInfo> CREATOR = new Creator<DisplayInfo>() {
146fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        public DisplayInfo createFromParcel(Parcel source) {
147fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown            return new DisplayInfo(source);
148fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
149fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
150fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        public DisplayInfo[] newArray(int size) {
151fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown            return new DisplayInfo[size];
152fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
153fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    };
154fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
155fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public DisplayInfo() {
156fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
157fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
158bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    public DisplayInfo(DisplayInfo other) {
159bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        copyFrom(other);
160bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    }
161bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown
162fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    private DisplayInfo(Parcel source) {
163fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        readFromParcel(source);
164fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
165fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
166fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    @Override
1674ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public boolean equals(Object o) {
1684ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return o instanceof DisplayInfo && equals((DisplayInfo)o);
1694ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
1704ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
1714ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public boolean equals(DisplayInfo other) {
1724ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return other != null
1734ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && layerStack == other.layerStack
1744ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && Objects.equal(name, other.name)
1754ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && appWidth == other.appWidth
1764ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && appHeight == other.appHeight
1774ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && smallestNominalAppWidth == other.smallestNominalAppWidth
1784ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && smallestNominalAppHeight == other.smallestNominalAppHeight
1794ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && largestNominalAppWidth == other.largestNominalAppWidth
1804ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && largestNominalAppHeight == other.largestNominalAppHeight
1814ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && logicalWidth == other.logicalWidth
1824ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && logicalHeight == other.logicalHeight
1834ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && rotation == other.rotation
1844ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && refreshRate == other.refreshRate
1854ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && logicalDensityDpi == other.logicalDensityDpi
1864ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && physicalXDpi == other.physicalXDpi
1874ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                && physicalYDpi == other.physicalYDpi;
1884ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
1894ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
1904ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    @Override
1914ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public int hashCode() {
1924ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return 0; // don't care
193fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
194fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
195fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void copyFrom(DisplayInfo other) {
1964ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        layerStack = other.layerStack;
197c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        flags = other.flags;
1984ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        name = other.name;
199fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        appWidth = other.appWidth;
200fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        appHeight = other.appHeight;
201fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        smallestNominalAppWidth = other.smallestNominalAppWidth;
202fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        smallestNominalAppHeight = other.smallestNominalAppHeight;
203fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        largestNominalAppWidth = other.largestNominalAppWidth;
204fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        largestNominalAppHeight = other.largestNominalAppHeight;
205fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        logicalWidth = other.logicalWidth;
206fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        logicalHeight = other.logicalHeight;
207fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        rotation = other.rotation;
208fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        refreshRate = other.refreshRate;
209908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        logicalDensityDpi = other.logicalDensityDpi;
210fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        physicalXDpi = other.physicalXDpi;
211fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        physicalYDpi = other.physicalYDpi;
212fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
213fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
214fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void readFromParcel(Parcel source) {
2154ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        layerStack = source.readInt();
216c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        flags = source.readInt();
2174ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        name = source.readString();
218fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        appWidth = source.readInt();
219fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        appHeight = source.readInt();
220fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        smallestNominalAppWidth = source.readInt();
221fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        smallestNominalAppHeight = source.readInt();
222fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        largestNominalAppWidth = source.readInt();
223fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        largestNominalAppHeight = source.readInt();
224fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        logicalWidth = source.readInt();
225fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        logicalHeight = source.readInt();
226fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        rotation = source.readInt();
227fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        refreshRate = source.readFloat();
228908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        logicalDensityDpi = source.readInt();
229fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        physicalXDpi = source.readFloat();
230fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        physicalYDpi = source.readFloat();
231fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
232fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
233fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    @Override
234fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void writeToParcel(Parcel dest, int flags) {
2354ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        dest.writeInt(layerStack);
2363f2ba6220bf74cb5157d6fafee9c76f526acea68Jeff Brown        dest.writeInt(this.flags);
2374ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        dest.writeString(name);
238fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(appWidth);
239fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(appHeight);
240fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(smallestNominalAppWidth);
241fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(smallestNominalAppHeight);
242fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(largestNominalAppWidth);
243fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(largestNominalAppHeight);
244fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(logicalWidth);
245fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(logicalHeight);
246fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeInt(rotation);
247fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeFloat(refreshRate);
248908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        dest.writeInt(logicalDensityDpi);
249fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeFloat(physicalXDpi);
250fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        dest.writeFloat(physicalYDpi);
251fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
252fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
2534ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    @Override
2544ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public int describeContents() {
2554ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return 0;
2564ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    }
2574ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
258fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void getAppMetrics(DisplayMetrics outMetrics, CompatibilityInfoHolder cih) {
259fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        getMetricsWithSize(outMetrics, cih, appWidth, appHeight);
260fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
261fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
262fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    public void getLogicalMetrics(DisplayMetrics outMetrics, CompatibilityInfoHolder cih) {
263fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        getMetricsWithSize(outMetrics, cih, logicalWidth, logicalHeight);
264fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
265fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
266fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    private void getMetricsWithSize(DisplayMetrics outMetrics, CompatibilityInfoHolder cih,
267fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown            int width, int height) {
268908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        outMetrics.densityDpi = outMetrics.noncompatDensityDpi = logicalDensityDpi;
269fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        outMetrics.noncompatWidthPixels  = outMetrics.widthPixels = width;
270fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        outMetrics.noncompatHeightPixels = outMetrics.heightPixels = height;
271fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
272908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn        outMetrics.density = outMetrics.noncompatDensity =
273908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn                logicalDensityDpi * DisplayMetrics.DENSITY_DEFAULT_SCALE;
274fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        outMetrics.scaledDensity = outMetrics.noncompatScaledDensity = outMetrics.density;
275fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        outMetrics.xdpi = outMetrics.noncompatXdpi = physicalXDpi;
276fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        outMetrics.ydpi = outMetrics.noncompatYdpi = physicalYDpi;
277fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
278fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        if (cih != null) {
279fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown            CompatibilityInfo ci = cih.getIfNeeded();
280fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown            if (ci != null) {
281fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown                ci.applyToDisplayMetrics(outMetrics);
282fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown            }
283fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
284fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
285bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown
286bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown    // For debugging purposes
287bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown    @Override
288bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown    public String toString() {
2894ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        return "DisplayInfo{\"" + name + "\", app " + appWidth + " x " + appHeight
290bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown                + ", real " + logicalWidth + " x " + logicalHeight
291bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown                + ", largest app " + largestNominalAppWidth + " x " + largestNominalAppHeight
292bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown                + ", smallest app " + smallestNominalAppWidth + " x " + smallestNominalAppHeight
293bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown                + ", " + refreshRate + " fps"
294bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown                + ", rotation " + rotation
295bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown                + ", density " + logicalDensityDpi
2964ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                + ", " + physicalXDpi + " x " + physicalYDpi + " dpi"
297c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown                + ", layerStack " + layerStack + flagsToString(flags) + "}";
298c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown    }
299c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown
300c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown    private static String flagsToString(int flags) {
301c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        StringBuilder result = new StringBuilder();
30277aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown        if ((flags & Display.FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0) {
30377aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown            result.append(", FLAG_SUPPORTS_PROTECTED_BUFFERS");
304c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        }
305c5df37c285221d0fb113f55b9e78b35632241d3fJeff Brown        return result.toString();
306bf5740e75efd87ae0213486e78e029403804c6f0Jeff Brown    }
307fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown}
308