Index: ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java |
diff --git a/ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java b/ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java |
index 96a310dfd809a8616fdf2aeb53aaad408eb5e5b6..dd86c1e152987fb92f81c3f873db1459a87e09d8 100644 |
--- a/ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java |
+++ b/ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java |
@@ -152,7 +152,8 @@ import org.chromium.ui.gfx.DeviceDisplayInfo; |
@Override |
public void onDisplayAdded(int sdkDisplayId) { |
- addDisplay(getDisplayManager().getDisplay(sdkDisplayId)); |
+ // DisplayAndroid is added lazily on first use. This is to workaround corner case |
+ // bug where DisplayManager.getDisplay(sdkDisplayId) returning null here. |
} |
@Override |
@@ -163,8 +164,10 @@ import org.chromium.ui.gfx.DeviceDisplayInfo; |
@Override |
public void onDisplayChanged(int sdkDisplayId) { |
updateDeviceDisplayInfo(); |
- mIdMap.get(sdkDisplayId) |
- .updateFromDisplay(getDisplayManager().getDisplay(sdkDisplayId)); |
+ DisplayAndroid displayAndroid = mIdMap.get(sdkDisplayId); |
+ if (displayAndroid != null) { |
+ displayAndroid.updateFromDisplay(getDisplayManager().getDisplay(sdkDisplayId)); |
+ } |
} |
} |
@@ -204,12 +207,8 @@ import org.chromium.ui.gfx.DeviceDisplayInfo; |
private DisplayAndroidManager() { |
mIdMap = new SparseArray<>(); |
- |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { |
mBackend = new DisplayListenerBackendImpl(); |
- for (Display display : getDisplayManager().getDisplays()) { |
- addDisplay(display); |
- } |
} else { |
Display display = getDisplayFromContext(getContext()); |
mBackend = new DisplayListenerAPI16(display.getDisplayId()); |
@@ -218,8 +217,13 @@ import org.chromium.ui.gfx.DeviceDisplayInfo; |
mBackend.startListening(); |
} |
- /* package */ DisplayAndroid getDisplayAndroid(int sdkDisplayId) { |
- return mIdMap.get(sdkDisplayId); |
+ /* package */ DisplayAndroid getDisplayAndroid(Display display) { |
+ int sdkDisplayId = display.getDisplayId(); |
+ DisplayAndroid displayAndroid = mIdMap.get(sdkDisplayId); |
+ if (displayAndroid == null) { |
+ displayAndroid = addDisplay(display); |
+ } |
+ return displayAndroid; |
} |
/* package */ void startAccurateListening() { |
@@ -230,8 +234,10 @@ import org.chromium.ui.gfx.DeviceDisplayInfo; |
mBackend.stopAccurateListening(); |
} |
- private void addDisplay(Display display) { |
+ private DisplayAndroid addDisplay(Display display) { |
int sdkDisplayId = display.getDisplayId(); |
- mIdMap.put(sdkDisplayId, new DisplayAndroid(display)); |
+ DisplayAndroid displayAndroid = new DisplayAndroid(display); |
+ mIdMap.put(sdkDisplayId, displayAndroid); |
+ return displayAndroid; |
} |
} |