Skip to content

Commit fb9ec03

Browse files
committed
feat : Alarm 설정하면 노티띄우고 맵프래그먼트의 바텀시트 띄우기
1 parent feb2e98 commit fb9ec03

File tree

9 files changed

+197
-40
lines changed

9 files changed

+197
-40
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class MainActivity : AppCompatActivity() {
2525

2626
override fun onNewIntent(intent: Intent?) {
2727
super.onNewIntent(intent)
28+
setIntent(intent)
2829

2930
intent?.extras?.getInt("ALARM_CODE")?.let {
3031
if (it == ALARM_CODE) {
Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,45 @@
11
package com.stop.alarm
22

33
import android.app.AlarmManager
4-
import android.app.PendingIntent
4+
import android.app.NotificationManager
55
import android.content.Context
6-
import android.content.Intent
7-
import com.stop.isMoreThanSnow
86
import com.stop.makeFullTime
7+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_NOTIFICATION_ID
8+
import com.stop.util.getAlarmReceiverPendingIntent
9+
import com.stop.util.getAlarmSettingNotification
10+
import com.stop.util.getAlarmSettingPendingIntent
911

1012
class AlarmFunctions(
1113
private val context: Context
1214
) {
15+
fun callAlarm(lastTime: String, alarmTime: Int) {
16+
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
1317

14-
private lateinit var pendingIntent: PendingIntent
15-
16-
fun callAlarm(lastTime: String, alarmTime: Int, alarmCode: Int) {
17-
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
18-
19-
val receiverIntent = Intent(context, AlarmReceiver::class.java)
20-
receiverIntent.apply {
21-
putExtra("ALARM_CODE", alarmCode)
22-
}
18+
val alarmSettingPendingIntent = context.getAlarmSettingPendingIntent()
19+
val alarmSettingNotification = context.getAlarmSettingNotification(
20+
alarmSettingPendingIntent,
21+
"알람이 막차시간 ${lastTime}에서 ${alarmTime}전에 울릴예정입니다."
22+
)
23+
notificationManager.notify(ALARM_NOTIFICATION_ID, alarmSettingNotification)
2324

24-
val pendingIntent = if (isMoreThanSnow()) {
25-
PendingIntent.getBroadcast(context, alarmCode, receiverIntent, PendingIntent.FLAG_IMMUTABLE)
26-
} else {
27-
PendingIntent.getBroadcast(context, alarmCode, receiverIntent, PendingIntent.FLAG_UPDATE_CURRENT)
28-
}
25+
val alarmReceiverPendingIntent = context.getAlarmReceiverPendingIntent()
2926

27+
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
3028
alarmManager.setExactAndAllowWhileIdle(
3129
AlarmManager.RTC_WAKEUP,
3230
makeFullTime(lastTime).timeInMillis - (alarmTime * 60 * 1000),
33-
pendingIntent
31+
alarmReceiverPendingIntent
3432
)
3533
}
3634

37-
fun cancelAlarm(alarmCode: Int) {
35+
fun cancelAlarm() {
3836
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
39-
val intent = Intent(context, AlarmReceiver::class.java)
37+
val alarmReceiverPendingIntent = context.getAlarmReceiverPendingIntent()
4038

41-
pendingIntent = if (isMoreThanSnow()) {
42-
PendingIntent.getBroadcast(context, alarmCode, intent, PendingIntent.FLAG_IMMUTABLE)
43-
} else {
44-
PendingIntent.getBroadcast(context, alarmCode, intent, PendingIntent.FLAG_UPDATE_CURRENT)
45-
}
39+
alarmManager.cancel(alarmReceiverPendingIntent)
4640

47-
alarmManager.cancel(pendingIntent)
41+
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
42+
notificationManager.cancel(ALARM_NOTIFICATION_ID)
4843
}
4944

5045
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import com.stop.R
1313
import com.stop.domain.usecase.nearplace.GetNearPlacesUseCase
1414
import com.stop.isMoreThanOreo
1515
import com.stop.makeFullTime
16-
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_CODE
1716
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_TIME
1817
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.LAST_TIME
1918
import dagger.assisted.Assisted
@@ -94,8 +93,8 @@ class LastTimeCheckWorker @AssistedInject constructor(
9493

9594
if(lastTime != resultLastTime && resultLastTime != null){
9695
lastTime = resultLastTime
97-
alarmFunctions.cancelAlarm(ALARM_CODE)
98-
alarmFunctions.callAlarm(resultLastTime, alarmTime, ALARM_CODE)
96+
alarmFunctions.cancelAlarm()
97+
alarmFunctions.callAlarm(resultLastTime, alarmTime)
9998
}
10099

101100
val delayTime = getDelayTime()

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ class AlarmSettingFragment : Fragment() {
123123

124124
companion object {
125125
const val ALARM_CODE = 123
126+
const val ALARM_MAP_CODE = 122
127+
const val ALARM_NOTIFICATION_ID = 121
126128
const val LAST_TIME = "lastTime"
127129
const val ALARM_TIME = "alarmTime"
128130
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import com.stop.domain.usecase.alarm.DeleteAlarmUseCase
1515
import com.stop.domain.usecase.alarm.GetAlarmUseCase
1616
import com.stop.domain.usecase.alarm.SaveAlarmUseCase
1717
import com.stop.makeFullTime
18-
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_CODE
1918
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_TIME
2019
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.LAST_TIME
2120
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -74,11 +73,11 @@ class AlarmSettingViewModel @Inject constructor(
7473
}
7574

7675
fun callAlarm(time: String) {
77-
alarmFunctions.callAlarm(time, alarmTime.value ?: 0, ALARM_CODE)
76+
alarmFunctions.callAlarm(time, alarmTime.value ?: 0)
7877
}
7978

8079
private fun cancelAlarm() {
81-
alarmFunctions.cancelAlarm(ALARM_CODE)
80+
alarmFunctions.cancelAlarm()
8281
}
8382

8483
fun makeAlarmWorker(time: String) {

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ import com.stop.RouteNavGraphDirections
2121
import com.stop.alarm.SoundService
2222
import com.stop.databinding.FragmentMapBinding
2323
import com.stop.model.Location
24+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_MAP_CODE
2425
import com.stop.ui.alarmsetting.AlarmSettingViewModel
2526
import com.stop.ui.placesearch.PlaceSearchViewModel
2627
import com.stop.ui.util.Marker
28+
import com.stop.util.getScreenSize
2729
import kotlinx.coroutines.launch
2830

2931
class MapFragment : Fragment(), MapHandler {
@@ -128,6 +130,11 @@ class MapFragment : Fragment(), MapHandler {
128130
}
129131

130132
private fun initBottomSheetBehavior() {
133+
val displaySize = requireContext().getScreenSize()
134+
val displayHeight = displaySize.height
135+
136+
binding.layoutHomeBottomSheet.maxHeight = (displayHeight * 0.8).toInt()
137+
131138
val behavior = BottomSheetBehavior.from(binding.layoutHomeBottomSheet)
132139

133140
alarmViewModel.getAlarm()
@@ -236,6 +243,21 @@ class MapFragment : Fragment(), MapHandler {
236243
requireContext().stopService(intent)
237244
}
238245

246+
override fun onResume() {
247+
super.onResume()
248+
249+
requireActivity().intent.extras?.getInt("ALARM_MAP_CODE")?.let {
250+
if (it == ALARM_MAP_CODE) {
251+
showBottomSheet()
252+
}
253+
}
254+
}
255+
256+
private fun showBottomSheet() {
257+
val behavior = BottomSheetBehavior.from(binding.layoutHomeBottomSheet)
258+
behavior.state = BottomSheetBehavior.STATE_EXPANDED
259+
}
260+
239261
override fun onDestroyView() {
240262
_binding = null
241263

@@ -252,7 +274,7 @@ class MapFragment : Fragment(), MapHandler {
252274

253275
fun setMissionStart() {
254276
alarmViewModel.lastTimeCountDown.value?.let {
255-
if(it.isBlank()){
277+
if (it.isBlank()) {
256278
alarmViewModel.startCountDownTimer()
257279
}
258280
}

presentation/src/main/java/com/stop/util/BuildVersionCheck.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,7 @@ fun isMoreThanOreoUnderRedVelVet(): Boolean =
1515
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) and (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R)
1616

1717
fun isMoreThanSnow(): Boolean =
18-
Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
18+
Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
19+
20+
fun isMOreThanRedVelVet(): Boolean =
21+
Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package com.stop.util
2+
3+
import android.app.Notification
4+
import android.app.NotificationChannel
5+
import android.app.NotificationManager
6+
import android.app.PendingIntent
7+
import android.content.Context
8+
import android.content.Intent
9+
import android.content.res.Resources
10+
import android.os.PowerManager
11+
import android.util.DisplayMetrics
12+
import android.util.Size
13+
import android.view.WindowManager
14+
import android.view.WindowMetrics
15+
import androidx.core.app.NotificationCompat
16+
import com.stop.MainActivity
17+
import com.stop.R
18+
import com.stop.alarm.AlarmReceiver
19+
import com.stop.isMOreThanRedVelVet
20+
import com.stop.isMoreThanOreo
21+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_CODE
22+
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_MAP_CODE
23+
24+
fun Context.getAlarmSettingPendingIntent(): PendingIntent {
25+
val intent = Intent(this, MainActivity::class.java)
26+
intent.putExtra("ALARM_MAP_CODE", ALARM_MAP_CODE)
27+
return PendingIntent.getActivity(
28+
this,
29+
ALARM_MAP_CODE,
30+
intent,
31+
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
32+
)
33+
}
34+
35+
fun Context.getAlarmSettingNotification(pendingIntent: PendingIntent, content: String): Notification {
36+
val id = applicationContext.getString(R.string.notification_channel_id)
37+
val name = applicationContext.getString(R.string.notification_channel_name)
38+
val title = applicationContext.getString(R.string.notification_title)
39+
40+
createDefaultNotificationChannel(applicationContext, id, name)
41+
42+
return NotificationCompat.Builder(applicationContext, id)
43+
.setContentTitle(title)
44+
.setContentText(content)
45+
.setSmallIcon(R.mipmap.ic_bus)
46+
.setOngoing(true)
47+
.setContentIntent(pendingIntent)
48+
.build()
49+
}
50+
51+
fun Context.getAlarmReceiverPendingIntent(): PendingIntent {
52+
val intent = Intent(this, AlarmReceiver::class.java)
53+
intent.putExtra("ALARM_CODE", ALARM_CODE)
54+
return PendingIntent.getBroadcast(
55+
this,
56+
ALARM_CODE,
57+
intent,
58+
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
59+
)
60+
}
61+
62+
fun Context.isScreenOn() =
63+
(getSystemService(Context.POWER_SERVICE) as PowerManager).isInteractive
64+
65+
fun Context.getAlarmReceiverNotification(pendingIntent: PendingIntent, content: String): Notification {
66+
val id = applicationContext.getString(R.string.notification_channel_id)
67+
val name = applicationContext.getString(R.string.notification_channel_name)
68+
val title = applicationContext.getString(R.string.notification_title)
69+
70+
createHighNotificationChannel(applicationContext, id, name)
71+
72+
return NotificationCompat.Builder(applicationContext, id)
73+
.setContentTitle(title)
74+
.setContentText(content)
75+
.setSmallIcon(R.mipmap.ic_bus)
76+
.setAutoCancel(true)
77+
.setPriority(NotificationCompat.PRIORITY_HIGH)
78+
.setCategory(NotificationCompat.CATEGORY_ALARM)
79+
.setFullScreenIntent(pendingIntent, true)
80+
.build()
81+
}
82+
83+
private fun createDefaultNotificationChannel(context: Context, id: String, name: String) {
84+
if (isMoreThanOreo()) {
85+
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
86+
val importance = NotificationManager.IMPORTANCE_DEFAULT
87+
88+
NotificationChannel(
89+
id,
90+
name,
91+
importance
92+
).apply {
93+
notificationManager.createNotificationChannel(this)
94+
}
95+
}
96+
}
97+
98+
private fun createHighNotificationChannel(context: Context, id: String, name: String) {
99+
if (isMoreThanOreo()) {
100+
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
101+
val importance = NotificationManager.IMPORTANCE_HIGH
102+
103+
NotificationChannel(
104+
id,
105+
name,
106+
importance
107+
).apply {
108+
notificationManager.createNotificationChannel(this)
109+
}
110+
}
111+
}
112+
113+
fun Context.getScreenSize(): Size {
114+
return if (isMOreThanRedVelVet()) {
115+
val metrics: WindowMetrics = getSystemService(WindowManager::class.java).currentWindowMetrics
116+
Size(metrics.bounds.width(), metrics.bounds.height())
117+
} else {
118+
val display = getSystemService(WindowManager::class.java).defaultDisplay
119+
val metrics = if (display != null) {
120+
DisplayMetrics().also { display.getRealMetrics(it) }
121+
} else {
122+
Resources.getSystem().displayMetrics
123+
}
124+
Size(metrics.widthPixels, metrics.heightPixels)
125+
}
126+
}

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

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<layout
3-
xmlns:android="http://schemas.android.com/apk/res/android"
2+
<layout xmlns:android="http://schemas.android.com/apk/res/android"
43
xmlns:app="http://schemas.android.com/apk/res-auto"
54
xmlns:bind="http://schemas.android.com/apk/res-auto">
65

76
<data>
7+
88
<variable
99
name="placeSearchViewModel"
1010
type="com.stop.ui.placesearch.PlaceSearchViewModel" />
@@ -90,8 +90,8 @@
9090

9191
<include
9292
android:id="@+id/home_panel"
93-
bind:placeSearchViewModel="@{placeSearchViewModel}"
94-
layout="@layout/home_panel" />
93+
layout="@layout/home_panel"
94+
bind:placeSearchViewModel="@{placeSearchViewModel}" />
9595
</androidx.constraintlayout.widget.ConstraintLayout>
9696

9797
<androidx.constraintlayout.widget.ConstraintLayout
@@ -153,10 +153,20 @@
153153

154154
<include
155155
android:id="@+id/home_bottom_sheet"
156+
layout="@layout/home_bottom_sheet"
157+
android:layout_width="match_parent"
158+
android:layout_height="0dp"
159+
app:layout_constraintBottom_toBottomOf="parent"
160+
app:layout_constraintEnd_toEndOf="parent"
161+
app:layout_constraintStart_toStartOf="parent"
162+
app:layout_constraintTop_toTopOf="parent"
156163
bind:alarmViewModel="@{alarmViewModel}"
157-
bind:fragment="@{fragment}"
158-
layout="@layout/home_bottom_sheet" />
164+
bind:fragment="@{fragment}" />
165+
159166
</androidx.constraintlayout.widget.ConstraintLayout>
167+
160168
</androidx.coordinatorlayout.widget.CoordinatorLayout>
169+
161170
</androidx.constraintlayout.widget.ConstraintLayout>
171+
162172
</layout>

0 commit comments

Comments
 (0)