import 'package:flutter/foundation.dart'; import 'package:shared_preferences/shared_preferences.dart'; /// Opt-in for reading the REAL audio level behind the waveform visualizer. /// /// This is a sensitive-permission gate, not a cosmetic preference. /// `VisualizadorAudio` subscribes to the native `pluriwave/audio_visualizer` /// EventChannel only while [ondaRealHabilitada] is true, and that /// subscription is precisely what makes `MainActivity` request /// `RECORD_AUDIO`. So the flag must: /// /// * default to `false`, so a fresh install never asks; /// * flip to `true` only from a place where the user has just been told what /// the permission is for (see `PantallaAjustesVisualizador`); /// * be revocable at any time with no friction at all. /// /// Without it the visualizer animates its synthetic wave, which is exactly /// what it already did whenever the permission was denied — nothing about /// the app breaks. class EstadoVisualizador extends ChangeNotifier { EstadoVisualizador({SharedPreferences? prefs}) : _prefs = prefs { _cargar(); } /// Persisted key. Public so tests can assert persistence without /// duplicating the literal. static const String claveOndaReal = 'visualizador_onda_real_v1'; final SharedPreferences? _prefs; bool _ondaRealHabilitada = false; bool get ondaRealHabilitada => _ondaRealHabilitada; Future cambiarOndaReal(bool habilitada) async { if (habilitada == _ondaRealHabilitada) return; _ondaRealHabilitada = habilitada; notifyListeners(); final prefs = await _resolverPrefs(); await prefs.setBool(claveOndaReal, habilitada); } Future _cargar() async { final prefs = await _resolverPrefs(); final guardado = prefs.getBool(claveOndaReal) ?? false; if (guardado == _ondaRealHabilitada) return; _ondaRealHabilitada = guardado; notifyListeners(); } Future _resolverPrefs() async => _prefs ?? SharedPreferences.getInstance(); }