Skip to content

Commit 26d838c

Browse files
committed
feat : 알람 울리고 미션 시작 누르면 미션 화면으로 이동하는 연결 구현 & 10m 이내면 미션 종료되는 로직 구현중
1 parent 2064984 commit 26d838c

File tree

10 files changed

+77
-28
lines changed

10 files changed

+77
-28
lines changed

presentation/src/main/java/com/stop/MainActivity.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
1515
import androidx.core.view.WindowCompat
1616
import androidx.navigation.fragment.NavHostFragment
1717
import com.stop.databinding.ActivityMainBinding
18+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_CODE
19+
import com.stop.ui.mission.MissionWorker.Companion.MISSION_CODE
1820
import dagger.hilt.android.AndroidEntryPoint
1921

2022
@AndroidEntryPoint
@@ -24,7 +26,10 @@ class MainActivity : AppCompatActivity() {
2426
override fun onNewIntent(intent: Intent?) {
2527
super.onNewIntent(intent)
2628

27-
intent?.extras?.getInt("ALARM_CODE")?.let {
29+
val alarmCode = intent?.extras?.getInt("ALARM_CODE")
30+
val missionCode = intent?.extras?.getInt("MISSION_CODE")
31+
32+
if(alarmCode == ALARM_CODE){
2833
val navHostFragment =
2934
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
3035
val inflater = navHostFragment.navController.navInflater
@@ -34,7 +39,7 @@ class MainActivity : AppCompatActivity() {
3439
navHostFragment.navController.graph = graph
3540
}
3641

37-
intent?.extras?.getInt("MISSION_CODE")?.let {
42+
if(missionCode == MISSION_CODE){
3843
val navHostFragment =
3944
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
4045
val inflater = navHostFragment.navController.navInflater

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ class AlarmSettingFragment : Fragment() {
110110

111111
alarmSettingViewModel.saveAlarm(alarmUseCaseItem)
112112
alarmSettingViewModel.callAlarm(transportLastTime.timeToBoard)
113-
alarmSettingViewModel.makeAlarmWorker(transportLastTime.timeToBoard)
113+
//alarmSettingViewModel.makeAlarmWorker(transportLastTime.timeToBoard)
114114

115115
val navController = findNavController()
116116
navController.setGraph(R.navigation.nav_graph)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class AlarmSettingViewModel @Inject constructor(
6868
}
6969

7070
fun callAlarm(time: String) {
71-
alarmFunctions.callAlarm("01:00:00", alarmTime.value ?: 0, ALARM_CODE)
71+
alarmFunctions.callAlarm("10:00:00", alarmTime.value ?: 0, ALARM_CODE)
7272
}
7373

7474
fun cancelAlarm() {

presentation/src/main/java/com/stop/ui/alarmstart/AlarmStartFragment.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.stop.ui.alarmstart
22

33
import android.content.Intent
44
import android.os.Bundle
5+
import android.util.Log
56
import android.view.LayoutInflater
67
import android.view.View
78
import android.view.ViewGroup
@@ -54,15 +55,13 @@ class AlarmStartFragment : Fragment() {
5455
buttonAlarmTurnOff.setOnClickListener {
5556
turnOffSoundService()
5657
alarmSettingViewModel.deleteAlarm()
57-
alarmSettingViewModel.removeAlarmWorker()
5858
requireActivity().finish()
5959
}
6060

6161
textViewMissionStart.setOnClickListener {
62+
Log.e("ABC","ABC")
6263
turnOffSoundService()
6364
root.findNavController().navigate(R.id.action_alarmStartFragment_to_missionFragment)
64-
alarmSettingViewModel.deleteAlarm()
65-
alarmSettingViewModel.removeAlarmWorker()
6665
}
6766
}
6867
}

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

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import androidx.fragment.app.Fragment
1313
import androidx.fragment.app.activityViewModels
1414
import androidx.fragment.app.viewModels
1515
import androidx.lifecycle.lifecycleScope
16+
import com.google.android.material.snackbar.Snackbar
1617
import com.skt.tmap.TMapPoint
1718
import com.stop.R
1819
import com.stop.databinding.FragmentMissionBinding
@@ -36,6 +37,8 @@ class MissionFragment : Fragment(), MissionHandler {
3637

3738
private lateinit var tMap: MissionTMap
3839

40+
var personCurrentLocation = Location(37.553836, 126.969652)
41+
3942
override fun onCreateView(
4043
inflater: LayoutInflater, container: ViewGroup?,
4144
savedInstanceState: Bundle?
@@ -53,6 +56,7 @@ class MissionFragment : Fragment(), MissionHandler {
5356
initTMap()
5457
setObserve()
5558
drawPersonLine()
59+
setMissionOver()
5660

5761
}
5862

@@ -85,8 +89,8 @@ class MissionFragment : Fragment(), MissionHandler {
8589

8690
fun setPersonCurrent() {
8791
tMap.tMapView.setCenterPoint(
88-
missionViewModel.personCurrentLocation.latitude,
89-
missionViewModel.personCurrentLocation.longitude,
92+
personCurrentLocation.latitude,
93+
personCurrentLocation.longitude,
9094
true
9195
)
9296

@@ -98,15 +102,20 @@ class MissionFragment : Fragment(), MissionHandler {
98102
with(tMap) {
99103
latitudes.clear()
100104
longitudes.clear()
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)
105+
latitudes.add(missionViewModel.destination.value.coordinate.latitude.toDouble())
106+
longitudes.add(missionViewModel.destination.value.coordinate.longitude.toDouble())
107+
latitudes.add(personCurrentLocation.latitude)
108+
longitudes.add(personCurrentLocation.longitude)
105109
setRouteDetailFocus()
106110
isTracking = false
107111
}
108112
}
109113

114+
fun clickMissionOver() {
115+
Snackbar.make(requireActivity().findViewById(com.airbnb.lottie.R.id.content), "미션을 취소합니다", Snackbar.LENGTH_SHORT).show()
116+
missionViewModel.isMissionOver.value = true
117+
}
118+
110119
private fun setObserve() {
111120
val shortAnimationDuration =
112121
resources.getInteger(android.R.integer.config_shortAnimTime)
@@ -174,13 +183,15 @@ class MissionFragment : Fragment(), MissionHandler {
174183
tMap.addMarker(
175184
Marker.PERSON_MARKER,
176185
Marker.PERSON_MARKER_IMG,
177-
TMapPoint(userLocation.latitude, userLocation.longitude)
186+
TMapPoint(userLocation.latitude, userLocation.longitude),
187+
true
178188
)
179-
missionViewModel.personCurrentLocation = userLocation
189+
personCurrentLocation = userLocation
180190
tMap.latitudes.add(userLocation.latitude)
181191
tMap.longitudes.add(userLocation.longitude)
182192
tMap.setRouteDetailFocus()
183193
first += 1
194+
arriveDestination(userLocation.latitude, userLocation.longitude)
184195
}
185196
else -> {
186197
Log.d("MissionWorker", "그리는 중 $userLocation $beforeLocation")
@@ -192,12 +203,13 @@ class MissionFragment : Fragment(), MissionHandler {
192203
Marker.PERSON_LINE_COLOR
193204
)
194205
tMap.addMarker(Marker.PERSON_MARKER, Marker.PERSON_MARKER_IMG, nowLocation)
195-
missionViewModel.personCurrentLocation = userLocation
206+
personCurrentLocation = userLocation
196207
if (tMap.isTracking) {
197208
tMap.tMapView.setCenterPoint(userLocation.latitude, userLocation.longitude)
198209
}
199210
beforeLocation = userLocation
200211
PERSON_LINE_NUM += 1
212+
arriveDestination(userLocation.latitude, userLocation.longitude)
201213
}
202214
}
203215

@@ -229,6 +241,28 @@ class MissionFragment : Fragment(), MissionHandler {
229241
tMap.longitudes.add(longitude)
230242
}
231243

244+
private fun arriveDestination(nowLatitude: Double, nowLongitude: Double) {
245+
if (tMap.getDistance(
246+
nowLatitude,
247+
nowLongitude,
248+
missionViewModel.destination.value.coordinate.latitude.toDouble(),
249+
missionViewModel.destination.value.coordinate.longitude.toDouble()
250+
) <= 10
251+
) {
252+
missionViewModel.isMissionOver.value = true
253+
Snackbar.make(requireActivity().findViewById(com.airbnb.lottie.R.id.content), "정류장에 도착했습니다!", Snackbar.LENGTH_SHORT).show()
254+
}
255+
}
256+
257+
private fun setMissionOver() {
258+
missionViewModel.isMissionOver.observe(viewLifecycleOwner) { isMissionOver ->
259+
if (isMissionOver) {
260+
missionViewModel.cancelMission()
261+
alarmSettingViewModel.deleteAlarm()
262+
}
263+
}
264+
}
265+
232266
companion object {
233267

234268
private const val PLUS = "+"

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ import android.util.Log
44
import androidx.lifecycle.*
55
import androidx.work.OneTimeWorkRequestBuilder
66
import androidx.work.WorkManager
7+
import com.stop.domain.model.route.tmap.custom.Coordinate
78
import com.stop.domain.model.route.tmap.custom.Place
89
import com.stop.model.Location
910
import dagger.hilt.android.lifecycle.HiltViewModel
1011
import kotlinx.coroutines.delay
12+
import kotlinx.coroutines.flow.MutableStateFlow
13+
import kotlinx.coroutines.flow.StateFlow
1114
import kotlinx.coroutines.launch
1215
import java.util.*
1316
import javax.inject.Inject
@@ -21,7 +24,7 @@ class MissionViewModel @Inject constructor(
2124

2225
private val random = Random(System.currentTimeMillis())
2326

24-
val destination= MutableLiveData<Place>()
27+
val destination = MutableStateFlow(Place("null",Coordinate("37.553836", "126.969652")))
2528

2629
private val _timeIncreased = MutableLiveData<Int>()
2730
val timeIncreased: LiveData<Int>
@@ -31,6 +34,8 @@ class MissionViewModel @Inject constructor(
3134
val estimatedTimeRemaining: LiveData<Int>
3235
get() = _estimatedTimeRemaining
3336

37+
val isMissionOver = MutableLiveData(false)
38+
3439
val leftMinute: LiveData<String> = Transformations.switchMap(estimatedTimeRemaining) {
3540
MutableLiveData<String>().apply {
3641
value = (it / TIME_UNIT).toString().padStart(TIME_DIGIT, '0')
@@ -43,8 +48,6 @@ class MissionViewModel @Inject constructor(
4348
}
4449
}
4550

46-
var personCurrentLocation = Location(37.553836, 126.969652)
47-
4851
val userLocation = missionManager.userLocation
4952

5053
lateinit var requestId: UUID

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class MissionWorker @AssistedInject constructor(
124124
private const val NOTIFICATION_CONTENT = "사용자의 위치를 추적중입니다."
125125
private var NUM = 0
126126
private const val INTERVAL_UNIT = 1000L
127-
private const val MISSION_CODE = 88
127+
const val MISSION_CODE = 88
128128
}
129129

130130
}

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.stop.model.Location
1212
import com.stop.ui.map.MapHandler
1313
import com.stop.ui.mission.MissionHandler
1414
import com.stop.ui.routedetail.RouteDetailHandler
15+
import kotlin.math.round
1516

1617
open class TMap(
1718
private val context: Context,
@@ -86,15 +87,17 @@ open class TMap(
8687
&& TMapView.MIN_LAT < location.latitude && location.latitude < TMapView.MAX_LAT
8788
}
8889

89-
fun addMarker(id: String, icon: Int, location: TMapPoint) {
90+
fun addMarker(id: String, icon: Int, location: TMapPoint, isFirst: Boolean = false) {
9091
val marker = TMapMarkerItem().apply {
9192
this.id = id
9293
this.icon = ContextCompat.getDrawable(context, icon)?.toBitmap()
9394
tMapPoint = location
9495
isAnimation = false
9596
}
9697

97-
tMapView.removeTMapMarkerItem(id)
98+
if (isFirst.not()) {
99+
tMapView.removeTMapMarkerItem(id)
100+
}
98101
tMapView.addTMapMarkerItem(marker)
99102
}
100103

@@ -109,4 +112,14 @@ open class TMap(
109112
tMapView.zoomLevel -= 1
110113
}
111114

115+
fun getDistance(startLatitude: Double, startLongitude: Double, endLatitude: Double, endLongitude: Double): Float {
116+
val startPoint = android.location.Location("Start")
117+
val endPoint = android.location.Location("End")
118+
119+
startPoint.latitude = startLatitude
120+
startPoint.longitude = startLongitude
121+
endPoint.latitude = endLatitude
122+
endPoint.longitude = endLongitude
123+
return startPoint.distanceTo(endPoint)
124+
}
112125
}

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

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

12-
<variable
13-
name="fragment"
14-
type="com.stop.ui.map.MapFragment" />
15-
1612
</data>
1713

1814
<androidx.constraintlayout.widget.ConstraintLayout
@@ -119,7 +115,6 @@
119115
android:textColor="@color/black"
120116
android:textSize="36sp"
121117
android:textStyle="bold"
122-
android:onClick="@{() -> fragment.setMissionStart()}"
123118
app:layout_constraintBottom_toTopOf="@id/button_alarm_turn_off"
124119
app:layout_constraintEnd_toEndOf="@id/guide_line_end"
125120
app:layout_constraintStart_toStartOf="@id/guide_line_start"

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@
118118
android:layout_marginBottom="10dp"
119119
android:background="@drawable/background_close_button"
120120
android:elevation="15dp"
121-
android:onClick="@{() -> viewModel.cancelMission()}"
121+
android:onClick="@{() -> fragment.clickMissionOver()}"
122122
app:layout_constraintBottom_toBottomOf="@id/guideline_bottom"
123123
app:layout_constraintEnd_toEndOf="parent"
124124
app:layout_constraintStart_toStartOf="parent">

0 commit comments

Comments
 (0)