evaluateAdaptiveSettings static method

Future<void> evaluateAdaptiveSettings()

Evaluates current conditions and updates tracking settings if needed.

This method:

  1. Checks if adaptive tracking is enabled
  2. Prevents re-entrancy during evaluation
  3. Calculates optimal settings based on speed, battery, location, etc.
  4. Applies settings only if they differ from current (debouncing)
  5. 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;
  }
}