@bricks-soft/capacitor-location-tracking 0.0.0-stage → 8.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +2759 -2
- package/android/build.gradle +107 -0
- package/android/consumer-rules.pro +42 -0
- package/android/src/main/AndroidManifest.xml +52 -0
- package/android/src/main/java/com/brickssoft/locationtracking/LocationTrackingPlugin.kt +431 -0
- package/android/src/main/java/com/brickssoft/locationtracking/api/LocationTrackingListener.kt +52 -0
- package/android/src/main/java/com/brickssoft/locationtracking/api/LocationTrackingNative.kt +267 -0
- package/android/src/main/java/com/brickssoft/locationtracking/api/NativeListeners.kt +270 -0
- package/android/src/main/java/com/brickssoft/locationtracking/api/NativeThread.kt +57 -0
- package/android/src/main/java/com/brickssoft/locationtracking/bridge/BridgeServices.kt +64 -0
- package/android/src/main/java/com/brickssoft/locationtracking/bridge/CallResponder.kt +41 -0
- package/android/src/main/java/com/brickssoft/locationtracking/bridge/OptionParsers.kt +281 -0
- package/android/src/main/java/com/brickssoft/locationtracking/bridge/PluginHandlers.kt +541 -0
- package/android/src/main/java/com/brickssoft/locationtracking/bridge/PluginPermissionHost.kt +76 -0
- package/android/src/main/java/com/brickssoft/locationtracking/bridge/WatchRegistry.kt +84 -0
- package/android/src/main/java/com/brickssoft/locationtracking/config/Config.kt +231 -0
- package/android/src/main/java/com/brickssoft/locationtracking/config/ConfigJson.kt +574 -0
- package/android/src/main/java/com/brickssoft/locationtracking/config/ConfigStore.kt +31 -0
- package/android/src/main/java/com/brickssoft/locationtracking/config/ConfigValidator.kt +170 -0
- package/android/src/main/java/com/brickssoft/locationtracking/config/RuntimeStateJson.kt +73 -0
- package/android/src/main/java/com/brickssoft/locationtracking/config/SharedPrefsConfigStore.kt +135 -0
- package/android/src/main/java/com/brickssoft/locationtracking/config/State.kt +45 -0
- package/android/src/main/java/com/brickssoft/locationtracking/core/AppDispatchers.kt +21 -0
- package/android/src/main/java/com/brickssoft/locationtracking/core/Clock.kt +41 -0
- package/android/src/main/java/com/brickssoft/locationtracking/core/Components.kt +217 -0
- package/android/src/main/java/com/brickssoft/locationtracking/core/Constants.kt +78 -0
- package/android/src/main/java/com/brickssoft/locationtracking/core/Errors.kt +27 -0
- package/android/src/main/java/com/brickssoft/locationtracking/core/EventBus.kt +39 -0
- package/android/src/main/java/com/brickssoft/locationtracking/core/ForceStopProbe.kt +63 -0
- package/android/src/main/java/com/brickssoft/locationtracking/core/Iso8601.kt +63 -0
- package/android/src/main/java/com/brickssoft/locationtracking/core/Logger.kt +68 -0
- package/android/src/main/java/com/brickssoft/locationtracking/core/RecordHooks.kt +47 -0
- package/android/src/main/java/com/brickssoft/locationtracking/core/TrackingEvent.kt +64 -0
- package/android/src/main/java/com/brickssoft/locationtracking/data/SqlSupport.kt +79 -0
- package/android/src/main/java/com/brickssoft/locationtracking/data/SqliteGeofenceStore.kt +144 -0
- package/android/src/main/java/com/brickssoft/locationtracking/data/SqliteLocationStore.kt +215 -0
- package/android/src/main/java/com/brickssoft/locationtracking/data/Stores.kt +45 -0
- package/android/src/main/java/com/brickssoft/locationtracking/data/TrackingDatabase.kt +111 -0
- package/android/src/main/java/com/brickssoft/locationtracking/device/DefaultDeviceInfoProvider.kt +104 -0
- package/android/src/main/java/com/brickssoft/locationtracking/device/DefaultDeviceMonitor.kt +335 -0
- package/android/src/main/java/com/brickssoft/locationtracking/device/DeviceMonitor.kt +36 -0
- package/android/src/main/java/com/brickssoft/locationtracking/device/DeviceStateMapping.kt +69 -0
- package/android/src/main/java/com/brickssoft/locationtracking/engine/DefaultTrackingEngine.kt +1281 -0
- package/android/src/main/java/com/brickssoft/locationtracking/engine/ElasticDistance.kt +68 -0
- package/android/src/main/java/com/brickssoft/locationtracking/engine/LocationRequests.kt +74 -0
- package/android/src/main/java/com/brickssoft/locationtracking/engine/MotionStateMachine.kt +291 -0
- package/android/src/main/java/com/brickssoft/locationtracking/engine/StationaryRegion.kt +41 -0
- package/android/src/main/java/com/brickssoft/locationtracking/engine/TrackingEngine.kt +60 -0
- package/android/src/main/java/com/brickssoft/locationtracking/engine/TrackingTimers.kt +90 -0
- package/android/src/main/java/com/brickssoft/locationtracking/geofence/DefaultGeofenceManager.kt +899 -0
- package/android/src/main/java/com/brickssoft/locationtracking/geofence/DwellTracker.kt +80 -0
- package/android/src/main/java/com/brickssoft/locationtracking/geofence/GeofenceManager.kt +33 -0
- package/android/src/main/java/com/brickssoft/locationtracking/geofence/PolygonMath.kt +194 -0
- package/android/src/main/java/com/brickssoft/locationtracking/heartbeat/DefaultHeartbeatScheduler.kt +713 -0
- package/android/src/main/java/com/brickssoft/locationtracking/heartbeat/HeartbeatAlarmReceiver.kt +69 -0
- package/android/src/main/java/com/brickssoft/locationtracking/heartbeat/HeartbeatAlarms.kt +100 -0
- package/android/src/main/java/com/brickssoft/locationtracking/heartbeat/HeartbeatScheduler.kt +25 -0
- package/android/src/main/java/com/brickssoft/locationtracking/heartbeat/HeartbeatWindow.kt +179 -0
- package/android/src/main/java/com/brickssoft/locationtracking/http/AuthorizationManager.kt +213 -0
- package/android/src/main/java/com/brickssoft/locationtracking/http/BodyBuilder.kt +73 -0
- package/android/src/main/java/com/brickssoft/locationtracking/http/HttpSupport.kt +118 -0
- package/android/src/main/java/com/brickssoft/locationtracking/http/HttpSyncer.kt +18 -0
- package/android/src/main/java/com/brickssoft/locationtracking/http/OkHttpSyncer.kt +551 -0
- package/android/src/main/java/com/brickssoft/locationtracking/http/StrictJson.kt +135 -0
- package/android/src/main/java/com/brickssoft/locationtracking/http/SyncPolicy.kt +109 -0
- package/android/src/main/java/com/brickssoft/locationtracking/http/TemplateRenderer.kt +143 -0
- package/android/src/main/java/com/brickssoft/locationtracking/logging/FileLogger.kt +461 -0
- package/android/src/main/java/com/brickssoft/locationtracking/logging/LogFileProvider.kt +9 -0
- package/android/src/main/java/com/brickssoft/locationtracking/logging/LogFormatter.kt +148 -0
- package/android/src/main/java/com/brickssoft/locationtracking/logging/LogStore.kt +30 -0
- package/android/src/main/java/com/brickssoft/locationtracking/model/DeviceModels.kt +176 -0
- package/android/src/main/java/com/brickssoft/locationtracking/model/GeofenceSpec.kt +25 -0
- package/android/src/main/java/com/brickssoft/locationtracking/model/ModelJson.kt +550 -0
- package/android/src/main/java/com/brickssoft/locationtracking/model/Record.kt +106 -0
- package/android/src/main/java/com/brickssoft/locationtracking/model/TrackedLocation.kt +53 -0
- package/android/src/main/java/com/brickssoft/locationtracking/permission/BackgroundRationaleDialog.kt +85 -0
- package/android/src/main/java/com/brickssoft/locationtracking/permission/CurrentActivityTracker.kt +72 -0
- package/android/src/main/java/com/brickssoft/locationtracking/permission/DefaultPermissionManager.kt +333 -0
- package/android/src/main/java/com/brickssoft/locationtracking/permission/PermissionManager.kt +54 -0
- package/android/src/main/java/com/brickssoft/locationtracking/position/DefaultPositionService.kt +277 -0
- package/android/src/main/java/com/brickssoft/locationtracking/position/PositionService.kt +39 -0
- package/android/src/main/java/com/brickssoft/locationtracking/position/PositionWatch.kt +115 -0
- package/android/src/main/java/com/brickssoft/locationtracking/processing/DefaultLocationProcessor.kt +93 -0
- package/android/src/main/java/com/brickssoft/locationtracking/processing/DefaultOdometer.kt +99 -0
- package/android/src/main/java/com/brickssoft/locationtracking/processing/DefaultRecordFactory.kt +166 -0
- package/android/src/main/java/com/brickssoft/locationtracking/processing/Geo.kt +56 -0
- package/android/src/main/java/com/brickssoft/locationtracking/processing/KalmanFilter.kt +72 -0
- package/android/src/main/java/com/brickssoft/locationtracking/processing/Processing.kt +48 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/Backends.kt +187 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/DefaultProviderFactory.kt +169 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/ProviderPackaging.kt +135 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/android/AndroidActivityBackend.kt +25 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/android/AndroidGeofenceBackend.kt +181 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/android/AndroidGeofenceReceiver.kt +115 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/android/AndroidLocationBackend.kt +265 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/android/AndroidProviderBundle.kt +31 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/android/LocationProviders.kt +98 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/gms/GmsActivityBackend.kt +80 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/gms/GmsActivityReceiver.kt +62 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/gms/GmsErrors.kt +72 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/gms/GmsGeofenceBackend.kt +152 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/gms/GmsGeofenceReceiver.kt +78 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/gms/GmsLocationBackend.kt +176 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/gms/GmsProviderBundle.kt +62 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/gms/GmsReceiverSupport.kt +88 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/gms/GmsTasks.kt +55 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/hms/HmsActivityBackend.kt +71 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/hms/HmsActivityReceiver.kt +57 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/hms/HmsErrors.kt +76 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/hms/HmsGeofenceBackend.kt +116 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/hms/HmsGeofenceReceiver.kt +67 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/hms/HmsIntents.kt +83 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/hms/HmsLocationBackend.kt +197 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/hms/HmsProviderBundle.kt +55 -0
- package/android/src/main/java/com/brickssoft/locationtracking/provider/hms/HmsTasks.kt +44 -0
- package/android/src/main/java/com/brickssoft/locationtracking/record/RecordSink.kt +95 -0
- package/android/src/main/java/com/brickssoft/locationtracking/service/BootCountStore.kt +44 -0
- package/android/src/main/java/com/brickssoft/locationtracking/service/BootReceiver.kt +175 -0
- package/android/src/main/java/com/brickssoft/locationtracking/service/DefaultServiceController.kt +196 -0
- package/android/src/main/java/com/brickssoft/locationtracking/service/LocationTrackingService.kt +319 -0
- package/android/src/main/java/com/brickssoft/locationtracking/service/NotificationActionReceiver.kt +42 -0
- package/android/src/main/java/com/brickssoft/locationtracking/service/NotificationFactory.kt +338 -0
- package/android/src/main/java/com/brickssoft/locationtracking/service/ServiceCommands.kt +204 -0
- package/android/src/main/java/com/brickssoft/locationtracking/service/ServiceController.kt +22 -0
- package/android/src/main/java/com/brickssoft/locationtracking/service/ServiceDeps.kt +61 -0
- package/android/src/main/java/com/brickssoft/locationtracking/service/WhileInUseStartCheck.kt +115 -0
- package/android/src/main/java/com/brickssoft/locationtracking/settings/DefaultDeviceSettings.kt +79 -0
- package/android/src/main/java/com/brickssoft/locationtracking/settings/DeviceSettings.kt +21 -0
- package/android/src/main/java/com/brickssoft/locationtracking/settings/OemPowerManagers.kt +198 -0
- package/android/src/main/res/drawable/lt_ic_notification.xml +11 -0
- package/android/src/main/res/values/lt_strings.xml +11 -0
- package/android/src/main/res/xml/lt_file_paths.xml +5 -0
- package/dist/esm/definitions.d.ts +719 -0
- package/dist/esm/definitions.js +2 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/events.d.ts +50 -0
- package/dist/esm/events.js +52 -0
- package/dist/esm/events.js.map +1 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/plugin.d.ts +3 -0
- package/dist/esm/plugin.js +10 -0
- package/dist/esm/plugin.js.map +1 -0
- package/dist/esm/web/config.d.ts +19 -0
- package/dist/esm/web/config.js +243 -0
- package/dist/esm/web/config.js.map +1 -0
- package/dist/esm/web/device.d.ts +9 -0
- package/dist/esm/web/device.js +90 -0
- package/dist/esm/web/device.js.map +1 -0
- package/dist/esm/web/errors.d.ts +14 -0
- package/dist/esm/web/errors.js +19 -0
- package/dist/esm/web/errors.js.map +1 -0
- package/dist/esm/web/geolocation.d.ts +26 -0
- package/dist/esm/web/geolocation.js +117 -0
- package/dist/esm/web/geolocation.js.map +1 -0
- package/dist/esm/web/location.d.ts +7 -0
- package/dist/esm/web/location.js +70 -0
- package/dist/esm/web/location.js.map +1 -0
- package/dist/esm/web.d.ts +164 -0
- package/dist/esm/web.js +328 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +945 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +948 -0
- package/dist/plugin.js.map +1 -0
- package/package.json +60 -4
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
package com.brickssoft.locationtracking.bridge
|
|
2
|
+
|
|
3
|
+
import com.brickssoft.locationtracking.core.ErrorCode
|
|
4
|
+
import com.brickssoft.locationtracking.core.Logger
|
|
5
|
+
import com.getcapacitor.Bridge
|
|
6
|
+
import com.getcapacitor.JSObject
|
|
7
|
+
import com.getcapacitor.PluginCall
|
|
8
|
+
import org.json.JSONObject
|
|
9
|
+
import java.util.concurrent.ConcurrentHashMap
|
|
10
|
+
|
|
11
|
+
/** Where a `watchPosition` delivers; in production a kept-alive [PluginCall] ([CallWatchTarget]). */
|
|
12
|
+
internal interface WatchTarget {
|
|
13
|
+
/** A `Location` for the JS callback. */
|
|
14
|
+
fun deliver(location: JSONObject)
|
|
15
|
+
|
|
16
|
+
/** An error for the JS callback; the watch stays active. */
|
|
17
|
+
fun fail(code: ErrorCode, message: String)
|
|
18
|
+
|
|
19
|
+
/** Ends the watch on the JS side (releases the kept-alive call). */
|
|
20
|
+
fun release()
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Kept-alive `watchPosition` targets by watch id (the call's callback id); thread-safe. */
|
|
24
|
+
internal class WatchRegistry {
|
|
25
|
+
private val targets = ConcurrentHashMap<String, WatchTarget>()
|
|
26
|
+
|
|
27
|
+
val size: Int get() = targets.size
|
|
28
|
+
|
|
29
|
+
val ids: Set<String> get() = targets.keys.toSet()
|
|
30
|
+
|
|
31
|
+
operator fun get(id: String): WatchTarget? = targets[id]
|
|
32
|
+
|
|
33
|
+
operator fun contains(id: String): Boolean = targets.containsKey(id)
|
|
34
|
+
|
|
35
|
+
/** Registers [target] under [id]; a different target already registered under [id] is released. */
|
|
36
|
+
fun add(id: String, target: WatchTarget) {
|
|
37
|
+
val previous = targets.put(id, target)
|
|
38
|
+
if (previous != null && previous !== target) releaseQuietly(id, previous)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Removes and releases the target of [id]; false if there was none. */
|
|
42
|
+
fun release(id: String): Boolean {
|
|
43
|
+
val target = targets.remove(id) ?: return false
|
|
44
|
+
releaseQuietly(id, target)
|
|
45
|
+
return true
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Releases every target; returns the released ids. */
|
|
49
|
+
fun releaseAll(): List<String> = targets.keys.toList().filter { release(it) }
|
|
50
|
+
|
|
51
|
+
private fun releaseQuietly(id: String, target: WatchTarget) {
|
|
52
|
+
try {
|
|
53
|
+
target.release()
|
|
54
|
+
} catch (e: Exception) {
|
|
55
|
+
Logger.w(TAG, "failed to release watch $id", e)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private companion object {
|
|
60
|
+
const val TAG = "LT.Watch"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* [WatchTarget] over a `RETURN_CALLBACK` [PluginCall] that was kept alive (`setKeepAlive(true)`): every
|
|
66
|
+
* [deliver] / [fail] invokes the JS callback; [release] frees the call in the [Bridge].
|
|
67
|
+
*/
|
|
68
|
+
internal class CallWatchTarget(
|
|
69
|
+
private val call: PluginCall,
|
|
70
|
+
private val bridge: () -> Bridge?,
|
|
71
|
+
) : WatchTarget {
|
|
72
|
+
override fun deliver(location: JSONObject) {
|
|
73
|
+
call.resolve(JSObject.fromJSONObject(location))
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
override fun fail(code: ErrorCode, message: String) {
|
|
77
|
+
call.reject(message, code.name)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
override fun release() {
|
|
81
|
+
val b = bridge()
|
|
82
|
+
if (b != null) call.release(b) else call.setKeepAlive(false)
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
package com.brickssoft.locationtracking.config
|
|
2
|
+
|
|
3
|
+
import com.brickssoft.locationtracking.core.LogLevel
|
|
4
|
+
import com.brickssoft.locationtracking.model.DesiredAccuracy
|
|
5
|
+
import com.brickssoft.locationtracking.model.LocationProviderSetting
|
|
6
|
+
|
|
7
|
+
// Mirrors the TS `Config` 1:1 (same field names, same defaults). JSON-valued fields are stored as JSON text.
|
|
8
|
+
// Units: distances in meters, intervals in ms unless the field name/KDoc says otherwise.
|
|
9
|
+
|
|
10
|
+
enum class HttpMethod {
|
|
11
|
+
POST,
|
|
12
|
+
PUT,
|
|
13
|
+
PATCH,
|
|
14
|
+
;
|
|
15
|
+
|
|
16
|
+
val wire: String get() = name
|
|
17
|
+
|
|
18
|
+
companion object {
|
|
19
|
+
fun fromWire(value: String?): HttpMethod? = entries.firstOrNull { it.name.equals(value, ignoreCase = true) }
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
enum class NotificationPriority(val wire: String) {
|
|
24
|
+
MIN("min"),
|
|
25
|
+
LOW("low"),
|
|
26
|
+
DEFAULT("default"),
|
|
27
|
+
HIGH("high"),
|
|
28
|
+
MAX("max"),
|
|
29
|
+
;
|
|
30
|
+
|
|
31
|
+
companion object {
|
|
32
|
+
fun fromWire(value: String?): NotificationPriority? =
|
|
33
|
+
entries.firstOrNull { it.wire.equals(value, ignoreCase = true) }
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
enum class RefreshPayloadEncoding(val wire: String) {
|
|
38
|
+
JSON("json"),
|
|
39
|
+
FORM("form"),
|
|
40
|
+
;
|
|
41
|
+
|
|
42
|
+
companion object {
|
|
43
|
+
fun fromWire(value: String?): RefreshPayloadEncoding? =
|
|
44
|
+
entries.firstOrNull { it.wire.equals(value, ignoreCase = true) }
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
data class LocationFilterConfig(
|
|
49
|
+
val useKalman: Boolean = false,
|
|
50
|
+
/** Reject fixes with accuracy worse than this (m). */
|
|
51
|
+
val trackingAccuracyThreshold: Double = 100.0,
|
|
52
|
+
/** Reject fixes implying speed above this (m/s); 0 = off. */
|
|
53
|
+
val maxImpliedSpeed: Double = 80.0,
|
|
54
|
+
/** Odometer ignores fixes worse than this (m). */
|
|
55
|
+
val odometerAccuracyThreshold: Double = 20.0,
|
|
56
|
+
val allowIdenticalLocations: Boolean = false,
|
|
57
|
+
/** Drop mock fixes entirely (otherwise they are kept with mock:true). */
|
|
58
|
+
val rejectMockLocations: Boolean = false,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
data class GeolocationConfig(
|
|
62
|
+
val desiredAccuracy: DesiredAccuracy = DesiredAccuracy.HIGH,
|
|
63
|
+
/** m */
|
|
64
|
+
val distanceFilter: Double = 10.0,
|
|
65
|
+
/** ms */
|
|
66
|
+
val locationUpdateInterval: Long = 1000,
|
|
67
|
+
/** ms */
|
|
68
|
+
val fastestLocationUpdateInterval: Long = 500,
|
|
69
|
+
val disableElasticity: Boolean = false,
|
|
70
|
+
val elasticityMultiplier: Double = 1.0,
|
|
71
|
+
/** m */
|
|
72
|
+
val stationaryRadius: Double = 25.0,
|
|
73
|
+
/** minutes */
|
|
74
|
+
val stopTimeout: Int = 5,
|
|
75
|
+
/** minutes, 0 = off */
|
|
76
|
+
val stopAfterElapsedMinutes: Int = 0,
|
|
77
|
+
val stopOnStationary: Boolean = false,
|
|
78
|
+
/** Default getCurrentPosition timeout, ms. */
|
|
79
|
+
val locationTimeout: Long = 30_000,
|
|
80
|
+
val filter: LocationFilterConfig = LocationFilterConfig(),
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
data class ActivityConfig(
|
|
84
|
+
val disableMotionActivityUpdates: Boolean = false,
|
|
85
|
+
/** ms */
|
|
86
|
+
val activityRecognitionInterval: Long = 10_000,
|
|
87
|
+
/** 0-100 */
|
|
88
|
+
val minimumActivityRecognitionConfidence: Int = 75,
|
|
89
|
+
/** ms */
|
|
90
|
+
val motionTriggerDelay: Long = 0,
|
|
91
|
+
val disableStopDetection: Boolean = false,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
data class HeartbeatConfig(
|
|
95
|
+
val enabled: Boolean = true,
|
|
96
|
+
/** seconds, min 60 */
|
|
97
|
+
val minInterval: Int = 180,
|
|
98
|
+
/** seconds, >= minInterval */
|
|
99
|
+
val maxInterval: Int = 300,
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
data class AuthorizationConfig(
|
|
103
|
+
val strategy: String = "JWT",
|
|
104
|
+
val accessToken: String? = null,
|
|
105
|
+
val refreshToken: String? = null,
|
|
106
|
+
val refreshUrl: String? = null,
|
|
107
|
+
/** JSON object text; string values may contain `{refreshToken}`. */
|
|
108
|
+
val refreshPayload: String = "{}",
|
|
109
|
+
val refreshHeaders: Map<String, String> = emptyMap(),
|
|
110
|
+
val refreshPayloadEncoding: RefreshPayloadEncoding = RefreshPayloadEncoding.JSON,
|
|
111
|
+
/** Access-token expiry, epoch ms; -1 = unknown. */
|
|
112
|
+
val expires: Long = -1,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
data class HttpConfig(
|
|
116
|
+
/** No url => nothing is uploaded (records stay queued). */
|
|
117
|
+
val url: String? = null,
|
|
118
|
+
val method: HttpMethod = HttpMethod.POST,
|
|
119
|
+
val headers: Map<String, String> = emptyMap(),
|
|
120
|
+
/** JSON object text, merged into the ROOT of every request body. */
|
|
121
|
+
val params: String = "{}",
|
|
122
|
+
val autoSync: Boolean = true,
|
|
123
|
+
/** Upload when queue >= threshold; 0 = every record. */
|
|
124
|
+
val autoSyncThreshold: Int = 0,
|
|
125
|
+
/**
|
|
126
|
+
* Seconds, 0 = off (round 2). Normal records are uploaded once the oldest pending normal record is at least this
|
|
127
|
+
* old (live location at most this stale); priority records are unaffected. See docs/e2e/architecture.md §4.
|
|
128
|
+
*/
|
|
129
|
+
val syncInterval: Int = 0,
|
|
130
|
+
val batchSync: Boolean = false,
|
|
131
|
+
val maxBatchSize: Int = 100,
|
|
132
|
+
val disableAutoSyncOnCellular: Boolean = false,
|
|
133
|
+
/** "." = no wrapping. */
|
|
134
|
+
val rootProperty: String = "location",
|
|
135
|
+
/** JSON text with `<%= name %>` placeholders. */
|
|
136
|
+
val locationTemplate: String? = null,
|
|
137
|
+
/** Used for event 'geofence'; falls back to [locationTemplate]. */
|
|
138
|
+
val geofenceTemplate: String? = null,
|
|
139
|
+
/** ms */
|
|
140
|
+
val timeout: Long = 60_000,
|
|
141
|
+
val authorization: AuthorizationConfig? = null,
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
data class PersistenceConfig(
|
|
145
|
+
val maxDaysToPersist: Int = 7,
|
|
146
|
+
/** -1 = unlimited */
|
|
147
|
+
val maxRecordsToPersist: Int = -1,
|
|
148
|
+
/** JSON object text, merged into `extras` of every record at creation time. */
|
|
149
|
+
val extras: String = "{}",
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
data class AppConfig(
|
|
153
|
+
val stopOnTerminate: Boolean = true,
|
|
154
|
+
val startOnBoot: Boolean = false,
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
data class NotificationActionButton(val id: String, val label: String)
|
|
158
|
+
|
|
159
|
+
data class NotificationConfig(
|
|
160
|
+
/** null = app label. */
|
|
161
|
+
val title: String? = null,
|
|
162
|
+
val text: String = DEFAULT_TEXT,
|
|
163
|
+
/** 'drawable/name' | 'mipmap/name' */
|
|
164
|
+
val smallIcon: String = DEFAULT_SMALL_ICON,
|
|
165
|
+
val largeIcon: String? = null,
|
|
166
|
+
/** '#RRGGBB' */
|
|
167
|
+
val color: String? = null,
|
|
168
|
+
val priority: NotificationPriority = NotificationPriority.DEFAULT,
|
|
169
|
+
val channelId: String = DEFAULT_CHANNEL_ID,
|
|
170
|
+
val channelName: String = DEFAULT_CHANNEL_NAME,
|
|
171
|
+
/** Max 3; tap => 'notificationaction' event. */
|
|
172
|
+
val actions: List<NotificationActionButton> = emptyList(),
|
|
173
|
+
val resume: ResumeNotificationConfig = ResumeNotificationConfig(),
|
|
174
|
+
) {
|
|
175
|
+
companion object {
|
|
176
|
+
const val DEFAULT_TEXT = "Location tracking is active"
|
|
177
|
+
const val DEFAULT_SMALL_ICON = "drawable/lt_ic_notification"
|
|
178
|
+
const val DEFAULT_CHANNEL_ID = "location_tracking"
|
|
179
|
+
const val DEFAULT_CHANNEL_NAME = "Location tracking"
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* The notification posted when Android refuses to restore tracking from the background (after a reboot, an app update
|
|
185
|
+
* or a process restart); tapping it resumes the session. Uses the tracking notification's small icon and color.
|
|
186
|
+
*/
|
|
187
|
+
data class ResumeNotificationConfig(
|
|
188
|
+
val enabled: Boolean = false,
|
|
189
|
+
/** null = app label. */
|
|
190
|
+
val title: String? = null,
|
|
191
|
+
val text: String = DEFAULT_TEXT,
|
|
192
|
+
val channelName: String = DEFAULT_CHANNEL_NAME,
|
|
193
|
+
) {
|
|
194
|
+
companion object {
|
|
195
|
+
const val DEFAULT_TEXT = "Location tracking is paused. Tap to resume."
|
|
196
|
+
const val DEFAULT_CHANNEL_NAME = "Paused location tracking"
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
data class GeofenceConfig(
|
|
201
|
+
val initialTriggerEntry: Boolean = true,
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
data class LoggerConfig(
|
|
205
|
+
val logLevel: LogLevel = LogLevel.INFO,
|
|
206
|
+
val logMaxDays: Int = 3,
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
/** null fields fall back to the plugin string resources `lt_bg_rationale_*`. */
|
|
210
|
+
data class BackgroundPermissionRationale(
|
|
211
|
+
val title: String? = null,
|
|
212
|
+
val message: String? = null,
|
|
213
|
+
val positiveAction: String? = null,
|
|
214
|
+
val negativeAction: String? = null,
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
/** The full plugin configuration with every default applied. */
|
|
218
|
+
data class Config(
|
|
219
|
+
val geolocation: GeolocationConfig = GeolocationConfig(),
|
|
220
|
+
val activity: ActivityConfig = ActivityConfig(),
|
|
221
|
+
val heartbeat: HeartbeatConfig = HeartbeatConfig(),
|
|
222
|
+
val http: HttpConfig = HttpConfig(),
|
|
223
|
+
val persistence: PersistenceConfig = PersistenceConfig(),
|
|
224
|
+
val app: AppConfig = AppConfig(),
|
|
225
|
+
val notification: NotificationConfig = NotificationConfig(),
|
|
226
|
+
val geofence: GeofenceConfig = GeofenceConfig(),
|
|
227
|
+
val logger: LoggerConfig = LoggerConfig(),
|
|
228
|
+
val backgroundPermissionRationale: BackgroundPermissionRationale = BackgroundPermissionRationale(),
|
|
229
|
+
/** Android only. */
|
|
230
|
+
val locationProvider: LocationProviderSetting = LocationProviderSetting.AUTO,
|
|
231
|
+
)
|