fix: 매 connect 마다 device-specific state 리셋

증상: 디바이스 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으로 보임 →
정확. 응답 도착하면 즉시 새 값 반영.
This commit is contained in:
2026-06-12 11:14:00 +09:00
parent 2f8a21505e
commit 2d32949a14
@@ -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)