Files
sodalive-android/docs/20260328_라이브룸방장캡쳐녹화허용.md

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