Realtime gps optimized for efficiency
This commit is contained in:
parent
22c6277d68
commit
a7bf869c8e
@ -4,6 +4,8 @@ import android.Manifest
|
||||
import android.content.pm.PackageManager
|
||||
import android.graphics.Color
|
||||
import android.os.Build
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.view.WindowInsetsController
|
||||
@ -27,6 +29,7 @@ import com.getcapacitor.annotation.PermissionCallback
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONObject
|
||||
import kotlin.math.*
|
||||
import android.location.Location
|
||||
|
||||
@CapacitorPlugin(
|
||||
name = "DumonGeolocation",
|
||||
@ -74,6 +77,11 @@ class DumonGeolocation : Plugin() {
|
||||
|
||||
private var motionState: String = "idle" // 'idle', 'driving', 'mocked'
|
||||
|
||||
private var bufferedDrivingLocation: Location? = null
|
||||
private var drivingEmitHandler: Handler? = null
|
||||
private var drivingEmitRunnable: Runnable? = null
|
||||
private val drivingEmitIntervalMs = 1500L
|
||||
|
||||
private var currentTrackingMode = GpsTrackingMode.NORMAL
|
||||
|
||||
override fun load() {
|
||||
@ -92,7 +100,12 @@ class DumonGeolocation : Plugin() {
|
||||
latestSource = if (isMocked) "MOCK" else "GNSS"
|
||||
isMockedLocation = isMocked
|
||||
latestTimestamp = location.time
|
||||
emitPositionUpdate()
|
||||
|
||||
if (currentTrackingMode == GpsTrackingMode.DRIVING) {
|
||||
bufferedDrivingLocation = location
|
||||
} else {
|
||||
emitPositionUpdate() // langsung emit di mode normal
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
@ -114,6 +127,33 @@ class DumonGeolocation : Plugin() {
|
||||
)
|
||||
}
|
||||
|
||||
private fun startDrivingEmitLoop() {
|
||||
if (drivingEmitHandler != null) return // already running
|
||||
|
||||
drivingEmitHandler = Handler(Looper.getMainLooper())
|
||||
drivingEmitRunnable = object : Runnable {
|
||||
override fun run() {
|
||||
bufferedDrivingLocation?.let { location ->
|
||||
latestLatitude = location.latitude
|
||||
latestLongitude = location.longitude
|
||||
latestAccuracy = location.accuracy.toDouble()
|
||||
latestTimestamp = location.time
|
||||
latestSource = if (isMockedLocation) "MOCK" else "GNSS"
|
||||
emitPositionUpdate()
|
||||
}
|
||||
drivingEmitHandler?.postDelayed(this, drivingEmitIntervalMs)
|
||||
}
|
||||
}
|
||||
drivingEmitHandler?.postDelayed(drivingEmitRunnable!!, drivingEmitIntervalMs)
|
||||
}
|
||||
|
||||
private fun stopDrivingEmitLoop() {
|
||||
drivingEmitHandler?.removeCallbacks(drivingEmitRunnable!!)
|
||||
drivingEmitHandler = null
|
||||
drivingEmitRunnable = null
|
||||
bufferedDrivingLocation = null
|
||||
}
|
||||
|
||||
@PluginMethod
|
||||
fun startPositioning(call: PluginCall) {
|
||||
if (!PermissionUtils.hasLocationAndWifiPermissions(context)) {
|
||||
@ -132,6 +172,7 @@ class DumonGeolocation : Plugin() {
|
||||
gpsManager?.stop()
|
||||
imuManager?.stop()
|
||||
wifiManager?.stopPeriodicScan()
|
||||
stopDrivingEmitLoop()
|
||||
call.resolve()
|
||||
}
|
||||
|
||||
@ -229,9 +270,13 @@ class DumonGeolocation : Plugin() {
|
||||
val mode = call.getString("mode") ?: "normal"
|
||||
if (mode == "driving") {
|
||||
gpsManager?.startContinuousMode()
|
||||
currentTrackingMode = GpsTrackingMode.DRIVING
|
||||
startDrivingEmitLoop()
|
||||
Log.d("DUMON_GEOLOCATION", "Switched to driving mode (continuous GPS)")
|
||||
} else {
|
||||
gpsManager?.startPollingMode()
|
||||
currentTrackingMode = GpsTrackingMode.NORMAL
|
||||
stopDrivingEmitLoop()
|
||||
Log.d("DUMON_GEOLOCATION", "Switched to normal mode (polling GPS)")
|
||||
}
|
||||
call.resolve()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user