Skip to content

Commit 16305ae

Browse files
authored
Merge branch 'develop' into feat/community_create_running_post
2 parents 4a1a5ee + d7ca06e commit 16305ae

File tree

9 files changed

+116
-101
lines changed

9 files changed

+116
-101
lines changed

presentation/src/main/java/com/whyranoid/presentation/community/CommunityFragment.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ internal class CommunityFragment :
1616

1717
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
1818
super.onViewCreated(view, savedInstanceState)
19+
initViews()
20+
}
1921

22+
private fun initViews() {
2023
val adapter = CommunityCategoryAdapter(this)
2124
setTabLayout(adapter)
2225
}

presentation/src/main/java/com/whyranoid/presentation/community/CommunityItemFragment.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.core.view.isVisible
66
import androidx.fragment.app.activityViewModels
77
import androidx.lifecycle.lifecycleScope
88
import androidx.navigation.fragment.findNavController
9+
import androidx.paging.LoadState
910
import com.google.android.material.snackbar.Snackbar
1011
import com.whyranoid.presentation.R
1112
import com.whyranoid.presentation.base.BaseFragment
@@ -109,6 +110,13 @@ internal class CommunityItemFragment :
109110
viewModel.onGroupJoinButtonClicked(it)
110111
}
111112
)
113+
114+
viewLifecycleOwner.repeatWhenUiStarted {
115+
postAdapter.loadStateFlow.collectLatest { loadStates ->
116+
binding.shimmerCommunity.isVisible = loadStates.refresh is LoadState.Loading
117+
}
118+
}
119+
112120
binding.rvCommunity.adapter = postAdapter
113121

114122
viewLifecycleOwner.repeatWhenUiStarted {
@@ -119,7 +127,6 @@ internal class CommunityItemFragment :
119127

120128
viewLifecycleOwner.repeatWhenUiStarted {
121129
viewModel.pagingPost.collectLatest { postList ->
122-
removeShimmer()
123130
postAdapter.submitData(postList)
124131
}
125132
}
@@ -133,9 +140,9 @@ internal class CommunityItemFragment :
133140
binding.rvCommunity.adapter = myGroupAdapter
134141

135142
viewLifecycleOwner.repeatWhenUiStarted {
136-
viewModel.myGroupList.collect { groupList ->
137-
removeShimmer()
143+
viewModel.myGroupList.collectLatest { groupList ->
138144
myGroupAdapter.submitList(groupList.sortedBy { it.name })
145+
removeShimmer()
139146
}
140147
}
141148
}
@@ -154,6 +161,13 @@ internal class CommunityItemFragment :
154161
}.show()
155162
}
156163
)
164+
165+
viewLifecycleOwner.repeatWhenUiStarted {
166+
postAdapter.loadStateFlow.collectLatest { loadStates ->
167+
binding.shimmerCommunity.isVisible = loadStates.refresh is LoadState.Loading
168+
}
169+
}
170+
157171
binding.rvCommunity.adapter = postAdapter
158172

159173
viewLifecycleOwner.repeatWhenUiStarted {
@@ -164,7 +178,6 @@ internal class CommunityItemFragment :
164178

165179
viewLifecycleOwner.repeatWhenUiStarted {
166180
viewModel.getMyPagingPostsUseCase().collectLatest { myPostList ->
167-
removeShimmer()
168181
postAdapter.submitData(myPostList)
169182
}
170183
}

presentation/src/main/java/com/whyranoid/presentation/community/group/detail/GroupDetailFragment.kt

Lines changed: 65 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.whyranoid.presentation.base.BaseFragment
1313
import com.whyranoid.presentation.databinding.FragmentGroupDetailBinding
1414
import com.whyranoid.presentation.util.repeatWhenUiStarted
1515
import dagger.hilt.android.AndroidEntryPoint
16+
import kotlinx.coroutines.flow.collectLatest
1617
import kotlinx.coroutines.launch
1718

1819
@AndroidEntryPoint
@@ -25,12 +26,24 @@ internal class GroupDetailFragment :
2526
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
2627
super.onViewCreated(view, savedInstanceState)
2728

29+
initViews()
30+
observeState()
31+
}
32+
33+
private fun initViews() {
34+
binding.viewModel = viewModel
2835
setupMenu()
29-
handleEvent()
30-
setBindingData()
3136
setNotificationAdapter()
3237
}
3338

39+
private fun observeState() {
40+
viewLifecycleOwner.repeatWhenUiStarted {
41+
viewModel.eventFlow.collect { event ->
42+
handleEvent(event)
43+
}
44+
}
45+
}
46+
3447
private fun setupMenu() {
3548
viewLifecycleOwner.lifecycleScope.launch {
3649
with(binding.topAppBar) {
@@ -77,76 +90,68 @@ internal class GroupDetailFragment :
7790
}
7891
}
7992

80-
private fun handleEvent() {
81-
viewLifecycleOwner.repeatWhenUiStarted {
82-
viewModel.eventFlow.collect { event ->
83-
when (event) {
84-
Event.RecruitButtonClick -> {
85-
Snackbar.make(
86-
binding.root,
87-
getString(R.string.text_check_recruit),
88-
Snackbar.LENGTH_SHORT
89-
).setAction(R.string.text_recruit) {
90-
viewModel.onRecruitSnackBarButtonClick()
91-
}.show()
92-
}
93-
is Event.RecruitSnackBarButtonClick -> {
94-
if (event.isSuccess) {
95-
Snackbar.make(
96-
binding.root,
97-
getString(R.string.text_recruit_success),
98-
Snackbar.LENGTH_SHORT
99-
).show()
100-
} else {
101-
Snackbar.make(
102-
binding.root,
103-
getString(R.string.text_recruit_fail),
104-
Snackbar.LENGTH_SHORT
105-
).show()
106-
}
107-
}
108-
Event.ExitGroupButtonClick -> {
109-
Snackbar.make(
110-
binding.root,
111-
getString(R.string.text_check_exit_group),
112-
Snackbar.LENGTH_SHORT
113-
).setAction(getString(R.string.text_exit_group)) {
114-
viewModel.onExitGroupSnackBarButtonClick()
115-
}.show()
116-
}
117-
is Event.ExitGroupSnackBarButtonClick -> {
118-
if (event.isSuccess) {
119-
Snackbar.make(
120-
binding.root,
121-
getString(R.string.text_exit_group_success),
122-
Snackbar.LENGTH_SHORT
123-
).show()
124-
findNavController().popBackStack()
125-
} else {
126-
Snackbar.make(
127-
binding.root,
128-
getString(R.string.text_exit_group_fail),
129-
Snackbar.LENGTH_SHORT
130-
).show()
131-
}
132-
}
93+
private fun handleEvent(event: Event) {
94+
when (event) {
95+
Event.RecruitButtonClick -> {
96+
Snackbar.make(
97+
binding.root,
98+
getString(R.string.text_check_recruit),
99+
Snackbar.LENGTH_SHORT
100+
).setAction(R.string.text_recruit) {
101+
viewModel.onRecruitSnackBarButtonClick()
102+
}.show()
103+
}
104+
is Event.RecruitSnackBarButtonClick -> {
105+
if (event.isSuccess) {
106+
Snackbar.make(
107+
binding.root,
108+
getString(R.string.text_recruit_success),
109+
Snackbar.LENGTH_SHORT
110+
).show()
111+
} else {
112+
Snackbar.make(
113+
binding.root,
114+
getString(R.string.text_recruit_fail),
115+
Snackbar.LENGTH_SHORT
116+
).show()
117+
}
118+
}
119+
Event.ExitGroupButtonClick -> {
120+
Snackbar.make(
121+
binding.root,
122+
getString(R.string.text_check_exit_group),
123+
Snackbar.LENGTH_SHORT
124+
).setAction(getString(R.string.text_exit_group)) {
125+
viewModel.onExitGroupSnackBarButtonClick()
126+
}.show()
127+
}
128+
is Event.ExitGroupSnackBarButtonClick -> {
129+
if (event.isSuccess) {
130+
Snackbar.make(
131+
binding.root,
132+
getString(R.string.text_exit_group_success),
133+
Snackbar.LENGTH_SHORT
134+
).show()
135+
findNavController().popBackStack()
136+
} else {
137+
Snackbar.make(
138+
binding.root,
139+
getString(R.string.text_exit_group_fail),
140+
Snackbar.LENGTH_SHORT
141+
).show()
133142
}
134143
}
135144
}
136145
}
137146

138-
private fun setBindingData() {
139-
binding.viewModel = viewModel
140-
}
141-
142147
private fun setNotificationAdapter() {
143148
viewLifecycleOwner.lifecycleScope.launch {
144149
val uid = viewModel.getUidUseCase()
145150
val notificationAdapter = GroupNotificationAdapter(uid)
146151

147152
binding.notificationRecyclerView.adapter = notificationAdapter
148153
viewLifecycleOwner.repeatWhenUiStarted {
149-
viewModel.mergedNotifications.collect { notifications ->
154+
viewModel.mergedNotifications.collectLatest { notifications ->
150155
notificationAdapter.submitList(notifications)
151156
}
152157
}

presentation/src/main/java/com/whyranoid/presentation/community/group/detail/GroupDetailViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class GroupDetailViewModel @Inject constructor(
7474
.sortedBy { notification ->
7575
when (notification) {
7676
is StartNotification -> notification.startedAt
77-
is FinishNotification -> notification.runningHistory.startedAt
77+
is FinishNotification -> notification.runningHistory.finishedAt
7878
}
7979
}
8080
}.launchIn(viewModelScope)

presentation/src/main/java/com/whyranoid/presentation/running/RunningDataManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class RunningDataManager @Inject constructor() {
8484
distance
8585
)
8686
val newTotalDistance = prevRunningData.totalDistance + distance.first()
87-
val newPace = newTotalDistance / newRunningTime
87+
val newPace = if (newRunningTime == 0) 0.0 else newTotalDistance / newRunningTime
8888
val newRunningPositionList =
8989
prevRunningData.runningPositionList.toList().map { it.toMutableList() }
9090
.also { it[it.lastIndex].add(runningPosition) }

presentation/src/main/java/com/whyranoid/presentation/runningfinish/RunningFinishFragment.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,16 @@ internal class RunningFinishFragment :
8484

8585
private fun handleEvent(event: Event) {
8686
when (event) {
87-
is Event.NegativeButtonButtonClick -> findNavController().popBackStack()
87+
is Event.NegativeButtonButtonClick -> handleNegativeButtonClicked()
8888
is Event.PositiveButtonClick -> handlePositiveButtonClicked(event.runningHistory)
8989
}
9090
}
9191

92+
private fun handleNegativeButtonClicked() {
93+
binding.mapFragmentLayout.visibility = View.INVISIBLE
94+
findNavController().popBackStack()
95+
}
96+
9297
private fun handlePositiveButtonClicked(runningHistory: RunningHistoryUiModel) {
9398
val direction = RunningFinishFragmentDirections.actionRunningFinishFragmentToCreateRunningPostFragment(
9499
runningHistory

presentation/src/main/java/com/whyranoid/presentation/runningstart/RunningStartFragment.kt

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,7 @@ internal class RunningStartFragment :
5252
RUNNING_FINISH_DATA_KEY
5353
)
5454

55-
// 결과 넘겨주기
56-
if (runningFinishData?.runningPositionList.isNullOrEmpty().not()) {
57-
runningFinishData?.let {
58-
val direction =
59-
RunningStartFragmentDirections.actionRunningStartFragmentToRunningFinish(
60-
runningFinishData
61-
)
62-
findNavController().navigate(direction)
63-
} ?: Snackbar.make(binding.root, getString(R.string.running_start_error_message), Snackbar.LENGTH_SHORT)
64-
.show()
65-
}
55+
navigateToRunningFinish(runningFinishData)
6656
}
6757
}
6858

@@ -155,4 +145,21 @@ internal class RunningStartFragment :
155145
}
156146
.show()
157147
}
148+
149+
private fun navigateToRunningFinish(runningFinishData: RunningFinishData?) {
150+
runningFinishData?.let { it ->
151+
if (it.runningPositionList.flatten().isNotEmpty()) {
152+
val direction =
153+
RunningStartFragmentDirections.actionRunningStartFragmentToRunningFinish(
154+
it
155+
)
156+
findNavController().navigate(direction)
157+
}
158+
} ?: Snackbar.make(
159+
binding.root,
160+
getString(R.string.running_start_error_message),
161+
Snackbar.LENGTH_SHORT
162+
)
163+
.show()
164+
}
158165
}

presentation/src/main/res/layout/fragment_running_finish.xml

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,13 @@
3636
</com.google.android.material.appbar.AppBarLayout>
3737

3838
<androidx.constraintlayout.widget.ConstraintLayout
39+
android:id="@+id/map_fragment_layout"
3940
android:layout_width="match_parent"
4041
android:layout_height="0dp"
4142
app:layout_constraintBottom_toTopOf="@id/running_history_item"
4243
app:layout_constraintTop_toBottomOf="@id/tool_bar">
4344

44-
<fragment
45+
<androidx.fragment.app.FragmentContainerView
4546
android:id="@+id/map_fragment"
4647
android:name="com.naver.maps.map.MapFragment"
4748
android:layout_width="match_parent"
@@ -89,26 +90,5 @@
8990
app:layout_constraintEnd_toEndOf="parent"
9091
app:layout_constraintStart_toEndOf="@id/btn_positive" />
9192

92-
<FrameLayout
93-
android:id="@+id/frame_progress_running"
94-
android:layout_width="match_parent"
95-
android:layout_height="match_parent"
96-
android:alpha="0.8"
97-
android:background="@color/black"
98-
android:translationZ="@{vm.runningFinishDataState instanceof UiState.Success ? 0f : 10f }"
99-
android:visibility="@{vm.runningFinishDataState instanceof UiState.Success ? View.GONE : View.VISIBLE }">
100-
101-
<com.google.android.material.progressindicator.CircularProgressIndicator
102-
android:id="@+id/progressindicator_running"
103-
android:layout_width="wrap_content"
104-
android:layout_height="wrap_content"
105-
android:layout_gravity="center"
106-
android:contentDescription="@string/running_finish_progress_description"
107-
android:indeterminate="true"
108-
android:visibility="@{vm.runningFinishDataState instanceof UiState.Success ? View.GONE : View.VISIBLE }"
109-
app:indicatorColor="?attr/colorOnPrimary" />
110-
111-
</FrameLayout>
112-
11393
</androidx.constraintlayout.widget.ConstraintLayout>
11494
</layout>

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@
8888
app:argType="com.whyranoid.presentation.model.RunningHistoryUiModel" />
8989
<action
9090
android:id="@+id/action_createRunningPostFragment_to_communityFragment"
91-
app:destination="@id/communityFragment" />
91+
app:destination="@id/communityFragment"
92+
app:popUpTo="@id/runningStartFragment"
93+
app:popUpToInclusive="true" />
9294
</fragment>
9395
<fragment
9496
android:id="@+id/runningFinishFragment"

0 commit comments

Comments
 (0)