fix(eq): seed device ID at startup and add device management UI
Fix multi-device EQ auto-switching by calling obtenerDispositivoActual() during cargarPersistido() to seed the initial device ID. Add device management modal with rename support, EQ preset editing, and connection status indicator. Translate device UI keys to all 13 locales.
This commit is contained in:
@@ -51,6 +51,9 @@ class EstadoEcualizador extends ChangeNotifier {
|
||||
/// Matrix presets: "stationUuid:deviceId" → PresetEcualizador.
|
||||
final Map<String, PresetEcualizador> _presetsMatriz = {};
|
||||
|
||||
/// Custom display names for devices: deviceId → custom name.
|
||||
final Map<String, String> _nombresDispositivos = {};
|
||||
|
||||
PresetEcualizador _presetPrincipal = PresetEcualizador.flat;
|
||||
PresetEcualizador _presetActual = PresetEcualizador.flat;
|
||||
bool _activo = true;
|
||||
@@ -65,6 +68,9 @@ class EstadoEcualizador extends ChangeNotifier {
|
||||
bool get eqMultiDeviceEnabled => _eqMultiDeviceEnabled;
|
||||
String? get dispositivoActualId => _dispositivoActualId;
|
||||
|
||||
Map<String, String> get nombresDispositivos =>
|
||||
Map.unmodifiable(_nombresDispositivos);
|
||||
|
||||
Map<String, PresetEcualizador> get presetsPorEmisora =>
|
||||
Map.unmodifiable(_presetsEmisoraMap);
|
||||
|
||||
@@ -148,6 +154,9 @@ class EstadoEcualizador extends ChangeNotifier {
|
||||
_presetsMatriz
|
||||
..clear()
|
||||
..addAll(config.presetsMatriz);
|
||||
_nombresDispositivos
|
||||
..clear()
|
||||
..addAll(config.nombresDispositivos);
|
||||
|
||||
// Resolve active preset and apply it.
|
||||
_presetActual = _resolverPresetActivo();
|
||||
@@ -156,6 +165,11 @@ class EstadoEcualizador extends ChangeNotifier {
|
||||
|
||||
// Subscribe to device changes only when toggle is on.
|
||||
_configurarSuscripcionDispositivo();
|
||||
|
||||
// Seed current device immediately so presets resolve before first event.
|
||||
if (_eqMultiDeviceEnabled) {
|
||||
await _sembrarDispositivoActual();
|
||||
}
|
||||
} catch (_) {
|
||||
_presetPrincipal = PresetEcualizador.flat;
|
||||
_presetActual = PresetEcualizador.flat;
|
||||
@@ -164,6 +178,20 @@ class EstadoEcualizador extends ChangeNotifier {
|
||||
_presetsEmisoraMap.clear();
|
||||
_presetsDispositivo.clear();
|
||||
_presetsMatriz.clear();
|
||||
_nombresDispositivos.clear();
|
||||
}
|
||||
}
|
||||
|
||||
/// Queries the current device and seeds [_dispositivoActualId] without
|
||||
/// waiting for a stream event. Falls back to `'builtin_speaker'` on error.
|
||||
Future<void> _sembrarDispositivoActual() async {
|
||||
final svc = _dispositivoAudio;
|
||||
if (svc == null) return;
|
||||
try {
|
||||
final dispositivo = await svc.obtenerDispositivoActual();
|
||||
await _onDispositivoCambiado(dispositivo);
|
||||
} catch (_) {
|
||||
_dispositivoActualId = 'builtin_speaker';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -280,6 +308,55 @@ class EstadoEcualizador extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
/// Persists a custom display name for [deviceId].
|
||||
///
|
||||
/// Empty names are silently ignored so the existing name is preserved.
|
||||
/// No-op when the multi-device toggle is off.
|
||||
Future<void> renombrarDispositivo(String deviceId, String nombre) async {
|
||||
if (!_eqMultiDeviceEnabled) return;
|
||||
final nombreTrimmed = nombre.trim();
|
||||
if (nombreTrimmed.isEmpty) return;
|
||||
_nombresDispositivos[deviceId] = nombreTrimmed;
|
||||
await servicio.guardarNombresDispositivos(
|
||||
Map.unmodifiable(_nombresDispositivos),
|
||||
);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// Persists a per-device EQ preset for [deviceId].
|
||||
///
|
||||
/// Guards on [_eqMultiDeviceEnabled]: no-op when toggle is off.
|
||||
/// If [deviceId] is the currently active device, re-resolves and
|
||||
/// applies the effective preset immediately.
|
||||
Future<void> guardarPresetDispositivo(
|
||||
String deviceId,
|
||||
PresetEcualizador preset,
|
||||
) async {
|
||||
if (!_eqMultiDeviceEnabled) return;
|
||||
_presetsDispositivo[deviceId] = preset;
|
||||
await servicio.guardarPresetDispositivo(deviceId, preset);
|
||||
if (_dispositivoActualId == deviceId) {
|
||||
// Re-resolve using the full hierarchy (station/matrix may override).
|
||||
final resuelto = _resolverPresetActivo();
|
||||
_presetActual = resuelto;
|
||||
await audio.aplicarPreset(resuelto);
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// Returns the stored custom name for [deviceId], or an empty string if none.
|
||||
String obtenerNombreDispositivo(String deviceId) =>
|
||||
_nombresDispositivos[deviceId] ?? '';
|
||||
|
||||
/// Resolves the display name for [deviceId] using the fallback chain:
|
||||
/// custom name → [platformName] → raw [deviceId].
|
||||
String nombreVisible(String deviceId, String platformName) {
|
||||
final custom = _nombresDispositivos[deviceId];
|
||||
if (custom != null && custom.isNotEmpty) return custom;
|
||||
if (platformName.isNotEmpty) return platformName;
|
||||
return deviceId;
|
||||
}
|
||||
|
||||
Future<void> cambiarActivo(bool activo) async {
|
||||
_activo = activo;
|
||||
await servicio.guardarActivo(activo);
|
||||
|
||||
Reference in New Issue
Block a user