startTracking method

Future<bool> startTracking([
  1. LocationSettings? settings
])

Start tracking location

Implementation

Future<bool> startTracking([LocationSettings? settings]) async {
  try {
    if (_isTracking) {
      debugPrint('Location tracking is already active');
      return true;
    }

    final permission = await checkPermission();
    if (!permission.isGranted) {
      _errorController.add('Location permission not granted');
      return false;
    }

    _currentSettings = settings ?? const LocationSettings();

    // If background tracking is enabled, check background permission
    if (_currentSettings!.enableBackgroundTracking) {
      if (defaultTargetPlatform == TargetPlatform.android) {
        final backgroundPermission = await Permission.locationAlways.status;
        if (!backgroundPermission.isGranted) {
          _errorController.add(
              'Background location permission not granted. Please request it first.');
          return false;
        }
      }
    }

    final locationSettings = _getLocationSettings(
      _currentSettings!.accuracy,
      distanceFilter: _currentSettings!.distanceFilter,
      timeInterval: _currentSettings!.timeInterval,
    );

    _positionStreamSubscription = geo.Geolocator.getPositionStream(
      locationSettings: locationSettings,
    ).listen(
      (geo.Position position) {
        final locationData = _convertPosition(position);

        // Filter mock locations if not allowed
        if (!_currentSettings!.allowMockLocations && locationData.isMocked) {
          _errorController.add('Mock location detected and filtered');
          return;
        }

        _lastLocation = locationData;
        _locationController.add(locationData);
      },
      onError: (error) {
        _errorController.add('Location stream error: $error');
      },
    );

    _isTracking = true;
    debugPrint('Location tracking started');
    return true;
  } catch (e) {
    _errorController.add('Failed to start tracking: $e');
    return false;
  }
}