locus 1.2.0
locus: ^1.2.0 copied to clipboard
Background geolocation SDK for Flutter. Native tracking, geofencing, activity recognition, and sync.
Changelog #
All notable changes to this project will be documented in this file.
1.2.0 - 2026-01-03 #
Breaking #
- Internal imports were reorganized into feature-first barrels. Any direct imports under
package:locus/src/core/...,package:locus/src/services/..., orpackage:locus/src/models/...from 1.1.x will break. Migrate to the public barrels exposed by lib/locus.dart or, for advanced/internal use, the consolidated lib/src/models.dart and lib/src/services.dart.
Added #
- Polygon Geofences: Define complex boundaries with arbitrary shapes using
PolygonGeofence. Supports enter/exit detection with efficient ray-casting algorithm. - Privacy Zones: New privacy protection feature allowing users to exclude, obfuscate, or reduce accuracy in sensitive areas.
- Trip Tracking: Automatic trip detection with start/end events, route recording, and trip summaries.
- Geofence Workflows: Multi-step geofence sequences with timeouts for complex location-based flows.
- Tracking Profiles: Pre-defined and custom tracking profiles with automatic switching rules.
- Battery Runway: Estimate remaining tracking time based on current battery drain rate.
Changed #
- Architecture: Restructured codebase to feature-first organization (MVVM pattern). Code is now organized by domain (location, geofencing, battery, etc.) rather than by layer (models, services).
- Import Paths: Barrel exports simplified. Use
import 'package:locus/locus.dart'for all public APIs.
Fixed #
- Android: guarded foreground service startup for null intents/notification permission errors and prevented stale geofence payloads from persisting when privacy mode is enabled; geofence restore now clears persisted entries on Play Services failures to keep Dart and native in sync.
- Android: cleaned up cached headless Flutter engines after idle to avoid leaks.
- iOS: startTracking now requests/validates permission before enabling, and significant-change monitoring runs only with Always authorization.
- Dart: start returns disabled state when native start fails instead of assuming enabled; destroy now also invokes native stop/cleanup hooks.
- Dart: location queries honor limit/offset without loading unbounded history; trip engine awaits persistence to avoid dropped saves; enqueue now surfaces native failures instead of returning empty ids.
1.1.0 - 2026-01-01 #
Added #
- Testability: Refactored
Locusto support mocking viasetMockInstance(), enabling robust unit testing for apps using the SDK. - Structured Logging: Replaced flat-file logging with SQLite-based structured logs on Android and iOS. Added
Locus.getLog()returningList<LogEntry>. - Authentication Handling: Implemented smart 401 Unauthorized handling. Sync pauses automatically on 401; use
Locus.resumeSync()after token refresh. - Permissions Workflow: Added
PermissionAssistantto manage complex permission sequences (Location, Activity, Notification) with UI callbacks. - Device Optimization: Added
DeviceOptimizationServiceto detect OEM battery restrictions and guide users to "Don't Kill My App" instructions (Android). - Configuration Presets: Added
Config.fitness()andConfig.passive()factory constructors for quick setup. - iOS Data Persistence: New
SQLiteStorageengine for iOS, providing high-performance persistent storage (replacingUserDefaults). - Custom Sync Body Builder: Added
Locus.setSyncBodyBuilder()to allow full control over HTTP request body structure. Ideal for backends requiring custom JSON envelopes (e.g.,{ ownerId, taskId, polygons: [...] }). - Headless Sync Body Builder: Added
Locus.registerHeadlessSyncBodyBuilder()for background sync with custom body formats, even when the app is terminated. - Native Sync Envelope Support: The
extrasconfig field is now merged at the top level of HTTP sync bodies on both Android and iOS. Combined withhttpRootProperty, this enables custom JSON structures without Dart callbacks. - Developer Experience (DX) Improvements:
- Added
locus_errors.dartwith descriptive exception types (NotInitializedException,SyncUrlNotConfiguredException,HeadlessRegistrationException, etc.). - Headless registration now prints detailed instructions when callback handles fail.
- Native sync adds debug logs explaining why sync was skipped (no URL, paused, etc.).
- Config validator now warns about common issues:
extraswithouthttpRootProperty,autoSyncwithoutbatchSync,enableHeadlesswithoutstopOnTerminate: false.
- Added
- Centralized
LocusConstantsfor all SDK parameters. - Proper
toString()implementations for core models.
Fixed #
- iOS Storage: Migrated storage to SQLite to resolve data truncation issues.
- Platform Parity: Implemented confidence threshold filtering for motion activity on iOS.
- Error Handling: Standardized error responses across platforms.
- Lifecycle Management: Fixed iOS
SyncManagerlifecycle issues. - Test Stability: Resolved unit and integration test flakiness.
Changed #
- Refactored
StorageManagerto utilize the new SQLite backend. - Simplified internal method channel handlers.
- Updated native battery stats to include detailed drain estimates.