44 lines
3.4 KiB
Markdown
44 lines
3.4 KiB
Markdown
# 20260328 라이브룸 방장 캡쳐/녹화 허용
|
|
|
|
## 구현 체크리스트
|
|
- [x] 방장 판별 시점과 캡처 보안 적용 지점을 확인한다. (QA: `isHost` 갱신 지점과 `FLAG_SECURE` 적용 지점 라인 확인)
|
|
- [x] 방장일 때만 `FLAG_SECURE`를 해제하고, 청취자는 기존 차단 상태를 유지한다. (QA: 방장/비방장 분기에서 `addFlags`/`clearFlags` 동작 확인)
|
|
- [x] 방장일 때 녹화 감지 기반 강제 mute가 적용되지 않도록 정합을 맞춘다. (QA: `syncCapturePrivacyMuteState` 분기 및 콜백 등록/해제 흐름 확인)
|
|
- [x] 진단/빌드/테스트/수동 QA를 수행하고 결과를 기록한다. (QA: 실행 명령과 결과 로그 확인)
|
|
|
|
## 검증 기록
|
|
- 2026-03-28
|
|
- 무엇: 방장 예외 적용을 위한 코드베이스/외부 레퍼런스 병렬 탐색을 수행했다.
|
|
- 왜: `FLAG_SECURE`를 역할 기반으로 런타임 토글할 때 라이프사이클/콜백 경합 없이 최소 변경으로 구현하기 위해서다.
|
|
- 어떻게:
|
|
- 내부 탐색(`explore`):
|
|
- `bg_016c0dfd` (host 보안 플로우 맵)
|
|
- `bg_ba4aa673` (host 판별 지연 시 race 위험 분석)
|
|
- `bg_3132d80b` (저장소 내 역할 기반 secure 패턴 탐색)
|
|
- 외부 탐색(`librarian`):
|
|
- `bg_1875bb8f` (Android 공식 문서/AOSP의 addFlags/clearFlags 근거)
|
|
- `bg_d010820d` (OSS 동적 토글 사례: Fenix/Signal/Bitwarden)
|
|
- 직접 검색:
|
|
- `grep`/`ast_grep_search`/`sg run`으로 `FLAG_SECURE`, `isHost`, 콜백 등록/해제, mute 계산식을 교차 확인
|
|
- `rg`는 로컬 환경에 설치되어 있지 않아(`command -v rg` 결과 없음) `grep`/`sg`로 대체 검증
|
|
|
|
- 2026-03-28
|
|
- 무엇: `LiveRoomActivity`에 방장 전용 캡처/녹화 허용 정책을 구현했다.
|
|
- 왜: 사용자 요청대로 방장(host)은 캡처/화면녹화를 허용하고, 청취자는 기존 차단 정책을 유지해야 하기 때문이다.
|
|
- 어떻게:
|
|
- `isHost` 판별 직후 정책 동기화를 위해 `syncCaptureSecurityPolicyByRole()`를 추가했다.
|
|
- 방장(`isHost=true`): `window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)` + 녹화 콜백 해제 + 강제 mute 상태 정리
|
|
- 청취자(`isHost=false`): `window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)` + 포그라운드에서 녹화 콜백 등록 유지
|
|
- `viewModel.roomInfoLiveData.observe`에서 `isHost` 갱신 직후 `syncCaptureSecurityPolicyByRole()`를 호출해 비동기 roomInfo 도착 시점에도 즉시 반영되도록 했다.
|
|
- `syncCapturePrivacyMuteState()`를 `val shouldMute = !isHost && isScreenRecordingActive`로 변경해 방장은 녹화 중에도 강제 mute 대상에서 제외했다.
|
|
|
|
- 2026-03-28
|
|
- 무엇: 진단/빌드/테스트/수동 QA를 완료했다.
|
|
- 왜: 컴파일 안정성과 요청 동작(방장 허용, 청취자 유지)을 실제 증거로 확인하기 위해서다.
|
|
- 어떻게:
|
|
- LSP 진단: `.kt` 서버 미구성으로 `lsp_diagnostics` 불가(환경 제약 확인), `.md` 파일 diagnostics는 없음.
|
|
- 실행 명령: `./gradlew :app:testDebugUnitTest :app:assembleDebug`
|
|
- 결과: `BUILD SUCCESSFUL`
|
|
- 수동 QA 명령: `python3` 스크립트로 정책 함수/분기/호출 순서/mute 계산식을 점검
|
|
- 수동 QA 결과: `MANUAL_QA_PASS: host can bypass capture security while listeners remain protected in source flow`
|