Skip to content

Commit fe1583e

Browse files
committed
feat : Mission WorkManager & notification & LocationServices 구현
1 parent ee48e21 commit fe1583e

File tree

7 files changed

+133
-27
lines changed

7 files changed

+133
-27
lines changed

presentation/build.gradle

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,10 @@ dependencies {
9090
// When using the BoM, don't specify versions in Firebase dependencies
9191
implementation 'com.google.firebase:firebase-analytics-ktx'
9292

93-
// Add the dependencies for any other desired Firebase products
94-
// https://firebase.google.com/docs/android/setup#available-libraries
95-
9693
// LifeCycle Service
9794
implementation 'androidx.lifecycle:lifecycle-service:2.5.1'
95+
96+
//Location Services
97+
implementation 'com.google.android.gms:play-services-location:21.0.1'
98+
9899
}

presentation/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<uses-permission android:name="android.permission.INTERNET" />
77
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
88
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
9+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
910

1011
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
1112
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.stop.di
2+
3+
import com.stop.ui.mission.MissionManager
4+
import dagger.Module
5+
import dagger.Provides
6+
import dagger.hilt.InstallIn
7+
import dagger.hilt.components.SingletonComponent
8+
import javax.inject.Singleton
9+
10+
@InstallIn(SingletonComponent::class)
11+
@Module
12+
object MissionModule {
13+
14+
@Provides
15+
@Singleton
16+
fun provideMissionManager() = MissionManager()
17+
18+
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.stop.ui.mission
22

3+
import android.Manifest
34
import android.animation.Animator
45
import android.animation.AnimatorListenerAdapter
56
import android.content.ContextWrapper
67
import android.os.Bundle
78
import android.view.LayoutInflater
89
import android.view.View
910
import android.view.ViewGroup
11+
import androidx.activity.result.contract.ActivityResultContracts
1012
import androidx.fragment.app.Fragment
1113
import androidx.fragment.app.viewModels
1214
import androidx.lifecycle.lifecycleScope
@@ -191,6 +193,7 @@ class MissionFragment : Fragment(), MissionHandler {
191193

192194
override fun alertTMapReady() {
193195
//mimicUserMove()
196+
requestPermissionsLauncher.launch(PERMISSIONS)
194197
tMap.setTrackingMode()
195198
drawBusLocationLine()
196199
drawSubwayLocationLine()
@@ -217,6 +220,14 @@ class MissionFragment : Fragment(), MissionHandler {
217220
}
218221
}
219222

223+
private val requestPermissionsLauncher = registerForActivityResult(
224+
ActivityResultContracts.RequestMultiplePermissions()
225+
) { permissions ->
226+
if (permissions.entries.any { it.value }) {
227+
tMap.setTrackingMode()
228+
}
229+
}
230+
220231
companion object {
221232

222233
private const val DESTINATION = "구로3동현대아파트"
@@ -232,5 +243,8 @@ class MissionFragment : Fragment(), MissionHandler {
232243

233244
private const val SECOND_UNIT = 1_000
234245

246+
private val PERMISSIONS =
247+
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)
248+
235249
}
236250
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.stop.ui.mission
2+
3+
import com.stop.model.Location
4+
5+
6+
class MissionManager() {
7+
8+
val personMovements = mutableListOf<Location>()
9+
10+
}

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

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import androidx.lifecycle.*
44
import androidx.work.OneTimeWorkRequestBuilder
55
import androidx.work.WorkManager
66
import androidx.work.workDataOf
7-
import com.stop.LastTimeCheckWorker
87
import com.stop.domain.model.nowlocation.BusInfoUseCaseItem
98
import com.stop.domain.model.nowlocation.SubwayRouteLocationUseCaseItem
109
import com.stop.domain.model.route.tmap.RouteRequest
@@ -165,19 +164,6 @@ class MissionViewModel @Inject constructor(
165164
workManager.enqueue(workRequest)
166165
}
167166

168-
fun makeAlarmWorker(time : String) {
169-
val workData = workDataOf(
170-
AlarmSettingFragment.LAST_TIME to time,
171-
AlarmSettingFragment.ALARM_TIME to 0
172-
)
173-
174-
val workRequest = OneTimeWorkRequestBuilder<LastTimeCheckWorker>()
175-
.setInputData(workData)
176-
.build()
177-
178-
workManager.enqueue(workRequest)
179-
}
180-
181167
companion object {
182168
private const val DELAY_TIME = 1000L
183169
private const val TIME_ZERO = 0
@@ -192,12 +178,14 @@ class MissionViewModel @Inject constructor(
192178

193179
private const val TEST_SUBWAY_NUMER = 4
194180
private const val LINE = "호선" //임시로.. 종성님이 어떻게 넘겨주시느냐에 따라 달림
195-
private const val TEST_TRAIN_NUMBER = "4330"
181+
private const val TEST_TRAIN_NUMBER = "4589"
196182

197183
private const val TEST_SUBWAY_LAT = "37.30973177"
198184
private const val TEST_SUBWAY_LONG = "126.85359515"
199185
private const val TEST_END_SUBWAY_STATION = "한대앞"
200186

187+
private const val TRANSPORT_TYPE = "TRANSPORT_TYPE"
188+
201189
}
202190

203191
}

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

Lines changed: 83 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,110 @@
11
package com.stop.ui.mission
22

3+
import android.Manifest
34
import android.app.NotificationChannel
45
import android.app.NotificationManager
56
import android.content.Context
7+
import android.content.pm.PackageManager
8+
import android.os.Looper
9+
import android.util.Log
10+
import androidx.core.app.ActivityCompat
611
import androidx.core.app.NotificationCompat
712
import androidx.hilt.work.HiltWorker
813
import androidx.work.CoroutineWorker
914
import androidx.work.ForegroundInfo
1015
import androidx.work.WorkManager
1116
import androidx.work.WorkerParameters
17+
import com.google.android.gms.location.*
1218
import com.stop.R
13-
import com.stop.domain.usecase.nearplace.GetNearPlacesUseCase
1419
import com.stop.isMoreThanOreo
15-
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_TIME
16-
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.LAST_TIME
20+
import com.stop.model.Location
1721
import dagger.assisted.Assisted
1822
import dagger.assisted.AssistedInject
1923
import kotlinx.coroutines.delay
2024

2125
@HiltWorker
2226
class MissionWorker @AssistedInject constructor(
2327
@Assisted context: Context,
24-
@Assisted workerParameters: WorkerParameters
28+
@Assisted workerParameters: WorkerParameters,
29+
private val missionManager: MissionManager
2530
) : CoroutineWorker(context, workerParameters) {
2631

2732
private val notificationManager =
2833
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
2934

35+
private val fusedLocationClient = LocationServices.getFusedLocationProviderClient(context)
36+
private val locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, INTERVAL_UNIT).build()
37+
private lateinit var locationCallback: LocationCallback
38+
3039
override suspend fun doWork(): Result {
3140
setForeground(createForegroundInfo())
32-
41+
initLocation()
42+
test()
43+
Log.d("MissionWorker","personMovements ${missionManager.personMovements}")
3344
return Result.success()
3445
}
3546

47+
private fun initLocation() {
48+
if (ActivityCompat.checkSelfPermission(
49+
applicationContext,
50+
Manifest.permission.ACCESS_FINE_LOCATION
51+
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
52+
applicationContext,
53+
Manifest.permission.ACCESS_COARSE_LOCATION
54+
) != PackageManager.PERMISSION_GRANTED
55+
) {
56+
return
57+
}
58+
fusedLocationClient.lastLocation
59+
.addOnSuccessListener { location ->
60+
if (location == null) {
61+
Log.d("MissionWorker", "location get fail")
62+
} else {
63+
Log.d("MissionWorker", "initLocation ${location.latitude} , ${location.longitude}")
64+
}
65+
}
66+
.addOnFailureListener {
67+
Log.d("MissionWorker", "location error is ${it.message}")
68+
it.printStackTrace()
69+
}
70+
71+
locationCallback = object : LocationCallback() {
72+
override fun onLocationResult(locationResult: LocationResult) {
73+
for (location in locationResult.locations) {
74+
if (location != null) {
75+
missionManager.personMovements.add(Location(location.latitude, location.longitude))
76+
}
77+
}
78+
}
79+
}
80+
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
81+
82+
}
83+
84+
private fun getPersonLocation() {
85+
locationCallback = object : LocationCallback() {
86+
override fun onLocationResult(locationResult: LocationResult) {
87+
Log.d("MissionWorker", "entire locationResult ${locationResult.locations}")
88+
for (location in locationResult.locations) {
89+
if (location != null) {
90+
val latitude = location.latitude
91+
val longitude = location.longitude
92+
Log.d("MissionWorker", "lat ${latitude} long ${longitude}")
93+
}
94+
}
95+
}
96+
}
97+
}
98+
99+
100+
private suspend fun test() {
101+
while (NUM < 60) {
102+
Log.d("MissionWorker", "찍히나 테스트 ${NUM}")
103+
NUM += 1
104+
delay(1000)
105+
}
106+
}
107+
36108
private fun createForegroundInfo(): ForegroundInfo {
37109
val id = applicationContext.getString(R.string.mission_notification_channel_id)
38110
val title = applicationContext.getString(R.string.mission_notification_title)
@@ -57,19 +129,21 @@ class MissionWorker @AssistedInject constructor(
57129

58130
private fun createChannel(id: String) {
59131
if (isMoreThanOreo()) {
132+
Log.d("MissionWorker", "createChannel ${notificationManager.getNotificationChannel(id)}")
60133
if (notificationManager.getNotificationChannel(id) == null) {
61-
val name = applicationContext.getString(R.string.notification_channel_name)
134+
val name = applicationContext.getString(R.string.mission_notification_channel_name)
62135
NotificationChannel(id, name, NotificationManager.IMPORTANCE_DEFAULT).apply {
63136
notificationManager.createNotificationChannel(this)
64137
}
65138
}
66139
}
67140
}
68141

69-
70-
71142
companion object {
72-
const val NOTIFICATION_ID = 12
143+
const val NOTIFICATION_ID = 82
73144
private const val NOTIFICATION_CONTENT = "사용자의 위치를 추적중입니다."
145+
private var NUM = 0
146+
private const val INTERVAL_UNIT = 1000L
74147
}
148+
75149
}

0 commit comments

Comments
 (0)