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

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

Issue 12771008: Implement java-side browser sensor polling for device motion and device orientation DOM events. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fixed Marcus's comments Created 7 years, 9 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/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);
-}

Powered by Google App Engine
This is Rietveld 408576698