Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 4a68aaed authored by Marvin W.'s avatar Marvin W. 🐿️
Browse files

Maps: Ensure consistent location source activation state

This fixes potential crashes when location sources can't handle being
deactivated while inactive.
parent 6854f71a
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ import android.app.PendingIntent
import android.location.Location
import android.os.Handler
import android.os.Looper
import android.util.Log
import com.google.android.gms.maps.internal.ILocationSourceDelegate
import com.google.android.gms.maps.internal.IOnLocationChangeListener
import com.mapbox.mapboxsdk.location.engine.LocationEngine
@@ -19,6 +20,7 @@ import com.mapbox.mapboxsdk.location.engine.LocationEngineResult
class SourceLocationEngine(private val locationSource: ILocationSourceDelegate) : LocationEngine, IOnLocationChangeListener.Stub() {
    val callbacks: MutableSet<Pair<LocationEngineCallback<LocationEngineResult>, Handler>> = hashSetOf()
    var lastLocation: Location? = null
    var active: Boolean = false

    override fun getLastLocation(callback: LocationEngineCallback<LocationEngineResult>) {
        callback.onSuccess(LocationEngineResult.create(lastLocation))
@@ -26,8 +28,13 @@ class SourceLocationEngine(private val locationSource: ILocationSourceDelegate)

    override fun requestLocationUpdates(request: LocationEngineRequest, callback: LocationEngineCallback<LocationEngineResult>, looper: Looper?) {
        callbacks.add(callback to Handler(looper ?: Looper.myLooper() ?: Looper.getMainLooper()))
        if (callbacks.size == 1) {
        if (!active) {
            active = true
            try {
                locationSource.activate(this)
            } catch (e: Exception) {
                Log.w(TAG, e)
            }
        }
    }

@@ -37,8 +44,13 @@ class SourceLocationEngine(private val locationSource: ILocationSourceDelegate)

    override fun removeLocationUpdates(callback: LocationEngineCallback<LocationEngineResult>) {
        callbacks.removeAll { it.first == callback }
        if (callbacks.isEmpty()) {
        if (callbacks.isEmpty() && active) {
            active = false
            try {
                locationSource.deactivate()
            } catch (e: Exception) {
                Log.w(TAG, e)
            }
        }
    }