blob: 6a6d06cc5f82e2d808cb28bd10f09f316fef0c3a [file] [log] [blame]
// 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.chromium.mojo.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.getProxyHandler().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);
}
}