Skip to content

Commit e8a2644

Browse files
committed
Sensor-enhanced location provider
Adds a LocationProvider that enhances another LocationProvider with the bearing values of the device rotation sensor. It provides accurate bearing values when the default location provider is unable to do so (commonly due to lack of movement).
1 parent d6233d1 commit e8a2644

File tree

1 file changed

+11
-11
lines changed

1 file changed

+11
-11
lines changed

lib/maplibre-compose/src/androidMain/kotlin/org/maplibre/compose/location/AndroidSensorEnhancedLocationProvider.kt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,18 @@ public class AndroidSensorEnhancedLocationProvider(
4444
) : LocationProvider {
4545
private val sensorManager = context.getSystemService(SENSOR_SERVICE) as SensorManager
4646

47+
private fun accuracyToDegrees(accuracy: Int): Double = when (accuracy) {
48+
SensorManager.SENSOR_STATUS_ACCURACY_HIGH -> 5.0
49+
SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM -> 15.0
50+
SensorManager.SENSOR_STATUS_ACCURACY_LOW -> 45.0
51+
SensorManager.SENSOR_STATUS_UNRELIABLE -> 180.0
52+
else -> 180.0
53+
}
54+
4755
private val bearing: Flow<Pair<Double, Double>> = callbackFlow {
4856
val rotationMatrix = FloatArray(9)
4957
val orientationAngles = FloatArray(3)
50-
var currentAccuracy = SensorManager.SENSOR_STATUS_UNRELIABLE
58+
var accuracyDegrees = accuracyToDegrees(SensorManager.SENSOR_STATUS_UNRELIABLE)
5159

5260
val listener = object : SensorEventListener {
5361
override fun onSensorChanged(event: SensorEvent?) {
@@ -62,21 +70,13 @@ public class AndroidSensorEnhancedLocationProvider(
6270
)
6371

6472
trySend(
65-
Math.toDegrees(orientationAngles[0].toDouble())
66-
to
67-
when (currentAccuracy) {
68-
SensorManager.SENSOR_STATUS_ACCURACY_HIGH -> 5.0
69-
SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM -> 15.0
70-
SensorManager.SENSOR_STATUS_ACCURACY_LOW -> 45.0
71-
SensorManager.SENSOR_STATUS_UNRELIABLE -> 180.0
72-
else -> 180.0
73-
}
73+
Math.toDegrees(orientationAngles[0].toDouble()) to accuracyDegrees
7474
)
7575
}
7676
}
7777

7878
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
79-
currentAccuracy = accuracy
79+
accuracyDegrees = accuracyToDegrees(accuracy)
8080
}
8181
}
8282

0 commit comments

Comments
 (0)