Index: sky/services/sensors/org/domokit/sensors/SensorForwarder.java |
diff --git a/sky/services/sensors/org/domokit/sensors/SensorForwarder.java b/sky/services/sensors/org/domokit/sensors/SensorForwarder.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2fb3b85fd8cabaac61b29b84467147eef8845e88 |
--- /dev/null |
+++ b/sky/services/sensors/org/domokit/sensors/SensorForwarder.java |
@@ -0,0 +1,111 @@ |
+// Copyright 2015 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.domokit.sensors; |
+ |
+import android.content.Context; |
+import android.hardware.Sensor; |
+import android.hardware.SensorEvent; |
+import android.hardware.SensorEventListener; |
+import android.hardware.SensorManager; |
+import android.util.Log; |
+ |
+import org.chromium.mojo.bindings.ConnectionErrorHandler; |
+import org.chromium.mojo.system.MojoException; |
+import org.chromium.mojom.sensors.SensorData; |
+import org.chromium.mojom.sensors.SensorListener; |
+import org.chromium.mojom.sensors.SensorType; |
+ |
+/** |
+ * A class to forward sensor data to a SensorListener. |
+ */ |
+public class SensorForwarder implements ConnectionErrorHandler, SensorEventListener { |
+ private static final String TAG = "SensorForwarder"; |
+ |
+ private SensorListener.Proxy mListener; |
+ private SensorManager mManager; |
+ private Sensor mSensor; |
+ |
+ private static int getAndroidTypeForSensor(int sensorType) { |
+ switch (sensorType) { |
+ case SensorType.ACCELEROMETER: |
+ return Sensor.TYPE_ACCELEROMETER; |
+ case SensorType.AMBIENT_TEMPERATURE: |
+ return Sensor.TYPE_AMBIENT_TEMPERATURE; |
+ case SensorType.GAME_ROTATION_VECTOR: |
+ return Sensor.TYPE_GAME_ROTATION_VECTOR; |
+ case SensorType.GEOMAGNETIC_ROTATION_VECTOR: |
+ return Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR; |
+ case SensorType.GRAVITY: |
+ return Sensor.TYPE_GRAVITY; |
+ case SensorType.GYROSCOPE: |
+ return Sensor.TYPE_GYROSCOPE; |
+ case SensorType.GYROSCOPE_UNCALIBRATED: |
+ return Sensor.TYPE_GYROSCOPE_UNCALIBRATED; |
+ case SensorType.HEART_RATE: |
+ return Sensor.TYPE_HEART_RATE; |
+ case SensorType.LIGHT: |
+ return Sensor.TYPE_LIGHT; |
+ case SensorType.LINEAR_ACCELERATION: |
+ return Sensor.TYPE_LINEAR_ACCELERATION; |
+ case SensorType.MAGNETIC_FIELD: |
+ return Sensor.TYPE_MAGNETIC_FIELD; |
+ case SensorType.MAGNETIC_FIELD_UNCALIBRATED: |
+ return Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED; |
+ case SensorType.PRESSURE: |
+ return Sensor.TYPE_PRESSURE; |
+ case SensorType.PROXIMITY: |
+ return Sensor.TYPE_PROXIMITY; |
+ case SensorType.RELATIVE_HUMIDITY: |
+ return Sensor.TYPE_RELATIVE_HUMIDITY; |
+ case SensorType.ROTATION_VECTOR: |
+ return Sensor.TYPE_ROTATION_VECTOR; |
+ case SensorType.SIGNIFICANT_MOTION: |
+ return Sensor.TYPE_SIGNIFICANT_MOTION; |
+ case SensorType.STEP_COUNTER: |
+ return Sensor.TYPE_STEP_COUNTER; |
+ case SensorType.STEP_DETECTOR: |
+ return Sensor.TYPE_STEP_DETECTOR; |
+ default: |
+ return -1; |
+ } |
+ } |
+ |
+ public SensorForwarder(Context context, int mojoSensorType, SensorListener.Proxy listener) { |
+ int androidSensorType = getAndroidTypeForSensor(mojoSensorType); |
+ mListener = listener; |
+ mManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); |
+ mSensor = mManager.getDefaultSensor(androidSensorType); |
+ |
+ if (mSensor == null) { |
+ Log.e(TAG, "No default sensor for sensor type " + mojoSensorType); |
+ mListener.close(); |
+ return; |
+ } |
+ |
+ // TODO(abarth): We should expose a way for clients to request different |
+ // update rates. |
+ mManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); |
+ mListener.setErrorHandler(this); |
+ } |
+ |
+ @Override |
+ public void onConnectionError(MojoException e) { |
+ mManager.unregisterListener(this); |
+ } |
+ |
+ @Override |
+ public void onAccuracyChanged(Sensor sensor, int accuracy) { |
+ mListener.onAccuracyChanged(accuracy); |
+ } |
+ |
+ @Override |
+ public void onSensorChanged(SensorEvent event) { |
+ SensorData data = new SensorData(); |
+ data.accuracy = event.accuracy; |
+ data.timeStamp = event.timestamp; |
+ data.values = event.values; |
+ mListener.onSensorChanged(data); |
+ } |
+} |