# 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`