Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -20,15 +21,18 @@ 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

@AndroidEntryPoint
class HintFragment : BaseFragment<FragmentHintBinding>(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

Expand All @@ -44,6 +48,7 @@ class HintFragment : BaseFragment<FragmentHintBinding>(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)
}

Expand All @@ -70,6 +75,21 @@ class HintFragment : BaseFragment<FragmentHintBinding>(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()
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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<HintState, HintEvent>() {

override val container: Container<HintState, HintEvent> =
container(
HintState(
hint = savedStateHandle.get<Hint>("hint") ?: Hint(),
userSubscribeStatus = HintFragmentArgs.fromSavedStateHandle(savedStateHandle).subscribeStatus,
)
)
container(HintState())

private val state: HintState
get() = container.stateFlow.value
Expand All @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -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> = _subscribeStatus.asStateFlow()

private val _currentHint = MutableStateFlow<Hint?>(null)
val currentHint: StateFlow<Hint?> = _currentHint.asStateFlow()

fun setCurrentHint(hint: Hint) {
_currentHint.value = hint
}
}
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -50,6 +51,7 @@ class TimerFragment : BaseFragment<FragmentTimerBinding>(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

Expand Down Expand Up @@ -266,7 +268,8 @@ class TimerFragment : BaseFragment<FragmentTimerBinding>(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()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
15 changes: 1 addition & 14 deletions presentation/src/main/res/navigation/game_navigation.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,7 @@

<action
android:id="@+id/move_to_hint_fragment"
app:destination="@id/hint_fragment">
<argument
android:name="hint"
app:argType="com.nextroom.nextroom.presentation.model.Hint" />
<argument
android:name="subscribeStatus"
app:argType="com.nextroom.nextroom.domain.model.SubscribeStatus" />
</action>
app:destination="@id/hint_fragment" />
<action
android:id="@+id/move_to_memo_fragment"
app:destination="@id/memo_fragment" />
Expand All @@ -43,12 +36,6 @@
<action
android:id="@+id/move_to_memo_fragment"
app:destination="@id/memo_fragment" />
<argument
android:name="subscribeStatus"
app:argType="com.nextroom.nextroom.domain.model.SubscribeStatus" />
<argument
android:name="hint"
app:argType="com.nextroom.nextroom.presentation.model.Hint" />
</fragment>

<fragment
Expand Down
Loading