Skip to content

Commit 7397a64

Browse files
authored
feat(android): introduce new rotation sensor (#80)
1 parent 8e5f89a commit 7397a64

File tree

1 file changed

+68
-19
lines changed

1 file changed

+68
-19
lines changed

android/src/main/java/com/orientationdirector/implementation/OrientationSensorsEventListener.kt

Lines changed: 68 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,19 @@ import com.facebook.react.bridge.ReactApplicationContext
1010
class 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

Comments
 (0)