| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- 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<bool> 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<bool> 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<bool> 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<bool> setTemperatureUseObd(bool value) async {
- if (value == _temperatureUseObd) return true;
- _temperatureUseObd = value;
- _notify();
- await _settings.setTemperatureUseObd(value);
- if (!value && _temperatureEnabled) {
- return _enableWeather();
- }
- return true;
- }
- Future<bool> _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();
- }
- }
|