From 2d32949a1412653d0ec41679cea74359b7ea55ba Mon Sep 17 00:00:00 2001 From: jjangddu Date: Fri, 12 Jun 2026 11:14:00 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=A7=A4=20connect=20=EB=A7=88=EB=8B=A4?= =?UTF-8?q?=20device-specific=20state=20=EB=A6=AC=EC=85=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 증상: 디바이스 A → B 로 스위치 시 firmware/battery/serial 이 이전 디바이스 값으로 잠깐 그대로 노출됨. STATE_DISCONNECTED 콜백이 안 떴거나 다른 디바이스로 즉시 스위치하는 경우. 원인: BleManager 가 singleton 이라 state 가 연결-연결 사이에 유지됨. 새 mid?/msn? 응답 받기 전까진 이전 디바이스 값이 보임 → 사용자가 잘못된 정보로 진단. 수정: - connect(BleDevice) 진입부에 firmwareVersion / hardwareVersion / serialNumber / batteryLevel / connectedDeviceName / isServiceReady 모두 reset - reconnectToLastDevice 도 동일 처리 - connectByAddress 는 connect 위임 → 자동 커버 연결 시작 ~ mid?/msn? 응답 도착 사이 잠깐 빈 값/0으로 보임 → 정확. 응답 도착하면 즉시 새 값 반영. --- .../medilightv2android/ble/BleManager.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt b/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt index 64900c4..ace2b0e 100644 --- a/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt +++ b/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt @@ -223,6 +223,16 @@ class BleManager private constructor(private val context: Context) { rxCharacteristic = null } + // 이전 디바이스의 state 가 남아있는 걸 방지 — 매 connect 마다 fresh. + // 새 mid?/msn? 응답 받기 전까진 빈 값으로 보임 → 정확. + // (STATE_DISCONNECTED 콜백이 안 떴거나 다른 디바이스로 바로 스위치하는 경우 대응) + firmwareVersion.value = "" + hardwareVersion.value = "" + serialNumber.value = "" + batteryLevel.value = 0 + connectedDeviceName.value = "" + isServiceReady.value = false + val idx = discoveredDevices.indexOfFirst { it.address == bleDevice.address } if (idx >= 0) discoveredDevices[idx] = discoveredDevices[idx].copy(isConnecting = true) @@ -402,6 +412,14 @@ class BleManager private constructor(private val context: Context) { bluetoothGatt = null } + // 이전 디바이스 state fresh (다른 디바이스로 스위치하는 reconnect 케이스 대비) + firmwareVersion.value = "" + hardwareVersion.value = "" + serialNumber.value = "" + batteryLevel.value = 0 + connectedDeviceName.value = "" + isServiceReady.value = false + isReconnecting.value = true val device = bluetoothAdapter.getRemoteDevice(lastDeviceAddress) bluetoothGatt = device.connectGatt(context, false, gattCallback, BluetoothDevice.TRANSPORT_LE)