Exportar e importar absolutamente toda la información de las preferencias de la aplicación
This commit is contained in:
@@ -899,32 +899,74 @@ class EstadoRadio extends ChangeNotifier {
|
||||
|
||||
// ── Export / Import ───────────────────────────────────────────────────────
|
||||
|
||||
/// Genera el JSON de toda la configuración.
|
||||
static const _keyAlarmasConfig = 'alarmas_musicales_v1';
|
||||
|
||||
/// Genera el JSON de toda la configuración (v2 — portabilidad completa).
|
||||
Future<Map<String, dynamic>> exportarConfig() async {
|
||||
final favs = await favoritos.obtenerTodos();
|
||||
final grupos = await favoritos.obtenerGrupos();
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
|
||||
// Alarmas: leemos el JSON crudo de SharedPreferences para no duplicar
|
||||
// lógica de ServicioAlarmas y evitar inyectar una dependencia nueva.
|
||||
final alarmasRaw = prefs.getString(_keyAlarmasConfig);
|
||||
final alarmasData =
|
||||
alarmasRaw != null ? jsonDecode(alarmasRaw) as Map<String, dynamic> : null;
|
||||
|
||||
return {
|
||||
'version': 1,
|
||||
'version': 2,
|
||||
'exportedAt': DateTime.now().toIso8601String(),
|
||||
// Favoritos + grupos (preserva asignaciones grupo_id en cada emisora)
|
||||
'gruposFavoritos':
|
||||
grupos
|
||||
.where((g) => !g.esSinAsignar)
|
||||
.map((g) => g.toMap())
|
||||
.toList(),
|
||||
'favoritos': favs.map((e) => e.toMap()).toList(),
|
||||
// Emisoras personalizadas
|
||||
'emisorasCustom': _emisorasCustom.map((e) => e.toMap()).toList(),
|
||||
// Ecualizador
|
||||
'presetPrincipalEcualizador': _presetPrincipal.toJson(),
|
||||
'presetsEcualizador': _presetsEmisoraMap.map(
|
||||
(uuid, preset) => MapEntry(uuid, preset.toJson()),
|
||||
),
|
||||
// Alarmas completas (alarmas + vacaciones + excepciones)
|
||||
'alarmas': alarmasData,
|
||||
// Preferencias de usuario
|
||||
'emisoraPreferidaUuid': _emisoraPreferidaUuid,
|
||||
'ordenListas': _ordenListas.name,
|
||||
'timerSuenoPresetsSegundos': _timerSuenoPresetsSegundos,
|
||||
};
|
||||
}
|
||||
|
||||
/// Importa configuración desde un JSON exportado previamente.
|
||||
/// Soporta v1 (sin grupos, sin alarmas) y v2 (portabilidad completa).
|
||||
Future<void> importarConfig(Map<String, dynamic> data) async {
|
||||
final version = data['version'] as int? ?? 1;
|
||||
if (version != 1) throw Exception(_textos.unsupportedConfigVersion);
|
||||
if (version > 2) throw Exception(_textos.unsupportedConfigVersion);
|
||||
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
|
||||
// ── Grupos de favoritos (v2) ──────────────────────────────────────────
|
||||
// Restauramos primero para que al agregar favoritos ya existan los grupos.
|
||||
if (version >= 2) {
|
||||
final gruposRaw = data['gruposFavoritos'] as List? ?? [];
|
||||
for (final raw in gruposRaw) {
|
||||
final g = GrupoFavoritos.fromMap(Map<String, dynamic>.from(raw as Map));
|
||||
// Usamos insert directo para preservar id, orden y nombre originales.
|
||||
await favoritos.restaurarGrupo(g);
|
||||
}
|
||||
await cargarGruposFavoritos();
|
||||
}
|
||||
|
||||
// ── Favoritos ─────────────────────────────────────────────────────────
|
||||
final favRaw = data['favoritos'] as List? ?? [];
|
||||
for (final raw in favRaw) {
|
||||
final emisora = Emisora.fromMap(Map<String, dynamic>.from(raw as Map));
|
||||
await favoritos.agregar(emisora);
|
||||
}
|
||||
|
||||
// ── Emisoras custom ───────────────────────────────────────────────────
|
||||
final customRaw = data['emisorasCustom'] as List? ?? [];
|
||||
_emisorasCustom =
|
||||
customRaw
|
||||
@@ -932,6 +974,7 @@ class EstadoRadio extends ChangeNotifier {
|
||||
.toList();
|
||||
await _guardarEmisorasCustom();
|
||||
|
||||
// ── Ecualizador ───────────────────────────────────────────────────────
|
||||
final principalRaw = data['presetPrincipalEcualizador'];
|
||||
if (principalRaw is Map) {
|
||||
_presetPrincipal = PresetEcualizador.desdeJson(
|
||||
@@ -968,6 +1011,42 @@ class EstadoRadio extends ChangeNotifier {
|
||||
actual == null ? _presetPrincipal : _presetParaEmisora(actual.uuid);
|
||||
await _aplicarPresetActivo(presetActivo);
|
||||
|
||||
// ── Alarmas (v2) ──────────────────────────────────────────────────────
|
||||
if (version >= 2) {
|
||||
final alarmasData = data['alarmas'];
|
||||
if (alarmasData is Map<String, dynamic>) {
|
||||
// Escribimos el bloque JSON tal como estaba en el dispositivo origen.
|
||||
// ServicioAlarmas lo leerá con su propio fromJson al siguiente acceso.
|
||||
await prefs.setString(_keyAlarmasConfig, jsonEncode(alarmasData));
|
||||
}
|
||||
}
|
||||
|
||||
// ── Preferencias de usuario (v2) ──────────────────────────────────────
|
||||
if (version >= 2) {
|
||||
final preferidaUuid = data['emisoraPreferidaUuid'] as String?;
|
||||
_emisoraPreferidaUuid = preferidaUuid;
|
||||
if (preferidaUuid == null) {
|
||||
await prefs.remove(_keyEmisoraPreferida);
|
||||
} else {
|
||||
await prefs.setString(_keyEmisoraPreferida, preferidaUuid);
|
||||
}
|
||||
|
||||
final ordenRaw = data['ordenListas'] as String?;
|
||||
_ordenListas = switch (ordenRaw) {
|
||||
'nombre' => OrdenEmisoras.nombre,
|
||||
'calidad' => OrdenEmisoras.calidad,
|
||||
_ => OrdenEmisoras.calidad,
|
||||
};
|
||||
await prefs.setString(_keyOrdenListas, _ordenListas.name);
|
||||
|
||||
final timerPresetsRaw = data['timerSuenoPresetsSegundos'] as List?;
|
||||
if (timerPresetsRaw != null) {
|
||||
await guardarTimerSuenoPresetsSegundos(
|
||||
timerPresetsRaw.whereType<num>().map((n) => n.toInt()).toList(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
await cargarFavoritos();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user