Files
sodalive-android/docs/20260329_라이브룸_UI미갱신_버그수정.md

58 lines
3.2 KiB
Markdown

# 라이브룸 UI 미갱신 버그 수정
## 현상
- 라이브 입장 후 공지, 메뉴판 터치 시 UI가 보이지 않음
- 상대방 채팅이 화면에 갱신되지 않음
- 방장이 아닌 유저에게서 두드러지게 나타남
- 키보드가 올라오거나 화면에 변화가 생기면 모든 것이 해결됨
## 원인 분석
- `BaseActivity`에서 `WindowCompat.setDecorFitsSystemWindows(window, false)` (edge-to-edge) 적용
- `LiveRoomActivity`의 manifest에 `adjustPan` 설정과 edge-to-edge가 충돌
- `adjustPan`은 시스템이 창을 pan 하려 하지만, edge-to-edge 모드에서는 앱이 insets을 직접 처리
- 이 충돌로 DecorView 내부 스크롤 트래킹 상태가 불일치하여 `invalidate()` 더티 영역 계산 오류 발생
- 키보드가 올라가면 시스템이 WindowInsets를 재분배하고, `OnApplyWindowInsetsListener`에서 `setPadding()` 호출 → `requestLayout()` → 전체 레이아웃 패스가 강제 수행되어 해결됨
## 수정 방법
- RTM과 RTC가 모두 연결 완료된 시점에 키보드를 프로그래밍적으로 올렸다 내려 레이아웃을 강제 갱신
- `isRtcJoined`, `isRtmJoined` 플래그로 두 연결 상태를 추적
- 두 플래그가 모두 true가 되면 `tryForceLayoutRefresh()`를 호출
### 눈속임 처리 (사용자에게 변화가 보이지 않도록)
1. 로딩 다이얼로그가 화면을 덮고 있는 동안 키보드 트릭을 수행
2. `adjustNothing`으로 임시 전환하여 키보드가 화면을 밀어올리지 않도록 방지
3. 키보드 show → 200ms 후 hide → `adjustPan` 복원 → 로딩 다이얼로그 dismiss
4. RTM 콜백의 `loadingDialog.dismiss()``tryForceLayoutRefresh()` 내부로 이동
## 수정 계획
- [x] `isRtcJoined`, `isRtmJoined` 플래그 추가
- [x] `onJoinChannelSuccess`에서 `isRtcJoined = true` 설정 및 `tryForceLayoutRefresh()` 호출
- [x] RTM 성공 콜백에서 `isRtmJoined = true` 설정 및 `tryForceLayoutRefresh()` 호출
- [x] `tryForceLayoutRefresh()` 메서드 구현
- [x] adjustNothing 임시 전환으로 화면 이동 방지
- [x] 로딩 다이얼로그 뒤에서 키보드 트릭 수행
- [x] 완료 후 adjustPan 복원 및 로딩 다이얼로그 dismiss
- [x] Boolean 반환으로 RTM 콜백에서 fallback dismiss 처리
- [x] 빌드 검증
## 검증 기록
### 2026-03-29 빌드 검증 (1차 - adjustNothing 방식)
- 명령: `./gradlew :app:assembleDebug`
- 결과: BUILD SUCCESSFUL (16s, 46 tasks)
- 변경 파일: `AndroidManifest.xml` (adjustPan→adjustNothing), `LiveRoomActivity.kt` (API S→R)
- 비고: 실기기에서 효과 없음 → 되돌림
### 2026-03-29 빌드 검증 (2차 - 키보드 강제 갱신 방식)
- 명령: `./gradlew :app:assembleDebug`
- 결과: BUILD SUCCESSFUL (21s, 46 tasks)
- 변경 파일: `LiveRoomActivity.kt` (RTM/RTC 연결 완료 후 키보드 올렸다 내리기)
- 비고: 키보드가 화면을 위로 밀어올리는 것이 사용자에게 보임 → 눈속임 개선 필요
### 2026-03-29 빌드 검증 (3차 - 눈속임 개선)
- 명령: `./gradlew :app:assembleDebug`
- 결과: BUILD SUCCESSFUL (18s, 46 tasks)
- 변경 파일: `LiveRoomActivity.kt`
- 방식: adjustNothing 임시 전환 + 로딩 다이얼로그 뒤에서 키보드 트릭 수행