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 1717bf4..dd45b33 100644 --- a/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt +++ b/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt @@ -376,9 +376,14 @@ class BleManager private constructor(private val context: Context) { } val silenceMs = System.currentTimeMillis() - lastRxTimestamp - debugLogger.info("WATCHDOG_CHECK silence=${silenceMs}ms connected=${isConnected.value}") + val connected = isConnected.value + debugLogger.info("WATCHDOG_CHECK silence=${silenceMs}ms connected=$connected") - if (!isConnected.value) continue + // connected=false면 정상 경로에서 이미 처리됨 → watchdog 종료 + if (!connected) { + debugLogger.info("WATCHDOG_STOP — already disconnected (handled by GATT callback)") + break + } if (silenceMs > watchdogTimeoutMs) { // 직접 로그 기록 (handler 블로킹 무관) @@ -551,7 +556,12 @@ class BleManager private constructor(private val context: Context) { connectionTimer = null if (status != BluetoothGatt.GATT_SUCCESS && newState != BluetoothProfile.STATE_CONNECTED) { - loge { "GATT connection failed with status: $status" } + val wasConnected = isConnected.value + loge { "GATT error: status=$status newState=$newState wasConnected=$wasConnected" } + debugLogger.error("GATT_ERROR status=$status newState=$newState wasConnected=$wasConnected") + + stopBatteryPolling() + stopWatchdog() bluetoothGatt = null txCharacteristic = null rxCharacteristic = null @@ -563,7 +573,11 @@ class BleManager private constructor(private val context: Context) { gatt.close() - if (reconnectAttempt > 0 && lastConnectedAddress != null) { + if (wasConnected && lastConnectedAddress != null && !isUserDisconnect) { + debugLogger.disconnected("gatt_error", status) + onUnexpectedDisconnect?.invoke() + scheduleAutoReconnect() + } else if (reconnectAttempt > 0 && lastConnectedAddress != null) { scheduleAutoReconnect() } else { isReconnecting.value = false