tracelet 1.9.2
tracelet: ^1.9.2 copied to clipboard
Production-grade background geolocation for Flutter. Battery-conscious tracking, geofencing, SQLite persistence, HTTP sync, and headless execution for iOS & Android.
1.9.2 #
- REFACTOR: Migrated
TlTrackingModeto a strongly-typed enum across the entire Pigeon bridge. This improves type safety and developer experience by eliminating magic integers in the platform communication layer. Android and iOS native implementations now use the generated enum types directly. - FIX: Resolved "Unable to establish connection" regression in
locationStreamwhen secondary engines (like overlays or background isolates) detach. EnsureddestroyAll()is correctly integrated into theprimaryInstanceguard on both Android and iOS to prevent resource leaks and duplicate registrations during hot restarts. - FIX:
Tracelet.locationStreamno longer goes silent whenflutter_overlay_window(or any plugin usingFlutterEngineGroup) creates a secondary in-processFlutterEngine. The primary-instance guard introduced in 1.9.0 (#51) blockedEventDispatcherre-binding for in-process overlay engines, causing Pigeon FlutterApionLocationchannel to report "Unable to establish connection". A Looper-based discriminator now distinguishes overlay engines (main-thread attach → re-bind dispatcher) from headless background engines (off-thread attach → full skip, preserving #51). - FIX: Android
destroyAll()now guards all background-critical subsystems whenstopOnTerminate: false(#65).httpSyncManager.stop(),scheduleManager.stop(), andstopHeartbeat()were still called unconditionally on every swipe-to-dismiss, permanently killing HTTP sync and heartbeat monitoring until the app was manually reopened. Fixed in nativetracelet-sdk1.1.2. - CHORE: Aligned
PigeonTraceletserialization logic to use enum indices for backward compatibility with the high-levelStatemodel while maintaining type-safe internal bridge contracts.
1.9.1 #
- FIX: Android
destroyAll()now respectsstopOnTerminate: falsefor continuous and geofence tracking modes (#63).locationEngine.destroy()was unconditionally called inonDetachedFromEngine(), racing withLocationService.onTaskRemoved()which bootstraps native tracking. Background location tracking now survives app swipe from recents whenstopOnTerminate: falseis configured.
1.9.0 #
- FEAT: Strongly typed permission APIs (#57). Added
getLocationAuthorization,requestLocationAuthorization,getNotificationAuthorization,requestNotificationAuthorization,getMotionAuthorization,requestMotionAuthorization, andrequestTemporaryFullAccuracyAuthorization, all returningFuture<AuthorizationStatus>instead of magic ints. The matching int-returning methods (getPermissionStatus,requestPermission,getNotificationPermissionStatus,requestNotificationPermission,getMotionPermissionStatus,requestMotionPermission,requestTemporaryFullAccuracy) are now@Deprecatedand will be removed in 2.0.0. - FIX: Android
LocationServiceno longer crashes the host app withRemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()(#59). Reproducible on real devices when usingperiodicUseForegroundService: true. Root cause:onStartCommandonly promoted to foreground forACTION_START, but the system can deliver intents for other actions (and null-intent sticky restarts after a system kill) under the same foreground-service contract. Fixed in nativetracelet-sdk1.1.0 by always promoting at the top ofonStartCommand. - FIX:
Geofence(extras: {...})now correctly persists and is returned bygetGeofences()and delivered inonGeofenceevents (#58). Bug was intracelet_platform_interface's_mapToGeofence, which silently droppedextrasandverticeswhen constructing the Pigeon payload; the 1.8.12 native fix had no effect because the data never crossed the platform channel. Affected both Android and iOS. - TEST: Added on-device integration test (
example/integration_test/geofence_extras_test.dart) that round-tripsaddGeofence→getGeofences()to prevent regression.
1.8.13 #
- PERF: Reduce first-fix latency on stationary → moving transitions on both iOS and Android. The native engines now fire an additional one-shot location request when motion starts, delivering a fresh GPS fix in ~1–5s instead of waiting for
distanceFilter(iOS) orlocationUpdateInterval(Android) on the continuous stream (#54). - FIX: Android — after a manual
Tracelet.changePace(false)(force stationary), the SDK can now detect real motion and resume tracking automatically. Previously the wake-up sensors stayed torn down, leaving the SDK in a dead-state. iOS was unaffected. - FIX: Bump iOS native SDK to 1.0.11 and Android native SDK to 1.0.12.
1.8.12 #
- FIX: Geofence
extrasnow arrive inGeofenceEvent.extrason Android (previously always empty). Locationextrasare also correctly included when reading back persisted locations (#51 follow-up). - FIX: Bump Android native SDK to 1.0.11.
1.8.11 #
- FIX: Geofence callbacks no longer silently stop during continuous tracking when a secondary FlutterEngine (e.g. Firebase background messaging) registers the plugin (#51).
1.8.10 #
- FIX: Killed-state tracking now works reliably —
stopBootTracking()deferred frominitialize()toready()so boot-mode native tracking survives until the Dart side explicitly takes over (#50). - FIX: Bump native SDKs to 1.0.10.
1.8.9 #
- FEAT: Add
syncIntervaltoHttpConfig— flush locations on a fixed timer instead of per-insert, for fleet/logistics use cases (#50). - FEAT: Bump native SDKs to 1.0.9.
1.8.8 #
- FIX: HTTP sync payload now consistent between iOS and Android — Android
cursorToLocation()and all location map producers now use canonicalis_moving(snake_case) and ISO 8601 timestamps, matching iOS format (#48). - FIX: Bump native SDKs to 1.0.8.
1.8.7 #
- FIX: Re-release of 1.8.6 fixes (1.8.6 was partially published to pub.dev without all fixes).
- FIX: Bump native SDKs to 1.0.7.
1.8.6 #
- FIX:
getCurrentPosition(samples: 1)now forces a fresh GPS fix instead of returning stale cached locations — usesrequestLocationUpdates/startUpdatingLocationinstead ofgetCurrentLocation/requestLocationwhich may return cached data without waking GPS hardware (#46). - FIX: HTTP sync headers callback (
setHeadersCallback) no longer invoked per-batch — eliminates unnecessary MethodChannel round-trip latency on every sync request. Token refresh now handled exclusively viasetTokenRefreshCallbackon 401. - FIX: Headless
FlutterEngineno longer overwrites foregroundhttpSyncManagercallbacks — fixes 10-second timeout onrequestFreshHeaderscaused by MethodChannel messages routed to the wrong Dart isolate. - FIX: Bump native SDKs to 1.0.6.
- FIX: Privacy zones, audit trail, and encryption APIs now work before
ready()— only requireinitialize()(DB creation), not active tracking. - FIX:
getPrivacyZones()no longer throws_Map<Object?, Object?>type cast error — fix Pigeon-generated lazy cast for nested map types.
1.8.5 #
- FIX:
getCurrentPosition()falls back to last known location when GPS returns no fix (e.g. emulator, GPS-off) — fixesLOCATION_UNAVAILABLEerrors (#46). - FIX: Bump native SDKs to 1.0.5.
1.8.4 #
- FIX: Add
isReadyguards to all Android SDK methods — preventsUninitializedPropertyAccessExceptionwhen called beforeready()(re-fixes #46). - FIX: Pin native SDK dependencies to exact versions — prevents auto-resolving to incompatible newer native SDK releases.
1.8.3 #
- FIX: Prevent crash when
getState(),setConfig(), or any other method is called beforeready()on iOS — comprehensiveisReadyguards across all native SDK methods (re-fixes #46).
1.8.2 #
- FIX: Prevent crash when
stop()is called beforeready()on iOS — returnsNOT_READYerror instead of accessing uninitialized properties. - FIX: Guard
soundManageraccess on Android to preventUninitializedPropertyAccessExceptionduring motion state changes or cleanup. - FIX: Use
LocationManagerCompat.isLocationEnabled()on Android — fixesNoSuchMethodErrorcrash on API 26/27 devices. - FIX: Enterprise optional dependencies (SQLCipher, Play Integrity, security-crypto) now gracefully degrade at runtime when not on the classpath — no more
NoClassDefFoundErrorcrashes. - REFACTOR: Refined ProGuard/R8 consumer rules — narrower keep rules, added
-dontwarnfor optional enterprise dependencies. - DOCS: Updated
INSTALL-ANDROID.mdandDATABASE-ENCRYPTION.mdwith enterprise dependency setup instructions.
1.8.1 #
- FIX: iOS periodic mode no longer shows persistent location indicator in the status bar.
1.8.0 #
- FIX: Align location map format contract across Android, iOS, and Dart layers — fixes 9 format mismatches.
- FEAT: Add
Tracelet.destroySyncedLocations()— deletes only synced locations, returns count deleted. - FEAT: Auto-purge synced locations from database after successful HTTP sync.
- TEST: Add 25 Dart location map format tests.
- DOCS: Add
help/LOCATION-MAP-FORMAT.mdcanonical format contract reference.
1.7.1 #
- FIX: ConfigManager null-merge — partial
setConfig()no longer overwrites existing values with null defaults (fixes periodic mode HTTP sync failure). - FEAT: Add
Tracelet.destroySyncedLocations()— deletes only synced locations, returns count deleted. - FEAT: Auto-purge synced locations from database after successful HTTP sync.
1.7.0 #
- FEAT: Migrate all event subscriptions from EventChannels to Pigeon FlutterApi platform streams.
- FEAT: Add
Location.fromTlandLocationActivity.fromTlfactory constructors for Pigeon type conversion. - FIX: Headless geofence events no longer silently dropped on Android task removal (#43).
- REFACTOR: Extract native SDKs to standalone modules — Android (Maven Central) and iOS (CocoaPods/SPM).
- DOCS: Add local development workflow documentation to CONTRIBUTING.md.
1.6.3-alpha.1 #
- FEAT: Migrate all event subscriptions from EventChannels to Pigeon FlutterApi platform streams.
- FEAT: Add
Location.fromTlandLocationActivity.fromTlfactory constructors for Pigeon type conversion. - REFACTOR: Remove
_eventChannels,_eventStreamsmaps, and_getEventStream()helper. - CHORE: Update cross-package dependency constraints to
^1.6.3-alpha.1.
1.6.2 #
- FIX: Update
tracelet_webdependency to^1.6.1— fixes 5 missing HTTP Sync method stubs that causedUnimplementedErroron web.
1.6.1 #
- FEAT: Add 401-aware retry — native HTTP sync now detects 401 responses, invokes the headless headers callback (
registerHeadlessHeadersCallback) to refresh authorization tokens, and retries the request once with updated dynamic headers. Works in both foreground and killed-state (headless) modes.
1.6.0 #
- FEAT: Add SSL certificate pinning via
HttpConfig.sslPinningCertificatesandHttpConfig.sslPinningFingerprints. - FEAT: Add dynamic HTTP headers —
setDynamicHeaders(),setHeadersCallback(),refreshHeaders(), and headlessregisterHeadlessHeadersCallback(). - FEAT: Add route context —
setRouteContext()/clearRouteContext()to attach metadata to every synced location. - FEAT: Add custom sync body builder —
setSyncBodyBuilder()and headlessregisterHeadlessSyncBodyBuilder(). - TEST: Add 19 Dart unit tests for
RouteContext,SyncBodyContext, andHttpConfigSSL fields. - TEST: Add 6 MethodChannel mock tests for new platform methods.
- DOCS: Update API.md, CONFIGURATION.md, HTTP-SYNC.md with new sync feature documentation.
- CHORE: Update cross-package dependency constraints to
^1.6.0.
1.5.0 #
- FEAT: Boot-mode HTTP auto-sync — locations sync to your server even when the app is killed or the device reboots (Android).
- FIX: Test server now correctly reads
latitude/longitudefrom nestedcoordsobject. - CHORE: Update cross-package dependency constraints to
^1.5.0.
1.4.6 #
- FIX: Rename native
PermissionManagertoTraceletPermissionManagerto avoid class name collision withpermission_handler_apple(#32). - CHORE: Update cross-package dependency constraints to
^1.4.6.
1.4.5 #
- TEST: Add integration tests for GPS-off fallback and reduced accuracy field serialization.
- CHORE: Update cross-package dependency constraints to
^1.4.5.
1.4.4 #
- FEAT: Add
reducedAccuracyfield toLocation—truewhen iOS 14+ grants only approximate location authorization. - FEAT: Example app now shows
[REDUCED]tag andgpsFallback=ONindicator for reduced/fallback location states. - TEST: Add 5 unit tests for
reducedAccuracyfield (default, parse, snake_case, round-trip, copyWithCoords). - CHORE: Update cross-package dependency constraints to
^1.4.4.
1.4.3 #
- FEAT: Add
locationSourcefield toLocation— classifies each fix asgps,wifi,cell,network, orunknown. - FEAT: Add
gpsFallbackfield toProviderChangeEvent— signals when the engine auto-downgrades to Wi-Fi/cell positioning because GPS is disabled. - CHORE: Update cross-package dependency constraints to
^1.4.3.
1.4.2 #
- FIX: Dead reckoning activation now reliably detects GPS hardware state instead of using accuracy-based heuristic.
- FIX: Mock detection heuristic no longer produces false positives for Wi-Fi/cell locations when GPS is disabled.
- CHORE: Update cross-package dependency constraints to
^1.4.2.
1.4.1 #
- FEAT: Dead reckoning — full native IMU sensor fusion for GPS-denied environments (tunnels, parking structures, urban canyons). Activates automatically on GPS loss, deactivates on GPS recovery.
- CHORE: Update cross-package dependency constraints to
^1.4.1.
1.4.0 #
- FEAT: Encrypted SQLite —
Tracelet.isDatabaseEncrypted()andTracelet.encryptDatabase()for at-rest database encryption (SQLCipher on Android, Data Protection on iOS). - FEAT: Device attestation —
Tracelet.getAttestationToken()returns a platform attestation token (Play Integrity on Android, App Attest on iOS). - FEAT: Remote config — automatic fetch of remote configuration with ETag caching and
onRemoteConfigevent stream. - FEAT: Dead reckoning —
Tracelet.getDeadReckoningState()stub for future accelerometer/gyroscope-based position estimation. - FEAT: Carbon estimator —
Tracelet.getCarbonReport()returns CO₂ emission estimates from tracked journeys. - FEAT: Add
SecurityConfigandAttestationConfigtoConfigmodel for enterprise feature configuration. - CHORE: Update cross-package dependency constraints to
^1.4.0.
1.3.7 #
- FIX: Android — fix
ClassNotFoundExceptioncrash on app upgrade forBootReceiverand other manifest-declared components (fixes #31). - CHORE: Update
tracelet_androiddependency constraint to^1.3.7.
1.3.6 #
- FIX:
SQLQuery.startandSQLQuery.endnow correctly filter locations on all platforms (Android, iOS, Web). - FIX: Add
offsetfield toSQLQueryto match native handler expectations. - FIX:
getCount()now accepts optionalSQLQueryfor time-bounded counting. - PERF:
DeltaEncoder.encodeis 2.1x faster (cached DateTime parsing, precomputed rounding factors). - PERF:
GeoUtils.haversineoptimized — fewer trig calls, precomputed constants. - CHORE: Update cross-package dependency constraints to
^1.3.6.
1.3.5 #
- FIX: iOS — fix
Unable to find module dependency: 'TraceletCore'build error. - CHORE: Update cross-package dependency constraints to
^1.3.5.
1.3.4 #
- CHORE: Update cross-package dependency constraints to
^1.3.3.
1.3.3 #
- FIX: Android — bundle native core Kotlin source (
com.tracelet.core.*) directly inside the plugin package, fixing "Unresolved reference" build errors when installed from pub.dev. - FIX: iOS — bundle TraceletCore Swift source directly inside the plugin package instead of depending on an unpublished local CocoaPod.
- CHORE: Remove React Native support to simplify the monorepo.
1.3.2 #
- PERF: Android — streaming
JsonWriterreplaces per-locationJSONObjectallocations in batch sync (A-L5). - PERF: iOS — C-level UUID generation replaces Foundation
UUID()inLocationEngineandTraceletDatabase(I-M6). - PERF: Performance audit now 77/77 items resolved (100%).
1.3.1 #
- FIX: Resolve
extraskey collision betweenHttpConfigandPersistenceConfig— serialization keys renamed tohttpExtrasandpersistenceExtrasto prevent native ConfigManager flat-merge from overwriting one with the other. Backward-compatible viafromMapfallback. - PERF: Add 22 new benchmarks covering DeltaEncoder, BatteryBudgetEngine, CarbonEstimator, PersistDecider, Config/State serialization.
- PERF: iOS
markSynced()now uses chunked prepared statements (500 UUIDs/chunk) to avoid SQLite variable limit and improve sync performance.
1.3.0 #
- FIX:
getState()always returnedenabled: falseon iOS — the iOSStateManager.toMap()flat-merged config keys into the state dictionary, overwritingenabledandisMovingwith config defaults. Fixed by nesting config under a"config"key, matching Android behavior (#26).
1.2.0 #
Breaking Changes #
- REFACTOR:
ForegroundServiceConfig.notificationPrioritychanged frominttoNotificationPriorityenum. Replace raw integers (-2..2) with enum values (NotificationPriority.min,.low,.defaultPriority,.high,.max). - REFACTOR:
AuditConfig.hashAlgorithmchanged fromStringtoHashAlgorithmenum. Replace'SHA-256'withHashAlgorithm.sha256,'SHA-512'withHashAlgorithm.sha512, etc. - REFACTOR:
MotionConfig.triggerActivitieschanged from comma-separatedStringtoSet<ActivityType>. Replace'on_foot, in_vehicle'with{ActivityType.onFoot, ActivityType.inVehicle}.
Notes #
- Native platform channel serialization is backward-compatible — no native code changes required.
notificationPrioritystill serializes as int,hashAlgorithmas"SHA-256"string, andtriggerActivitiesas comma-separated string.
1.1.0 #
New Features #
- FEAT: Add
ComplianceReportmodel andTracelet.generateComplianceReport()API for GDPR Article 30 / CCPA data processing inventory reports. Auto-generates a structured snapshot of all location data collection metadata including:totalLocationsStored,totalLocationsSynced, data retention policy (maxDaysToPersist,maxRecordsToPersist), timestamp bounds of stored records (oldestRecord,newestRecord), database encryption status, active privacy zone count and identifiers, HTTP sync URL and auto-sync state, audit trail status with chain validation, permission states (location + motion), and tracking configuration flags (sparse updates, Kalman filter, delta compression, tracking mode). SupportstoJson()for automated tooling integration andtoMarkdown()for human-readable audit documents. - FEAT: Add
BatteryBudgetEnginealgorithm — a feedback control loop that automatically adjustsdistanceFilter,desiredAccuracy, and periodic interval to maintain a configurable battery budget. SetbatteryBudgetPerHourinGeoConfig(typical range: 1.0–5.0 %/hr) to enable. Subscribe toTracelet.onBudgetAdjustment()for real-time adjustment events showing current drain vs. target and the new parameters being applied. - FEAT: Add
CarbonEstimator— per-trip and cumulative CO₂ emission calculator using EU EEA 2024 mode-specific emission factors (gCO₂/km): car = 192, bus = 89, train = 41, walking/cycling = 0. Integrates with activity recognition to track distance per transport mode via Haversine. ReturnsTripCarbonSummarywithtotalCarbonGrams,totalDistanceMeters,carbonByMode,distanceByMode, anddominantMode. Tracks cumulative totals across trips. - FEAT: Add
DeltaEncoderalgorithm — batch location compression codec using delta encoding with 60–80% payload reduction. First location transmitted in full; subsequent positions as deltas with shortened field names and configurable coordinate precision (5 = ~1.1 m, 6 = ~0.11 m). Native implementations provided on Android (Kotlin) and iOS (Swift) for consistency. - FEAT: Add
RTree<T>spatial index — O(log n) geofence proximity queries supporting 10,000+ geofences with sub-millisecond lookup. ProvidesqueryCircle()andqueryBBox()APIs with Haversine-verified results.
New Configuration Fields #
- FEAT:
GeoConfig.batteryBudgetPerHour(double, default0.0) — target max battery drain (%/hr). When > 0, enablesBatteryBudgetEnginewhich auto-adjusts accuracy, distance filter, and sample rate. Overrides manual settings. - FEAT:
GeoConfig.enableSparseUpdates(bool, defaultfalse) — app-level deduplication that drops locations withinsparseDistanceThreshold(default 50 m) of the last recorded position. UnlikedistanceFilter(which controls platform GPS sampling), this filters at the persistence layer.sparseMaxIdleSeconds(default 300) forces periodic "still here" updates. - FEAT:
GeoConfig.enableDeadReckoning(bool, defaultfalse) — inertial navigation using accelerometer + gyroscope + compass when GPS is lost for longer thandeadReckoningActivationDelayseconds (default 10). Auto-stops afterdeadReckoningMaxDurationseconds (default 120) to prevent IMU drift accumulation. - FEAT:
HttpConfig.enableDeltaCompression(bool, defaultfalse) — enable delta encoding for batch HTTP syncs.deltaCoordinatePrecision(default 6) controls coordinate precision. - FEAT:
HttpConfig.disableAutoSyncOnCellular(bool, defaultfalse) — skip auto-sync on cellular networks, only sync on WiFi. Supported on Android, iOS, and Web (via Network Information API). - FEAT:
GeoConfig.enableAdaptiveMode(bool, defaultfalse) — dynamic sampling based on activity type + battery level + charging state. Activity profiles: still → 500 m, walking → 50 m, driving → 10 m; battery scaling progressively widens filter below 50%/20%/10%. - FEAT: Periodic mode configuration:
periodicLocationInterval(60–43200 sec),periodicDesiredAccuracy,periodicUseForegroundService(Android — sub-15-min intervals),periodicUseExactAlarms(Android —AlarmManagerprecision).
Bug Fixes #
- FIX:
generateComplianceReport()andgetHealthCheck()no longer crash withtype 'Map<Object?, Object?>' is not a subtype of type 'Map<String, Object?>'errors. Platform channel maps are now safely converted viaMap<String, Object?>.from()instead of directascasts. Also fixed nested config sub-map casts (config,geo,http,audit,persistence) using null-safeis Mapchecks.
Infrastructure #
- CHORE: Migrate melos configuration from standalone
melos.yamltopubspec.yamlunder themelos:key for melos 7.x compatibility. All 13 scripts (analyze, format, format:fix, test, test:dart, pigeon, clean, pub:get, build:example:android/ios/web, coverage, benchmark) now run viamelos run <name>. - CHORE: Adopt Dart pub workspaces — root
pubspec.yamldeclaresworkspace:listing all 6 packages; each package declaresresolution: workspace. Removed 5pubspec_overrides.yamlfiles that are no longer needed. - CHORE: Upgrade melos dependency from
^6.0.0to^7.0.0.
1.0.2 #
- FIX: (Android/iOS) Geofence registrations were unconditionally destroyed on app termination and reset, even when
stopOnTerminate: falsewas configured withtrackingMode=1. Geofences now survive process death and are properly re-registered (#23).
1.0.1 #
- FIX: HTTP auto-sync was not triggered during automatic location tracking on any platform — locations accumulated in the database without being synced to the server (#21).
- FIX: (iOS)
HttpMethod.putwas silently ignored due to type mismatch in native config parsing. - FIX: (iOS) HTTP headers could be dropped when platform channel delivered mixed-type maps.
- FIX: (iOS)
maxBatchSizedefault corrected from 100 to 250.
1.0.0 #
🎉 Stable Release #
- FEAT: First stable release of
tracelet— production-grade background geolocation for Flutter. - DOCS: Add Play Store background location declaration guide.
- REFACTOR: Remove third-party company name references — use generic
flutter_background_geolocationthroughout. - REFACTOR: Rename migration guide to
MIGRATION-FROM-FBG.md. - All APIs are finalized and production-ready.
0.12.0 #
Performance Audit — 74 of 77 issues resolved #
- PERF: Cache
AdaptiveSamplingEngineinstance instead of re-creating per GPS fix (D-C1). - PERF: Add
Location.copyWithCoords()to eliminatetoMap()/fromMap()round-trip in Kalman filter hot path (D-C2). - PERF: Wire trip detection to processed location stream, eliminating duplicate
Location.fromMap()(D-H1). - PERF: Fast-path
_castToMapwith type check — avoids map copy when already correct type (D-H2). - PERF: Replace
.expand()with.where()in_filterLocationto avoid single-element list allocations (D-H4). - PERF: Cancel adaptive activity subscription in
removeListeners()(D-H7). - PERF: Use
.toList(growable: false)foraddGeofences/addPrivacyZonesresult lists (D-M6). - PERF: Invalidate cached stream pipeline on
setConfig()so it rebuilds with new settings (D-M8). - PERF: Use
Map.from()instead of.map()withMapEntryfor extras inLocation.fromMap()(D-L4). - REFACTOR: Deduplicate
LocationProcessorparameter list insetConfig()(D-L5).
0.11.5 #
- FIX: [Android/iOS] Polygon geofence
verticesare now correctly persisted to the native SQLite databases. Previously, vertex data was silently dropped duringaddGeofence(), causing polygon geofences to revert to circular after app restart.
0.11.4 #
- FIX: [iOS] Revert over-aggressive permission guards — When In Use permission now works correctly for all tracking modes. Only the killed-state auto-resume (
autoResumeTracking) requires Always authorization. iOS enforces permission at the OS level.
0.11.3 #
- FIX: [Android] Enforce
ACCESS_BACKGROUND_LOCATIONcheck on all killed-state restart paths (boot receiver, task removal, periodic alarms/workers). "While In Use" permission no longer triggers background tracking. - FIX: [iOS] Enforce
.authorizedAlwayscheck on killed-state auto-resume and guardallowsBackgroundLocationUpdates. "When In Use" permission no longer triggers tracking from killed state.- FEAT: AddTracelet.hasBackgroundPermissionstatic getter — convenience check that returnstruewhen location permission isAuthorizationStatus.always.
0.11.2 #
- DOCS: Fix 22 unresolved dartdoc references (
[Enterprise],[Config.*],[isValid],[brokenAtIndex],[brokenAtUuid]). - CHORE: Tighten all platform package constraints to
^0.11.2(fixespub downgradescore penalty).
0.11.1 #
- FEAT: Add
canScheduleExactAlarms()andopenExactAlarmSettings()static methods for Android exact alarm permission management. - FIX: Bypass
LocationProcessordistance/accuracy/speed filters for periodic location events — every timed fix is now delivered regardless of movement. - CHORE: Bump platform interface to 0.11.1.
0.11.0 #
- FEAT: Tamper-proof audit trail — SHA-256 hash chain for location integrity verification.
- FEAT: Privacy zones — exclude, degrade, or event-only actions for geographic privacy control.
- FEAT:
AuditConfigsub-config withenabled,hashAlgorithm,includeExtrasInHashoptions. - FEAT:
PrivacyZoneConfigsub-config withenabledtoggle. - FEAT:
PrivacyZonemodel withidentifier,latitude,longitude,radius,action,degradedAccuracyMeters. - FEAT:
AuditProofmodel for hash chain verification results. - FEAT: CRUD API:
addPrivacyZone(),addPrivacyZones(),removePrivacyZone(),removePrivacyZones(),getPrivacyZones(). - FEAT: Audit API:
getAuditTrail(),verifyAuditTrail(),getAuditProof(). - DOCS: Added AUDIT-TRAIL.md and PRIVACY-ZONES.md guides.
- CHORE: Bump all platform packages to ^0.11.0.
0.10.0 #
- FEAT: Periodic mode —
Tracelet.startPeriodic()for GPS-friendly interval tracking. GPS icon visible only ~5–10 seconds per fix instead of permanently. - FEAT:
GeoConfigperiodic options:periodicLocationInterval,periodicDesiredAccuracy,periodicUseForegroundService,periodicUseExactAlarms. - FEAT: Three Android scheduling strategies: WorkManager (default, battery-optimal), foreground service (reliable timing), and AlarmManager exact alarms (precise, no notification).
- FEAT: Example app: periodic mode UI section with start/stop toggle, custom settings dialog, and map integration with distinct cyan markers.
- DOCS: Updated API.md, CONFIGURATION.md, BACKGROUND-TRACKING.md, and INSTALL-ANDROID.md with periodic mode and exact alarms documentation.
- CHORE: Bump all platform packages to ^0.10.0.
0.9.1 #
- FIX: iOS
HttpSyncManageroptionalUIBackgroundTaskIdentifierunwrap safety.
0.9.0 #
- FEAT: Adaptive sampling engine — auto-adjusts
distanceFilterbased on detected activity type, battery level, and speed. Enable withGeoConfig(enableAdaptiveMode: true). See Adaptive Sampling Guide. - FEAT: Health check API —
Tracelet.getHealth()returns a comprehensive diagnostic snapshot covering tracking state, permissions, battery, sensors, database, and geofence state with actionableHealthWarningenum. See Health Check Guide. - FEAT: HTTP sync retry metadata —
HttpEventnow includesisRetryandretryCountfields. - FEAT: Configurable motion sensitivity —
MotionConfiggainsshakeThreshold,stillThreshold, andstillSampleCountfor tuning accelerometer-based motion detection. - FEAT:
HealthWarningDescriptionextension with.descriptiongetter for human-readable warning text. - CHORE: Bump all platform dependencies to ^0.9.0.
0.8.3 #
- FEAT: Unlimited geofences via proximity-based auto-load/unload — only geofences within
geofenceProximityRadiusare registered with the OS (up to 100 on Android, 20 on iOS), sorted by distance. Enables monitoring thousands of geofences despite platform limits. - FEAT:
geofencesChangeevent fires when geofences are activated/deactivated from proximity monitoring. - CHORE: Bump all platform dependencies to ^0.8.3.
0.8.2 #
- DOCS: Improve README visuals with combined Android & iOS demo image.
0.8.1 #
- PERF: iOS background hardening — all native operations (location persist, HTTP sync, headless engine boot, lifecycle transitions) now wrapped in
beginBackgroundTaskfor safe background execution. - FEAT: iOS 17+
CLBackgroundActivitySessionsupport — extends background runtime for location tracking. - FEAT: iOS 18+
CLServiceSessionsupport — maintains authorization state during background execution. - FIX: iOS
preventSuspendlifecycle gaps — audio keep-alive now correctly started/stopped in all tracking modes and transitions. - FIX: Web EventChannel bridge — all event streams (
onLocation,onMotionChange,onHeartbeat, etc.) were broken on web due to events being consumed but never forwarded. Now works correctly. - CHORE: Bump
tracelet_iosto ^0.8.1,tracelet_webto ^0.8.1.
0.8.0 #
- FEAT: OEM compatibility — automatic mitigations for aggressive OEM power management (Huawei, Xiaomi, OnePlus, Samsung, Oppo, Vivo).
- FEAT:
Tracelet.getSettingsHealth()— device health API returning manufacturer, aggression rating, battery optimization status, and available OEM settings screens. - FEAT:
Tracelet.openOemSettings(label)— open OEM-specific settings screens (autostart, battery saver, app launch) by label. - DOCS: Comprehensive OEM-COMPATIBILITY.md guide with per-manufacturer instructions.
- DOCS: Update README with OEM compatibility feature and documentation link.
- CHORE: Bump all platform dependencies to ^0.8.0.
0.7.1 #
- DOCS: Add mock location detection feature to README with documentation links and feature description.
- DOCS: Add Mock Detection guide to documentation table.
- CHORE: Bump all platform dependencies to ^0.7.1.
0.7.0 #
- FEAT: Mock location detection & prevention — detect and reject spoofed GPS locations across Android, iOS, and Web.
- FEAT:
Location.isMockfield — boolean flag indicating if a location came from a mock provider. - FEAT:
Location.mockHeuristicsfield —MockHeuristicsmetadata (satellite count, elapsed realtime drift, timestamp drift, platform flag). - FEAT:
LocationFilter.rejectMockLocationsconfig — block spoofed locations from reaching the app. - FEAT:
LocationFilter.mockDetectionLevelconfig —MockDetectionLevelenum (disabled,basic,heuristic) for configurable detection depth. - FEAT:
ProviderChangeEvent.mockLocationsDetected— real-time alert when mock locations are detected. - FEAT: Re-export
MockDetectionLevelfromtracelet.dartbarrel file. - DOCS: Comprehensive MOCK-DETECTION.md guide.
- DOCS: Updated CONFIGURATION.md with mock detection options.
- CHORE: Bump all platform dependencies to ^0.7.0.
0.6.1 #
- CHORE: Bump all platform dependencies to ^0.6.1.
0.6.0 #
- FEAT: Integrate shared Dart
LocationProcessorintoonLocationstream — distance filtering, elasticity, accuracy filtering, and speed filtering now run in Dart for cross-platform consistency. - FEAT: Integrate shared Dart
GeofenceEvaluatorfor high-accuracy proximity checks. - FIX: Fix broadcast stream bug — stateful
LocationProcessorandKalmanLocationFilterwere called once per listener per event, causing second subscriber to see distance=0 and filter all locations. Now uses cached.asBroadcastStream()so transformations run exactly once. - PERF: Native code no longer duplicates filtering logic — significantly reduces native code surface.
- CHORE: Bump all platform dependencies to ^0.6.0.
0.5.5 #
- FIX: iOS
onScheduleevent now sends full state map instead of partial data. - CHORE: Bump all platform dependencies to ^0.5.5.
0.5.4 #
- FIX: Heartbeat events no longer return zero coordinates on Android and iOS.
0.5.3 #
- CHORE: Bump all platform dependencies to ^0.5.3.
0.5.2 #
- FEAT:
disableMotionActivityUpdatesnow falls back to permission-free accelerometer-only motion detection instead of disabling all motion detection entirely. - DOCS: Expanded
MotionConfig.disableMotionActivityUpdatesdocumentation with fallback behavior, use cases, and battery notes. - DOCS: Updated
getMotionPermissionStatus()/requestMotionPermission()docs to reflect accelerometer-only mode behavior. - DOCS: Added "Opting Out of Motion Permission" section to PERMISSIONS.md with comparison table.
0.5.1 #
- DOCS: Update README with web platform in architecture and documentation tables.
0.5.0 #
- FEAT: Add web platform support via
tracelet_webpackage. - FEAT: Guard
registerHeadlessTask()for web compatibility (kIsWebearly return). - DOCS: Add Web Support guide (
help/WEB-SUPPORT.md) with full API compatibility matrix. - DOCS: Update README with web platform in architecture table and documentation links.
- CHORE: Bump all platform dependencies to ^0.5.0.
0.4.0 #
- FEAT:
getMotionPermissionStatus()andrequestMotionPermission()APIs for activity recognition permission. - FIX: Speed always zero in motionchange events — track
lastEffectiveSpeedacross location updates. - DOCS: Split README into focused help guides (Permissions, Background Tracking, API, Configuration).
- DOCS: Add side-by-side Android/iOS demo recordings.
- CHORE: Bump all platform dependencies to ^0.4.0.
- CHORE: Format all Dart files.
0.3.0 #
- FEAT: One-shot location —
getCurrentPosition()now supportspersist,samples,maximumAge, andextrasparameters for enterprise single-time location requests. - FEAT:
getLastKnownLocation()— returns the last cached location without triggering the GPS, ornullif unavailable. - FEAT:
ForegroundServiceConfig.enabled— disable foreground service/notification for lightweight one-shot requests. - BREAKING: Bump all platform dependencies to ^0.3.0.
0.2.5 #
- Fix LICENSE file format for proper SPDX detection on pub.dev.
- Bump
tracelet_androiddependency to ^0.2.3. - Bump
tracelet_iosdependency to ^0.2.4.
0.2.4 #
- Bump
tracelet_androiddependency to ^0.2.2 (fixes config not applied to foreground notification). - Bump
tracelet_iosdependency to ^0.2.3 (fixes config values ignored on iOS).
0.2.3 #
- Bump
tracelet_iosdependency to ^0.2.2 (fixes iOSConfigManagercrash).
0.2.2 #
- Fix dangling library doc comment lint in
_helpers.dart.
0.2.1 #
- Add
tracelet_androidandtracelet_iosas explicit dependencies to fix default plugin resolution warnings.
0.2.0 #
- Add
isMovingfield toStatemodel. - Fix
Config.toMap()— use nested map structure to prevent extras key collision. - Fix
watchPositionlistener leak — subscriptions now tracked and cancelled. - Fix
removeListeners()to cancel all Dart-side stream subscriptions. - Change
LogLeveldefault fromofftoinfo. - Complete
==/hashCodeon all sub-config classes. - Extract shared deserialization helpers to reduce code duplication.
- Fix example (
LogConfig→LoggerConfig).
0.1.1 #
- Fix pubspec description length for pub.dev scoring.
- Add SPDX
license: Apache-2.0identifier. - Add
example/main.dartfor pub.dev documentation score.
0.1.0 #
- Initial release.
- Full background geolocation API with 38 public methods.
- 14 real-time event streams (location, motion, geofence, HTTP, etc.).
- Comprehensive config system: GeoConfig, AppConfig, HttpConfig, MotionConfig, GeofenceConfig, PersistenceConfig, LoggerConfig.
- Elasticity-based distance filter scaling.
- Location filtering and denoising.
- Headless Dart execution for background events.
- Scheduling with cron-like expressions.
removeListeners()for centralized cleanup.
