From 0f969afbd55d9a771ec0e7a0b491351cd2e13f5a Mon Sep 17 00:00:00 2001 From: fiatcode Date: Thu, 30 Apr 2026 10:58:27 +0700 Subject: [PATCH] feat: add FusedLocationProvider for GPS location acquisition --- .../location/FusedLocationProvider.kt | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 android/app/src/main/kotlin/com/traccar/traccar_client/location/FusedLocationProvider.kt diff --git a/android/app/src/main/kotlin/com/traccar/traccar_client/location/FusedLocationProvider.kt b/android/app/src/main/kotlin/com/traccar/traccar_client/location/FusedLocationProvider.kt new file mode 100644 index 0000000..4ab7102 --- /dev/null +++ b/android/app/src/main/kotlin/com/traccar/traccar_client/location/FusedLocationProvider.kt @@ -0,0 +1,69 @@ +package com.traccar.traccar_client.location + +import android.annotation.SuppressLint +import android.content.Context +import android.location.Location +import android.os.Looper +import com.google.android.gms.location.FusedLocationProviderClient +import com.google.android.gms.location.LocationCallback +import com.google.android.gms.location.LocationRequest +import com.google.android.gms.location.LocationResult +import com.google.android.gms.location.LocationServices +import com.google.android.gms.location.Priority + +class FusedLocationProvider(context: Context) { + + private val fusedLocationClient: FusedLocationProviderClient = + LocationServices.getFusedLocationProviderClient(context) + + private var locationCallback: LocationCallback? = null + + @SuppressLint("MissingPermission") + fun startLocationUpdates( + interval: Long, + fastestInterval: Long, + accuracy: Int, + callback: (Location) -> Unit + ) { + val locationRequest = LocationRequest.Builder(interval) + .setMinUpdateIntervalMillis(fastestInterval) + .setPriority(mapAccuracy(accuracy)) + .build() + + locationCallback = object : LocationCallback() { + override fun onLocationResult(result: LocationResult) { + result.lastLocation?.let { callback(it) } + } + } + + fusedLocationClient.requestLocationUpdates( + locationRequest, + locationCallback!!, + Looper.getMainLooper() + ) + } + + fun stopLocationUpdates() { + locationCallback?.let { + fusedLocationClient.removeLocationUpdates(it) + locationCallback = null + } + } + + @SuppressLint("MissingPermission") + fun getLastLocation(callback: (Location?) -> Unit) { + fusedLocationClient.lastLocation + .addOnSuccessListener { location -> callback(location) } + .addOnFailureListener { callback(null) } + } + + private fun mapAccuracy(accuracy: Int): Int { + return when (accuracy) { + 0 -> Priority.PRIORITY_HIGH_ACCURACY + 1 -> Priority.PRIORITY_HIGH_ACCURACY + 2 -> Priority.PRIORITY_BALANCED_POWER_ACCURACY + 3 -> Priority.PRIORITY_LOW_POWER + else -> Priority.PRIORITY_BALANCED_POWER_ACCURACY + } + } +}