3.4 KiB
3.4 KiB
20260328 라이브룸 방장 캡쳐/녹화 허용
구현 체크리스트
- 방장 판별 시점과 캡처 보안 적용 지점을 확인한다. (QA:
isHost갱신 지점과FLAG_SECURE적용 지점 라인 확인) - 방장일 때만
FLAG_SECURE를 해제하고, 청취자는 기존 차단 상태를 유지한다. (QA: 방장/비방장 분기에서addFlags/clearFlags동작 확인) - 방장일 때 녹화 감지 기반 강제 mute가 적용되지 않도록 정합을 맞춘다. (QA:
syncCapturePrivacyMuteState분기 및 콜백 등록/해제 흐름 확인) - 진단/빌드/테스트/수동 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
- LSP 진단: