evaluateAdaptiveSettings static method
Evaluates current conditions and updates tracking settings if needed.
This method:
- Checks if adaptive tracking is enabled
- Prevents re-entrancy during evaluation
- Calculates optimal settings based on speed, battery, location, etc.
- Applies settings only if they differ from current (debouncing)
- Updates the native config via
LocusConfig.setConfig
Called automatically on location/activity/motion events.
Implementation
static Future<void> evaluateAdaptiveSettings() async {
if (_adaptiveConfig == null || !_adaptiveConfig!.enabled) {
// Only log once, not on every evaluation attempt
return;
}
if (_isEvaluatingAdaptiveSettings) return;
_isEvaluatingAdaptiveSettings = true;
try {
final settings = await calculateAdaptiveSettings();
// Debounce: only update if settings changed significantly
if (_currentAdaptiveSettings?.distanceFilter == settings.distanceFilter &&
_currentAdaptiveSettings?.desiredAccuracy ==
settings.desiredAccuracy &&
_currentAdaptiveSettings?.heartbeatInterval ==
settings.heartbeatInterval &&
_currentAdaptiveSettings?.gpsEnabled == settings.gpsEnabled) {
return;
}
_currentAdaptiveSettings = settings;
// Update config
debugPrint('[Locus] Applying adaptive settings: $settings');
await LocusConfig.setConfig(Config(
desiredAccuracy: settings.desiredAccuracy,
distanceFilter: settings.distanceFilter,
locationUpdateInterval: settings.heartbeatInterval * 1000,
// Also update heartbeat interval itself if using heartbeat mechanism
heartbeatInterval: settings.heartbeatInterval,
));
} catch (e) {
// Only log for unexpected errors, not MissingPluginException in tests
if (!e.toString().contains('MissingPluginException')) {
debugPrint('[Locus] Adaptive tracking error: $e');
}
} finally {
_isEvaluatingAdaptiveSettings = false;
}
}