| 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 dd86c1e152987fb92f81c3f873db1459a87e09d8..ea17cb7e37bf2e56dc496c66a9b552a6a6601fb2 100644
|
| --- a/ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java
|
| +++ b/ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java
|
| @@ -17,11 +17,13 @@ import android.view.WindowManager;
|
|
|
| import org.chromium.base.ContextUtils;
|
| import org.chromium.base.ThreadUtils;
|
| +import org.chromium.base.annotations.JNINamespace;
|
| import org.chromium.ui.gfx.DeviceDisplayInfo;
|
|
|
| /**
|
| * DisplayAndroidManager is a class that informs its observers Display changes.
|
| */
|
| +@JNINamespace("display")
|
| /* package */ class DisplayAndroidManager {
|
| /**
|
| * DisplayListenerBackend is an interface that abstract the mechanism used for the actual
|
| @@ -66,13 +68,8 @@ import org.chromium.ui.gfx.DeviceDisplayInfo;
|
|
|
| private static final long POLLING_DELAY = 500;
|
|
|
| - private int mMainSdkDisplayId;
|
| private int mAccurateCount;
|
|
|
| - public DisplayListenerAPI16(int sdkDisplayId) {
|
| - mMainSdkDisplayId = sdkDisplayId;
|
| - }
|
| -
|
| // DisplayListenerBackend implementation:
|
|
|
| @Override
|
| @@ -158,6 +155,13 @@ import org.chromium.ui.gfx.DeviceDisplayInfo;
|
|
|
| @Override
|
| public void onDisplayRemoved(int sdkDisplayId) {
|
| + // Never remove the primary display.
|
| + if (sdkDisplayId == mMainSdkDisplayId) return;
|
| +
|
| + DisplayAndroid displayAndroid = mIdMap.get(sdkDisplayId);
|
| + if (displayAndroid == null) return;
|
| +
|
| + nativeRemoveDisplay(sdkDisplayId);
|
| mIdMap.remove(sdkDisplayId);
|
| }
|
|
|
| @@ -173,6 +177,7 @@ import org.chromium.ui.gfx.DeviceDisplayInfo;
|
|
|
| private static DisplayAndroidManager sDisplayAndroidManager;
|
|
|
| + private int mMainSdkDisplayId;
|
| private SparseArray<DisplayAndroid> mIdMap;
|
| private final DisplayListenerBackend mBackend;
|
|
|
| @@ -207,13 +212,26 @@ import org.chromium.ui.gfx.DeviceDisplayInfo;
|
|
|
| private DisplayAndroidManager() {
|
| mIdMap = new SparseArray<>();
|
| + Display display;
|
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
| mBackend = new DisplayListenerBackendImpl();
|
| + // Make sure the display map contains the built-in primary display.
|
| + // The primary display is never removed.
|
| + display = getDisplayManager().getDisplay(Display.DEFAULT_DISPLAY);
|
| +
|
| + // Android documentation on Display.DEFAULT_DISPLAY suggests that the above
|
| + // method might return null. In that case we retrieve the default display
|
| + // from the application context and take it as the primary display.
|
| + if (display == null) display = getDisplayFromContext(getContext());
|
| } else {
|
| - Display display = getDisplayFromContext(getContext());
|
| - mBackend = new DisplayListenerAPI16(display.getDisplayId());
|
| - addDisplay(display); // Note this display is never removed.
|
| + mBackend = new DisplayListenerAPI16();
|
| + display = getDisplayFromContext(getContext());
|
| }
|
| +
|
| + mMainSdkDisplayId = display.getDisplayId();
|
| + nativeSetPrimaryDisplayId(mMainSdkDisplayId);
|
| + addDisplay(display); // Note this display is never removed.
|
| +
|
| mBackend.startListening();
|
| }
|
|
|
| @@ -238,6 +256,22 @@ import org.chromium.ui.gfx.DeviceDisplayInfo;
|
| int sdkDisplayId = display.getDisplayId();
|
| DisplayAndroid displayAndroid = new DisplayAndroid(display);
|
| mIdMap.put(sdkDisplayId, displayAndroid);
|
| +
|
| + updateDisplayOnNativeSide(displayAndroid);
|
| return displayAndroid;
|
| }
|
| +
|
| + /* package */ void updateDisplayOnNativeSide(DisplayAndroid displayAndroid) {
|
| + nativeUpdateDisplay(displayAndroid.getSdkDisplayId(),
|
| + displayAndroid.getPhysicalDisplayWidth(), displayAndroid.getPhysicalDisplayHeight(),
|
| + displayAndroid.getDisplayWidth(), displayAndroid.getDisplayHeight(),
|
| + displayAndroid.getDIPScale(), displayAndroid.getRotationDegrees(),
|
| + displayAndroid.getBitsPerPixel(), displayAndroid.getBitsPerComponent());
|
| + }
|
| +
|
| + private static native void nativeUpdateDisplay(int sdkDisplayId, int physicalWidth,
|
| + int physicalHeight, int width, int height, float dipScale, int rotationDegrees,
|
| + int bitsPerPixel, int bitsPerComponent);
|
| + private static native void nativeRemoveDisplay(int sdkDisplayId);
|
| + private static native void nativeSetPrimaryDisplayId(int sdkDisplayId);
|
| }
|
|
|