Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
8 changes: 7 additions & 1 deletion docs/development/ended-session-deletion.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
# 확인한 종료 기록과 연결 자료의 원자적 삭제

종료 이력에서 사용자가 고른 기록을 명시 확인 후 이 기기에서 삭제한다. 해당 세션의 차량 관찰과 사용자 메모는 기존 schema4의 FK CASCADE로 함께 정리한다. 다른 종료/활성 세션과 준비는 보존하며 과정 완료 판정이나 전체 보관 정책은 이번 범위가 아니다.
종료 이력에서 사용자가 고른 기록을 명시 확인 후 이 기기에서 삭제한다. 해당 세션의 차량 관찰과 사용자 메모는 기존 schema4의 FK CASCADE로 함께 정리한다. 다른 종료/활성 세션과 준비는 보존한다.

## 보관과 기기 이전

연습 기록은 앱의 내부 Room 저장소에 보관한다. 별도 보관 기한을 두거나 자동으로 삭제하지 않는다. 사용자가 이력에서 해당 기록을 삭제하거나 앱 데이터를 지울 때 사라진다. 이미 다른 준비나 연습에 복사한 목표는 별도 자료이므로 원본 기록을 삭제해도 남는다.

저장소 접근은 Android 앱 격리와 기기의 저장소 보호에 의존한다. 파일 기반 암호화가 켜진 기기에서는 앱의 기본 자격 증명 보호 저장소를 사용한다. 앱 자체가 DB를 별도로 암호화하거나 SQLite 파일의 삭제 흔적까지 지우는 것은 아니다. 앱은 연습 기록 이전을 제공하지 않는다. Android 12 이상 백업/기기 이전 규칙에서 DB와 내부 파일을 제외하며, 기기 제조사별 실제 이전 동작은 별도 검증 대상이다.

## 확인과 삭제의 경계

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions feature/home/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@
<string name="history_summary_tasks">과제별 기록</string>
<string name="history_summary_scope">저장 당시 목표와 코스 정보가 같은 기록이에요.</string>

<string name="history_retention">연습 기록은 이 기기에 남아요. 앱에서 자동으로 지우거나 새 기기로 옮기지 않아요.</string>
<string name="history_delete">이 기록 삭제</string>
<string name="history_delete_title">기록을 삭제할까요?</string>
<string name="history_delete_warning">이 연습과 연결된 차량 관찰, 메모, 배경 실행, 위치 표본과 수집 상태, 마무리 선언을\n이 기기에서 영구 삭제해요. 복구할 수 없어요. 다른 준비나 연습으로 가져온 목표 도로는 남아요.</string>
Expand Down
Loading