Skip to content

Commit a0a9c88

Browse files
Merge pull request #127 from Next-Room/feature/NR-122
NR-122 타이머와 힌트 화면이 viewModel을 공유해서 사용하도록 리팩토링한다.
2 parents 3523b79 + 02b08e2 commit a0a9c88

9 files changed

Lines changed: 68 additions & 54 deletions

File tree

presentation/src/main/java/com/nextroom/nextroom/presentation/model/Hint.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.nextroom.nextroom.presentation.model
33
import java.io.Serializable
44

55
data class Hint(
6-
val id: Int = -1,
6+
val id: Int = 0,
77
val progress: Int = 0,
88
val hint: String = "",
99
val answer: String = "",

presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintFragment.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.view.View
55
import androidx.core.os.bundleOf
66
import androidx.core.view.isVisible
77
import androidx.fragment.app.viewModels
8+
import androidx.hilt.navigation.fragment.hiltNavGraphViewModels
89
import androidx.navigation.fragment.findNavController
910
import androidx.viewpager2.widget.ViewPager2
1011
import com.google.firebase.analytics.FirebaseAnalytics
@@ -20,15 +21,18 @@ import com.nextroom.nextroom.presentation.extension.safeNavigate
2021
import com.nextroom.nextroom.presentation.extension.snackbar
2122
import com.nextroom.nextroom.presentation.extension.toTimerFormat
2223
import com.nextroom.nextroom.presentation.extension.updateSystemPadding
24+
import com.nextroom.nextroom.presentation.ui.main.GameSharedViewModel
2325
import dagger.hilt.android.AndroidEntryPoint
2426
import kotlinx.coroutines.delay
27+
import kotlinx.coroutines.launch
2528
import org.orbitmvi.orbit.viewmodel.observe
2629
import timber.log.Timber
2730

2831
@AndroidEntryPoint
2932
class HintFragment : BaseFragment<FragmentHintBinding>(FragmentHintBinding::inflate) {
3033

3134
private val viewModel: HintViewModel by viewModels()
35+
private val gameSharedViewModel: GameSharedViewModel by hiltNavGraphViewModels(R.id.game_navigation)
3236
private val state: HintState
3337
get() = viewModel.container.stateFlow.value
3438

@@ -44,6 +48,7 @@ class HintFragment : BaseFragment<FragmentHintBinding>(FragmentHintBinding::infl
4448
super.onViewCreated(view, savedInstanceState)
4549
FirebaseAnalytics.getInstance(requireContext()).logEvent("screen_view", bundleOf("screen_name" to "hint"))
4650
initViews()
51+
initSubscribe()
4752
viewModel.observe(viewLifecycleOwner, state = ::render, sideEffect = ::handleEvent)
4853
}
4954

@@ -70,6 +75,21 @@ class HintFragment : BaseFragment<FragmentHintBinding>(FragmentHintBinding::infl
7075
}
7176
}
7277

78+
private fun initSubscribe() {
79+
viewLifecycleOwner.repeatOnStarted {
80+
launch {
81+
gameSharedViewModel.currentHint.collect { hint ->
82+
hint?.let { viewModel.setHint(it) }
83+
}
84+
}
85+
launch {
86+
gameSharedViewModel.subscribeStatus.collect { subscribeStatus ->
87+
viewModel.setSubscribeStatus(subscribeStatus)
88+
}
89+
}
90+
}
91+
}
92+
7393
private fun render(state: HintState) = with(binding) {
7494
pbLoading.isVisible = state.loading
7595
tbHint.tvTitle.text = state.lastSeconds.toTimerFormat()

presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintState.kt

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,11 @@
11
package com.nextroom.nextroom.presentation.ui.hint
22

33
import com.nextroom.nextroom.domain.model.SubscribeStatus
4-
import com.nextroom.nextroom.domain.model.UserSubscribeStatus
54
import com.nextroom.nextroom.presentation.model.Hint
65

76
data class HintState(
87
val loading: Boolean = false,
9-
val hint: Hint = Hint(
10-
id = 0,
11-
progress = 0,
12-
hint = "침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. \n" +
13-
"침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 \n" +
14-
"침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 \n" +
15-
"침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. \n" +
16-
"침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. \n" +
17-
"침대 옆 공간을 보시면 숫자와 카드 조침대 옆 공간을 보시면 숫자와 카드 조",
18-
answer = "침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. \n" +
19-
"침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 \n" +
20-
"침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. 침대 옆 공간을 보시면 숫자와 카드 조합이 몇 가지 나와있는데 그걸 해답일지의 풀이법에 대입하면 정답이 나옵니다. 액자에 적힌 정보도 잘 체크해 보세요. ",
21-
answerOpened = false,
22-
),
8+
val hint: Hint = Hint(),
239
val lastSeconds: Int = 0,
2410
val userSubscribeStatus: SubscribeStatus = SubscribeStatus.Default,
2511
val networkDisconnectedCount: Int = 0

presentation/src/main/java/com/nextroom/nextroom/presentation/ui/hint/HintViewModel.kt

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package com.nextroom.nextroom.presentation.ui.hint
22

3-
import androidx.lifecycle.SavedStateHandle
43
import com.mangbaam.commonutil.DateTimeUtil
5-
import com.nextroom.nextroom.domain.repository.AdminRepository
4+
import com.nextroom.nextroom.domain.model.SubscribeStatus
65
import com.nextroom.nextroom.domain.repository.DataStoreRepository
7-
import com.nextroom.nextroom.domain.repository.StatisticsRepository
86
import com.nextroom.nextroom.domain.repository.TimerRepository
97
import com.nextroom.nextroom.presentation.base.BaseViewModel
108
import com.nextroom.nextroom.presentation.model.Hint
@@ -18,20 +16,12 @@ import javax.inject.Inject
1816

1917
@HiltViewModel
2018
class HintViewModel @Inject constructor(
21-
savedStateHandle: SavedStateHandle,
2219
private val timerRepository: TimerRepository,
23-
private val statsRepository: StatisticsRepository,
24-
private val adminRepository: AdminRepository,
2520
private val dataStoreRepository: DataStoreRepository,
2621
) : BaseViewModel<HintState, HintEvent>() {
2722

2823
override val container: Container<HintState, HintEvent> =
29-
container(
30-
HintState(
31-
hint = savedStateHandle.get<Hint>("hint") ?: Hint(),
32-
userSubscribeStatus = HintFragmentArgs.fromSavedStateHandle(savedStateHandle).subscribeStatus,
33-
)
34-
)
24+
container(HintState())
3525

3626
private val state: HintState
3727
get() = container.stateFlow.value
@@ -50,20 +40,22 @@ class HintViewModel @Inject constructor(
5040
updateNetworkDisconnectedCount(it)
5141
}
5242
}
53-
/*viewModelScope.launch {
54-
// 힌트 오픈 시간 통계 집계
55-
statsRepository.recordHintStats(HintStats(state.hint.id, DateTimeUtil().currentTime() ?: "", ""))
56-
}*/
5743
}
5844

5945
private fun updateNetworkDisconnectedCount(count: Int) = intent {
6046
reduce { state.copy(networkDisconnectedCount = count) }
6147
}
6248

49+
fun setHint(hint: Hint) = intent {
50+
reduce { state.copy(hint = hint) }
51+
}
52+
53+
fun setSubscribeStatus(subscribeStatus: SubscribeStatus) = intent {
54+
reduce { state.copy(userSubscribeStatus = subscribeStatus) }
55+
}
56+
6357
fun openAnswer() = intent {
6458
reduce { state.copy(hint = state.hint.copy(answerOpened = true)) }
65-
// 정답 오픈 시간 통계 집계
66-
// statsRepository.recordAnswerOpenTime(state.hint.id, dateTimeUtil.currentTime() ?: "")
6759
}
6860

6961
private fun tick(lastSeconds: Int) = intent {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.nextroom.nextroom.presentation.ui.main
2+
3+
import androidx.lifecycle.SavedStateHandle
4+
import com.nextroom.nextroom.domain.model.SubscribeStatus
5+
import com.nextroom.nextroom.presentation.base.NewBaseViewModel
6+
import com.nextroom.nextroom.presentation.model.Hint
7+
import dagger.hilt.android.lifecycle.HiltViewModel
8+
import kotlinx.coroutines.flow.MutableStateFlow
9+
import kotlinx.coroutines.flow.StateFlow
10+
import kotlinx.coroutines.flow.asStateFlow
11+
import javax.inject.Inject
12+
13+
@HiltViewModel
14+
class GameSharedViewModel @Inject constructor(
15+
savedStateHandle: SavedStateHandle
16+
) : NewBaseViewModel() {
17+
18+
private val _subscribeStatus = MutableStateFlow(
19+
TimerFragmentArgs.fromSavedStateHandle(savedStateHandle).subscribeStatus
20+
)
21+
val subscribeStatus: StateFlow<SubscribeStatus> = _subscribeStatus.asStateFlow()
22+
23+
private val _currentHint = MutableStateFlow<Hint?>(null)
24+
val currentHint: StateFlow<Hint?> = _currentHint.asStateFlow()
25+
26+
fun setCurrentHint(hint: Hint) {
27+
_currentHint.value = hint
28+
}
29+
}

presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerEvent.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package com.nextroom.nextroom.presentation.ui.main
22

3-
import com.nextroom.nextroom.domain.model.SubscribeStatus
43
import com.nextroom.nextroom.presentation.model.Hint
54

65
sealed interface TimerEvent {
76
data class OnOpenHint(
8-
val hint: Hint,
9-
val subscribeStatus: SubscribeStatus
7+
val hint: Hint
108
) : TimerEvent
119

1210
data object TimerFinish : TimerEvent

presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerFragment.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.core.view.isVisible
1212
import androidx.fragment.app.activityViewModels
1313
import androidx.fragment.app.setFragmentResultListener
1414
import androidx.fragment.app.viewModels
15+
import androidx.hilt.navigation.fragment.hiltNavGraphViewModels
1516
import androidx.navigation.fragment.findNavController
1617
import com.bumptech.glide.Glide
1718
import com.bumptech.glide.load.DataSource
@@ -50,6 +51,7 @@ class TimerFragment : BaseFragment<FragmentTimerBinding>(FragmentTimerBinding::i
5051

5152
private val viewModel: TimerViewModel by viewModels()
5253
private val painterViewModel: PainterViewModel by activityViewModels()
54+
private val gameSharedViewModel: GameSharedViewModel by hiltNavGraphViewModels(R.id.game_navigation)
5355

5456
private var gameStartConfirmDialog: NRDialog? = null
5557

@@ -266,7 +268,8 @@ class TimerFragment : BaseFragment<FragmentTimerBinding>(FragmentTimerBinding::i
266268
when (event) {
267269
is TimerEvent.ClearHintCode -> binding.customCodeInput.setCode("")
268270
is TimerEvent.OnOpenHint -> {
269-
val action = TimerFragmentDirections.moveToHintFragment(event.hint, event.subscribeStatus)
271+
gameSharedViewModel.setCurrentHint(event.hint)
272+
val action = TimerFragmentDirections.moveToHintFragment()
270273
findNavController().safeNavigate(action)
271274
viewModel.clearHintCode()
272275
}

presentation/src/main/java/com/nextroom/nextroom/presentation/ui/main/TimerViewModel.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,7 @@ class TimerViewModel @Inject constructor(
208208
answerOpened = state.answerOpenedHints.contains(hint.id),
209209
hintImageUrlList = hint.hintImageUrlList.toList(),
210210
answerImageUrlList = hint.answerImageUrlList.toList()
211-
),
212-
TimerFragmentArgs.fromSavedStateHandle(savedStateHandle).subscribeStatus
211+
)
213212
),
214213
)
215214
setGameState()

presentation/src/main/res/navigation/game_navigation.xml

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,7 @@
1212

1313
<action
1414
android:id="@+id/move_to_hint_fragment"
15-
app:destination="@id/hint_fragment">
16-
<argument
17-
android:name="hint"
18-
app:argType="com.nextroom.nextroom.presentation.model.Hint" />
19-
<argument
20-
android:name="subscribeStatus"
21-
app:argType="com.nextroom.nextroom.domain.model.SubscribeStatus" />
22-
</action>
15+
app:destination="@id/hint_fragment" />
2316
<action
2417
android:id="@+id/move_to_memo_fragment"
2518
app:destination="@id/memo_fragment" />
@@ -43,12 +36,6 @@
4336
<action
4437
android:id="@+id/move_to_memo_fragment"
4538
app:destination="@id/memo_fragment" />
46-
<argument
47-
android:name="subscribeStatus"
48-
app:argType="com.nextroom.nextroom.domain.model.SubscribeStatus" />
49-
<argument
50-
android:name="hint"
51-
app:argType="com.nextroom.nextroom.presentation.model.Hint" />
5239
</fragment>
5340

5441
<fragment

0 commit comments

Comments
 (0)