• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.display;
18 
19 import android.util.DisplayMetrics;
20 import android.view.Display;
21 import android.view.Surface;
22 
23 import libcore.util.Objects;
24 
25 /**
26  * Describes the characteristics of a physical display device.
27  */
28 final class DisplayDeviceInfo {
29     /**
30      * Flag: Indicates that this display device should be considered the default display
31      * device of the system.
32      */
33     public static final int FLAG_DEFAULT_DISPLAY = 1 << 0;
34 
35     /**
36      * Flag: Indicates that the orientation of this display device is coupled to the
37      * rotation of its associated logical display.
38      * <p>
39      * This flag should be applied to the default display to indicate that the user
40      * physically rotates the display when content is presented in a different orientation.
41      * The display manager will apply a coordinate transformation assuming that the
42      * physical orientation of the display matches the logical orientation of its content.
43      * </p><p>
44      * The flag should not be set when the display device is mounted in a fixed orientation
45      * such as on a desk.  The display manager will apply a coordinate transformation
46      * such as a scale and translation to letterbox or pillarbox format under the
47      * assumption that the physical orientation of the display is invariant.
48      * </p>
49      */
50     public static final int FLAG_ROTATES_WITH_CONTENT = 1 << 1;
51 
52     /**
53      * Flag: Indicates that this display device has secure video output, such as HDCP.
54      */
55     public static final int FLAG_SECURE = 1 << 2;
56 
57     /**
58      * Flag: Indicates that this display device supports compositing
59      * from gralloc protected buffers.
60      */
61     public static final int FLAG_SUPPORTS_PROTECTED_BUFFERS = 1 << 3;
62 
63     /**
64      * Touch attachment: Display does not receive touch.
65      */
66     public static final int TOUCH_NONE = 0;
67 
68     /**
69      * Touch attachment: Touch input is via the internal interface.
70      */
71     public static final int TOUCH_INTERNAL = 1;
72 
73     /**
74      * Touch attachment: Touch input is via an external interface, such as USB.
75      */
76     public static final int TOUCH_EXTERNAL = 2;
77 
78     /**
79      * Gets the name of the display device, which may be derived from
80      * EDID or other sources.  The name may be displayed to the user.
81      */
82     public String name;
83 
84     /**
85      * The width of the display in its natural orientation, in pixels.
86      * This value is not affected by display rotation.
87      */
88     public int width;
89 
90     /**
91      * The height of the display in its natural orientation, in pixels.
92      * This value is not affected by display rotation.
93      */
94     public int height;
95 
96     /**
97      * The refresh rate of the display.
98      */
99     public float refreshRate;
100 
101     /**
102      * The nominal apparent density of the display in DPI used for layout calculations.
103      * This density is sensitive to the viewing distance.  A big TV and a tablet may have
104      * the same apparent density even though the pixels on the TV are much bigger than
105      * those on the tablet.
106      */
107     public int densityDpi;
108 
109     /**
110      * The physical density of the display in DPI in the X direction.
111      * This density should specify the physical size of each pixel.
112      */
113     public float xDpi;
114 
115     /**
116      * The physical density of the display in DPI in the X direction.
117      * This density should specify the physical size of each pixel.
118      */
119     public float yDpi;
120 
121     /**
122      * Display flags.
123      */
124     public int flags;
125 
126     /**
127      * The touch attachment, per {@link DisplayViewport#touch}.
128      */
129     public int touch;
130 
131     /**
132      * The additional rotation to apply to all content presented on the display device
133      * relative to its physical coordinate system.  Default is {@link Surface#ROTATION_0}.
134      * <p>
135      * This field can be used to compensate for the fact that the display has been
136      * physically rotated relative to its natural orientation such as an HDMI monitor
137      * that has been mounted sideways to appear to be portrait rather than landscape.
138      * </p>
139      */
140     public int rotation = Surface.ROTATION_0;
141 
142     /**
143      * Display type.
144      */
145     public int type;
146 
147     /**
148      * Display address, or null if none.
149      * Interpretation varies by display type.
150      */
151     public String address;
152 
setAssumedDensityForExternalDisplay(int width, int height)153     public void setAssumedDensityForExternalDisplay(int width, int height) {
154         densityDpi = Math.min(width, height) * DisplayMetrics.DENSITY_XHIGH / 1080;
155         // Technically, these values should be smaller than the apparent density
156         // but we don't know the physical size of the display.
157         xDpi = densityDpi;
158         yDpi = densityDpi;
159     }
160 
161     @Override
equals(Object o)162     public boolean equals(Object o) {
163         return o instanceof DisplayDeviceInfo && equals((DisplayDeviceInfo)o);
164     }
165 
equals(DisplayDeviceInfo other)166     public boolean equals(DisplayDeviceInfo other) {
167         return other != null
168                 && Objects.equal(name, other.name)
169                 && width == other.width
170                 && height == other.height
171                 && refreshRate == other.refreshRate
172                 && densityDpi == other.densityDpi
173                 && xDpi == other.xDpi
174                 && yDpi == other.yDpi
175                 && flags == other.flags
176                 && touch == other.touch
177                 && rotation == other.rotation
178                 && type == other.type
179                 && Objects.equal(address, other.address);
180     }
181 
182     @Override
hashCode()183     public int hashCode() {
184         return 0; // don't care
185     }
186 
copyFrom(DisplayDeviceInfo other)187     public void copyFrom(DisplayDeviceInfo other) {
188         name = other.name;
189         width = other.width;
190         height = other.height;
191         refreshRate = other.refreshRate;
192         densityDpi = other.densityDpi;
193         xDpi = other.xDpi;
194         yDpi = other.yDpi;
195         flags = other.flags;
196         touch = other.touch;
197         rotation = other.rotation;
198         type = other.type;
199         address = other.address;
200     }
201 
202     // For debugging purposes
203     @Override
toString()204     public String toString() {
205         return "DisplayDeviceInfo{\"" + name + "\": " + width + " x " + height + ", "
206                 + refreshRate + " fps, "
207                 + "density " + densityDpi + ", " + xDpi + " x " + yDpi + " dpi"
208                 + ", touch " + touchToString(touch) + flagsToString(flags)
209                 + ", rotation " + rotation
210                 + ", type " + Display.typeToString(type)
211                 + ", address " + address
212                 + "}";
213     }
214 
touchToString(int touch)215     private static String touchToString(int touch) {
216         switch (touch) {
217             case TOUCH_NONE:
218                 return "NONE";
219             case TOUCH_INTERNAL:
220                 return "INTERNAL";
221             case TOUCH_EXTERNAL:
222                 return "EXTERNAL";
223             default:
224                 return Integer.toString(touch);
225         }
226     }
227 
flagsToString(int flags)228     private static String flagsToString(int flags) {
229         StringBuilder msg = new StringBuilder();
230         if ((flags & FLAG_DEFAULT_DISPLAY) != 0) {
231             msg.append(", FLAG_DEFAULT_DISPLAY");
232         }
233         if ((flags & FLAG_ROTATES_WITH_CONTENT) != 0) {
234             msg.append(", FLAG_ROTATES_WITH_CONTENT");
235         }
236         if ((flags & FLAG_SECURE) != 0) {
237             msg.append(", FLAG_SECURE");
238         }
239         if ((flags & FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0) {
240             msg.append(", FLAG_SUPPORTS_PROTECTED_BUFFERS");
241         }
242         return msg.toString();
243     }
244 }
245