Skip to content

Commit c8aabe0

Browse files
committed
feat : 사용자가 이동할 walk 경로 그리기 & 도착지 마커 및 안내 패널 생성
1 parent a25abe3 commit c8aabe0

File tree

12 files changed

+108
-62
lines changed

12 files changed

+108
-62
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.stop.ui.alarmsetting
22

3+
import android.util.Log
34
import androidx.lifecycle.MutableLiveData
45
import androidx.lifecycle.ViewModel
56
import androidx.lifecycle.viewModelScope
@@ -21,7 +22,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
2122
import kotlinx.coroutines.flow.StateFlow
2223
import kotlinx.coroutines.flow.collectLatest
2324
import kotlinx.coroutines.launch
24-
import java.util.UUID
25+
import java.util.*
2526
import javax.inject.Inject
2627

2728
@HiltViewModel
@@ -54,7 +55,7 @@ class AlarmSettingViewModel @Inject constructor(
5455
viewModelScope.launch(Dispatchers.IO) {
5556
getAlarmUseCase.getAlarm().collectLatest {
5657
_alarmItem.value = it
57-
58+
Log.d("MissonWorker","alarm viewModel에서 가져오나? ${_alarmItem.value} ${_alarmItem.value?.routes}")
5859
_isAlarmItemNotNull.value = it != null
5960
}
6061
}
@@ -67,7 +68,7 @@ class AlarmSettingViewModel @Inject constructor(
6768
}
6869

6970
fun callAlarm(time: String) {
70-
alarmFunctions.callAlarm(time, alarmTime.value ?: 0, ALARM_CODE)
71+
alarmFunctions.callAlarm("01:00:00", alarmTime.value ?: 0, ALARM_CODE)
7172
}
7273

7374
fun cancelAlarm() {

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.stop.ui.map
22

33
import android.Manifest.permission
4+
import android.content.Intent
45
import android.os.Bundle
6+
import android.util.Log
57
import android.view.LayoutInflater
68
import android.view.View
79
import android.view.ViewGroup
@@ -17,6 +19,7 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior
1719
import com.skt.tmap.TMapPoint
1820
import com.stop.R
1921
import com.stop.RouteNavGraphDirections
22+
import com.stop.SoundService
2023
import com.stop.databinding.FragmentMapBinding
2124
import com.stop.model.Location
2225
import com.stop.ui.alarmsetting.AlarmSettingViewModel
@@ -68,6 +71,7 @@ class MapFragment : Fragment(), MapHandler {
6871
binding.lifecycleOwner = viewLifecycleOwner
6972
binding.alarmViewModel = alarmViewModel
7073
binding.placeSearchViewModel = placeSearchViewModel
74+
binding.fragment = this@MapFragment
7175
}
7276

7377
private fun initTMap() {
@@ -222,11 +226,17 @@ class MapFragment : Fragment(), MapHandler {
222226
private fun listenButtonClick(){
223227
binding.homeBottomSheet.layoutStateExpanded.buttonAlarmTurnOff.setOnClickListener {
224228
alarmViewModel.deleteAlarm()
229+
turnOffSoundService()
225230
val behavior = BottomSheetBehavior.from(binding.layoutHomeBottomSheet)
226231
behavior.state = BottomSheetBehavior.STATE_COLLAPSED
227232
}
228233
}
229234

235+
private fun turnOffSoundService() {
236+
val intent = Intent(context, SoundService::class.java)
237+
requireContext().stopService(intent)
238+
}
239+
230240
override fun onDestroyView() {
231241
_binding = null
232242

@@ -241,6 +251,11 @@ class MapFragment : Fragment(), MapHandler {
241251
}
242252
}
243253

254+
fun setMissionStart() {
255+
Log.d("MissionWorker","mission 버튼 클릭")
256+
binding.root.findNavController().navigate(R.id.action_mapFragment_to_missionFragment)
257+
}
258+
244259
companion object {
245260
private val PERMISSIONS =
246261
arrayOf(permission.ACCESS_FINE_LOCATION, permission.ACCESS_COARSE_LOCATION)

presentation/src/main/java/com/stop/ui/mission/MissionFragment.kt

Lines changed: 52 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,18 @@ import android.util.Log
88
import android.view.LayoutInflater
99
import android.view.View
1010
import android.view.ViewGroup
11-
import android.widget.Toast
1211
import androidx.activity.result.contract.ActivityResultContracts
1312
import androidx.fragment.app.Fragment
13+
import androidx.fragment.app.activityViewModels
1414
import androidx.fragment.app.viewModels
1515
import androidx.lifecycle.lifecycleScope
1616
import com.skt.tmap.TMapPoint
1717
import com.stop.R
1818
import com.stop.databinding.FragmentMissionBinding
19+
import com.stop.domain.model.route.tmap.custom.Place
20+
import com.stop.domain.model.route.tmap.custom.WalkRoute
1921
import com.stop.model.Location
22+
import com.stop.ui.alarmsetting.AlarmSettingViewModel
2023
import com.stop.ui.util.Marker
2124
import dagger.hilt.android.AndroidEntryPoint
2225
import kotlinx.coroutines.launch
@@ -28,7 +31,8 @@ class MissionFragment : Fragment(), MissionHandler {
2831
private val binding: FragmentMissionBinding
2932
get() = _binding!!
3033

31-
private val viewModel: MissionViewModel by viewModels()
34+
private val missionViewModel: MissionViewModel by viewModels()
35+
private val alarmSettingViewModel: AlarmSettingViewModel by activityViewModels<AlarmSettingViewModel>()
3236

3337
private lateinit var tMap: MissionTMap
3438

@@ -60,7 +64,7 @@ class MissionFragment : Fragment(), MissionHandler {
6064

6165
private fun setDataBinding() {
6266
binding.lifecycleOwner = viewLifecycleOwner
63-
binding.viewModel = viewModel
67+
binding.viewModel = missionViewModel
6468
binding.fragment = this@MissionFragment
6569
}
6670

@@ -72,8 +76,7 @@ class MissionFragment : Fragment(), MissionHandler {
7276
}
7377

7478
private fun initViewModel() {
75-
viewModel.setDestination(DESTINATION)
76-
viewModel.countDownWith(LEFT_TIME)
79+
missionViewModel.countDownWith(LEFT_TIME)
7780
}
7881

7982
fun setCompassMode() {
@@ -82,8 +85,8 @@ class MissionFragment : Fragment(), MissionHandler {
8285

8386
fun setPersonCurrent() {
8487
tMap.tMapView.setCenterPoint(
85-
viewModel.personCurrentLocation.latitude,
86-
viewModel.personCurrentLocation.longitude,
88+
missionViewModel.personCurrentLocation.latitude,
89+
missionViewModel.personCurrentLocation.longitude,
8790
true
8891
)
8992

@@ -95,10 +98,10 @@ class MissionFragment : Fragment(), MissionHandler {
9598
with(tMap) {
9699
latitudes.clear()
97100
longitudes.clear()
98-
latitudes.add(TEST_DESTINATION.latitude)
99-
longitudes.add(TEST_DESTINATION.longitude)
100-
latitudes.add(viewModel.personCurrentLocation.latitude)
101-
longitudes.add(viewModel.personCurrentLocation.longitude)
101+
latitudes.add((missionViewModel.destination.value?.coordinate?.latitude ?: "37.553836").toDouble())
102+
longitudes.add((missionViewModel.destination.value?.coordinate?.longitude ?: "126.969652").toDouble())
103+
latitudes.add(missionViewModel.personCurrentLocation.latitude)
104+
longitudes.add(missionViewModel.personCurrentLocation.longitude)
102105
setRouteDetailFocus()
103106
isTracking = false
104107
}
@@ -108,7 +111,7 @@ class MissionFragment : Fragment(), MissionHandler {
108111
val shortAnimationDuration =
109112
resources.getInteger(android.R.integer.config_shortAnimTime)
110113

111-
viewModel.timeIncreased.observe(viewLifecycleOwner) {
114+
missionViewModel.timeIncreased.observe(viewLifecycleOwner) {
112115
val sign = if (it > 0) {
113116
PLUS
114117
} else {
@@ -134,26 +137,11 @@ class MissionFragment : Fragment(), MissionHandler {
134137
})
135138
}
136139
}
137-
138-
viewModel.errorMessage.observe(viewLifecycleOwner) {
139-
it.getContentIfNotHandled()?.let { errorType ->
140-
val message = getString(errorType.stringResourcesId)
141-
142-
Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show()
143-
}
144-
}
145-
viewModel.transportIsArrived.observe(viewLifecycleOwner) {
146-
it.getContentIfNotHandled()?.let { isArrived ->
147-
if (isArrived) {
148-
Toast.makeText(requireContext(), "도착했습니다.", Toast.LENGTH_LONG).show()
149-
}
150-
}
151-
}
152140
}
153141

154142
override fun alertTMapReady() {
155143
requestPermissionsLauncher.launch(PERMISSIONS)
156-
makeDestinationMarker()
144+
getAlarmInfo()
157145
}
158146

159147
override fun setOnEnableScrollWithZoomLevelListener() {
@@ -176,7 +164,7 @@ class MissionFragment : Fragment(), MissionHandler {
176164
var first = 0
177165
lateinit var beforeLocation: Location
178166
lifecycleScope.launch {
179-
viewModel.userLocation.collect { userLocation ->
167+
missionViewModel.userLocation.collect { userLocation ->
180168
when (first) {
181169
0 -> {
182170
first += 1
@@ -188,7 +176,7 @@ class MissionFragment : Fragment(), MissionHandler {
188176
Marker.PERSON_MARKER_IMG,
189177
TMapPoint(userLocation.latitude, userLocation.longitude)
190178
)
191-
viewModel.personCurrentLocation = userLocation
179+
missionViewModel.personCurrentLocation = userLocation
192180
tMap.latitudes.add(userLocation.latitude)
193181
tMap.longitudes.add(userLocation.longitude)
194182
tMap.setRouteDetailFocus()
@@ -204,7 +192,7 @@ class MissionFragment : Fragment(), MissionHandler {
204192
Marker.PERSON_LINE_COLOR
205193
)
206194
tMap.addMarker(Marker.PERSON_MARKER, Marker.PERSON_MARKER_IMG, nowLocation)
207-
viewModel.personCurrentLocation = userLocation
195+
missionViewModel.personCurrentLocation = userLocation
208196
if (tMap.isTracking) {
209197
tMap.tMapView.setCenterPoint(userLocation.latitude, userLocation.longitude)
210198
}
@@ -217,15 +205,43 @@ class MissionFragment : Fragment(), MissionHandler {
217205
}
218206
}
219207

220-
private fun makeDestinationMarker() {
221-
tMap.addMarker(Marker.DESTINATION_MARKER, Marker.DESTINATION_MARKER_IMG, TEST_DESTINATION)
222-
tMap.latitudes.add(TEST_DESTINATION.latitude)
223-
tMap.longitudes.add(TEST_DESTINATION.longitude)
208+
private fun getAlarmInfo() {
209+
alarmSettingViewModel.getAlarm()
210+
val linePoints = arrayListOf<TMapPoint>()
211+
val walkInfo = alarmSettingViewModel.alarmItem.value?.routes?.first() as WalkRoute
212+
Log.d("MissionWorker", "route 그리기 ${alarmSettingViewModel.alarmItem.value?.routes?.first()}")
213+
drawWalkRoute(walkInfo, linePoints)
214+
tMap.drawWalkLines(linePoints, Marker.WALK_LINE, Marker.WALK_LINE_COLOR)
215+
216+
missionViewModel.destination.value = walkInfo.end
217+
makeDestinationMarker(walkInfo.end)
218+
}
219+
220+
private fun makeDestinationMarker(destination: Place) {
221+
val latitude = destination.coordinate.latitude.toDouble()
222+
val longitude = destination.coordinate.longitude.toDouble()
223+
tMap.addMarker(
224+
Marker.DESTINATION_MARKER,
225+
Marker.DESTINATION_MARKER_IMG,
226+
TMapPoint(latitude, longitude)
227+
)
228+
tMap.latitudes.add(latitude)
229+
tMap.longitudes.add(longitude)
230+
}
231+
232+
233+
private fun drawWalkRoute(route: WalkRoute, linePoints: ArrayList<TMapPoint>) {
234+
route.steps.forEach { step ->
235+
step.lineString.split(" ").forEach { coordinate ->
236+
val points = coordinate.split(",")
237+
238+
linePoints.add(TMapPoint(points.last().toDouble(), points.first().toDouble()))
239+
}
240+
}
224241
}
225242

226243
companion object {
227244

228-
private const val DESTINATION = "구로3동현대아파트"
229245
private const val PLUS = "+"
230246
private const val MINUS = ""
231247
private const val LEFT_TIME = 60
@@ -235,7 +251,5 @@ class MissionFragment : Fragment(), MissionHandler {
235251
private val PERMISSIONS =
236252
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)
237253

238-
private val TEST_DESTINATION = TMapPoint(37.553836, 126.969652)
239-
240254
}
241255
}

presentation/src/main/java/com/stop/ui/mission/MissionTMap.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,12 @@ class MissionTMap(
2020
tMapView.addTMapPolyLine(polyLine)
2121
}
2222

23+
fun drawWalkLines(points: ArrayList<TMapPoint>, id: String, color: Int) {
24+
val polyLine = TMapPolyLine(id, points).apply {
25+
lineColor = color
26+
outLineColor = color
27+
}
28+
tMapView.addTMapPolyLine(polyLine)
29+
}
30+
2331
}

presentation/src/main/java/com/stop/ui/mission/MissionViewModel.kt

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@ import android.util.Log
44
import androidx.lifecycle.*
55
import androidx.work.OneTimeWorkRequestBuilder
66
import androidx.work.WorkManager
7-
import com.stop.model.ErrorType
8-
import com.stop.model.Event
7+
import com.stop.domain.model.route.tmap.custom.Place
98
import com.stop.model.Location
109
import dagger.hilt.android.lifecycle.HiltViewModel
1110
import kotlinx.coroutines.delay
1211
import kotlinx.coroutines.launch
13-
import java.util.UUID
12+
import java.util.*
1413
import javax.inject.Inject
1514
import kotlin.random.Random
1615

@@ -22,9 +21,7 @@ class MissionViewModel @Inject constructor(
2221

2322
private val random = Random(System.currentTimeMillis())
2423

25-
private val _destination = MutableLiveData<String>()
26-
val destination: LiveData<String>
27-
get() = _destination
24+
val destination= MutableLiveData<Place>()
2825

2926
private val _timeIncreased = MutableLiveData<Int>()
3027
val timeIncreased: LiveData<Int>
@@ -34,14 +31,6 @@ class MissionViewModel @Inject constructor(
3431
val estimatedTimeRemaining: LiveData<Int>
3532
get() = _estimatedTimeRemaining
3633

37-
private val _errorMessage = MutableLiveData<Event<ErrorType>>()
38-
val errorMessage: LiveData<Event<ErrorType>>
39-
get() = _errorMessage
40-
41-
private val _transportIsArrived = MutableLiveData<Event<Boolean>>()
42-
val transportIsArrived: LiveData<Event<Boolean>>
43-
get() = _transportIsArrived
44-
4534
val leftMinute: LiveData<String> = Transformations.switchMap(estimatedTimeRemaining) {
4635
MutableLiveData<String>().apply {
4736
value = (it / TIME_UNIT).toString().padStart(TIME_DIGIT, '0')
@@ -64,10 +53,6 @@ class MissionViewModel @Inject constructor(
6453
makeMissionWorker()
6554
}
6655

67-
fun setDestination(inputDestination: String) {
68-
_destination.value = inputDestination
69-
}
70-
7156
fun countDownWith(startTime: Int) {
7257
_estimatedTimeRemaining.value = startTime
7358
var leftTime = startTime

presentation/src/main/java/com/stop/ui/util/Marker.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,7 @@ object Marker {
2020

2121
const val DESTINATION_MARKER = "destination_marker"
2222
const val DESTINATION_MARKER_IMG = R.drawable.ic_start_marker
23+
24+
const val WALK_LINE = "walk_line"
25+
const val WALK_LINE_COLOR = Color.BLACK
2326
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
name="viewModel"
1010
type="com.stop.ui.alarmsetting.AlarmSettingViewModel" />
1111

12+
<variable
13+
name="fragment"
14+
type="com.stop.ui.map.MapFragment" />
15+
1216
</data>
1317

1418
<androidx.constraintlayout.widget.ConstraintLayout
@@ -115,6 +119,7 @@
115119
android:textColor="@color/black"
116120
android:textSize="36sp"
117121
android:textStyle="bold"
122+
android:onClick="@{() -> fragment.setMissionStart()}"
118123
app:layout_constraintBottom_toTopOf="@id/button_alarm_turn_off"
119124
app:layout_constraintEnd_toEndOf="@id/guide_line_end"
120125
app:layout_constraintStart_toStartOf="@id/guide_line_start"

0 commit comments

Comments
 (0)