fix(clinical): 병원 임상 모드에서 기기 연결로 갈 길이 없었다

"기기를 먼저 연결해 주세요" 라고 안내만 하고 정작 가는 길이 없었다. 연결이 이 모드의
첫 단계인데, 조작자는 홈까지 되돌아가 일반 흐름을 타고 다시 들어와야 했다.

## 복귀처를 불리언이 아니라 값으로
기기 연결 화면은 여러 곳에서 불려 온다. 원래는 `ClinicalSessionStore.inClinicalFlow`
불리언 하나로 "임상 흐름이면 CLINICAL_HOME, 아니면 HOME" 만 갈랐다. 여기에 병원 모드용
불리언을 하나 더 만들면 그 순간부터 두 깃발이 어긋나기 시작한다.

그래서 `AppState.connectReturnScreen` 에 **어디로 돌아갈지를 값으로** 담는다. null 이면
기존 규칙 그대로라 **기존 호출부는 하나도 건드리지 않았다.** 한 번 쓰면 비운다
(consumeConnectReturn) — 안 비우면 다음에 다른 경로로 들어온 연결 화면까지 엉뚱한
곳으로 보낸다.

## 나가는 길이 셋이라 셋 다 손봤다
  · 연결 성공        AppState.deviceConnected()
  · 시스템 뒤로가기   MainActivity BackHandler
  · 화면 안 화살표    AppState.backToSensorSelect()

세 번째에서 기존 문제도 드러났다 — 화면 안 화살표는 `inClinicalFlow` 를 보지 않고 늘
HOME 으로 간다. 시스템 뒤로가기와 목적지가 다르다. 기존부터 그랬고 지금 고치면 임상
흐름의 동작이 바뀌므로 그대로 두고 주석으로 남겼다. 복귀처를 지정한 화면만 두 경로가
같아진다.

## 검증 (실기기 23021RAA2Y)
홈 3연타 → 개발자 모드 → [병원 임상 측정] → [기기 연결] → 검색 화면 →
시스템 뒤로가기 / 화면 안 화살표 **둘 다** 병원 임상 화면으로 복귀. 크래시 0건.
연결 성공 경로는 프로브가 없어 아직 확인 못 했다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-02 17:29:06 +09:00
parent c5dd0fdc3e
commit fba3ef8626
3 changed files with 52 additions and 5 deletions
@@ -23,6 +23,26 @@ enum class AppScreen {
class AppState(private val context: Context) {
var currentScreen by mutableStateOf(AppScreen.ONBOARDING)
/**
* DEVICE_SCAN 을 끝내고(연결 성공이든 뒤로가기든) 돌아갈 화면.
*
* 기기 연결 화면은 여러 곳에서 불려 오는데, 원래는 `ClinicalSessionStore.inClinicalFlow`
* 불리언 하나로 "임상 흐름이면 CLINICAL_HOME, 아니면 HOME" 만 갈랐다. 부르는 곳이
* 셋 이상이 되면 불리언을 더 만들게 되고, 그 순간부터 두 깃발이 어긋나기 시작한다.
*
* 그래서 **어디로 돌아갈지를 값으로** 들고 있는다. null 이면 기존 규칙대로 간다 —
* 기존 호출부는 하나도 건드리지 않았다.
*
* 한 번 쓰면 비운다([consumeConnectReturn]). 안 비우면 다음에 다른 경로로 들어온
* 연결 화면까지 엉뚱한 곳으로 보낸다.
*/
var connectReturnScreen: AppScreen? = null
/** 복귀 화면을 꺼내며 지운다. 없으면 null. */
fun consumeConnectReturn(): AppScreen? =
connectReturnScreen.also { connectReturnScreen = null }
var user by mutableStateOf(User())
var sensorMode by mutableStateOf(SensorMode.PIEZO)
var bladderLevel by mutableStateOf(BladderLevel())
@@ -121,12 +141,24 @@ class AppState(private val context: Context) {
currentScreen = AppScreen.DEVICE_SCAN
}
/**
* 기기 연결 화면의 **화면 안 뒤로 화살표**.
*
* ⚠ 시스템 뒤로가기(MainActivity BackHandler)와 목적지가 다르다 — 그쪽은
* `inClinicalFlow` 를 보고 CLINICAL_HOME 으로 가는데 여기는 늘 HOME 이다.
* 기존부터 그랬고 지금 손대면 임상 흐름의 동작이 바뀌므로 그대로 둔다.
* 다만 복귀처를 지정한 화면([connectReturnScreen])은 두 경로가 같아야 하므로
* 여기서도 먼저 확인한다.
*/
fun backToSensorSelect() {
consumeConnectReturn()?.let { currentScreen = it; return }
currentScreen = AppScreen.HOME
}
fun deviceConnected() {
isDeviceConnected = true
// 부른 화면이 복귀처를 지정했으면 그리로 (병원 임상 모드 등).
consumeConnectReturn()?.let { currentScreen = it; return }
// 임상 모드에서 BLE 연결 시 ClinicalHome으로 복귀 (Personalization 우회)
if (com.medithings.vesiscan.services.ClinicalSessionStore.inClinicalFlow) {
currentScreen = AppScreen.CLINICAL_HOME