From 638b8e454cba9c3e4bc897188261500800e49168 Mon Sep 17 00:00:00 2001 From: jjangddu Date: Mon, 3 Aug 2026 15:44:13 +0900 Subject: [PATCH] =?UTF-8?q?fix(firmware):=20auto-connect=20=EC=8B=9C=20Sca?= =?UTF-8?q?n=20UI=20=EC=A1=B0=EA=B1=B4=EB=B6=80=20=EC=88=A8=EA=B9=80=20(cl?= =?UTF-8?q?oud-mvp=20d0e5ca7=20=EC=9D=B4=EC=8B=9D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit target 설정된 상태 (auto-connect 성공) 에서는 Scan 버튼 · Devices 리스트 숨김. target 없거나 IDLE/SCANNING phase 에서만 노출. Fallback: 연결 없이 진입하거나 auto-connect 실패 시 기존 스캔 UI 유지. Co-Authored-By: Claude Opus 4.7 --- .../firmware/ui/FirmwareUpdateView.kt | 72 ++++++++++--------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/com/medithings/vesiscan/firmware/ui/FirmwareUpdateView.kt b/app/src/main/java/com/medithings/vesiscan/firmware/ui/FirmwareUpdateView.kt index 185bfca..b486fc9 100644 --- a/app/src/main/java/com/medithings/vesiscan/firmware/ui/FirmwareUpdateView.kt +++ b/app/src/main/java/com/medithings/vesiscan/firmware/ui/FirmwareUpdateView.kt @@ -233,16 +233,19 @@ fun DfuScreen(manager: DfuManager, modifier: Modifier = Modifier) { } // ── Actions ─────────────────────────────────────────────────────────────────────── + // 2026-08-03: auto-connect 로 대부분 target 즉시 설정됨. + // target 없는 경우 (fresh install · 새 기기) 에만 수동 Scan/Stop 노출. + val hasTarget = target != null Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { - // Keyed off the phase, not the scanner: the DFU re-scan also runs the scanner, and - // stopping that one from here would abort the update. - if (phase == DfuPhase.SCANNING) { - OutlinedButton(onClick = { manager.stopScan() }) { Text("Stop") } - } else { - OutlinedButton( - onClick = { manager.startScan() }, - enabled = !manager.isBusy, - ) { Text("Scan") } + if (!hasTarget || phase == DfuPhase.IDLE || phase == DfuPhase.SCANNING) { + if (phase == DfuPhase.SCANNING) { + OutlinedButton(onClick = { manager.stopScan() }) { Text("Stop") } + } else { + OutlinedButton( + onClick = { manager.startScan() }, + enabled = !manager.isBusy, + ) { Text("Scan") } + } } Button( @@ -261,31 +264,32 @@ fun DfuScreen(manager: DfuManager, modifier: Modifier = Modifier) { } } - // ── Discovered devices ──────────────────────────────────────────────────────────── - Text( - "Devices (${manager.devices.size})", - style = MaterialTheme.typography.labelLarge, - ) - Card(modifier = Modifier.fillMaxWidth().heightIn(min = 80.dp, max = 220.dp)) { - if (manager.devices.isEmpty()) { - Text( - when (phase) { - DfuPhase.CONNECTED -> "Connected — disconnect to scan again." - DfuPhase.SCANNING -> "Scanning…" - else -> "No devices yet — tap Scan." - }, - modifier = Modifier.padding(12.dp), - style = MaterialTheme.typography.bodySmall, - ) - } else { - LazyColumn { - items(manager.devices, key = { it.address }) { device -> - DeviceRow( - device = device, - enabled = !manager.isBusy, - onClick = { manager.connect(device) }, - ) - HorizontalDivider() + // ── Discovered devices — target 없을 때만 (auto-connect 실패 · 첫 사용) ──────── + if (!hasTarget) { + Text( + "Devices (${manager.devices.size})", + style = MaterialTheme.typography.labelLarge, + ) + Card(modifier = Modifier.fillMaxWidth().heightIn(min = 80.dp, max = 220.dp)) { + if (manager.devices.isEmpty()) { + Text( + when (phase) { + DfuPhase.SCANNING -> "Scanning…" + else -> "No devices yet — tap Scan." + }, + modifier = Modifier.padding(12.dp), + style = MaterialTheme.typography.bodySmall, + ) + } else { + LazyColumn { + items(manager.devices, key = { it.address }) { device -> + DeviceRow( + device = device, + enabled = !manager.isBusy, + onClick = { manager.connect(device) }, + ) + HorizontalDivider() + } } } }