Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(579)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java

Issue 163433010: Use Display changes for screen orientation changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@orientation_tests
Patch Set: rebase Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | content/public/android/javatests/src/org/chromium/content/browser/ScreenOrientationTest.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
index 04b3175e6c4116e5fef5f6039ae141ccb70469ae..8964d412cd2652904afbb248c235aeef53f807dd 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
@@ -16,6 +16,7 @@ import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
+import android.hardware.display.DisplayManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@@ -436,6 +437,72 @@ public class ContentViewCore
}
/**
+ * DisplayManager listener used to detect screen orientation changes and
+ * inform the ContentViewCore of any change.
+ */
+ private class DisplayOrientationListener
+ implements DisplayManager.DisplayListener {
+
+ private final DisplayManager mDisplayManager;
+ private int mPreviousOrientation;
+
+ public DisplayOrientationListener(Context context) {
+ mDisplayManager =
+ (DisplayManager) getContext().getSystemService(Context.DISPLAY_SERVICE);
+ mDisplayManager.registerDisplayListener(this, null);
+
+ mPreviousOrientation = getOrientation();
+ sendOrientationChangeEvent(mPreviousOrientation);
+ }
+
+ @Override
+ public void onDisplayAdded(int displayId) {
+ }
+
+ @Override
+ public void onDisplayChanged(int displayId) {
+ int orientation = getOrientation();
+ if (orientation == mPreviousOrientation) {
+ return;
+ }
+
+ sendOrientationChangeEvent(orientation);
+ mPreviousOrientation = orientation;
+ }
+
+ @Override
+ public void onDisplayRemoved(int displayId) {
+ }
+
+ /**
+ * Gets the screen orientation from Android.
+ */
+ private int getOrientation() {
+ WindowManager windowManager =
+ (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
+ switch (windowManager.getDefaultDisplay().getRotation()) {
+ case Surface.ROTATION_90:
+ return 90;
+ case Surface.ROTATION_180:
+ return 180;
+ case Surface.ROTATION_270:
+ return -90;
+ case Surface.ROTATION_0:
+ return 0;
+ default:
+ throw new IllegalStateException(
+ "Display.getRotation() shouldn't return that value");
+ }
+ }
+
+ private void destroy() {
+ mDisplayManager.unregisterDisplayListener(this);
+ }
+ }
+
+ private DisplayOrientationListener mDisplayListener;
+
+ /**
* Used by UMA stat for tracking accidental double tap navigations. Specifies the amount of
* time after a double tap within which actions will be recorded to the UMA stat.
*/
@@ -720,8 +787,6 @@ public class ContentViewCore
resetGestureDetectors();
}
};
-
- sendOrientationChangeEvent();
}
@CalledByNative
@@ -1578,6 +1643,8 @@ public class ContentViewCore
@SuppressWarnings("javadoc")
public void onAttachedToWindow() {
setAccessibilityState(mAccessibilityManager.isEnabled());
+
+ mDisplayListener = new DisplayOrientationListener(mContext);
}
/**
@@ -1589,6 +1656,9 @@ public class ContentViewCore
hidePopupDialog();
mZoomControlsDelegate.dismissZoomPicker();
unregisterAccessibilityContentObserver();
+
+ mDisplayListener.destroy();
+ mDisplayListener = null;
}
/**
@@ -1643,15 +1713,7 @@ public class ContentViewCore
manager.restartInput(mContainerView);
}
mContainerViewInternals.super_onConfigurationChanged(newConfig);
- // Make sure the size is up to date in JavaScript's window.onorientationchanged.
- mContainerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
- @Override
- public void onLayoutChange(View v, int left, int top, int right, int bottom,
- int oldLeft, int oldTop, int oldRight, int oldBottom) {
- mContainerView.removeOnLayoutChangeListener(this);
- sendOrientationChangeEvent();
- }
- });
+
// To request layout has side effect, but it seems OK as it only happen in
// onConfigurationChange and layout has to be changed in most case.
mContainerView.requestLayout();
@@ -2124,32 +2186,12 @@ public class ContentViewCore
}
/**
- * Get the screen orientation from the OS and push it to WebKit.
- *
- * TODO(husky): Add a hook for mock orientations.
+ * Send the screen orientation value to the renderer.
*/
- private void sendOrientationChangeEvent() {
+ private void sendOrientationChangeEvent(int orientation) {
if (mNativeContentViewCore == 0) return;
- WindowManager windowManager =
- (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
- switch (windowManager.getDefaultDisplay().getRotation()) {
- case Surface.ROTATION_90:
- nativeSendOrientationChangeEvent(mNativeContentViewCore, 90);
- break;
- case Surface.ROTATION_180:
- nativeSendOrientationChangeEvent(mNativeContentViewCore, 180);
- break;
- case Surface.ROTATION_270:
- nativeSendOrientationChangeEvent(mNativeContentViewCore, -90);
- break;
- case Surface.ROTATION_0:
- nativeSendOrientationChangeEvent(mNativeContentViewCore, 0);
- break;
- default:
- Log.w(TAG, "Unknown rotation!");
- break;
- }
+ nativeSendOrientationChangeEvent(mNativeContentViewCore, orientation);
}
/**
« no previous file with comments | « no previous file | content/public/android/javatests/src/org/chromium/content/browser/ScreenOrientationTest.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698