diff --git a/app/src/androidTest/kotlin/io/github/hangillab/hangil/SessionDeletionFlowTest.kt b/app/src/androidTest/kotlin/io/github/hangillab/hangil/SessionDeletionFlowTest.kt index 44bf5be..9a82036 100644 --- a/app/src/androidTest/kotlin/io/github/hangillab/hangil/SessionDeletionFlowTest.kt +++ b/app/src/androidTest/kotlin/io/github/hangillab/hangil/SessionDeletionFlowTest.kt @@ -144,6 +144,16 @@ class SessionDeletionFlowTest { emptyLocations.events.isEmpty() && emptyLocations.runs.isEmpty() && before.recordingRuns.getValue(fixture.seed.latest.sessionId).isEmpty(), ) + bringIntoView("history_retention") + val retention = nodes("history_retention").single() + val notice = + retention.config + .getOrNull(SemanticsProperties.Text) + .orEmpty() + .joinToString("") { it.text } + assertTrue("RETENTION_POLICY_VISIBLE", fullyVisible(retention)) + assertTrue("RETENTION_NO_AUTOMATIC_DELETION_OR_TRANSFER", notice.contains("자동으로 지우거나 새 기기로 옮기지 않아요")) + assertLayout(retention, notice) openAndReadConfirmation(fixture, fixture.seed.latest) touch("history_delete_cancel") waitAbsent("history_delete_dialog") diff --git a/docs/development/ended-session-deletion.md b/docs/development/ended-session-deletion.md index 4bc0857..f86c5e0 100644 --- a/docs/development/ended-session-deletion.md +++ b/docs/development/ended-session-deletion.md @@ -1,6 +1,12 @@ # 확인한 종료 기록과 연결 자료의 원자적 삭제 -종료 이력에서 사용자가 고른 기록을 명시 확인 후 이 기기에서 삭제한다. 해당 세션의 차량 관찰과 사용자 메모는 기존 schema4의 FK CASCADE로 함께 정리한다. 다른 종료/활성 세션과 준비는 보존하며 과정 완료 판정이나 전체 보관 정책은 이번 범위가 아니다. +종료 이력에서 사용자가 고른 기록을 명시 확인 후 이 기기에서 삭제한다. 해당 세션의 차량 관찰과 사용자 메모는 기존 schema4의 FK CASCADE로 함께 정리한다. 다른 종료/활성 세션과 준비는 보존한다. + +## 보관과 기기 이전 + +연습 기록은 앱의 내부 Room 저장소에 보관한다. 별도 보관 기한을 두거나 자동으로 삭제하지 않는다. 사용자가 이력에서 해당 기록을 삭제하거나 앱 데이터를 지울 때 사라진다. 이미 다른 준비나 연습에 복사한 목표는 별도 자료이므로 원본 기록을 삭제해도 남는다. + +저장소 접근은 Android 앱 격리와 기기의 저장소 보호에 의존한다. 파일 기반 암호화가 켜진 기기에서는 앱의 기본 자격 증명 보호 저장소를 사용한다. 앱 자체가 DB를 별도로 암호화하거나 SQLite 파일의 삭제 흔적까지 지우는 것은 아니다. 앱은 연습 기록 이전을 제공하지 않는다. Android 12 이상 백업/기기 이전 규칙에서 DB와 내부 파일을 제외하며, 기기 제조사별 실제 이전 동작은 별도 검증 대상이다. ## 확인과 삭제의 경계 diff --git a/feature/home/src/main/kotlin/io/github/hangillab/hangil/feature/home/SessionHistoryScreen.kt b/feature/home/src/main/kotlin/io/github/hangillab/hangil/feature/home/SessionHistoryScreen.kt index 5d4c725..c0a85a2 100644 --- a/feature/home/src/main/kotlin/io/github/hangillab/hangil/feature/home/SessionHistoryScreen.kt +++ b/feature/home/src/main/kotlin/io/github/hangillab/hangil/feature/home/SessionHistoryScreen.kt @@ -541,7 +541,15 @@ private fun HistoryRecord( recordingRuns() courseCompletion() locations() - if (allowBrowsing) nextPractice() + if (allowBrowsing) { + nextPractice() + Text( + stringResource(R.string.history_retention), + Modifier.testTag("history_retention"), + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } ParkedButton( onClick = onDelete, prominent = false, diff --git a/feature/home/src/main/res/values/strings.xml b/feature/home/src/main/res/values/strings.xml index 080c7ad..1961652 100644 --- a/feature/home/src/main/res/values/strings.xml +++ b/feature/home/src/main/res/values/strings.xml @@ -157,6 +157,7 @@ 과제별 기록 저장 당시 목표와 코스 정보가 같은 기록이에요. + 연습 기록은 이 기기에 남아요. 앱에서 자동으로 지우거나 새 기기로 옮기지 않아요. 이 기록 삭제 기록을 삭제할까요? 이 연습과 연결된 차량 관찰, 메모, 배경 실행, 위치 표본과 수집 상태, 마무리 선언을\n이 기기에서 영구 삭제해요. 복구할 수 없어요. 다른 준비나 연습으로 가져온 목표 도로는 남아요.