import 'package:flutter/foundation.dart'; import '../../data/repositories/settings_repository.dart'; import 'gps_speed_controller.dart'; import 'weather_controller.dart'; /// Persisted Home visibility and source choices for speed and temperature. /// /// OBD-II is preferred when it is connected and fresh; GPS and the weather /// provider are the fallbacks. Turning either row on with a GPS source asks for /// location permission, and turning temperature off stops the weather poller so /// CarDash keeps working quietly when the row is hidden. class TelemetrySettingsController extends ChangeNotifier { TelemetrySettingsController(this._settings, this._weather, this._gps); final SettingsRepository _settings; final WeatherController _weather; final GpsSpeedController _gps; bool _speedEnabled = true; bool _speedUseObd = true; bool _temperatureEnabled = false; bool _temperatureUseObd = true; bool _disposed = false; bool get speedEnabled => _speedEnabled; bool get speedUseObd => _speedUseObd; bool get temperatureEnabled => _temperatureEnabled; bool get temperatureUseObd => _temperatureUseObd; bool get weatherEnabled => _weather.enabled; String? get weatherError => _weather.error; void initialize() { _speedEnabled = _settings.speedEnabled; _speedUseObd = _settings.speedUseObd; _temperatureEnabled = _settings.temperatureEnabled; _temperatureUseObd = _settings.temperatureUseObd; _weather.restoreEnabled( _temperatureEnabled && _settings.weatherLocationTemperature, ); } /// Returns false when the speed switch is on but GPS fallback permission was /// denied and OBD-II is not configured as the source. Future setSpeedEnabled(bool value) async { if (value == _speedEnabled) return true; _speedEnabled = value; _notify(); await _settings.setSpeedEnabled(value); if (!value || !_needsGpsSpeed) return true; return _gps.requestPermission(); } Future setSpeedUseObd(bool value) async { if (value == _speedUseObd) return true; _speedUseObd = value; _notify(); await _settings.setSpeedUseObd(value); if (value || !_speedEnabled || !_needsGpsSpeed) return true; return _gps.requestPermission(); } /// GPS is the source whenever the adapter is not configured or OBD speed is /// explicitly off. A configured-but-disconnected adapter keeps OBD selected. bool get _needsGpsSpeed => !_speedUseObd || _settings.obdAdapterAddress == null; /// Returns false when the temperature switch is on but location permission /// for the weather fallback was denied. OBD-II temperature can still work. Future setTemperatureEnabled(bool value) async { if (value == _temperatureEnabled) return true; _temperatureEnabled = value; _notify(); await _settings.setTemperatureEnabled(value); if (!value) { await _settings.setWeatherLocationTemperature(false); await _weather.setEnabled(false); return true; } return _enableWeather(); } Future setTemperatureUseObd(bool value) async { if (value == _temperatureUseObd) return true; _temperatureUseObd = value; _notify(); await _settings.setTemperatureUseObd(value); if (!value && _temperatureEnabled) { return _enableWeather(); } return true; } Future _enableWeather() async { final granted = await _weather.setEnabled(true); if (granted) { await _settings.setWeatherLocationTemperature(true); } _notify(); return granted; } void _notify() { if (!_disposed) notifyListeners(); } @override void dispose() { _disposed = true; super.dispose(); } }