@@ -10,12 +10,19 @@ import com.facebook.react.bridge.ReactApplicationContext
1010class OrientationSensorsEventListener (
1111 context : ReactApplicationContext ,
1212) : SensorEventListener {
13- private var mSensorManager: SensorManager = context.getSystemService(SENSOR_SERVICE ) as SensorManager
13+ private var mSensorManager: SensorManager =
14+ context.getSystemService(SENSOR_SERVICE ) as SensorManager
1415
15- private var mAccelerometerSensor: Sensor ? = mSensorManager.getDefaultSensor(Sensor .TYPE_ACCELEROMETER )
16- private var mMagneticFieldSensor: Sensor ? = mSensorManager.getDefaultSensor(Sensor .TYPE_MAGNETIC_FIELD )
16+ private var mRotationSensor: Sensor ? =
17+ mSensorManager.getDefaultSensor(Sensor .TYPE_ROTATION_VECTOR )
18+ private var mAccelerometerSensor: Sensor ? =
19+ mSensorManager.getDefaultSensor(Sensor .TYPE_ACCELEROMETER )
20+ private var mMagneticFieldSensor: Sensor ? =
21+ mSensorManager.getDefaultSensor(Sensor .TYPE_MAGNETIC_FIELD )
1722
18- private var hasRequiredSensors: Boolean = mAccelerometerSensor != null && mMagneticFieldSensor != null
23+ private var hasRotationSensor: Boolean = mRotationSensor != null
24+ private var hasAccelerometerAndMagneticFieldSensors: Boolean =
25+ mAccelerometerSensor != null && mMagneticFieldSensor != null
1926
2027 private val accelerometerReading = FloatArray (3 )
2128 private val magnetometerReading = FloatArray (3 )
@@ -32,6 +39,59 @@ class OrientationSensorsEventListener(
3239 return
3340 }
3441
42+ if (event.sensor.type == Sensor .TYPE_ROTATION_VECTOR ) {
43+ computeOrientationFromRotationSensor(event.values);
44+ return
45+ }
46+
47+ computeOrientationFromOtherSensors(event)
48+ }
49+
50+ override fun onAccuracyChanged (sensor : Sensor ? , accuracy : Int ) {}
51+
52+ fun enable () {
53+ if (hasRotationSensor) {
54+ mSensorManager.registerListener(
55+ this ,
56+ mRotationSensor,
57+ SensorManager .SENSOR_DELAY_NORMAL ,
58+ SensorManager .SENSOR_DELAY_UI
59+ )
60+ return
61+ }
62+
63+ if (hasAccelerometerAndMagneticFieldSensors) {
64+ mSensorManager.registerListener(
65+ this ,
66+ mAccelerometerSensor,
67+ SensorManager .SENSOR_DELAY_NORMAL ,
68+ SensorManager .SENSOR_DELAY_UI
69+ )
70+ mSensorManager.registerListener(
71+ this ,
72+ mMagneticFieldSensor,
73+ SensorManager .SENSOR_DELAY_NORMAL ,
74+ SensorManager .SENSOR_DELAY_UI
75+ )
76+ return
77+ }
78+ }
79+
80+ fun disable () {
81+ mSensorManager.unregisterListener(this )
82+ }
83+
84+ private fun computeOrientationFromRotationSensor (values : FloatArray ) {
85+ val rotationMatrix = FloatArray (9 )
86+ SensorManager .getRotationMatrixFromVector(rotationMatrix, values)
87+
88+ val orientationAngles = FloatArray (3 )
89+ SensorManager .getOrientation(rotationMatrix, orientationAngles)
90+
91+ notifyOrientationAnglesChanged(orientationAngles)
92+ }
93+
94+ private fun computeOrientationFromOtherSensors (event : SensorEvent ) {
3595 if (event.sensor.type == Sensor .TYPE_ACCELEROMETER ) {
3696 System .arraycopy(event.values, 0 , accelerometerReading, 0 , accelerometerReading.size)
3797 }
@@ -54,26 +114,15 @@ class OrientationSensorsEventListener(
54114 val orientationAngles = FloatArray (3 )
55115 SensorManager .getOrientation(rotationMatrix, orientationAngles)
56116
117+ notifyOrientationAnglesChanged(orientationAngles)
118+ }
119+
120+ private fun notifyOrientationAnglesChanged (orientationAngles : FloatArray ) {
57121 if (lastComputedOrientationAngles.contentEquals(orientationAngles)) {
58122 return
59123 }
60124
61125 onOrientationAnglesChangedCallback?.invoke(orientationAngles)
62126 lastComputedOrientationAngles = orientationAngles
63127 }
64-
65- override fun onAccuracyChanged (sensor : Sensor ? , accuracy : Int ) {}
66-
67- fun enable () {
68- if (! hasRequiredSensors) {
69- return
70- }
71-
72- mSensorManager.registerListener(this , mAccelerometerSensor, SensorManager .SENSOR_DELAY_NORMAL )
73- mSensorManager.registerListener(this , mMagneticFieldSensor, SensorManager .SENSOR_DELAY_NORMAL )
74- }
75-
76- fun disable () {
77- mSensorManager.unregisterListener(this )
78- }
79128}
0 commit comments