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

Unified Diff: content/public/android/java/src/org/chromium/content/browser/ScreenOrientationListener.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/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");
- }
- }
-}

Powered by Google App Engine
This is Rietveld 408576698