| 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
|
| deleted file mode 100644
|
| index 8529da24ed632bfc3548edc6d369e178f777565d..0000000000000000000000000000000000000000
|
| --- a/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationListener.java
|
| +++ /dev/null
|
| @@ -1,354 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -package org.chromium.content.browser;
|
| -
|
| -import android.annotation.SuppressLint;
|
| -import android.content.ComponentCallbacks;
|
| -import android.content.Context;
|
| -import android.content.res.Configuration;
|
| -import android.hardware.display.DisplayManager;
|
| -import android.hardware.display.DisplayManager.DisplayListener;
|
| -import android.os.Build;
|
| -import android.view.Surface;
|
| -import android.view.WindowManager;
|
| -
|
| -import org.chromium.base.Log;
|
| -import org.chromium.base.ObserverList;
|
| -import org.chromium.base.ThreadUtils;
|
| -import org.chromium.base.VisibleForTesting;
|
| -import org.chromium.ui.gfx.DeviceDisplayInfo;
|
| -
|
| -/**
|
| - * ScreenOrientationListener is a class that informs its observers when the
|
| - * screen orientation changes.
|
| - */
|
| -@VisibleForTesting
|
| -public class ScreenOrientationListener {
|
| -
|
| - /**
|
| - * Observes changes in screen orientation.
|
| - */
|
| - public interface ScreenOrientationObserver {
|
| - /**
|
| - * Called whenever the screen orientation changes.
|
| - *
|
| - * @param orientation The orientation angle of the screen.
|
| - */
|
| - void onScreenOrientationChanged(int orientation);
|
| - }
|
| -
|
| - /**
|
| - * ScreenOrientationListenerBackend is an interface that abstract the
|
| - * mechanism used for the actual screen orientation listening. The reason
|
| - * being that from Android API Level 17 DisplayListener will be used. Before
|
| - * that, an unreliable solution based on onConfigurationChanged has to be
|
| - * used.
|
| - */
|
| - private interface ScreenOrientationListenerBackend {
|
| -
|
| - /**
|
| - * Starts to listen for screen orientation changes. This will be called
|
| - * when the first observer is added.
|
| - */
|
| - void startListening();
|
| -
|
| - /**
|
| - * Stops to listen for screen orientation changes. This will be called
|
| - * 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();
|
| - }
|
| -
|
| - /**
|
| - * ScreenOrientationConfigurationListener implements ScreenOrientationListenerBackend
|
| - * to use ComponentCallbacks in order to listen for screen orientation
|
| - * changes.
|
| - *
|
| - * 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
|
| - public void startListening() {
|
| - mAppContext.registerComponentCallbacks(this);
|
| - }
|
| -
|
| - @Override
|
| - public void stopListening() {
|
| - 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
|
| - public void onConfigurationChanged(Configuration newConfig) {
|
| - notifyObservers();
|
| - }
|
| -
|
| - @Override
|
| - public void onLowMemory() {
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * ScreenOrientationDisplayListener implements ScreenOrientationListenerBackend
|
| - * to use DisplayListener in order to listen for screen orientation changes.
|
| - *
|
| - * This method is reliable but DisplayListener is only available for API Level 17+.
|
| - */
|
| - @SuppressLint("NewApi")
|
| - private class ScreenOrientationDisplayListener
|
| - implements ScreenOrientationListenerBackend, DisplayListener {
|
| -
|
| - // ScreenOrientationListenerBackend implementation:
|
| -
|
| - @Override
|
| - public void startListening() {
|
| - DisplayManager displayManager =
|
| - (DisplayManager) mAppContext.getSystemService(Context.DISPLAY_SERVICE);
|
| - displayManager.registerDisplayListener(this, null);
|
| - }
|
| -
|
| - @Override
|
| - public void stopListening() {
|
| - DisplayManager displayManager =
|
| - (DisplayManager) mAppContext.getSystemService(Context.DISPLAY_SERVICE);
|
| - displayManager.unregisterDisplayListener(this);
|
| - }
|
| -
|
| - @Override
|
| - public void startAccurateListening() {
|
| - // Always accurate. Do nothing.
|
| - }
|
| -
|
| - @Override
|
| - public void stopAccurateListening() {
|
| - // Always accurate. Do nothing.
|
| - }
|
| -
|
| - // DisplayListener implementation:
|
| -
|
| - @Override
|
| - public void onDisplayAdded(int displayId) {
|
| - }
|
| -
|
| - @Override
|
| - public void onDisplayRemoved(int displayId) {
|
| - }
|
| -
|
| - @Override
|
| - public void onDisplayChanged(int displayId) {
|
| - notifyObservers();
|
| - }
|
| -
|
| - }
|
| -
|
| - private static final String TAG = "cr.ScreenOrientation";
|
| -
|
| - // List of observers to notify when the screen orientation changes.
|
| - private final ObserverList<ScreenOrientationObserver> mObservers =
|
| - new ObserverList<ScreenOrientationObserver>();
|
| -
|
| - // mOrientation will be updated every time the orientation changes. When not
|
| - // listening for changes, the value will be invalid and will be updated when
|
| - // starting to listen again.
|
| - private int mOrientation;
|
| -
|
| - // Current application context derived from the first context being received.
|
| - private Context mAppContext;
|
| -
|
| - private ScreenOrientationListenerBackend mBackend;
|
| -
|
| - private static ScreenOrientationListener sInstance;
|
| -
|
| - /**
|
| - * Returns a ScreenOrientationListener implementation based on the device's
|
| - * supported API level.
|
| - */
|
| - public static ScreenOrientationListener getInstance() {
|
| - ThreadUtils.assertOnUiThread();
|
| -
|
| - if (sInstance == null) {
|
| - sInstance = new ScreenOrientationListener();
|
| - }
|
| -
|
| - return sInstance;
|
| - }
|
| -
|
| - private ScreenOrientationListener() {
|
| - mBackend = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1
|
| - ? new ScreenOrientationDisplayListener()
|
| - : new ScreenOrientationConfigurationListener();
|
| - }
|
| -
|
| - /**
|
| - * Add |observer| in the ScreenOrientationListener observer list and
|
| - * immediately call |onScreenOrientationChanged| on it with the current
|
| - * orientation value.
|
| - *
|
| - * @param observer The observer that will get notified.
|
| - * @param context The context associated with this observer.
|
| - */
|
| - public void addObserver(ScreenOrientationObserver observer, Context context) {
|
| - if (mAppContext == null) {
|
| - mAppContext = context.getApplicationContext();
|
| - }
|
| -
|
| - assert mAppContext == context.getApplicationContext();
|
| - assert mAppContext != null;
|
| -
|
| - if (!mObservers.addObserver(observer)) {
|
| - Log.w(TAG, "Adding an observer that is already present!");
|
| - return;
|
| - }
|
| -
|
| - // If we got our first observer, we should start listening.
|
| - if (mObservers.size() == 1) {
|
| - updateOrientation();
|
| - mBackend.startListening();
|
| - }
|
| -
|
| - // We need to send the current value to the added observer as soon as
|
| - // possible but outside of the current stack.
|
| - final ScreenOrientationObserver obs = observer;
|
| - ThreadUtils.assertOnUiThread();
|
| - ThreadUtils.postOnUiThread(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - obs.onScreenOrientationChanged(mOrientation);
|
| - }
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * Remove the |observer| from the ScreenOrientationListener observer list.
|
| - *
|
| - * @param observer The observer that will no longer receive notification.
|
| - */
|
| - public void removeObserver(ScreenOrientationObserver observer) {
|
| - if (!mObservers.removeObserver(observer)) {
|
| - Log.w(TAG, "Removing an inexistent observer!");
|
| - return;
|
| - }
|
| -
|
| - if (mObservers.isEmpty()) {
|
| - // The last observer was removed, we should just stop listening.
|
| - mBackend.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.
|
| - */
|
| - 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.
|
| - */
|
| - private void notifyObservers() {
|
| - int previousOrientation = mOrientation;
|
| - updateOrientation();
|
| -
|
| - if (mOrientation == previousOrientation) {
|
| - return;
|
| - }
|
| -
|
| - DeviceDisplayInfo.create(mAppContext).updateNativeSharedDisplayInfo();
|
| -
|
| - for (ScreenOrientationObserver observer : mObservers) {
|
| - observer.onScreenOrientationChanged(mOrientation);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Updates |mOrientation| based on the default display rotation.
|
| - */
|
| - private void updateOrientation() {
|
| - WindowManager windowManager =
|
| - (WindowManager) mAppContext.getSystemService(Context.WINDOW_SERVICE);
|
| -
|
| - switch (windowManager.getDefaultDisplay().getRotation()) {
|
| - case Surface.ROTATION_0:
|
| - mOrientation = 0;
|
| - break;
|
| - case Surface.ROTATION_90:
|
| - mOrientation = 90;
|
| - break;
|
| - case Surface.ROTATION_180:
|
| - mOrientation = 180;
|
| - break;
|
| - case Surface.ROTATION_270:
|
| - mOrientation = -90;
|
| - break;
|
| - default:
|
| - throw new IllegalStateException(
|
| - "Display.getRotation() shouldn't return that value");
|
| - }
|
| - }
|
| -}
|
|
|