| Index: content/public/android/java/src/org/chromium/content/browser/DeviceOrientation.java
|
| diff --git a/content/public/android/java/src/org/chromium/content/browser/DeviceOrientation.java b/content/public/android/java/src/org/chromium/content/browser/DeviceOrientation.java
|
| deleted file mode 100644
|
| index a77cd28b27ab6901f6a12f7a2e4e012b3e7c8f71..0000000000000000000000000000000000000000
|
| --- a/content/public/android/java/src/org/chromium/content/browser/DeviceOrientation.java
|
| +++ /dev/null
|
| @@ -1,269 +0,0 @@
|
| -// Copyright (c) 2012 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.content.Context;
|
| -import android.hardware.Sensor;
|
| -import android.hardware.SensorEvent;
|
| -import android.hardware.SensorEventListener;
|
| -import android.hardware.SensorManager;
|
| -import android.os.Handler;
|
| -import android.os.Looper;
|
| -
|
| -import org.chromium.base.CalledByNative;
|
| -import org.chromium.base.JNINamespace;
|
| -import org.chromium.base.WeakContext;
|
| -
|
| -import java.util.List;
|
| -
|
| -/**
|
| - * Android implementation of the DeviceOrientation API.
|
| - */
|
| -@JNINamespace("content")
|
| -class DeviceOrientation implements SensorEventListener {
|
| -
|
| - // These fields are lazily initialized by getHandler().
|
| - private Thread mThread;
|
| - private Handler mHandler;
|
| -
|
| - // The lock to access the mHandler.
|
| - private Object mHandlerLock = new Object();
|
| -
|
| - // Non-zero if and only if we're listening for events.
|
| - // To avoid race conditions on the C++ side, access must be synchronized.
|
| - private int mNativePtr;
|
| -
|
| - // The lock to access the mNativePtr.
|
| - private Object mNativePtrLock = new Object();
|
| -
|
| - // The gravity vector expressed in the body frame.
|
| - private float[] mGravityVector;
|
| -
|
| - // The geomagnetic vector expressed in the body frame.
|
| - private float[] mMagneticFieldVector;
|
| -
|
| - // Lazily initialized when registering for notifications.
|
| - private SensorManager mSensorManager;
|
| -
|
| - // The only instance of that class and its associated lock.
|
| - private static DeviceOrientation sSingleton;
|
| - private static Object sSingletonLock = new Object();
|
| -
|
| - private DeviceOrientation() {
|
| - }
|
| -
|
| - /**
|
| - * Start listening for sensor events. If this object is already listening
|
| - * for events, the old callback is unregistered first.
|
| - *
|
| - * @param nativePtr Value to pass to nativeGotOrientation() for each event.
|
| - * @param rateInMilliseconds Requested callback rate in milliseconds. The
|
| - * actual rate may be higher. Unwanted events should be ignored.
|
| - * @return True on success.
|
| - */
|
| - @CalledByNative
|
| - public boolean start(int nativePtr, int rateInMilliseconds) {
|
| - synchronized (mNativePtrLock) {
|
| - stop();
|
| - if (registerForSensors(rateInMilliseconds)) {
|
| - mNativePtr = nativePtr;
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Stop listening for sensor events. Always succeeds.
|
| - *
|
| - * We strictly guarantee that nativeGotOrientation() will not be called
|
| - * after this method returns.
|
| - */
|
| - @CalledByNative
|
| - public void stop() {
|
| - synchronized (mNativePtrLock) {
|
| - if (mNativePtr != 0) {
|
| - mNativePtr = 0;
|
| - unregisterForSensors();
|
| - }
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void onAccuracyChanged(Sensor sensor, int accuracy) {
|
| - // Nothing
|
| - }
|
| -
|
| - @Override
|
| - public void onSensorChanged(SensorEvent event) {
|
| - switch (event.sensor.getType()) {
|
| - case Sensor.TYPE_ACCELEROMETER:
|
| - if (mGravityVector == null) {
|
| - mGravityVector = new float[3];
|
| - }
|
| - System.arraycopy(event.values, 0, mGravityVector, 0, mGravityVector.length);
|
| - break;
|
| -
|
| - case Sensor.TYPE_MAGNETIC_FIELD:
|
| - if (mMagneticFieldVector == null) {
|
| - mMagneticFieldVector = new float[3];
|
| - }
|
| - System.arraycopy(event.values, 0, mMagneticFieldVector, 0,
|
| - mMagneticFieldVector.length);
|
| - break;
|
| -
|
| - default:
|
| - // Unexpected
|
| - return;
|
| - }
|
| -
|
| - getOrientationUsingGetRotationMatrix();
|
| - }
|
| -
|
| - void getOrientationUsingGetRotationMatrix() {
|
| - if (mGravityVector == null || mMagneticFieldVector == null) {
|
| - return;
|
| - }
|
| -
|
| - // Get the rotation matrix.
|
| - // The rotation matrix that transforms from the body frame to the earth
|
| - // frame.
|
| - float[] deviceRotationMatrix = new float[9];
|
| - if (!SensorManager.getRotationMatrix(deviceRotationMatrix, null, mGravityVector,
|
| - mMagneticFieldVector)) {
|
| - return;
|
| - }
|
| -
|
| - // Convert rotation matrix to rotation angles.
|
| - // Assuming that the rotations are appied in the order listed at
|
| - // http://developer.android.com/reference/android/hardware/SensorEvent.html#values
|
| - // the rotations are applied about the same axes and in the same order as required by the
|
| - // API. The only conversions are sign changes as follows. The angles are in radians
|
| -
|
| - float[] rotationAngles = new float[3];
|
| - SensorManager.getOrientation(deviceRotationMatrix, rotationAngles);
|
| -
|
| - double alpha = Math.toDegrees(-rotationAngles[0]);
|
| - while (alpha < 0.0) {
|
| - alpha += 360.0; // [0, 360)
|
| - }
|
| -
|
| - double beta = Math.toDegrees(-rotationAngles[1]);
|
| - while (beta < -180.0) {
|
| - beta += 360.0; // [-180, 180)
|
| - }
|
| -
|
| - double gamma = Math.toDegrees(rotationAngles[2]);
|
| - while (gamma < -90.0) {
|
| - gamma += 360.0; // [-90, 90)
|
| - }
|
| -
|
| - gotOrientation(alpha, beta, gamma);
|
| - }
|
| -
|
| - boolean registerForSensors(int rateInMilliseconds) {
|
| - if (registerForSensorType(Sensor.TYPE_ACCELEROMETER, rateInMilliseconds)
|
| - && registerForSensorType(Sensor.TYPE_MAGNETIC_FIELD, rateInMilliseconds)) {
|
| - return true;
|
| - }
|
| - unregisterForSensors();
|
| - return false;
|
| - }
|
| -
|
| - private SensorManager getSensorManager() {
|
| - if (mSensorManager != null) {
|
| - return mSensorManager;
|
| - }
|
| - mSensorManager = (SensorManager)WeakContext.getSystemService(Context.SENSOR_SERVICE);
|
| - return mSensorManager;
|
| - }
|
| -
|
| - void unregisterForSensors() {
|
| - SensorManager sensorManager = getSensorManager();
|
| - if (sensorManager == null) {
|
| - return;
|
| - }
|
| - sensorManager.unregisterListener(this);
|
| - }
|
| -
|
| - boolean registerForSensorType(int type, int rateInMilliseconds) {
|
| - SensorManager sensorManager = getSensorManager();
|
| - if (sensorManager == null) {
|
| - return false;
|
| - }
|
| - List<Sensor> sensors = sensorManager.getSensorList(type);
|
| - if (sensors.isEmpty()) {
|
| - return false;
|
| - }
|
| -
|
| - final int rateInMicroseconds = 1000 * rateInMilliseconds;
|
| - // We want to err on the side of getting more events than we need.
|
| - final int requestedRate = rateInMicroseconds / 2;
|
| -
|
| - // TODO(steveblock): Consider handling multiple sensors.
|
| - return sensorManager.registerListener(this, sensors.get(0), requestedRate, getHandler());
|
| - }
|
| -
|
| - void gotOrientation(double alpha, double beta, double gamma) {
|
| - synchronized (mNativePtrLock) {
|
| - if (mNativePtr != 0) {
|
| - nativeGotOrientation(mNativePtr, alpha, beta, gamma);
|
| - }
|
| - }
|
| - }
|
| -
|
| - private Handler getHandler() {
|
| - synchronized (mHandlerLock) {
|
| - // If we don't have a background thread, start it now.
|
| - if (mThread == null) {
|
| - mThread = new Thread(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - Looper.prepare();
|
| - // Our Handler doesn't actually have to do anything, because
|
| - // SensorManager posts directly to the underlying Looper.
|
| - setHandler(new Handler());
|
| - Looper.loop();
|
| - }
|
| - });
|
| - mThread.start();
|
| - }
|
| - // Wait for the background thread to spin up.
|
| - while (mHandler == null) {
|
| - try {
|
| - mHandlerLock.wait();
|
| - } catch (InterruptedException e) {
|
| - // Somebody doesn't want us to wait! That's okay, SensorManager accepts null.
|
| - return null;
|
| - }
|
| - }
|
| - return mHandler;
|
| - }
|
| - }
|
| -
|
| - private void setHandler(Handler handler) {
|
| - synchronized (mHandlerLock) {
|
| - mHandler = handler;
|
| - mHandlerLock.notify();
|
| - }
|
| - }
|
| -
|
| - @CalledByNative
|
| - private static DeviceOrientation getInstance() {
|
| - synchronized (sSingletonLock) {
|
| - if (sSingleton == null) {
|
| - sSingleton = new DeviceOrientation();
|
| - }
|
| - return sSingleton;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * See chrome/browser/device_orientation/data_fetcher_impl_android.cc
|
| - */
|
| - private native void nativeGotOrientation(
|
| - int nativeDataFetcherImplAndroid,
|
| - double alpha, double beta, double gamma);
|
| -}
|
|
|