Chromium Code Reviews| 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 |