Files
FreeTLab bccc5c48b8
Build & Deploy PluriWave / Análisis de código (push) Successful in 38s
Build & Deploy PluriWave / Build APK + AAB release (push) Successful in 2m30s
docs(openspec): add SDD artifact trail for recent alarm and EQ changes
Persist the exploration, proposal, spec, design, tasks, and
verify/archive reports produced during the multi-device EQ,
alarm-countdown, and notification-visual-polish SDD cycles.
2026-07-04 12:42:11 +02:00

68 lines
2.8 KiB
Markdown

# Design: Multi-Device Equalizer
## Technical Approach
Add a device dimension to the existing 2-level EQ resolution (station > global) by introducing a platform channel bridge for device detection, a Dart service abstraction, and extending `EstadoEcualizador` to resolve through a 4-level hierarchy. Follows existing project patterns: ChangeNotifier state, SharedPreferences persistence via `ServicioEcualizador`, platform channels in `MainActivity.kt`, and constructor-injected fakes for testing.
## Architecture Decisions
### ADR-1: Platform Channel vs Package
**Decision**: Custom platform channel `pluriwave/audio_devices`
- Rationale: Project already has 3 platform channels. Pattern is established. BT MAC from `AudioManager.getDevices()` requires no extra permission.
### ADR-2: Device Service as Abstract Class
**Decision**: Abstract `ServicioDispositivoAudio` with real + fake implementations
- Rationale: Testable without platform channels. Matches existing service pattern.
### ADR-3: Composite Key for Matrix Persistence
**Decision**: `"stationUuid:deviceId"` string key in flat map
- Rationale: Simple serialization. ~80 bytes/entry, predictable SP size.
### ADR-4: Resolution Wiring Point
**Decision**: `EstadoEcualizador` subscribes and resolves internally
- Rationale: Single owner of resolution logic. Handler stays thin and testable.
### ADR-5: EQ Re-application After `_recrearPlayer()`
**Decision**: State layer keeps `_presetActual` updated on device/station change
- Rationale: Handler unchanged. State layer ensures `_presetActual` is always resolved.
### ADR-6: Feature Toggle Scope
**Decision**: SP key `eq_multi_device_enabled_v1` read by `EstadoEcualizador`
- Rationale: Zero behavioral change when off. Toggle at state layer fully isolates feature.
## Data Flow
```
Platform (Android/iOS)
|
AudioDeviceCallback / routeChangeNotification
|
EventChannel: pluriwave/audio_devices
|
ServicioDispositivoAudio (Stream<DispositivoAudio>)
|
EstadoEcualizador (4-level resolution: matrix > station > device > global)
|
aplicarPresetActivo(resolved)
|
ServicioAudio + ServicioEcualizador
```
## File Changes
19 files modified or created:
- `lib/modelos/dispositivo_audio.dart` (NEW)
- `lib/servicios/servicio_dispositivo_audio.dart` (NEW)
- `android/app/src/main/kotlin/.../MainActivity.kt` (MODIFIED)
- `ios/Runner/AudioDevicesPlugin.swift` (NEW)
- `ios/Runner/AppDelegate.swift` (MODIFIED)
- `lib/servicios/servicio_ecualizador.dart` (MODIFIED)
- `lib/estado/estado_ecualizador.dart` (MODIFIED)
- `lib/servicios/servicio_export_import.dart` (MODIFIED)
- `lib/pantallas/pantalla_ajustes.dart` (MODIFIED)
- `lib/l10n/app_en.arb` (MODIFIED)
- `lib/l10n/app_es.arb` (MODIFIED)
- `test/` — 8 new/extended test files
(See Engram observation #2187 for complete design document with all interfaces and contracts)