package triaina.webview.bridge;
import java.util.List;
import javax.inject.Inject;
import triaina.webview.WebViewBridge;
import triaina.webview.annotation.Bridge;
import triaina.webview.entity.device.AccelerometerEnableParams;
import triaina.webview.entity.web.AccelerometerParams;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class AccelerometerBridge implements BridgeLifecyclable {
@Inject
private SensorManager mSensorManager;
private AccelerometerListener mListener;
private AccelerometerEnableParams mParams;
private WebViewBridge mBridge;
public AccelerometerBridge(WebViewBridge bridge) {
mBridge = bridge;
}
@Bridge("system.sensor.accelerometer.enable")
public void enable(AccelerometerEnableParams params) {
if (mParams != null)
return;
enableInternal(mBridge, params);
mParams = params;
}
@Bridge("system.sensor.accelerometer.disable")
public void disable() {
if (mParams == null)
return;
disableInternal();
mParams = null;
}
private void enableInternal(WebViewBridge bridge,
AccelerometerEnableParams params) {
List<Sensor> sensors = mSensorManager
.getSensorList(Sensor.TYPE_ACCELEROMETER);
if (sensors.size() > 0) {
Sensor sensor = sensors.get(0);
mListener = new AccelerometerListener(bridge, params.getCallback());
mSensorManager
.registerListener(mListener, sensor, params.getRate());
}
}
private void disableInternal() {
mSensorManager.unregisterListener(mListener);
mListener = null;
}
protected static class AccelerometerListener implements SensorEventListener {
private WebViewBridge mBridge;
private String mDest;
public AccelerometerListener(WebViewBridge bridge, String dest) {
mBridge = bridge;
mDest = dest;
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
mBridge.call(mDest, new AccelerometerParams(
(double) event.values[0], (double) event.values[1],
(double) event.values[2]));
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
@Override
public void onResume() {
if (mParams == null)
return;
enableInternal(mBridge, mParams);
}
@Override
public void onPause() {
if (mParams == null)
return;
disableInternal();
}
@Override
public void onDestroy() {
}
}