| Index: content/public/android/java/src/org/chromium/content/browser/ScreenOrientationListener.java
|
| diff --git a/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationListener.java b/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationListener.java
|
| index 4cd67865a4dea8d0546e81dccba009eb8867c70e..381f98b0992bfb466337d430e14cac89934af54c 100644
|
| --- a/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationListener.java
|
| +++ b/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationListener.java
|
| @@ -60,6 +60,19 @@ public class ScreenOrientationListener {
|
| * when the last observer is removed.
|
| */
|
| void stopListening();
|
| +
|
| + /**
|
| + * Toggle the accurate mode if it wasn't already doing so. The backend
|
| + * will keep track of the number of times this has been called.
|
| + */
|
| + void startAccurateListening();
|
| +
|
| + /**
|
| + * Request to stop the accurate mode. It will effectively be stopped
|
| + * only if this method is called as many times as
|
| + * startAccurateListening().
|
| + */
|
| + void stopAccurateListening();
|
| }
|
|
|
| /**
|
| @@ -69,10 +82,16 @@ public class ScreenOrientationListener {
|
| *
|
| * This method is known to not correctly detect 180 degrees changes but it
|
| * is the only method that will work before API Level 17 (excluding polling).
|
| + * When toggleAccurateMode() is called, it will start polling in order to
|
| + * find out if the display has changed.
|
| */
|
| private class ScreenOrientationConfigurationListener
|
| implements ScreenOrientationListenerBackend, ComponentCallbacks {
|
|
|
| + private static final long POLLING_DELAY = 500;
|
| +
|
| + private int mAccurateCount = 0;
|
| +
|
| // ScreenOrientationListenerBackend implementation:
|
|
|
| @Override
|
| @@ -85,6 +104,36 @@ public class ScreenOrientationListener {
|
| mAppContext.unregisterComponentCallbacks(this);
|
| }
|
|
|
| + @Override
|
| + public void startAccurateListening() {
|
| + ++mAccurateCount;
|
| +
|
| + if (mAccurateCount > 1)
|
| + return;
|
| +
|
| + // Start polling if we went from 0 to 1. The polling will
|
| + // automatically stop when mAccurateCount reaches 0.
|
| + final ScreenOrientationConfigurationListener self = this;
|
| + ThreadUtils.postOnUiThreadDelayed(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + self.onConfigurationChanged(null);
|
| +
|
| + if (self.mAccurateCount < 1)
|
| + return;
|
| +
|
| + ThreadUtils.postOnUiThreadDelayed(this,
|
| + ScreenOrientationConfigurationListener.POLLING_DELAY);
|
| + }
|
| + }, POLLING_DELAY);
|
| + }
|
| +
|
| + @Override
|
| + public void stopAccurateListening() {
|
| + --mAccurateCount;
|
| + assert mAccurateCount >= 0;
|
| + }
|
| +
|
| // ComponentCallbacks implementation:
|
|
|
| @Override
|
| @@ -123,6 +172,16 @@ public class ScreenOrientationListener {
|
| displayManager.unregisterDisplayListener(this);
|
| }
|
|
|
| + @Override
|
| + public void startAccurateListening() {
|
| + // Always accurate. Do nothing.
|
| + }
|
| +
|
| + @Override
|
| + public void stopAccurateListening() {
|
| + // Always accurate. Do nothing.
|
| + }
|
| +
|
| // DisplayListener implementation:
|
|
|
| @Override
|
| @@ -235,6 +294,22 @@ public class ScreenOrientationListener {
|
| }
|
|
|
| /**
|
| + * Toggle the accurate mode if it wasn't already doing so. The backend will
|
| + * keep track of the number of times this has been called.
|
| + */
|
| + public void startAccurateListening() {
|
| + mBackend.startAccurateListening();
|
| + }
|
| +
|
| + /**
|
| + * Request to stop the accurate mode. It will effectively be stopped only if
|
| + * this method is called as many times as startAccurateListening().
|
| + */
|
| + public void stopAccurateListening() {
|
| + mBackend.stopAccurateListening();
|
| + }
|
| +
|
| + /**
|
| * This should be called by classes extending ScreenOrientationListener when
|
| * it is possible that there is a screen orientation change. If there is an
|
| * actual change, the observers will get notified.
|
| @@ -243,12 +318,12 @@ public class ScreenOrientationListener {
|
| int previousOrientation = mOrientation;
|
| updateOrientation();
|
|
|
| - DeviceDisplayInfo.create(mAppContext).updateNativeSharedDisplayInfo();
|
| -
|
| if (mOrientation == previousOrientation) {
|
| return;
|
| }
|
|
|
| + DeviceDisplayInfo.create(mAppContext).updateNativeSharedDisplayInfo();
|
| +
|
| for (ScreenOrientationObserver observer : mObservers) {
|
| observer.onScreenOrientationChanged(mOrientation);
|
| }
|
|
|