telemetry_settings_controller.dart 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import 'package:flutter/foundation.dart';
  2. import '../../data/repositories/settings_repository.dart';
  3. import 'gps_speed_controller.dart';
  4. import 'weather_controller.dart';
  5. /// Persisted Home visibility and source choices for speed and temperature.
  6. ///
  7. /// OBD-II is preferred when it is connected and fresh; GPS and the weather
  8. /// provider are the fallbacks. Turning either row on with a GPS source asks for
  9. /// location permission, and turning temperature off stops the weather poller so
  10. /// CarDash keeps working quietly when the row is hidden.
  11. class TelemetrySettingsController extends ChangeNotifier {
  12. TelemetrySettingsController(this._settings, this._weather, this._gps);
  13. final SettingsRepository _settings;
  14. final WeatherController _weather;
  15. final GpsSpeedController _gps;
  16. bool _speedEnabled = true;
  17. bool _speedUseObd = true;
  18. bool _temperatureEnabled = false;
  19. bool _temperatureUseObd = true;
  20. bool _disposed = false;
  21. bool get speedEnabled => _speedEnabled;
  22. bool get speedUseObd => _speedUseObd;
  23. bool get temperatureEnabled => _temperatureEnabled;
  24. bool get temperatureUseObd => _temperatureUseObd;
  25. bool get weatherEnabled => _weather.enabled;
  26. String? get weatherError => _weather.error;
  27. void initialize() {
  28. _speedEnabled = _settings.speedEnabled;
  29. _speedUseObd = _settings.speedUseObd;
  30. _temperatureEnabled = _settings.temperatureEnabled;
  31. _temperatureUseObd = _settings.temperatureUseObd;
  32. _weather.restoreEnabled(
  33. _temperatureEnabled && _settings.weatherLocationTemperature,
  34. );
  35. }
  36. /// Returns false when the speed switch is on but GPS fallback permission was
  37. /// denied and OBD-II is not configured as the source.
  38. Future<bool> setSpeedEnabled(bool value) async {
  39. if (value == _speedEnabled) return true;
  40. _speedEnabled = value;
  41. _notify();
  42. await _settings.setSpeedEnabled(value);
  43. if (!value || !_needsGpsSpeed) return true;
  44. return _gps.requestPermission();
  45. }
  46. Future<bool> setSpeedUseObd(bool value) async {
  47. if (value == _speedUseObd) return true;
  48. _speedUseObd = value;
  49. _notify();
  50. await _settings.setSpeedUseObd(value);
  51. if (value || !_speedEnabled || !_needsGpsSpeed) return true;
  52. return _gps.requestPermission();
  53. }
  54. /// GPS is the source whenever the adapter is not configured or OBD speed is
  55. /// explicitly off. A configured-but-disconnected adapter keeps OBD selected.
  56. bool get _needsGpsSpeed =>
  57. !_speedUseObd || _settings.obdAdapterAddress == null;
  58. /// Returns false when the temperature switch is on but location permission
  59. /// for the weather fallback was denied. OBD-II temperature can still work.
  60. Future<bool> setTemperatureEnabled(bool value) async {
  61. if (value == _temperatureEnabled) return true;
  62. _temperatureEnabled = value;
  63. _notify();
  64. await _settings.setTemperatureEnabled(value);
  65. if (!value) {
  66. await _settings.setWeatherLocationTemperature(false);
  67. await _weather.setEnabled(false);
  68. return true;
  69. }
  70. return _enableWeather();
  71. }
  72. Future<bool> setTemperatureUseObd(bool value) async {
  73. if (value == _temperatureUseObd) return true;
  74. _temperatureUseObd = value;
  75. _notify();
  76. await _settings.setTemperatureUseObd(value);
  77. if (!value && _temperatureEnabled) {
  78. return _enableWeather();
  79. }
  80. return true;
  81. }
  82. Future<bool> _enableWeather() async {
  83. final granted = await _weather.setEnabled(true);
  84. if (granted) {
  85. await _settings.setWeatherLocationTemperature(true);
  86. }
  87. _notify();
  88. return granted;
  89. }
  90. void _notify() {
  91. if (!_disposed) notifyListeners();
  92. }
  93. @override
  94. void dispose() {
  95. _disposed = true;
  96. super.dispose();
  97. }
  98. }