fix(home): 메인 홈 추천 탭 지금 라이브 중 입장을 연결한다

This commit is contained in:
2026-07-06 02:34:41 +09:00
parent b1f605fda4
commit 5489c86cdc
3 changed files with 157 additions and 45 deletions

View File

@@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.v2.creator.channel
import android.content.Intent
import android.view.LayoutInflater
import android.widget.Toast
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.audio_content.AudioContentPlayService
@@ -27,7 +28,7 @@ import java.util.Locale
import java.util.TimeZone
class CreatorChannelLiveCoordinator(
private val activity: CreatorChannelActivity,
private val activity: FragmentActivity,
private val layoutInflater: LayoutInflater,
private val fragmentManager: FragmentManager,
private val liveViewModel: LiveViewModel,
@@ -65,38 +66,64 @@ class CreatorChannelLiveCoordinator(
}
liveViewModel.getRoomDetail(roomId) {
if (!it.channelName.isNullOrBlank()) {
if (it.manager.id == SharedPreferenceManager.userId) {
liveViewModel.enterRoom(roomId, onEnterRoomSuccess)
} else if (it.price == 0 || it.isPaid) {
if (it.isPrivateRoom) {
LiveRoomPasswordDialog(
activity = activity,
layoutInflater = layoutInflater,
can = 0,
confirmButtonClick = { password ->
liveViewModel.enterRoom(
roomId = roomId,
onSuccess = onEnterRoomSuccess,
password = password
)
}
).show(screenWidthProvider())
} else {
liveViewModel.enterRoom(roomId, onEnterRoomSuccess)
}
enterLiveRoom(roomId, it, onEnterRoomSuccess)
}
}
fun enterLiveRoom(roomId: Long, roomDetail: GetRoomDetailResponse) {
activity.startService(
Intent(activity, AudioContentPlayService::class.java).apply {
action = AudioContentPlayService.MusicAction.STOP.name
}
)
activity.startService(
Intent(activity, AudioContentPlayerService::class.java).apply {
action = "STOP_SERVICE"
}
)
val onEnterRoomSuccess = {
activity.runOnUiThread { openLiveRoom(roomId) }
}
enterLiveRoom(roomId, roomDetail, onEnterRoomSuccess)
}
private fun enterLiveRoom(
roomId: Long,
roomDetail: GetRoomDetailResponse,
onEnterRoomSuccess: () -> Unit
) {
if (!roomDetail.channelName.isNullOrBlank()) {
if (roomDetail.manager.id == SharedPreferenceManager.userId) {
liveViewModel.enterRoom(roomId, onEnterRoomSuccess)
} else if (roomDetail.price == 0 || roomDetail.isPaid) {
if (roomDetail.isPrivateRoom) {
LiveRoomPasswordDialog(
activity = activity,
layoutInflater = layoutInflater,
can = 0,
confirmButtonClick = { password ->
liveViewModel.enterRoom(
roomId = roomId,
onSuccess = onEnterRoomSuccess,
password = password
)
}
).show(screenWidthProvider())
} else {
showPaidLiveEntryDialog(
roomId = roomId,
beginDateTimeUtc = it.beginDateTimeUtc,
price = it.price,
isPrivateRoom = it.isPrivateRoom,
onEnterRoomSuccess = onEnterRoomSuccess
)
liveViewModel.enterRoom(roomId, onEnterRoomSuccess)
}
} else {
showLiveRoomDetail(roomId)
showPaidLiveEntryDialog(
roomId = roomId,
beginDateTimeUtc = roomDetail.beginDateTimeUtc,
price = roomDetail.price,
isPrivateRoom = roomDetail.isPrivateRoom,
onEnterRoomSuccess = onEnterRoomSuccess
)
}
} else {
showLiveRoomDetail(roomId)
}
}

View File

@@ -17,9 +17,11 @@ import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.CreatorCo
import kr.co.vividnext.sodalive.following.FollowingCreatorActivity
import kr.co.vividnext.sodalive.chat.talk.room.ChatRoomActivity
import kr.co.vividnext.sodalive.home.pushnotification.PushNotificationListActivity
import kr.co.vividnext.sodalive.live.LiveViewModel
import kr.co.vividnext.sodalive.mypage.can.charge.CanChargeActivity
import kr.co.vividnext.sodalive.search.SearchActivity
import kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivity
import kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelLiveCoordinator
import kr.co.vividnext.sodalive.v2.live.onair.HomeOnAirLiveActivity
import kr.co.vividnext.sodalive.v2.main.chat.dm.DmChatRoomActivity
import kr.co.vividnext.sodalive.v2.main.chat.model.ChatRoomListUiItem
@@ -74,6 +76,7 @@ import kr.co.vividnext.sodalive.v2.main.home.ui.HomeRecentDebutCreatorAdapter
import kr.co.vividnext.sodalive.v2.widget.creatorranking.CreatorRankingAdapter
import kr.co.vividnext.sodalive.v2.widget.creatorranking.CreatorRankingItem
import kr.co.vividnext.sodalive.v2.widget.feed.FeedItem
import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.viewModel
class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
@@ -82,7 +85,18 @@ class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
private val homeRecommendationViewModel: HomeRecommendationViewModel by viewModel()
private val homeCreatorRankingViewModel: HomeCreatorRankingViewModel by viewModel()
private val homeFollowingViewModel: HomeFollowingViewModel by viewModel()
private val liveViewModel: LiveViewModel by inject()
private val loadingDialog: LoadingDialog by lazy { LoadingDialog(requireActivity(), layoutInflater) }
private val liveCoordinator: CreatorChannelLiveCoordinator by lazy {
CreatorChannelLiveCoordinator(
activity = requireActivity(),
layoutInflater = layoutInflater,
fragmentManager = requireActivity().supportFragmentManager,
liveViewModel = liveViewModel,
screenWidthProvider = { screenWidth },
refreshHome = { homeRecommendationViewModel.loadRecommendations() }
)
}
private val liveAdapter = HomeLiveAdapter()
private val recentActivityCreatorAdapter = HomeRecentActivityCreatorAdapter { onRecentActivityClick(it) }
private val recentDebutCreatorAdapter = HomeRecentDebutCreatorAdapter { openCreatorProfile(it.creatorId) }
@@ -111,6 +125,10 @@ class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
private var hasLoadedCreatorRankings = false
private var hasLoadedFollowing = false
private var currentHomeTabIndex = HOME_TAB_RECOMMENDATION
private var isRecommendationLoading = false
private var isCreatorRankingLoading = false
private var isFollowingLoading = false
private var isLiveEntryLoading = false
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -138,6 +156,7 @@ class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
bindHomeRecommendationObservers()
bindHomeCreatorRankingObservers()
bindHomeFollowingObservers()
bindLiveEntryObservers()
homeRecommendationViewModel.loadRecommendations()
}
@@ -252,11 +271,8 @@ class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
}
}
homeCreatorRankingViewModel.isLoading.observe(viewLifecycleOwner) { isLoading ->
if (isLoading) {
loadingDialog.show(screenWidth)
} else {
loadingDialog.dismiss()
}
isCreatorRankingLoading = isLoading
updateLoadingDialog()
}
homeCreatorRankingViewModel.toastLiveData.observe(viewLifecycleOwner) { toastMessage ->
toastMessage?.let(::showToast)
@@ -315,11 +331,8 @@ class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
}
}
homeFollowingViewModel.isLoading.observe(viewLifecycleOwner) { isLoading ->
if (isLoading) {
loadingDialog.show(screenWidth)
} else {
loadingDialog.dismiss()
}
isFollowingLoading = isLoading
updateLoadingDialog()
}
homeFollowingViewModel.toastLiveData.observe(viewLifecycleOwner) { toastMessage ->
toastMessage?.let(::showToast)
@@ -337,17 +350,32 @@ class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
}
}
homeRecommendationViewModel.isLoading.observe(viewLifecycleOwner) { isLoading ->
if (isLoading) {
loadingDialog.show(screenWidth)
} else {
loadingDialog.dismiss()
}
isRecommendationLoading = isLoading
updateLoadingDialog()
}
homeRecommendationViewModel.toastLiveData.observe(viewLifecycleOwner) { toastMessage ->
toastMessage?.let(::showToast)
}
}
private fun bindLiveEntryObservers() {
liveViewModel.isLoading.observe(viewLifecycleOwner) { isLoading ->
isLiveEntryLoading = isLoading
updateLoadingDialog()
}
liveViewModel.toastLiveData.observe(viewLifecycleOwner) { message ->
message?.let { showToast(it) }
}
}
private fun updateLoadingDialog() {
if (isRecommendationLoading || isCreatorRankingLoading || isFollowingLoading || isLiveEntryLoading) {
loadingDialog.show(screenWidth)
} else {
loadingDialog.dismiss()
}
}
private fun bindHomeRecommendationContent(content: HomeRecommendationUiState.Content) {
bindLiveSection(content.lives)
bindBannerSection(content.banners)
@@ -514,7 +542,16 @@ class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
ivSectionTitleChevron.visibility = if (showMore) View.VISIBLE else View.GONE
}
private fun onLiveClick(item: HomeRecommendationLiveUiModel) = Unit
private fun onLiveClick(item: HomeRecommendationLiveUiModel) {
ensureMainV2NavigationAllowed {
liveViewModel.getRoomDetail(item.roomId) { roomDetail ->
if (!isAdded || view == null) return@getRoomDetail
ensureMainV2NavigationAllowed(requiresAdultContentAccess = roomDetail.isAdult) {
liveCoordinator.enterLiveRoom(item.roomId, roomDetail)
}
}
}
}
private fun openHomeOnAirLive() {
ensureMainV2NavigationAllowed {