Skip to content

Commit d50e5cf

Browse files
authored
Merge pull request #98 from boostcampwm-2022/95-alarm-refactoring
[PR] μ•ŒλžŒ μ½”λ“œλ¦¬νŒ©ν† λ§
2 parents f808c7e + cc5f9de commit d50e5cf

File tree

7 files changed

+98
-128
lines changed

7 files changed

+98
-128
lines changed

β€Žpresentation/src/main/java/com/stop/alarm/AlarmFunctions.kt

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,41 @@ package com.stop.alarm
33
import android.app.AlarmManager
44
import android.app.NotificationManager
55
import android.content.Context
6+
import android.content.Intent
7+
import com.stop.MainActivity
8+
import com.stop.R
69
import com.stop.makeFullTime
10+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_CODE
11+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_MAP_CODE
712
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_NOTIFICATION_ID
8-
import com.stop.util.getAlarmSettingNotification
9-
import com.stop.util.getAlarmSettingPendingIntent
10-
import com.stop.util.getAlarmStartPendingIntent
13+
import com.stop.util.getActivityPendingIntent
14+
import com.stop.util.getAlarmDefaultNotification
15+
import com.stop.util.getBroadcastPendingIntent
1116

1217
class AlarmFunctions(
1318
private val context: Context
1419
) {
1520
fun callAlarm(lastTime: String, alarmTime: Int) {
1621
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
1722

18-
val alarmSettingPendingIntent = context.getAlarmSettingPendingIntent()
19-
val alarmSettingNotification = context.getAlarmSettingNotification(
23+
val alarmSettingPendingIntent = context.getActivityPendingIntent(
24+
Intent(context, MainActivity::class.java).apply {
25+
putExtra("ALARM_MAP_CODE", ALARM_MAP_CODE)
26+
},
27+
ALARM_MAP_CODE
28+
)
29+
30+
val content = context.getString(R.string.alarm_last_notification_text, lastTime, alarmTime.toString())
31+
val alarmSettingNotification = context.getAlarmDefaultNotification(
2032
alarmSettingPendingIntent,
21-
"μ•ŒλžŒμ΄ λ§‰μ°¨μ‹œκ°„ ${lastTime}μ—μ„œ ${alarmTime}전에 μšΈλ¦΄μ˜ˆμ •μž…λ‹ˆλ‹€."
33+
content
2234
)
2335
notificationManager.notify(ALARM_NOTIFICATION_ID, alarmSettingNotification)
2436

25-
val alarmReceiverPendingIntent = context.getAlarmStartPendingIntent()
37+
val alarmReceiverPendingIntent = context.getBroadcastPendingIntent(
38+
Intent(context, AlarmReceiver::class.java),
39+
ALARM_CODE
40+
)
2641

2742
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
2843
alarmManager.setExactAndAllowWhileIdle(
@@ -34,7 +49,10 @@ class AlarmFunctions(
3449

3550
fun cancelAlarm() {
3651
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
37-
val alarmReceiverPendingIntent = context.getAlarmStartPendingIntent()
52+
val alarmReceiverPendingIntent = context.getBroadcastPendingIntent(
53+
Intent(context, AlarmReceiver::class.java),
54+
ALARM_CODE
55+
)
3856

3957
alarmManager.cancel(alarmReceiverPendingIntent)
4058

β€Žpresentation/src/main/java/com/stop/alarm/AlarmReceiver.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import com.stop.isMoreThanOreo
1010
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_CODE
1111
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_NOTIFICATION_HIGH_ID
1212
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_NOTIFICATION_ID
13-
import com.stop.util.getAlarmReceiverNotification
14-
import com.stop.util.getAlarmReceiverPendingIntent
13+
import com.stop.util.getActivityPendingIntent
14+
import com.stop.util.getAlarmHighNotification
1515

1616
class AlarmReceiver : BroadcastReceiver() {
1717

@@ -25,8 +25,14 @@ class AlarmReceiver : BroadcastReceiver() {
2525
val soundRestartServiceIntent = Intent(context, SoundRestartService::class.java)
2626
context.startForegroundService(soundRestartServiceIntent)
2727

28-
val alarmStartPendingIntent = context.getAlarmReceiverPendingIntent()
29-
val alarmStartNotification = context.getAlarmReceiverNotification(
28+
val alarmStartPendingIntent = context.getActivityPendingIntent(
29+
Intent(context, AlarmActivity::class.java).apply {
30+
putExtra("ALARM_CODE", ALARM_CODE)
31+
flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
32+
},
33+
ALARM_CODE
34+
)
35+
val alarmStartNotification = context.getAlarmHighNotification(
3036
alarmStartPendingIntent,
3137
content
3238
)

β€Žpresentation/src/main/java/com/stop/alarm/SoundRestartService.kt

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,30 @@
11
package com.stop.alarm
22

3-
import android.app.*
4-
import android.content.Context
3+
import android.app.Service
54
import android.content.Intent
6-
import android.os.Build
75
import android.os.IBinder
8-
import androidx.core.app.NotificationCompat
96
import com.stop.AlarmActivity
10-
import com.stop.R
7+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_CODE
8+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_NOTIFICATION_ID
9+
import com.stop.util.getActivityPendingIntent
10+
import com.stop.util.getAlarmDefaultNotification
1111

1212
class SoundRestartService : Service() {
1313

1414
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
15-
val builder = NotificationCompat.Builder(this, "default")
16-
builder.setSmallIcon(R.mipmap.ic_bus)
17-
builder.setContentTitle(null)
18-
builder.setContentText(null)
19-
20-
val notificationIntent = Intent(this, AlarmActivity::class.java)
21-
val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
22-
builder.setContentIntent(pendingIntent)
23-
24-
val manager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
25-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
26-
manager.createNotificationChannel(
27-
NotificationChannel(
28-
"default",
29-
"κΈ°λ³Έ 채널",
30-
NotificationManager.IMPORTANCE_NONE
31-
)
32-
)
33-
}
34-
35-
val notification: Notification = builder.build()
36-
startForeground(9, notification)
15+
val notImportantPendingIntent = this.getActivityPendingIntent(
16+
Intent(this, AlarmActivity::class.java),
17+
ALARM_CODE
18+
)
19+
val notImportantNotification = this.getAlarmDefaultNotification(
20+
notImportantPendingIntent,
21+
""
22+
)
23+
startForeground(ALARM_NOTIFICATION_ID, notImportantNotification)
3724

3825
val serviceIntent = Intent(this, SoundService::class.java)
39-
4026
startService(serviceIntent)
27+
4128
stopForeground(true)
4229
stopSelf()
4330

β€Žpresentation/src/main/java/com/stop/alarm/SoundService.kt

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

33
import android.app.AlarmManager
4-
import android.app.PendingIntent
54
import android.content.Context
65
import android.content.Intent
76
import android.media.MediaPlayer
@@ -13,6 +12,8 @@ import com.stop.domain.usecase.alarm.GetAlarmUseCase
1312
import com.stop.isMoreThanOreoUnderRedVelVet
1413
import com.stop.isMoreThanSnow
1514
import com.stop.isUnderOreo
15+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_CODE
16+
import com.stop.util.getBroadcastPendingIntent
1617
import dagger.hilt.android.AndroidEntryPoint
1718
import kotlinx.coroutines.flow.collectLatest
1819
import kotlinx.coroutines.launch
@@ -92,10 +93,16 @@ class SoundService : LifecycleService() {
9293
}
9394

9495
private fun setAlarmTimer() {
95-
val intent = Intent(this, AlarmReceiver::class.java)
96-
val sender = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
96+
val restartPendingIntent = this.getBroadcastPendingIntent(
97+
Intent(this, AlarmReceiver::class.java),
98+
ALARM_CODE
99+
)
97100
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
98-
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), sender)
101+
alarmManager.setExactAndAllowWhileIdle(
102+
AlarmManager.RTC_WAKEUP,
103+
System.currentTimeMillis(),
104+
restartPendingIntent
105+
)
99106
}
100107

101108
companion object {

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

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

33
import android.Manifest.permission
4+
import android.app.NotificationManager
5+
import android.content.Context
46
import android.content.Intent
57
import android.os.Bundle
68
import android.view.LayoutInflater
@@ -20,6 +22,7 @@ import com.stop.RouteNavGraphDirections
2022
import com.stop.alarm.SoundService
2123
import com.stop.databinding.FragmentMapBinding
2224
import com.stop.model.Location
25+
import com.stop.ui.alarmsetting.AlarmSettingFragment
2326
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_MAP_CODE
2427
import com.stop.ui.alarmsetting.AlarmSettingViewModel
2528
import com.stop.ui.placesearch.PlaceSearchViewModel
@@ -261,12 +264,18 @@ class MapFragment : Fragment(), MapHandler {
261264
private fun listenButtonClick() {
262265
binding.homeBottomSheet.layoutStateExpanded.buttonAlarmTurnOff.setOnClickListener {
263266
alarmViewModel.deleteAlarm()
267+
cancelNotification()
264268
turnOffSoundService()
265269
val behavior = BottomSheetBehavior.from(binding.layoutHomeBottomSheet)
266270
behavior.state = BottomSheetBehavior.STATE_COLLAPSED
267271
}
268272
}
269273

274+
private fun cancelNotification() {
275+
val notificationManager = requireContext().getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
276+
notificationManager.cancel(AlarmSettingFragment.ALARM_NOTIFICATION_HIGH_ID)
277+
}
278+
270279
private fun turnOffSoundService() {
271280
val intent = Intent(requireContext(), SoundService::class.java)
272281
requireContext().stopService(intent)

β€Žpresentation/src/main/java/com/stop/util/Context.kt

Lines changed: 26 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,114 +1,60 @@
11
package com.stop.util
22

3-
import android.app.*
3+
import android.app.Notification
4+
import android.app.NotificationChannel
5+
import android.app.NotificationManager
6+
import android.app.PendingIntent
47
import android.content.Context
58
import android.content.Intent
69
import android.content.res.Resources
7-
import android.os.PowerManager
810
import android.util.DisplayMetrics
911
import android.util.Size
1012
import android.view.WindowManager
1113
import android.view.WindowMetrics
1214
import androidx.core.app.NotificationCompat
13-
import com.stop.*
14-
import com.stop.alarm.AlarmReceiver
15-
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_CODE
16-
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_MAP_CODE
15+
import com.stop.R
16+
import com.stop.isMOreThanRedVelVet
17+
import com.stop.isMoreThanOreo
1718

18-
fun Context.getAlarmSettingPendingIntent(): PendingIntent {
19-
val intent = Intent(this, MainActivity::class.java)
20-
intent.putExtra("ALARM_MAP_CODE", ALARM_MAP_CODE)
19+
fun Context.getActivityPendingIntent(
20+
intent: Intent, requestCode: Int
21+
): PendingIntent {
2122
return PendingIntent.getActivity(
22-
this,
23-
ALARM_MAP_CODE,
24-
intent,
25-
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
23+
this, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
2624
)
2725
}
2826

29-
fun Context.getAlarmSettingNotification(pendingIntent: PendingIntent, content: String): Notification {
30-
val id = applicationContext.getString(R.string.notification_channel_id)
31-
val name = applicationContext.getString(R.string.notification_channel_name)
32-
val title = applicationContext.getString(R.string.notification_title)
33-
34-
createDefaultNotificationChannel(applicationContext, id, name)
35-
36-
return NotificationCompat.Builder(applicationContext, id)
37-
.setContentTitle(title)
38-
.setContentText(content)
39-
.setSmallIcon(R.mipmap.ic_bus)
40-
.setOngoing(true)
41-
.setContentIntent(pendingIntent)
42-
.build()
43-
}
44-
45-
fun Context.getAlarmStartPendingIntent(): PendingIntent {
46-
val intent = Intent(this, AlarmReceiver::class.java)
47-
intent.putExtra("ALARM_CODE", ALARM_CODE)
27+
fun Context.getBroadcastPendingIntent(
28+
intent: Intent, requestCode: Int
29+
): PendingIntent {
4830
return PendingIntent.getBroadcast(
49-
this,
50-
ALARM_CODE,
51-
intent,
52-
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
53-
)
54-
}
55-
56-
fun Context.isThisAppRunning() =
57-
(getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager)
58-
.runningAppProcesses
59-
.firstOrNull()
60-
?.processName
61-
?.equals("com.stop")
62-
?: false
63-
64-
fun Context.isScreenOn() =
65-
(getSystemService(Context.POWER_SERVICE) as PowerManager).isInteractive
66-
67-
fun Context.getAlarmReceiverPendingIntent(): PendingIntent {
68-
val intent = Intent(this, AlarmActivity::class.java)
69-
intent.putExtra("ALARM_CODE", ALARM_CODE)
70-
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
71-
return PendingIntent.getActivity(
72-
this,
73-
ALARM_CODE,
74-
intent,
75-
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
31+
this, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
7632
)
7733
}
7834

79-
fun Context.getAlarmScreenOnNotification(pendingIntent: PendingIntent, content : String) : Notification{
35+
fun Context.getAlarmDefaultNotification(
36+
pendingIntent: PendingIntent, content: String
37+
): Notification {
8038
val id = applicationContext.getString(R.string.notification_channel_id)
8139
val name = applicationContext.getString(R.string.notification_channel_name)
8240
val title = applicationContext.getString(R.string.notification_title)
8341

8442
createDefaultNotificationChannel(applicationContext, id, name)
8543

86-
return NotificationCompat.Builder(applicationContext, id)
87-
.setContentTitle(title)
88-
.setContentText(content)
89-
.setSmallIcon(R.mipmap.ic_bus)
90-
.setAutoCancel(true)
91-
.setContentIntent(pendingIntent)
92-
.build()
44+
return NotificationCompat.Builder(applicationContext, id).setContentTitle(title).setContentText(content).setSmallIcon(R.mipmap.ic_bus).setOngoing(true).setContentIntent(pendingIntent).build()
9345
}
9446

95-
fun Context.getAlarmReceiverNotification(pendingIntent: PendingIntent, content: String): Notification {
47+
fun Context.getAlarmHighNotification(
48+
pendingIntent: PendingIntent, content: String
49+
): Notification {
9650
val id = applicationContext.getString(R.string.notification_channel_high_id)
9751
val name = applicationContext.getString(R.string.notification_channel_high_name)
9852
val title = applicationContext.getString(R.string.notification_title)
9953

10054
createHighNotificationChannel(applicationContext, id, name)
10155

102-
return NotificationCompat.Builder(applicationContext, id)
103-
.setContentTitle(title)
104-
.setContentText(content)
105-
.setSmallIcon(R.mipmap.ic_bus)
106-
.setAutoCancel(true)
107-
.setPriority(NotificationCompat.PRIORITY_HIGH)
108-
.setCategory(NotificationCompat.CATEGORY_ALARM)
109-
.setContentIntent(pendingIntent)
110-
.setFullScreenIntent(pendingIntent, true)
111-
.build()
56+
return NotificationCompat.Builder(applicationContext, id).setContentTitle(title).setContentText(content).setSmallIcon(R.mipmap.ic_bus).setAutoCancel(true)
57+
.setPriority(NotificationCompat.PRIORITY_HIGH).setCategory(NotificationCompat.CATEGORY_ALARM).setContentIntent(pendingIntent).setFullScreenIntent(pendingIntent, true).build()
11258
}
11359

11460
private fun createDefaultNotificationChannel(context: Context, id: String, name: String) {
@@ -117,9 +63,7 @@ private fun createDefaultNotificationChannel(context: Context, id: String, name:
11763
val importance = NotificationManager.IMPORTANCE_DEFAULT
11864

11965
NotificationChannel(
120-
id,
121-
name,
122-
importance
66+
id, name, importance
12367
).apply {
12468
notificationManager.createNotificationChannel(this)
12569
}
@@ -132,9 +76,7 @@ private fun createHighNotificationChannel(context: Context, id: String, name: St
13276
val importance = NotificationManager.IMPORTANCE_HIGH
13377

13478
NotificationChannel(
135-
id,
136-
name,
137-
importance
79+
id, name, importance
13880
).apply {
13981
notificationManager.createNotificationChannel(this)
14082
}

β€Žpresentation/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,5 @@
8080
<string name="end_position_text">도착지 : %1$s</string>
8181
<string name="last_time_text">λ§‰μ°¨μ‹œκ°„ : %1$s</string>
8282
<string name="walk_time_text">%1$dλΆ„</string>
83+
<string name="alarm_last_notification_text">λ§‰μ°¨μ‹œκ°„ %1$sμ—μ„œ %2$sλΆ„ 전에 μ•ŒλžŒμ΄ μšΈλ¦΄μ˜ˆμ •μž…λ‹ˆλ‹€.</string>
8384
</resources>

0 commit comments

Comments
Β (0)