Skip to content

Commit 6ad014b

Browse files
Merge pull request #102 from boostcampwm-2022/96-fix-nav-graph-and-viewmodel
Navigation Component 버그 해결하기
2 parents 0dd73ce + bc5d96f commit 6ad014b

File tree

11 files changed

+105
-91
lines changed

11 files changed

+105
-91
lines changed

data/src/main/java/com/stop/data/di/NetworkModule.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import okhttp3.Response
2020
import okhttp3.logging.HttpLoggingInterceptor
2121
import retrofit2.Retrofit
2222
import retrofit2.converter.moshi.MoshiConverterFactory
23+
import java.util.concurrent.TimeUnit
2324
import javax.inject.Named
2425
import javax.inject.Singleton
2526

@@ -40,6 +41,9 @@ internal object NetworkModule {
4041
loggingInterceptor: HttpLoggingInterceptor,
4142
): OkHttpClient {
4243
return OkHttpClient.Builder()
44+
.connectTimeout(5, TimeUnit.SECONDS)
45+
.writeTimeout(5, TimeUnit.SECONDS)
46+
.readTimeout(5, TimeUnit.SECONDS)
4347
.addInterceptor(loggingInterceptor)
4448
.addInterceptor(customInterceptor)
4549
.build()

domain/src/main/java/com/stop/domain/usecase/route/GetLastTransportTimeUseCaseImpl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
378378
lastTime += TIME_CORRECTION_VALUE
379379
}
380380

381-
val lastTimeString = lastTime.toString().chunked(2).joinToString(":")
381+
val lastTimeString = lastTime.toString().padStart(6, '0').chunked(2).joinToString(":")
382382

383383
return TransportLastTime(
384384
transportMoveType = TransportMoveType.BUS,
@@ -521,7 +521,7 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
521521
lastTime += TIME_CORRECTION_VALUE
522522
}
523523

524-
val lastTimeString = lastTime.toString().chunked(2).joinToString(":")
524+
val lastTimeString = lastTime.toString().padStart(6, '0').chunked(2).joinToString(":")
525525

526526
return TransportLastTime(
527527
transportMoveType = TransportMoveType.BUS,

presentation/src/main/java/com/stop/model/ErrorType.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,7 @@ enum class ErrorType(val stringResourcesId: Int) {
1212
AVAILABLE_BUS_NO_EXIST_YET(R.string.available_bus_no_exist_yet),
1313
BUS_DISAPPEAR_SUDDENLY(R.string.bus_disappear_suddenly),
1414
MISSION_SOMETHING_WRONG(R.string.mission_something_wrong),
15+
SOCKET_TIMEOUT_EXCEPTION(R.string.socket_timeout_exception_please_retry),
16+
UNKNOWN_EXCEPTION(R.string.unknown_exception_occur),
17+
UNKNOWN_HOST_EXCEPTION(R.string.unknown_host_exception_occur),
1518
}

presentation/src/main/java/com/stop/ui/alarmsetting/AlarmSettingFragment.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,7 @@ class AlarmSettingFragment : Fragment() {
111111
//alarmSettingViewModel.makeAlarmWorker(transportLastTime.timeToBoard)
112112

113113
val navController = findNavController()
114-
navController.setGraph(R.navigation.nav_graph)
115-
navController.popBackStack(R.id.action_global_mapFragment, false)
114+
navController.popBackStack(R.id.mapFragment, false)
116115
requireActivity().viewModelStore.clear()
117116
}
118117

presentation/src/main/java/com/stop/ui/map/MapFragment.kt

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import android.view.LayoutInflater
1111
import android.view.View
1212
import android.view.ViewGroup
1313
import androidx.activity.result.contract.ActivityResultContracts
14+
import androidx.core.os.bundleOf
1415
import androidx.fragment.app.Fragment
1516
import androidx.fragment.app.activityViewModels
1617
import androidx.fragment.app.viewModels
@@ -22,7 +23,6 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior
2223
import com.skt.tmap.TMapPoint
2324
import com.stop.AlarmActivity
2425
import com.stop.R
25-
import com.stop.RouteNavGraphDirections
2626
import com.stop.alarm.SoundService
2727
import com.stop.databinding.FragmentMapBinding
2828
import com.stop.model.AlarmStatus
@@ -141,24 +141,14 @@ class MapFragment : Fragment(), MapHandler {
141141

142142
binding.homePanel.viewPanelStart.setOnClickListener {
143143
placeSearchViewModel.setPanelVisibility(View.INVISIBLE)
144-
findNavController().apply {
145-
setGraph(R.navigation.route_nav_graph)
146-
navigate(
147-
RouteNavGraphDirections.actionGlobalRouteFragment()
148-
.setStart(placeSearchViewModel.panelInfo)
149-
)
150-
}
144+
val bundle = bundleOf("start" to placeSearchViewModel.panelInfo)
145+
findNavController().navigate(R.id.action_mapFragment_to_route_nav_graph, bundle)
151146
}
152147

153148
binding.homePanel.viewPanelEnd.setOnClickListener {
154149
placeSearchViewModel.setPanelVisibility(View.INVISIBLE)
155-
findNavController().apply {
156-
setGraph(R.navigation.route_nav_graph)
157-
navigate(
158-
RouteNavGraphDirections.actionGlobalRouteFragment()
159-
.setEnd(placeSearchViewModel.panelInfo)
160-
)
161-
}
150+
val bundle = bundleOf("end" to placeSearchViewModel.panelInfo)
151+
findNavController().navigate(R.id.action_mapFragment_to_route_nav_graph, bundle)
162152
}
163153
}
164154

presentation/src/main/java/com/stop/ui/route/RouteFragment.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,7 @@ class RouteFragment : Fragment() {
5555

5656
backPressedCallback = object : OnBackPressedCallback(true) {
5757
override fun handleOnBackPressed() {
58-
val navController = findNavController()
59-
navController.setGraph(R.navigation.nav_graph)
60-
navController.popBackStack(R.id.action_global_mapFragment, false)
58+
findNavController().popBackStack(R.id.mapFragment, false)
6159
}
6260
}
6361
requireActivity().onBackPressedDispatcher.addCallback(this, backPressedCallback)
@@ -163,7 +161,7 @@ class RouteFragment : Fragment() {
163161
requireArguments().clear()
164162

165163
if (args?.start != null || args?.end != null) {
166-
routeViewModel.getRoute()
164+
routeViewModel.patchRoute()
167165
}
168166
}
169167

@@ -176,9 +174,9 @@ class RouteFragment : Fragment() {
176174

177175
val dialogView = layoutInflater.inflate(R.layout.dialog_progress, null)
178176
alertDialog = AlertDialog.Builder(requireContext())
179-
.setView(dialogView)
180-
.setCancelable(false)
181-
.create()
177+
.setView(dialogView)
178+
.setCancelable(false)
179+
.create()
182180
alertDialog.window?.setBackgroundDrawableResource(R.color.transparent)
183181
routeViewModel.alertDialog = alertDialog
184182
}

presentation/src/main/java/com/stop/ui/route/RouteViewModel.kt

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ import com.stop.model.ErrorType
1414
import com.stop.model.Event
1515
import com.stop.model.route.Place
1616
import dagger.hilt.android.lifecycle.HiltViewModel
17+
import kotlinx.coroutines.CoroutineExceptionHandler
18+
import kotlinx.coroutines.Dispatchers
1719
import kotlinx.coroutines.launch
20+
import java.net.SocketTimeoutException
21+
import java.net.UnknownHostException
1822
import javax.inject.Inject
1923

2024
@HiltViewModel
@@ -50,7 +54,17 @@ class RouteViewModel @Inject constructor(
5054
val isLoading: LiveData<Event<Boolean>>
5155
get() = _isLoading
5256

53-
fun getRoute(isShowError: Boolean = true) {
57+
private val coroutineExceptionHandler = CoroutineExceptionHandler { _, throwable ->
58+
val errorMessage = when (throwable) {
59+
is SocketTimeoutException -> Event(ErrorType.SOCKET_TIMEOUT_EXCEPTION)
60+
is UnknownHostException -> Event(ErrorType.UNKNOWN_HOST_EXCEPTION)
61+
else -> Event(ErrorType.UNKNOWN_EXCEPTION)
62+
}
63+
_errorMessage.postValue(errorMessage)
64+
_isLoading.postValue(Event(false))
65+
}
66+
67+
fun patchRoute(isShowError: Boolean = true) {
5468
val originValue = _origin.value ?: let {
5569
if (!isShowError) {
5670
return
@@ -75,30 +89,30 @@ class RouteViewModel @Inject constructor(
7589
endY = destinationValue.coordinate.latitude,
7690
)
7791

78-
viewModelScope.launch {
92+
viewModelScope.launch(Dispatchers.Default + coroutineExceptionHandler) {
7993
val itineraries = getRouteUseCase(routeRequest)
8094
if (itineraries.isEmpty()) {
81-
_errorMessage.value = Event(ErrorType.NO_ROUTE_RESULT)
82-
_routeResponse.value = listOf()
83-
_isLoading.value = Event(false)
95+
_errorMessage.postValue(Event(ErrorType.NO_ROUTE_RESULT))
96+
_routeResponse.postValue(listOf())
97+
_isLoading.postValue(Event(false))
8498
return@launch
8599
}
86-
this@RouteViewModel._routeResponse.value = itineraries
87-
_isLoading.value = Event(false)
100+
this@RouteViewModel._routeResponse.postValue(itineraries)
101+
_isLoading.postValue(Event(false))
88102
}
89103
}
90104

91105
fun changeOriginAndDestination() {
92106
_origin.value = _destination.value.also {
93107
_destination.value = _origin.value
94108
}
95-
getRoute(false)
109+
patchRoute(false)
96110
}
97111

98112
fun calculateLastTransportTime(itinerary: Itinerary) {
99113
checkClickedItinerary(itinerary)
100-
viewModelScope.launch {
101-
this@RouteViewModel._lastTimeResponse.value = Event(getLastTransportTimeUseCase(itinerary) )
114+
viewModelScope.launch(Dispatchers.Default + coroutineExceptionHandler) {
115+
this@RouteViewModel._lastTimeResponse.postValue(Event(getLastTransportTimeUseCase(itinerary)))
102116
}
103117
}
104118

presentation/src/main/java/com/stop/ui/routedetail/RouteDetailFragment.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import android.view.LayoutInflater
66
import android.view.View
77
import android.view.ViewGroup
88
import androidx.core.view.GravityCompat
9-
import androidx.navigation.findNavController
109
import androidx.navigation.fragment.findNavController
1110
import com.stop.R
1211
import androidx.navigation.navGraphViewModels
@@ -76,8 +75,7 @@ class RouteDetailFragment : Fragment(), RouteDetailHandler {
7675

7776
binding.imageViewClose.setOnClickListener {
7877
findNavController().apply {
79-
setGraph(R.navigation.nav_graph)
80-
popBackStack(R.id.action_global_mapFragment, false)
78+
popBackStack(R.id.mapFragment, false)
8179
requireActivity().viewModelStore.clear()
8280
}
8381
}

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

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,26 @@
55
android:id="@+id/nav_graph"
66
app:startDestination="@id/mapFragment">
77

8-
<include app:graph="@navigation/route_nav_graph" />
9-
108
<fragment
119
android:id="@+id/mapFragment"
1210
android:name="com.stop.ui.map.MapFragment"
1311
android:label="MapFragment"
1412
tools:layout="@layout/fragment_map">
1513

14+
<action
15+
android:id="@+id/action_mapFragment_to_route_nav_graph"
16+
app:destination="@id/route_nav_graph" />
17+
<argument
18+
android:name="start"
19+
android:defaultValue="@null"
20+
app:argType="com.stop.model.route.Place"
21+
app:nullable="true" />
22+
<argument
23+
android:name="end"
24+
android:defaultValue="@null"
25+
app:argType="com.stop.model.route.Place"
26+
app:nullable="true" />
27+
1628
<action
1729
android:id="@+id/action_mapFragment_to_placeSearchFragment"
1830
app:destination="@id/placeSearchFragment" />
@@ -35,9 +47,49 @@
3547
app:destination="@id/mapFragment" />
3648
</fragment>
3749

38-
<action
39-
android:id="@+id/action_global_mapFragment"
40-
app:destination="@id/mapFragment" />
50+
<navigation
51+
android:id="@+id/route_nav_graph"
52+
app:startDestination="@id/routeFragment">
53+
54+
<fragment
55+
android:id="@+id/routeFragment"
56+
android:name="com.stop.ui.route.RouteFragment"
57+
android:label="RouteFragment"
58+
tools:layout="@layout/fragment_route">
59+
<action
60+
android:id="@+id/action_routeFragment_to_routeDetailFragment"
61+
app:destination="@id/routeDetailFragment" />
62+
<argument
63+
android:name="start"
64+
android:defaultValue="@null"
65+
app:argType="com.stop.model.route.Place"
66+
app:nullable="true" />
67+
<argument
68+
android:name="end"
69+
android:defaultValue="@null"
70+
app:argType="com.stop.model.route.Place"
71+
app:nullable="true" />
72+
</fragment>
73+
74+
<fragment
75+
android:id="@+id/routeDetailFragment"
76+
android:name="com.stop.ui.routedetail.RouteDetailFragment"
77+
android:label="RouteDetailFragment"
78+
tools:layout="@layout/fragment_route_detail">
79+
<action
80+
android:id="@+id/action_routeDetailFragment_to_alarmSetting"
81+
app:destination="@id/alarmSetting" />
82+
</fragment>
83+
84+
<fragment
85+
android:id="@+id/alarmSetting"
86+
android:name="com.stop.ui.alarmsetting.AlarmSettingFragment"
87+
android:label="fragment_alarm_setting"
88+
tools:layout="@layout/fragment_alarm_setting" />
89+
<action
90+
android:id="@+id/action_global_routeFragment"
91+
app:destination="@id/routeFragment" />
92+
</navigation>
4193

4294
<action
4395
android:id="@+id/action_global_placeSearchFragment"

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

Lines changed: 0 additions & 47 deletions
This file was deleted.

0 commit comments

Comments
 (0)