feat(eq): name Bluetooth devices from the system pairing list
A Bluetooth device only reports its own name through AudioDeviceInfo.productName while it is enumerated as an active output, i.e. while it is connected. Paired-but-switched-off devices therefore had no name to fall back on, and the platform-name cache is in-memory only by design (bt-device-identity ADR-4), so it self-heals per session ONLY for whatever happens to be connected. Every other device showed its raw id. Android already knows those names: BluetoothAdapter.getBondedDevices() lists every pairing with its name and MAC, connected or not, and nothing in this app was asking. Read it and seed the platform-name cache from it, keyed bt_a2dp:<uppercase MAC> to match the ids the audio layer emits. Seeded BEFORE the active-device query so a live enumeration name, being the fresher of the two, still wins; a user's custom name outranks both. Re-read on refrescarDispositivoActual so pairing or renaming a device in system settings shows up as soon as the list becomes visible. Reading the bond list is gated by BLUETOOTH_CONNECT from API 31 and by the legacy BLUETOOTH permission below it, so declare the latter with maxSdkVersion 30. It is a normal permission: granted at install, no runtime prompt, no new friction. When the answer is unavailable — permission denied, no adapter, Bluetooth off — both layers return an empty map rather than throwing, and the row degrades to the id exactly as before. Does not help rows persisted under a bt_a2dp:name: placeholder id: those never had a MAC to match against.
This commit is contained in:
+16
-1
@@ -465,6 +465,11 @@ class FakeServicioDispositivoAudioThrows extends ServicioDispositivoAudio {
|
||||
throw Exception('Platform channel error: device unavailable');
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Map<String, String>> obtenerNombresEmparejados() async {
|
||||
throw Exception('Platform channel error: bonded devices unavailable');
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> resubscribir() async {
|
||||
resubscribirLlamadas++;
|
||||
@@ -485,7 +490,17 @@ class FakeServicioDispositivoAudioThrows extends ServicioDispositivoAudio {
|
||||
/// Use [emitirDispositivo] to push device change events without needing
|
||||
/// a real platform channel.
|
||||
class FakeServicioDispositivoAudio extends ServicioDispositivoAudio {
|
||||
FakeServicioDispositivoAudio({this.permisoBluetoothConcedido = true});
|
||||
FakeServicioDispositivoAudio({
|
||||
this.permisoBluetoothConcedido = true,
|
||||
this.nombresEmparejados = const {},
|
||||
});
|
||||
|
||||
/// MAC → name entries the system would report for PAIRED devices.
|
||||
final Map<String, String> nombresEmparejados;
|
||||
|
||||
@override
|
||||
Future<Map<String, String>> obtenerNombresEmparejados() async =>
|
||||
nombresEmparejados;
|
||||
|
||||
/// Value returned by [solicitarPermisoBluetooth] (bt-device-identity
|
||||
/// Phase 2/4 testing strategy — defaults to granted so existing tests
|
||||
|
||||
Reference in New Issue
Block a user