telemetry_settings_controller.dart 2.9 KB

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