diff --git a/presentation/src/main/java/com/nextroom/nextroom/presentation/model/Hint.kt b/presentation/src/main/java/com/nextroom/nextroom/presentation/model/Hint.kt index c777d55b..7a1de7d3 100644 --- a/presentation/src/main/java/com/nextroom/nextroom/presentation/model/Hint.kt +++ b/presentation/src/main/java/com/nextroom/nextroom/presentation/model/Hint.kt @@ -3,7 +3,7 @@ package com.nextroom.nextroom.presentation.model import java.io.Serializable data class Hint( - val id: Int = -1, + val id: Int = 0, val progress: Int = 0, val hint: String = "", val answer: String = "", diff --git a/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintFragment.kt b/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintFragment.kt index cdf313a6..526915d1 100644 --- a/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintFragment.kt +++ b/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintFragment.kt @@ -5,6 +5,7 @@ import android.view.View import androidx.core.os.bundleOf import androidx.core.view.isVisible import androidx.fragment.app.viewModels +import androidx.hilt.navigation.fragment.hiltNavGraphViewModels import androidx.navigation.fragment.findNavController import androidx.viewpager2.widget.ViewPager2 import com.google.firebase.analytics.FirebaseAnalytics @@ -20,8 +21,10 @@ import com.nextroom.nextroom.presentation.extension.safeNavigate import com.nextroom.nextroom.presentation.extension.snackbar import com.nextroom.nextroom.presentation.extension.toTimerFormat import com.nextroom.nextroom.presentation.extension.updateSystemPadding +import com.nextroom.nextroom.presentation.ui.main.GameSharedViewModel import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import org.orbitmvi.orbit.viewmodel.observe import timber.log.Timber @@ -29,6 +32,7 @@ import timber.log.Timber class HintFragment : BaseFragment(FragmentHintBinding::inflate) { private val viewModel: HintViewModel by viewModels() + private val gameSharedViewModel: GameSharedViewModel by hiltNavGraphViewModels(R.id.game_navigation) private val state: HintState get() = viewModel.container.stateFlow.value @@ -44,6 +48,7 @@ class HintFragment : BaseFragment(FragmentHintBinding::infl super.onViewCreated(view, savedInstanceState) FirebaseAnalytics.getInstance(requireContext()).logEvent("screen_view", bundleOf("screen_name" to "hint")) initViews() + initSubscribe() viewModel.observe(viewLifecycleOwner, state = ::render, sideEffect = ::handleEvent) } @@ -70,6 +75,21 @@ class HintFragment : BaseFragment(FragmentHintBinding::infl } } + private fun initSubscribe() { + viewLifecycleOwner.repeatOnStarted { + launch { + gameSharedViewModel.currentHint.collect { hint -> + hint?.let { viewModel.setHint(it) } + } + } + launch { + gameSharedViewModel.subscribeStatus.collect { subscribeStatus -> + viewModel.setSubscribeStatus(subscribeStatus) + } + } + } + } + private fun render(state: HintState) = with(binding) { pbLoading.isVisible = state.loading tbHint.tvTitle.text = state.lastSeconds.toTimerFormat() diff --git a/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintState.kt b/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintState.kt index 3e0b0646..816d943c 100644 --- a/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintState.kt +++ b/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintState.kt @@ -1,25 +1,11 @@ package com.nextroom.nextroom.presentation.ui.hint import com.nextroom.nextroom.domain.model.SubscribeStatus -import com.nextroom.nextroom.domain.model.UserSubscribeStatus import com.nextroom.nextroom.presentation.model.Hint data class HintState( val loading: Boolean = false, - val hint: Hint = Hint( - id = 0, - progress = 0, - hint = "침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. \n" + - "침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 \n" + - "침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 \n" + - "침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. \n" + - "침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. \n" + - "침대 옆 공간을 보시면 숫자와 카드 조침대 옆 공간을 보시면 숫자와 카드 조", - answer = "침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. \n" + - "침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 \n" + - "침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. ", - answerOpened = false, - ), + val hint: Hint = Hint(), val lastSeconds: Int = 0, val userSubscribeStatus: SubscribeStatus = SubscribeStatus.Default, val networkDisconnectedCount: Int = 0 diff --git a/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintViewModel.kt b/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintViewModel.kt index 8912962c..2ecfb195 100644 --- a/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintViewModel.kt +++ b/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintViewModel.kt @@ -1,10 +1,8 @@ package com.nextroom.nextroom.presentation.ui.hint -import androidx.lifecycle.SavedStateHandle import com.mangbaam.commonutil.DateTimeUtil -import com.nextroom.nextroom.domain.repository.AdminRepository +import com.nextroom.nextroom.domain.model.SubscribeStatus import com.nextroom.nextroom.domain.repository.DataStoreRepository -import com.nextroom.nextroom.domain.repository.StatisticsRepository import com.nextroom.nextroom.domain.repository.TimerRepository import com.nextroom.nextroom.presentation.base.BaseViewModel import com.nextroom.nextroom.presentation.model.Hint @@ -18,20 +16,12 @@ import javax.inject.Inject @HiltViewModel class HintViewModel @Inject constructor( - savedStateHandle: SavedStateHandle, private val timerRepository: TimerRepository, - private val statsRepository: StatisticsRepository, - private val adminRepository: AdminRepository, private val dataStoreRepository: DataStoreRepository, ) : BaseViewModel() { override val container: Container = - container( - HintState( - hint = savedStateHandle.get("hint") ?: Hint(), - userSubscribeStatus = HintFragmentArgs.fromSavedStateHandle(savedStateHandle).subscribeStatus, - ) - ) + container(HintState()) private val state: HintState get() = container.stateFlow.value @@ -50,20 +40,22 @@ class HintViewModel @Inject constructor( updateNetworkDisconnectedCount(it) } } - /*viewModelScope.launch { - // 힌트 오픈 시간 통계 집계 - statsRepository.recordHintStats(HintStats(state.hint.id, DateTimeUtil().currentTime() ?: "", "")) - }*/ } private fun updateNetworkDisconnectedCount(count: Int) = intent { reduce { state.copy(networkDisconnectedCount = count) } } + fun setHint(hint: Hint) = intent { + reduce { state.copy(hint = hint) } + } + + fun setSubscribeStatus(subscribeStatus: SubscribeStatus) = intent { + reduce { state.copy(userSubscribeStatus = subscribeStatus) } + } + fun openAnswer() = intent { reduce { state.copy(hint = state.hint.copy(answerOpened = true)) } - // 정답 오픈 시간 통계 집계 -// statsRepository.recordAnswerOpenTime(state.hint.id, dateTimeUtil.currentTime() ?: "") } private fun tick(lastSeconds: Int) = intent { diff --git a/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/GameSharedViewModel.kt b/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/GameSharedViewModel.kt new file mode 100644 index 00000000..d7ba213b --- /dev/null +++ b/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/GameSharedViewModel.kt @@ -0,0 +1,29 @@ +package com.nextroom.nextroom.presentation.ui.main + +import androidx.lifecycle.SavedStateHandle +import com.nextroom.nextroom.domain.model.SubscribeStatus +import com.nextroom.nextroom.presentation.base.NewBaseViewModel +import com.nextroom.nextroom.presentation.model.Hint +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import javax.inject.Inject + +@HiltViewModel +class GameSharedViewModel @Inject constructor( + savedStateHandle: SavedStateHandle +) : NewBaseViewModel() { + + private val _subscribeStatus = MutableStateFlow( + TimerFragmentArgs.fromSavedStateHandle(savedStateHandle).subscribeStatus + ) + val subscribeStatus: StateFlow = _subscribeStatus.asStateFlow() + + private val _currentHint = MutableStateFlow(null) + val currentHint: StateFlow = _currentHint.asStateFlow() + + fun setCurrentHint(hint: Hint) { + _currentHint.value = hint + } +} \ No newline at end of file diff --git a/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerEvent.kt b/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerEvent.kt index 9a6d776f..47d8e382 100644 --- a/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerEvent.kt +++ b/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerEvent.kt @@ -1,12 +1,10 @@ package com.nextroom.nextroom.presentation.ui.main -import com.nextroom.nextroom.domain.model.SubscribeStatus import com.nextroom.nextroom.presentation.model.Hint sealed interface TimerEvent { data class OnOpenHint( - val hint: Hint, - val subscribeStatus: SubscribeStatus + val hint: Hint ) : TimerEvent data object TimerFinish : TimerEvent diff --git a/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerFragment.kt b/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerFragment.kt index 4be8a308..1f047e2c 100644 --- a/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerFragment.kt +++ b/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerFragment.kt @@ -12,6 +12,7 @@ import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels import androidx.fragment.app.setFragmentResultListener import androidx.fragment.app.viewModels +import androidx.hilt.navigation.fragment.hiltNavGraphViewModels import androidx.navigation.fragment.findNavController import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource @@ -50,6 +51,7 @@ class TimerFragment : BaseFragment(FragmentTimerBinding::i private val viewModel: TimerViewModel by viewModels() private val painterViewModel: PainterViewModel by activityViewModels() + private val gameSharedViewModel: GameSharedViewModel by hiltNavGraphViewModels(R.id.game_navigation) private var gameStartConfirmDialog: NRDialog? = null @@ -266,7 +268,8 @@ class TimerFragment : BaseFragment(FragmentTimerBinding::i when (event) { is TimerEvent.ClearHintCode -> binding.customCodeInput.setCode("") is TimerEvent.OnOpenHint -> { - val action = TimerFragmentDirections.moveToHintFragment(event.hint, event.subscribeStatus) + gameSharedViewModel.setCurrentHint(event.hint) + val action = TimerFragmentDirections.moveToHintFragment() findNavController().safeNavigate(action) viewModel.clearHintCode() } diff --git a/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerViewModel.kt b/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerViewModel.kt index 21dc38c0..de3e5907 100644 --- a/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerViewModel.kt +++ b/presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerViewModel.kt @@ -208,8 +208,7 @@ class TimerViewModel @Inject constructor( answerOpened = state.answerOpenedHints.contains(hint.id), hintImageUrlList = hint.hintImageUrlList.toList(), answerImageUrlList = hint.answerImageUrlList.toList() - ), - TimerFragmentArgs.fromSavedStateHandle(savedStateHandle).subscribeStatus + ) ), ) setGameState() diff --git a/presentation/src/main/res/navigation/game_navigation.xml b/presentation/src/main/res/navigation/game_navigation.xml index 995be402..46fcd5c3 100644 --- a/presentation/src/main/res/navigation/game_navigation.xml +++ b/presentation/src/main/res/navigation/game_navigation.xml @@ -12,14 +12,7 @@ - - - + app:destination="@id/hint_fragment" /> @@ -43,12 +36,6 @@ - -