diff --git a/.gitignore b/.gitignore index 36ccfb3..c23356c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ android/build **/*.swp +.DS_Store diff --git a/README.md b/README.md index 3769ac9..f27ed21 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,19 @@ DeviceEventEmitter.addListener('Magnetometer', function (data) { SensorManager.stopMagnetometer(); ``` +### Gravity +```js +DeviceEventEmitter.addListener('Gravity', function (data) { + /** + * data.x + * data.y + * data.z + **/ +}); +SensorManager.startGravity(100); +SensorManager.stopGravity(); +``` + ### Orientation ```js SensorManager.startOrientation(100); diff --git a/android/src/main/java/com/sensormanager/GravityRecord.java b/android/src/main/java/com/sensormanager/GravityRecord.java new file mode 100644 index 0000000..15eef1d --- /dev/null +++ b/android/src/main/java/com/sensormanager/GravityRecord.java @@ -0,0 +1,90 @@ +package com.sensormanager; + +import android.os.Bundle; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.util.Log; +import android.support.annotation.Nullable; + +import java.io.*; +import java.util.Date; +import java.util.Timer; + +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.ReactContext; +import com.facebook.react.bridge.WritableMap; +import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.facebook.react.bridge.ReactApplicationContext; + +public class GravityRecord implements SensorEventListener { + + private SensorManager mSensorManager; + private Sensor mGravity; + private long lastUpdate = 0; + private int i = 0, n = 0; + private int delay; + private int isRegistered = 0; + + private ReactContext mReactContext; + private Arguments mArguments; + + + public GravityRecord(ReactApplicationContext reactContext) { + mSensorManager = (SensorManager)reactContext.getSystemService(reactContext.SENSOR_SERVICE); + mGravity = mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); + mReactContext = reactContext; + } + + public int start(int delay) { + this.delay = delay; + if (mGravity != null && isRegistered == 0) { + mSensorManager.registerListener(this, mGravity, SensorManager.SENSOR_DELAY_FASTEST); + isRegistered = 1; + return (1); + } + return (0); + } + + public void stop() { + if (isRegistered == 1) { + mSensorManager.unregisterListener(this); + isRegistered = 0; + } + } + + private void sendEvent(String eventName, @Nullable WritableMap params) + { + try { + mReactContext + .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) + .emit(eventName, params); + } catch (RuntimeException e) { + Log.e("ERROR", "java.lang.RuntimeException: Trying to invoke JS before CatalystInstance has been set!"); + } + } + + @Override + public void onSensorChanged(SensorEvent sensorEvent) { + Sensor mySensor = sensorEvent.sensor; + WritableMap map = mArguments.createMap(); + + if (mySensor.getType() == Sensor.TYPE_GRAVITY) { + long curTime = System.currentTimeMillis(); + i++; + if ((curTime - lastUpdate) > delay) { + i = 0; + map.putDouble("x", sensorEvent.values[0]); + map.putDouble("y", sensorEvent.values[1]); + map.putDouble("z", sensorEvent.values[2]); + sendEvent("Gravity", map); + lastUpdate = curTime; + } + } + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + } +} diff --git a/android/src/main/java/com/sensormanager/OrientationRecord.java b/android/src/main/java/com/sensormanager/OrientationRecord.java index 3811f85..219311a 100644 --- a/android/src/main/java/com/sensormanager/OrientationRecord.java +++ b/android/src/main/java/com/sensormanager/OrientationRecord.java @@ -105,11 +105,15 @@ public void onSensorChanged(SensorEvent sensorEvent) { roll = 360 - (0 - roll); } + i++; + if ((curTime - lastUpdate) > delay) { + i = 0; map.putDouble("azimuth", heading); map.putDouble("pitch", pitch); map.putDouble("roll", roll); sendEvent("Orientation", map); lastUpdate = curTime; + } } } } diff --git a/android/src/main/java/com/sensormanager/SensorManagerModule.java b/android/src/main/java/com/sensormanager/SensorManagerModule.java index c342419..70249d5 100644 --- a/android/src/main/java/com/sensormanager/SensorManagerModule.java +++ b/android/src/main/java/com/sensormanager/SensorManagerModule.java @@ -10,8 +10,8 @@ import android.util.Log; public class SensorManagerModule extends ReactContextBaseJavaModule { - private static final String REACT_CLASS = "SensorManager"; - private AccelerometerRecord mAccelerometerRecord = null; + private static final String REACT_CLASS = "SensorManager"; + private AccelerometerRecord mAccelerometerRecord = null; private GyroscopeRecord mGyroscopeRecord = null; private MagnetometerRecord mMagnetometerRecord = null; private StepCounterRecord mStepCounterRecord = null; @@ -20,6 +20,7 @@ public class SensorManagerModule extends ReactContextBaseJavaModule { private OrientationRecord mOrientationRecord = null; private ProximityRecord mProximityRecord = null; private LightSensorRecord mLightSensorRecord = null; + private GravityRecord mGravityRecord = null; private ReactApplicationContext mReactContext; @@ -150,6 +151,19 @@ public void stopLightSensor() { mLightSensorRecord.stop(); } + @ReactMethod + public int startGravity(int delay) { + if (mGravityRecord == null) + mGravityRecord = new GravityRecord(mReactContext); + return (mGravityRecord.start(delay)); + } + + @ReactMethod + public void stopGravity() { + if (mGravityRecord != null) + mGravityRecord.stop(); + } + /* @Override public ReactBarcodeScannerView createViewInstance(ThemedReactContext context) {