Skip to content

Commit c81c78f

Browse files
committed
feat : 막차시간이 다가올수록 네트워크 호출 주기 변경 및 워크매니저에서 네트워크 호출 및 알람 설정 연결
1 parent 37cb4fe commit c81c78f

File tree

7 files changed

+102
-55
lines changed

7 files changed

+102
-55
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,12 @@ class AlarmFunctions(
1111

1212
private lateinit var pendingIntent: PendingIntent
1313

14-
fun callAlarm(lastTime: String, alarmTime: Int, alarmCode: Int, alarmContent: String) {
14+
fun callAlarm(lastTime: String, alarmTime: Int, alarmCode: Int) {
1515
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
1616

1717
val receiverIntent = Intent(context, AlarmReceiver::class.java)
1818
receiverIntent.apply {
1919
putExtra("ALARM_CODE", alarmCode)
20-
putExtra("ALARM_CONTENT", alarmContent)
2120
}
2221

2322
val pendingIntent = if (isMoreThanSnow()) {

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

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,24 @@ import android.content.BroadcastReceiver
77
import android.content.Context
88
import android.content.Intent
99
import androidx.core.app.NotificationCompat
10+
import com.stop.LastTimeCheckWorker.Companion.NOTIFICATION_ID
1011

1112
class AlarmReceiver : BroadcastReceiver() {
1213

1314
override fun onReceive(context: Context, intent: Intent) {
1415
val alarmCode = intent.extras?.getInt("ALARM_CODE") ?: -1
15-
val alarmContent = intent.extras?.getString("ALARM_CONTENT") ?: ""
1616

1717
val soundServiceIntent = Intent(context, SoundService::class.java)
1818

1919
if (isMoreThanOreo()) {
2020
context.startForegroundService(soundServiceIntent)
2121

22+
val id = context.getString(R.string.notification_channel_id)
23+
val name = context.getString(R.string.notification_channel_name)
24+
2225
val notificationManager = context.getSystemService(NotificationManager::class.java)
23-
if (notificationManager.getNotificationChannel(ALARM_RECEIVER_CHANNEL_ID) == null) {
24-
NotificationChannel(ALARM_RECEIVER_CHANNEL_ID, ALARM_RECEIVER_CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH).apply {
26+
if (notificationManager.getNotificationChannel(id) == null) {
27+
NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH).apply {
2528
notificationManager.createNotificationChannel(this)
2629
}
2730
}
@@ -30,17 +33,20 @@ class AlarmReceiver : BroadcastReceiver() {
3033
putExtra("ALARM_CODE", alarmCode)
3134
}, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
3235

33-
val builder = NotificationCompat.Builder(context, ALARM_RECEIVER_CHANNEL_ID)
34-
.setSmallIcon(R.drawable.ic_baseline_alarm_on_24)
35-
.setContentTitle(LAST_TRANSPORT_NOTIFICATION_TITLE)
36-
.setContentText(alarmContent)
36+
val title = context.getString(R.string.notification_title)
37+
val content = context.getString(R.string.alarm_content_text)
38+
39+
val builder = NotificationCompat.Builder(context, id)
40+
.setSmallIcon(R.mipmap.ic_bus)
41+
.setContentTitle(title)
42+
.setContentText(content)
3743
.setAutoCancel(true)
3844
.setPriority(NotificationCompat.PRIORITY_HIGH)
3945
.setCategory(NotificationCompat.CATEGORY_ALARM)
4046
.setFullScreenIntent(pendingIntent, true)
4147

4248
try {
43-
notificationManager.notify(ALARM_NOTIFICATION_ID, builder.build())
49+
notificationManager.notify(NOTIFICATION_ID, builder.build())
4450
} catch (e: Exception) {
4551
e.printStackTrace()
4652
}
@@ -54,11 +60,4 @@ class AlarmReceiver : BroadcastReceiver() {
5460
}
5561
}
5662

57-
companion object {
58-
const val ALARM_RECEIVER_CHANNEL_ID = "ALARM_RECEIVER_CHANNEL_ID"
59-
const val ALARM_RECEIVER_CHANNEL_NAME = "ALARM_RECEIVER_CHANNEL_NAME"
60-
const val ALARM_NOTIFICATION_ID = 123
61-
private const val LAST_TRANSPORT_NOTIFICATION_TITLE = "막차 알림"
62-
}
63-
6463
}

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import androidx.work.ForegroundInfo
1010
import androidx.work.WorkManager
1111
import androidx.work.WorkerParameters
1212
import com.stop.domain.usecase.nearplace.GetNearPlacesUseCase
13+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_TIME
14+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.LAST_TIME
1315
import dagger.assisted.Assisted
1416
import dagger.assisted.AssistedInject
1517
import kotlinx.coroutines.delay
@@ -24,8 +26,14 @@ class LastTimeCheckWorker @AssistedInject constructor(
2426
private val notificationManager =
2527
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
2628

27-
override suspend fun doWork(): Result {
29+
private val lastTime by lazy {
30+
inputData.getString(LAST_TIME)
31+
}
32+
private val alarmTime by lazy {
33+
inputData.getInt(ALARM_TIME, 0)
34+
}
2835

36+
override suspend fun doWork(): Result {
2937
setForeground(createForegroundInfo())
3038
checkLastTransportTime()
3139

@@ -66,14 +74,16 @@ class LastTimeCheckWorker @AssistedInject constructor(
6674
}
6775

6876
private suspend fun checkLastTransportTime() {
77+
//TODO 막차시간 갱신시 알람 삭제 후 등록 로직필요
78+
6979
while (isStopped.not()) {
7080
getNearPlacesUseCase.getNearPlaces(
7181
"아남타워",
7282
126.969652,
7383
37.553836
7484
)
7585

76-
val delayTime = getDelayTime("18:18:00")
86+
val delayTime = getDelayTime()
7787
if (delayTime == 0L) {
7888
this.onStopped()
7989
} else {
@@ -82,8 +92,8 @@ class LastTimeCheckWorker @AssistedInject constructor(
8292
}
8393
}
8494

85-
private fun getDelayTime(lastTime: String): Long {
86-
val fullLastTimeMillis = makeFullTime(lastTime).timeInMillis
95+
private fun getDelayTime(): Long {
96+
val fullLastTimeMillis = makeFullTime(lastTime ?: "").timeInMillis
8797
val currentTimeMillis = System.currentTimeMillis()
8898

8999
return when (val diffTimeMillis =
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.stop.di
2+
3+
import android.content.Context
4+
import androidx.work.WorkManager
5+
import com.stop.AlarmFunctions
6+
import dagger.Module
7+
import dagger.Provides
8+
import dagger.hilt.InstallIn
9+
import dagger.hilt.android.qualifiers.ApplicationContext
10+
import dagger.hilt.components.SingletonComponent
11+
import javax.inject.Singleton
12+
13+
@InstallIn(SingletonComponent::class)
14+
@Module
15+
object AlarmModule {
16+
17+
@Provides
18+
@Singleton
19+
fun provideWorkManager(
20+
@ApplicationContext context: Context
21+
) = WorkManager.getInstance(context)
22+
23+
@Provides
24+
@Singleton
25+
fun provideAlarmFunctions(
26+
@ApplicationContext context: Context
27+
) = AlarmFunctions(context)
28+
29+
}

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

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

33
import android.os.Bundle
4-
import android.util.Log
54
import android.view.LayoutInflater
65
import android.view.View
76
import android.view.ViewGroup
87
import androidx.fragment.app.Fragment
98
import androidx.fragment.app.activityViewModels
109
import androidx.navigation.findNavController
11-
import androidx.work.PeriodicWorkRequestBuilder
12-
import androidx.work.WorkManager
13-
import com.stop.AlarmFunctions
14-
import com.stop.AlarmWorker
1510
import com.stop.R
1611
import com.stop.databinding.FragmentAlarmSettingBinding
1712
import com.stop.domain.model.alarm.AlarmUseCaseItem
1813
import com.stop.ui.route.ClickRouteViewModel
1914
import dagger.hilt.android.AndroidEntryPoint
20-
import java.util.concurrent.TimeUnit
2115
import kotlin.math.roundToInt
2216

2317
@AndroidEntryPoint
@@ -29,8 +23,6 @@ class AlarmSettingFragment : Fragment() {
2923
private val alarmSettingViewModel by activityViewModels<AlarmSettingViewModel>()
3024
private val clickRouteViewModel by activityViewModels<ClickRouteViewModel>()
3125

32-
private lateinit var alarmFunctions: AlarmFunctions
33-
3426
override fun onCreateView(
3527
inflater: LayoutInflater, container: ViewGroup?,
3628
savedInstanceState: Bundle?
@@ -45,7 +37,6 @@ class AlarmSettingFragment : Fragment() {
4537
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
4638
super.onViewCreated(view, savedInstanceState)
4739

48-
alarmFunctions = AlarmFunctions(requireActivity())
4940
initView()
5041
setToggleListener()
5142

@@ -97,27 +88,12 @@ class AlarmSettingFragment : Fragment() {
9788
ALARM_CODE,
9889
true
9990
)
100-
alarmSettingViewModel.saveAlarm(alarmUseCaseItem)
101-
makeAlarm()
102-
//makeAlarmWorker()
103-
binding.root.findNavController().navigate(R.id.action_alarmSetting_to_mapFragment)
104-
}
10591

106-
private fun makeAlarm() {
107-
//TODO 알람 바꿔야함
108-
alarmFunctions.callAlarm("00:00:05", 4, ALARM_CODE, "막차알림")
109-
}
92+
alarmSettingViewModel.saveAlarm(alarmUseCaseItem)
93+
alarmSettingViewModel.callAlarm(clickRouteViewModel.lastTime)
94+
alarmSettingViewModel.makeAlarmWorker(clickRouteViewModel.lastTime)
11095

111-
private fun makeAlarmWorker() {
112-
val periodicWorkRequest = PeriodicWorkRequestBuilder<AlarmWorker>(15, TimeUnit.MINUTES)
113-
.build()
114-
val workManager = WorkManager.getInstance(requireContext())
115-
workManager.enqueue(periodicWorkRequest)
116-
workManager.getWorkInfoByIdLiveData(periodicWorkRequest.id)
117-
.observe(viewLifecycleOwner) { info ->
118-
val outPutData = info.outputData.getString("WORK_RESULT")
119-
Log.e("ABC", outPutData.toString())
120-
}
96+
binding.root.findNavController().navigate(R.id.action_alarmSetting_to_mapFragment)
12197
}
12298

12399
override fun onDestroyView() {
@@ -127,6 +103,8 @@ class AlarmSettingFragment : Fragment() {
127103

128104
companion object {
129105
const val ALARM_CODE = 123
106+
const val LAST_TIME = "lastTime"
107+
const val ALARM_TIME = "alarmTime"
130108
}
131109

132110
}

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

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,18 @@ package com.stop.ui.alarmsetting
33
import androidx.lifecycle.MutableLiveData
44
import androidx.lifecycle.ViewModel
55
import androidx.lifecycle.viewModelScope
6+
import androidx.work.OneTimeWorkRequestBuilder
7+
import androidx.work.WorkManager
8+
import androidx.work.workDataOf
9+
import com.stop.AlarmFunctions
10+
import com.stop.LastTimeCheckWorker
611
import com.stop.domain.model.alarm.AlarmUseCaseItem
712
import com.stop.domain.usecase.alarm.DeleteAlarmUseCase
813
import com.stop.domain.usecase.alarm.GetAlarmUseCase
914
import com.stop.domain.usecase.alarm.SaveAlarmUseCase
15+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_CODE
16+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_TIME
17+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.LAST_TIME
1018
import dagger.hilt.android.lifecycle.HiltViewModel
1119
import kotlinx.coroutines.Dispatchers
1220
import kotlinx.coroutines.flow.MutableStateFlow
@@ -19,7 +27,9 @@ import javax.inject.Inject
1927
class AlarmSettingViewModel @Inject constructor(
2028
private val saveAlarmUseCase: SaveAlarmUseCase,
2129
private val getAlarmUseCase: GetAlarmUseCase,
22-
private val deleteAlarmUseCase: DeleteAlarmUseCase
30+
private val deleteAlarmUseCase: DeleteAlarmUseCase,
31+
private val alarmFunctions: AlarmFunctions,
32+
private val workManager: WorkManager
2333
) : ViewModel() {
2434

2535
val alarmTime = MutableLiveData(0)
@@ -47,10 +57,31 @@ class AlarmSettingViewModel @Inject constructor(
4757
}
4858
}
4959

50-
fun deleteAlarm(){
51-
viewModelScope.launch(Dispatchers.IO){
60+
fun deleteAlarm() {
61+
viewModelScope.launch(Dispatchers.IO) {
5262
deleteAlarmUseCase.deleteAlarm()
5363
}
5464
}
5565

66+
fun callAlarm(time: String) {
67+
alarmFunctions.callAlarm(time, alarmTime.value ?: 0, ALARM_CODE)
68+
}
69+
70+
fun cancelAlarm() {
71+
alarmFunctions.cancelAlarm(ALARM_CODE)
72+
}
73+
74+
fun makeAlarmWorker(time : String) {
75+
val workData = workDataOf(
76+
LAST_TIME to time,
77+
ALARM_TIME to alarmTime.value
78+
)
79+
80+
val workRequest = OneTimeWorkRequestBuilder<LastTimeCheckWorker>()
81+
.setInputData(workData)
82+
.build()
83+
84+
workManager.enqueue(workRequest)
85+
}
86+
5687
}

presentation/src/main/res/values/strings.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@
4545
<string name="recent_search_text">최근기록</string>
4646
<string name="delete_recent_search_text">최근기록 삭제</string>
4747

48-
<string name="notification_channel_id">"notification_channel_id</string>
49-
<string name="notification_channel_name">"notification_channel_name"</string>
50-
<string name="notification_title">"막차 알림</string>
48+
<string name="notification_channel_id">notification_channel_id</string>
49+
<string name="notification_channel_name">notification_channel_name</string>
50+
<string name="notification_title">막차 알림</string>
5151
<string name="alarm_cancel_text">취소하기</string>
52+
<string name="alarm_content_text">막차를 타러 이제 나가야해요~!!</string>
5253
</resources>

0 commit comments

Comments
 (0)