fix(live-room): 라이브룸 입장 직후 UI 미갱신을 방지한다

This commit is contained in:
2026-03-29 04:23:57 +09:00
parent 5609560b77
commit c78849e994
2 changed files with 102 additions and 2 deletions

View File

@@ -190,6 +190,10 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
// joinChannel 중복 호출 방지 플래그
private var hasInvokedJoinChannel = false
// RTM/RTC 연결 완료 추적 플래그 (둘 다 연결되면 레이아웃 강제 갱신)
private var isRtcJoined = false
private var isRtmJoined = false
private var v2vSourceLanguage: String? = null
private var v2vTargetLanguage: String? = null
private var isV2vAvailable = false
@@ -731,6 +735,41 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
}
// endregion
// RTM과 RTC가 모두 연결되면 키보드를 잠깐 올렸다 내려 레이아웃을 강제 갱신한다.
// 로딩 다이얼로그가 화면을 덮고 있는 동안 수행하여 사용자에게 변화가 보이지 않도록 한다.
private fun tryForceLayoutRefresh(): Boolean {
if (!isRtcJoined || !isRtmJoined) return false
handler.post {
// 키보드가 화면을 밀어올리지 않도록 임시로 adjustNothing 전환
window.setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING
)
binding.etChat.requestFocus()
imm.showSoftInput(binding.etChat, InputMethodManager.SHOW_IMPLICIT)
handler.postDelayed({
imm.hideSoftInputFromWindow(
binding.etChat.windowToken,
InputMethodManager.HIDE_NOT_ALWAYS
)
binding.etChat.clearFocus()
// 원래 softInputMode 복원
window.setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN
)
// 키보드 트릭 완료 후 로딩 다이얼로그 dismiss
loadingDialog.dismiss()
}, 200)
}
return true
}
private fun applyKeyboardPanInsets() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
return
@@ -2188,6 +2227,8 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
override fun onJoinChannelSuccess(channel: String, uid: Int, elapsed: Int) {
super.onJoinChannelSuccess(channel, uid, elapsed)
Logger.e("onJoinChannelSuccess - uid: $uid, channel: $channel")
isRtcJoined = true
tryForceLayoutRefresh()
}
override fun onStreamMessage(uid: Int, streamId: Int, data: ByteArray?) {
@@ -2834,8 +2875,10 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
rtmToken = roomInfo.rtmToken,
channelName = roomInfo.channelName,
rtmChannelJoinSuccess = {
handler.post {
loadingDialog.dismiss()
isRtmJoined = true
// 두 채널 모두 연결 시 키보드 트릭 후 dismiss, 아니면 즉시 dismiss
if (!tryForceLayoutRefresh()) {
handler.post { loadingDialog.dismiss() }
}
if (userId == roomInfo.creatorId) {