@@ -12,15 +12,16 @@ import com.yapp.alarm.services.AlarmService
1212import com.yapp.analytics.AnalyticsEvent
1313import com.yapp.analytics.AnalyticsHelper
1414import com.yapp.domain.model.Alarm
15+ import com.yapp.domain.model.toAlarmDay
1516import com.yapp.domain.model.toTimeString
1617import com.yapp.domain.repository.FortuneRepository
1718import com.yapp.domain.usecase.AlarmUseCase
1819import dagger.hilt.android.AndroidEntryPoint
1920import kotlinx.coroutines.CoroutineScope
2021import kotlinx.coroutines.Dispatchers
2122import kotlinx.coroutines.flow.first
22- import kotlinx.coroutines.flow.firstOrNull
2323import kotlinx.coroutines.launch
24+ import java.time.LocalDate
2425import java.time.LocalDateTime
2526import javax.inject.Inject
2627
@@ -105,17 +106,31 @@ class AlarmReceiver : BroadcastReceiver() {
105106 androidAlarmScheduler.cancelSnoozedAlarm(notificationId)
106107 context.stopService(alarmServiceIntent)
107108
108- sendBroadCastToCloseAlarmInteractionActivity(
109- context = context,
110- notificationId = notificationId,
111- missionType = missionType,
112- missionCount = missionCount,
113- )
114-
115109 CoroutineScope (Dispatchers .IO ).launch {
116- val alarms = alarmUseCase.getAllAlarms().first().sortedBy { it.isAlarmActive }
117- val isFirstAlarm = alarms.firstOrNull()?.id == notificationId
110+ val alarms = alarmUseCase.getAllAlarms().first()
111+
112+ val isSnoozeId = notificationId >= AlarmConstants .SNOOZE_ID_OFFSET
113+
114+ fun Alarm.ringsToday (): Boolean {
115+ if (repeatDays == 0 ) return true
116+
117+ val todayAlarmDay = LocalDate .now().dayOfWeek.toAlarmDay()
118+ return (repeatDays and todayAlarmDay.bitValue) != 0
119+ }
118120
121+ val earliestIdToday: Long? = alarms
122+ .asSequence()
123+ .filter { (it.isAlarmActive || it.id == notificationId) && it.ringsToday() }
124+ .sortedWith(compareBy({ it.hour }, { it.minute }, { it.second }))
125+ .firstOrNull()
126+ ?.id
127+
128+ val isEarliestAlarmDismissedToday =
129+ ! isSnoozeId && (earliestIdToday == notificationId)
130+
131+ if (isEarliestAlarmDismissedToday) fortuneRepository.markFirstAlarmDismissedToday()
132+
133+ val isFirstAlarm = earliestIdToday == notificationId
119134 analyticsHelper.logEvent(
120135 AnalyticsEvent (
121136 type = " alarm_dismiss" ,
@@ -126,12 +141,12 @@ class AlarmReceiver : BroadcastReceiver() {
126141 ),
127142 )
128143
129- val existingId = fortuneRepository.firstDismissedAlarmIdFlow.firstOrNull()
130- if (existingId == null ) {
131- fortuneRepository.saveFirstDismissedAlarmId( notificationId)
132- } else if (existingId != notificationId) {
133- fortuneRepository.clearDismissedAlarmId()
134- }
144+ sendBroadCastToCloseAlarmInteractionActivity(
145+ context = context,
146+ notificationId = notificationId,
147+ missionType = missionType,
148+ missionCount = missionCount,
149+ )
135150 }
136151
137152 Toast .makeText(context, " 알람이 해제되었어요" , Toast .LENGTH_SHORT ).show()
0 commit comments