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

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

Issue 2361633002: android: Introduce DisplayAndroid (Closed)
Patch Set: test comments Created 4 years, 2 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
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 44a559d9272a39c959bc7627c140541af8144d49..0f07c0a5d125e304e7cb1758e80d0338f0a9da34 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
@@ -33,6 +33,7 @@ import android.view.HapticFeedbackConstants;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.MotionEvent;
+import android.view.Surface;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStructure;
@@ -56,7 +57,6 @@ import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.content.R;
-import org.chromium.content.browser.ScreenOrientationListener.ScreenOrientationObserver;
import org.chromium.content.browser.accessibility.BrowserAccessibilityManager;
import org.chromium.content.browser.accessibility.captioning.CaptioningBridgeFactory;
import org.chromium.content.browser.accessibility.captioning.SystemCaptioningBridge;
@@ -85,6 +85,7 @@ import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.base.ViewAndroidDelegate;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.base.ime.TextInputType;
+import org.chromium.ui.display.DisplayAndroid.DisplayAndroidObserver;
import org.chromium.ui.touch_selection.SelectionEventType;
import java.lang.annotation.Annotation;
@@ -101,7 +102,7 @@ import java.util.Map;
* being tied to the view system.
*/
@JNINamespace("content")
-public class ContentViewCore implements AccessibilityStateChangeListener, ScreenOrientationObserver,
+public class ContentViewCore implements AccessibilityStateChangeListener, DisplayAndroidObserver,
SystemCaptioningBridge.SystemCaptioningBridgeListener,
WindowAndroidProvider {
private static final String TAG = "cr_ContentViewCore";
@@ -327,6 +328,7 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen
// Native pointer to C++ ContentViewCoreImpl object which will be set by nativeInit().
private long mNativeContentViewCore = 0;
+ private boolean mAttachedToWindow;
private final ObserverList<GestureStateListener> mGestureStateListeners;
private final RewindableIterator<GestureStateListener> mGestureStateListenersIterator;
private ZoomControlsDelegate mZoomControlsDelegate;
@@ -680,6 +682,7 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen
* @param windowAndroid The new {@link WindowAndroid} for this {@link ContentViewCore}.
*/
public void updateWindowAndroid(WindowAndroid windowAndroid) {
+ removeDisplayAndroidObserver();
long windowNativePointer = windowAndroid == null ? 0 : windowAndroid.getNativePointer();
nativeUpdateWindowAndroid(mNativeContentViewCore, windowNativePointer);
@@ -689,12 +692,29 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen
mPastePopupMenu = null;
mRenderCoordinates.setDeviceScaleFactor(getDisplayContext(windowAndroid));
+ addDisplayAndroidObserverIfNeeded();
for (WindowAndroidChangedObserver observer : mWindowAndroidChangedObservers) {
observer.onWindowAndroidChanged(windowAndroid);
}
}
+ private void addDisplayAndroidObserverIfNeeded() {
+ if (!mAttachedToWindow) return;
+ WindowAndroid windowAndroid = getWindowAndroid();
+ if (windowAndroid != null) {
+ windowAndroid.getDisplay().addObserver(this);
+ onRotationChanged(windowAndroid.getDisplay().getRotation());
+ }
+ }
+
+ private void removeDisplayAndroidObserver() {
+ WindowAndroid windowAndroid = getWindowAndroid();
+ if (windowAndroid != null) {
+ windowAndroid.getDisplay().removeObserver(this);
+ }
+ }
+
/**
* Sets a new container view for this {@link ContentViewCore}.
*
@@ -820,6 +840,7 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen
* onDetachedFromWindow() which is guaranteed to be called in Android WebView.
*/
public void destroy() {
+ removeDisplayAndroidObserver();
if (mNativeContentViewCore != 0) {
nativeOnJavaContentViewCoreDestroyed(mNativeContentViewCore);
}
@@ -843,7 +864,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen
mGestureStateListenersIterator.next().onDestroyed();
}
mGestureStateListeners.clear();
- ScreenOrientationListener.getInstance().removeObserver(this);
hidePopupsAndPreserveSelection();
mPastePopupMenu = null;
@@ -1348,9 +1368,10 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen
*/
@SuppressWarnings("javadoc")
public void onAttachedToWindow() {
+ mAttachedToWindow = true;
+ addDisplayAndroidObserverIfNeeded();
setAccessibilityState(mAccessibilityManager.isEnabled());
updateTextSelectionUI(true);
- ScreenOrientationListener.getInstance().addObserver(this, mContext);
GamepadList.onAttachedToWindow(mContext);
mAccessibilityManager.addAccessibilityStateChangeListener(this);
mSystemCaptioningBridge.addListener(this);
@@ -1380,10 +1401,10 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen
@SuppressWarnings("javadoc")
@SuppressLint("MissingSuperCall")
public void onDetachedFromWindow() {
+ mAttachedToWindow = false;
mImeAdapter.onViewDetachedFromWindow();
mZoomControlsDelegate.dismissZoomPicker();
-
- ScreenOrientationListener.getInstance().removeObserver(this);
+ removeDisplayAndroidObserver();
GamepadList.onDetachedFromWindow();
mAccessibilityManager.removeAccessibilityStateChangeListener(this);
@@ -3217,16 +3238,35 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen
}
@Override
- public void onScreenOrientationChanged(int orientation) {
+ public void onRotationChanged(int rotation) {
// ActionMode#invalidate() won't be able to re-layout the floating
- // action mode menu items according to the new orientation. So Chrome
+ // action mode menu items according to the new rotation. So Chrome
// has to re-create the action mode.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && mActionMode != null) {
hidePopupsAndPreserveSelection();
showSelectActionMode(true);
}
- sendOrientationChangeEvent(orientation);
+ int rotationDegrees = 0;
+ switch (rotation) {
+ case Surface.ROTATION_0:
+ rotationDegrees = 0;
+ break;
+ case Surface.ROTATION_90:
+ rotationDegrees = 90;
+ break;
+ case Surface.ROTATION_180:
+ rotationDegrees = 180;
+ break;
+ case Surface.ROTATION_270:
+ rotationDegrees = -90;
+ break;
+ default:
+ throw new IllegalStateException(
+ "Display.getRotation() shouldn't return that value");
+ }
+
+ sendOrientationChangeEvent(rotationDegrees);
}
/**

Powered by Google App Engine
This is Rietveld 408576698