Skip to content

Commit 67aa878

Browse files
authored
๐Ÿ”€ #69 from boostcampwm-2022/feat/running_tab
๋Ÿฌ๋‹ ์—‘ํ‹ฐ๋น„ํ‹ฐ ๋ฐฑ์Šคํƒ ๊ด€๋ฆฌ, ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ ์ฝœ๋ฐฑ ์ถ”๊ฐ€, ์ธ์ฆ ๊ธ€ ์“ฐ๊ธฐ ํŽ˜์ด์ง€ ์—ฐ๊ฒฐ
2 parents a03f646 + 5730d6c commit 67aa878

File tree

9 files changed

+81
-14
lines changed

9 files changed

+81
-14
lines changed

โ€Žpresentation/src/main/java/com/whyranoid/presentation/running/RunningActivity.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package com.whyranoid.presentation.running
22

33
import android.content.Intent
44
import android.os.Bundle
5+
import androidx.activity.OnBackPressedCallback
56
import androidx.activity.viewModels
7+
import com.google.android.material.snackbar.Snackbar
68
import com.naver.maps.geometry.LatLng
79
import com.naver.maps.map.CameraUpdate
810
import com.naver.maps.map.LocationSource
@@ -28,6 +30,18 @@ internal class RunningActivity :
2830

2931
private val viewModel: RunningViewModel by viewModels()
3032

33+
private val backPressedCallback = object : OnBackPressedCallback(true) {
34+
override fun handleOnBackPressed() {
35+
Snackbar.make(
36+
binding.root,
37+
getString(R.string.running_finish_snackbar_content),
38+
Snackbar.LENGTH_SHORT
39+
).setAction(getString(R.string.running_finish_snackbar_action)) {
40+
viewModel.onFinishButtonClicked()
41+
}.show()
42+
}
43+
}
44+
3145
private lateinit var mapView: MapView
3246
private lateinit var naverMap: NaverMap
3347
private lateinit var paths: MutableList<PathOverlay>
@@ -125,6 +139,7 @@ internal class RunningActivity :
125139
mapView.getMapAsync(this)
126140

127141
binding.vm = viewModel
142+
this.onBackPressedDispatcher.addCallback(this, backPressedCallback)
128143
}
129144

130145
private fun observeState() {

โ€Žpresentation/src/main/java/com/whyranoid/presentation/running/RunningWorker.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import com.google.android.gms.location.LocationRequest
2020
import com.google.android.gms.location.LocationResult
2121
import com.google.android.gms.location.LocationServices
2222
import com.google.android.gms.location.Priority
23+
import com.whyranoid.presentation.MainActivity
2324
import com.whyranoid.presentation.R
2425
import dagger.assisted.Assisted
2526
import dagger.assisted.AssistedInject
@@ -61,7 +62,7 @@ class RunningWorker @AssistedInject constructor(
6162
val id = context.getString(R.string.running_notification_id)
6263
val title = context.getString(R.string.running_notification_title)
6364

64-
val intent = Intent(context, RunningActivity::class.java)
65+
val intent = Intent(context, MainActivity::class.java)
6566
val pendingIntent =
6667
PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
6768

โ€Žpresentation/src/main/java/com/whyranoid/presentation/runningfinish/RunningFinishFragment.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,10 @@ internal class RunningFinishFragment :
9090
}
9191

9292
private fun handlePositiveButtonClicked(runningHistory: RunningHistoryUiModel) {
93-
// TODO Safe-Args ํ™œ์šฉ CreateRunningPostFragment๋กœ ์ด๋™
93+
val direction = RunningFinishFragmentDirections.actionRunningFinishFragmentToCreateRunningPostFragment(
94+
runningHistory
95+
)
96+
findNavController().navigate(direction)
9497
}
9598

9699
override fun onMapReady(naverMap: NaverMap) {

โ€Žpresentation/src/main/java/com/whyranoid/presentation/runningstart/RunningStartFragment.kt

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.whyranoid.presentation.base.BaseFragment
1818
import com.whyranoid.presentation.databinding.FragmentRunningStartBinding
1919
import com.whyranoid.presentation.running.RunningActivity
2020
import com.whyranoid.presentation.running.RunningFinishData
21+
import com.whyranoid.presentation.running.RunningState
2122
import com.whyranoid.presentation.running.RunningViewModel.Companion.RUNNING_FINISH_DATA_KEY
2223
import com.whyranoid.presentation.util.getSerializableData
2324
import com.whyranoid.presentation.util.gpsstate.GPSState
@@ -51,27 +52,41 @@ internal class RunningStartFragment :
5152
RUNNING_FINISH_DATA_KEY
5253
)
5354

54-
runningFinishData?.let {
55-
// ๊ฒฐ๊ณผ ๋„˜๊ฒจ์ฃผ๊ธฐ
56-
val direction =
57-
RunningStartFragmentDirections.actionRunningStartFragmentToRunningFinish(
58-
runningFinishData
59-
)
60-
findNavController().navigate(direction)
61-
} ?: Snackbar.make(binding.root, "๋Ÿฌ๋‹ ๋„์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์–ด์š”! ์ฃ„์†กํ•ด์š”..", Snackbar.LENGTH_SHORT)
62-
.show()
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+
}
6366
}
6467
}
6568

6669
private val viewModel by viewModels<RunningStartViewModel>()
6770

6871
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
6972
super.onViewCreated(view, savedInstanceState)
70-
binding.vm = viewModel
7173

74+
initViews()
7275
observeState()
7376
}
7477

78+
private fun initViews() {
79+
binding.vm = viewModel
80+
if ((viewModel.runningDataManager.runningState.value is RunningState.NotRunning).not()) {
81+
runningActivityLauncher.launch(
82+
Intent(
83+
requireContext(),
84+
RunningActivity::class.java
85+
)
86+
)
87+
}
88+
}
89+
7590
private fun observeState() {
7691
viewLifecycleOwner.repeatWhenUiStarted {
7792
viewModel.runnerCount.collect { runnerCount ->

โ€Žpresentation/src/main/java/com/whyranoid/presentation/runningstart/RunningStartViewModel.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.whyranoid.presentation.runningstart
33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.viewModelScope
55
import com.whyranoid.domain.usecase.GetRunnerCountUseCase
6+
import com.whyranoid.presentation.running.RunningDataManager
67
import com.whyranoid.presentation.util.networkconnection.NetworkConnectionStateHolder
78
import dagger.hilt.android.lifecycle.HiltViewModel
89
import kotlinx.coroutines.flow.MutableSharedFlow
@@ -13,7 +14,8 @@ import javax.inject.Inject
1314
@HiltViewModel
1415
class RunningStartViewModel @Inject constructor(
1516
getRunnerCountUseCase: GetRunnerCountUseCase,
16-
networkConnectionStateHolder: NetworkConnectionStateHolder
17+
networkConnectionStateHolder: NetworkConnectionStateHolder,
18+
val runningDataManager: RunningDataManager
1719
) : ViewModel() {
1820

1921
val networkState = networkConnectionStateHolder.networkState

โ€Žpresentation/src/main/res/layout/fragment_running_finish.xml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
xmlns:app="http://schemas.android.com/apk/res-auto">
44

55
<data>
6+
<import type="com.whyranoid.presentation.model.UiState"/>
7+
<import type="android.view.View"/>
68

79
<variable
810
name="vm"
@@ -80,5 +82,26 @@
8082
app:layout_constraintEnd_toEndOf="parent"
8183
app:layout_constraintStart_toEndOf="@id/btn_positive" />
8284

85+
<FrameLayout
86+
android:id="@+id/frame_progress_running"
87+
android:layout_width="match_parent"
88+
android:layout_height="match_parent"
89+
android:background="@color/black"
90+
android:alpha="0.8"
91+
android:translationZ="@{vm.runningFinishDataState instanceof UiState.Success ? 0f : 10f }"
92+
android:visibility="@{vm.runningFinishDataState instanceof UiState.Success ? View.GONE : View.VISIBLE }">
93+
94+
<com.google.android.material.progressindicator.CircularProgressIndicator
95+
android:id="@+id/progressindicator_running"
96+
android:layout_width="wrap_content"
97+
android:layout_height="wrap_content"
98+
android:layout_gravity="center"
99+
android:contentDescription="@string/running_finish_progress_description"
100+
android:indeterminate="true"
101+
android:visibility="@{vm.runningFinishDataState instanceof UiState.Success ? View.GONE : View.VISIBLE }"
102+
app:indicatorColor="?attr/colorOnPrimary" />
103+
104+
</FrameLayout>
105+
83106
</androidx.constraintlayout.widget.ConstraintLayout>
84107
</layout>

โ€Žpresentation/src/main/res/navigation/navigation_graph.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@
9797
android:name="runningFinishData"
9898
app:argType="com.whyranoid.presentation.running.RunningFinishData"
9999
app:nullable="true" />
100+
<action
101+
android:id="@+id/action_runningFinishFragment_to_createRunningPostFragment"
102+
app:destination="@id/createRunningPostFragment" />
100103
</fragment>
101104

102105
</navigation>

โ€Žpresentation/src/main/res/values/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,5 +119,9 @@
119119
<string name="running_finish_tool_bar">๋Ÿฌ๋‹ ์ข…๋ฃŒ</string>
120120
<string name="running_finish_positive_btn">์ž๋ž‘ํ• ๋ž˜์š”</string>
121121
<string name="running_finish_negative_btn">๊ดœ์ฐฎ์•„์š”</string>
122+
<string name="running_finish_progress_description">๋Ÿฌ๋‹ ์ข…๋ฃŒ ํ™”๋ฉด ํ”„๋กœ๊ทธ๋ ˆ์Šค๋ฐ”</string>
123+
<string name="running_finish_snackbar_content">๋Ÿฌ๋‹์„ ์ข…๋ฃŒํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?</string>
124+
<string name="running_finish_snackbar_action">์ข…๋ฃŒํ•˜๊ธฐ</string>
125+
<string name="running_start_error_message">๋Ÿฌ๋‹ ๋„์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์–ด์š”! ์ฃ„์†กํ•ด์š”..</string>
122126

123127
</resources>

โ€Žpresentation/src/main/res/values/themes.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
<item name="colorSecondaryVariant">@color/mogakrun_secondary_dark</item>
1111
<item name="colorOnSecondary">@color/mogakrun_on_secondary</item>
1212
<!-- Status bar color. -->
13-
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
13+
<item name="android:statusBarColor">@color/mogakrun_background</item>
14+
<item name="android:windowLightStatusBar">true</item>
1415
<!-- TabLayout color. -->
1516
<item name="tabSelectedTextColor">@color/mogakrun_on_primary</item>
1617
<!-- Base color. -->

0 commit comments

Comments
ย (0)