OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.ui.display; | 5 package org.chromium.ui.display; |
6 | 6 |
7 import android.annotation.SuppressLint; | 7 import android.annotation.SuppressLint; |
8 import android.content.ComponentCallbacks; | 8 import android.content.ComponentCallbacks; |
9 import android.content.Context; | 9 import android.content.Context; |
10 import android.content.res.Configuration; | 10 import android.content.res.Configuration; |
11 import android.hardware.display.DisplayManager; | 11 import android.hardware.display.DisplayManager; |
12 import android.hardware.display.DisplayManager.DisplayListener; | 12 import android.hardware.display.DisplayManager.DisplayListener; |
13 import android.os.Build; | 13 import android.os.Build; |
14 import android.util.SparseArray; | 14 import android.util.SparseArray; |
15 import android.view.Display; | 15 import android.view.Display; |
16 import android.view.WindowManager; | 16 import android.view.WindowManager; |
17 | 17 |
18 import org.chromium.base.ContextUtils; | 18 import org.chromium.base.ContextUtils; |
19 import org.chromium.base.ThreadUtils; | 19 import org.chromium.base.ThreadUtils; |
20 import org.chromium.base.annotations.JNINamespace; | |
20 import org.chromium.ui.gfx.DeviceDisplayInfo; | 21 import org.chromium.ui.gfx.DeviceDisplayInfo; |
21 | 22 |
22 /** | 23 /** |
23 * DisplayAndroidManager is a class that informs its observers Display changes. | 24 * DisplayAndroidManager is a class that informs its observers Display changes. |
24 */ | 25 */ |
26 @JNINamespace("display") | |
25 /* package */ class DisplayAndroidManager { | 27 /* package */ class DisplayAndroidManager { |
26 /** | 28 /** |
27 * DisplayListenerBackend is an interface that abstract the mechanism used f or the actual | 29 * DisplayListenerBackend is an interface that abstract the mechanism used f or the actual |
28 * display update listening. The reason being that from Android API Level 17 DisplayListener | 30 * display update listening. The reason being that from Android API Level 17 DisplayListener |
29 * will be used. Before that, an unreliable solution based on onConfiguratio nChanged has to be | 31 * will be used. Before that, an unreliable solution based on onConfiguratio nChanged has to be |
30 * used. | 32 * used. |
31 */ | 33 */ |
32 private interface DisplayListenerBackend { | 34 private interface DisplayListenerBackend { |
33 | 35 |
34 /** | 36 /** |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
151 // DisplayListener implementation: | 153 // DisplayListener implementation: |
152 | 154 |
153 @Override | 155 @Override |
154 public void onDisplayAdded(int sdkDisplayId) { | 156 public void onDisplayAdded(int sdkDisplayId) { |
155 // DisplayAndroid is added lazily on first use. This is to workaroun d corner case | 157 // DisplayAndroid is added lazily on first use. This is to workaroun d corner case |
156 // bug where DisplayManager.getDisplay(sdkDisplayId) returning null here. | 158 // bug where DisplayManager.getDisplay(sdkDisplayId) returning null here. |
157 } | 159 } |
158 | 160 |
159 @Override | 161 @Override |
160 public void onDisplayRemoved(int sdkDisplayId) { | 162 public void onDisplayRemoved(int sdkDisplayId) { |
163 // Never remove the primary display. | |
164 if (sdkDisplayId == Display.DEFAULT_DISPLAY) return; | |
165 | |
166 DisplayAndroid displayAndroid = mIdMap.get(sdkDisplayId); | |
167 if (displayAndroid == null) return; | |
168 | |
169 nativeRemoveDisplay(sdkDisplayId); | |
161 mIdMap.remove(sdkDisplayId); | 170 mIdMap.remove(sdkDisplayId); |
162 } | 171 } |
163 | 172 |
164 @Override | 173 @Override |
165 public void onDisplayChanged(int sdkDisplayId) { | 174 public void onDisplayChanged(int sdkDisplayId) { |
166 updateDeviceDisplayInfo(); | 175 updateDeviceDisplayInfo(); |
167 DisplayAndroid displayAndroid = mIdMap.get(sdkDisplayId); | 176 DisplayAndroid displayAndroid = mIdMap.get(sdkDisplayId); |
168 if (displayAndroid != null) { | 177 if (displayAndroid != null) { |
169 displayAndroid.updateFromDisplay(getDisplayManager().getDisplay( sdkDisplayId)); | 178 displayAndroid.updateFromDisplay(getDisplayManager().getDisplay( sdkDisplayId)); |
170 } | 179 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
202 } | 211 } |
203 | 212 |
204 private static void updateDeviceDisplayInfo() { | 213 private static void updateDeviceDisplayInfo() { |
205 DeviceDisplayInfo.create(getContext()).updateNativeSharedDisplayInfo(); | 214 DeviceDisplayInfo.create(getContext()).updateNativeSharedDisplayInfo(); |
206 } | 215 } |
207 | 216 |
208 private DisplayAndroidManager() { | 217 private DisplayAndroidManager() { |
209 mIdMap = new SparseArray<>(); | 218 mIdMap = new SparseArray<>(); |
210 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { | 219 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { |
211 mBackend = new DisplayListenerBackendImpl(); | 220 mBackend = new DisplayListenerBackendImpl(); |
221 // Make sure the display map contains the built-in primary display i f it exists. | |
222 // The primary display is never removed. | |
223 Display display = getDisplayManager().getDisplay(Display.DEFAULT_DIS PLAY); | |
224 if (display != null) { | |
225 addDisplay(display); | |
226 } else { | |
227 nativeSetNoPrimaryDisplay(); | |
mthiesse
2016/10/27 14:30:30
This feels scary - should we not just use getDispl
Tima Vaisburd
2016/10/27 17:56:23
Sorry, I did not quite get your idea. Do you sugge
mthiesse
2016/10/27 19:51:51
Yes, that's what I'm suggesting. I'm not sure what
Tima Vaisburd
2016/10/27 20:22:30
I do not know, maybe not possible.
Another idea is
mthiesse
2016/10/27 20:29:13
I'll have to defer to Bo here, I don't know enough
boliu
2016/10/27 22:17:49
I don't this that can ever happen. throw an except
Tima Vaisburd
2016/10/31 23:36:15
Got Display from the application context. I had to
| |
228 } | |
212 } else { | 229 } else { |
213 Display display = getDisplayFromContext(getContext()); | 230 Display display = getDisplayFromContext(getContext()); |
214 mBackend = new DisplayListenerAPI16(display.getDisplayId()); | 231 mBackend = new DisplayListenerAPI16(display.getDisplayId()); |
215 addDisplay(display); // Note this display is never removed. | 232 addDisplay(display); // Note this display is never removed. |
216 } | 233 } |
217 mBackend.startListening(); | 234 mBackend.startListening(); |
218 } | 235 } |
219 | 236 |
220 /* package */ DisplayAndroid getDisplayAndroid(Display display) { | 237 /* package */ DisplayAndroid getDisplayAndroid(Display display) { |
221 int sdkDisplayId = display.getDisplayId(); | 238 int sdkDisplayId = display.getDisplayId(); |
222 DisplayAndroid displayAndroid = mIdMap.get(sdkDisplayId); | 239 DisplayAndroid displayAndroid = mIdMap.get(sdkDisplayId); |
223 if (displayAndroid == null) { | 240 if (displayAndroid == null) { |
224 displayAndroid = addDisplay(display); | 241 displayAndroid = addDisplay(display); |
225 } | 242 } |
226 return displayAndroid; | 243 return displayAndroid; |
227 } | 244 } |
228 | 245 |
229 /* package */ void startAccurateListening() { | 246 /* package */ void startAccurateListening() { |
230 mBackend.startAccurateListening(); | 247 mBackend.startAccurateListening(); |
231 } | 248 } |
232 | 249 |
233 /* package */ void stopAccurateListening() { | 250 /* package */ void stopAccurateListening() { |
234 mBackend.stopAccurateListening(); | 251 mBackend.stopAccurateListening(); |
235 } | 252 } |
236 | 253 |
237 private DisplayAndroid addDisplay(Display display) { | 254 private DisplayAndroid addDisplay(Display display) { |
238 int sdkDisplayId = display.getDisplayId(); | 255 int sdkDisplayId = display.getDisplayId(); |
239 DisplayAndroid displayAndroid = new DisplayAndroid(display); | 256 DisplayAndroid displayAndroid = new DisplayAndroid(display); |
240 mIdMap.put(sdkDisplayId, displayAndroid); | 257 mIdMap.put(sdkDisplayId, displayAndroid); |
258 | |
259 updateDisplayOnNativeSide(displayAndroid); | |
241 return displayAndroid; | 260 return displayAndroid; |
242 } | 261 } |
262 | |
263 /* package */ void updateDisplayOnNativeSide(DisplayAndroid displayAndroid) { | |
264 nativeUpdateDisplay(displayAndroid.getSdkDisplayId(), | |
265 displayAndroid.getPhysicalDisplayWidth(), displayAndroid.getPhys icalDisplayHeight(), | |
266 displayAndroid.getDisplayWidth(), displayAndroid.getDisplayHeigh t(), | |
267 displayAndroid.getDIPScale(), displayAndroid.getRotationDegrees( ), | |
268 displayAndroid.getBitsPerPixel(), displayAndroid.getBitsPerCompo nent()); | |
269 } | |
270 | |
271 private static native void nativeUpdateDisplay(int sdkDisplayId, int physica lWidth, | |
272 int physicalHeight, int width, int height, float dipScale, int rotat ionDegrees, | |
273 int bitsPerPixel, int bitsPerComponent); | |
274 private static native void nativeRemoveDisplay(int sdkDisplayId); | |
275 private static native void nativeSetNoPrimaryDisplay(); | |
243 } | 276 } |
OLD | NEW |