Skip to content

Commit

Permalink
Ignore oncoming alarm if another alarm is ringing
Browse files Browse the repository at this point in the history
  • Loading branch information
gdelataillade committed Sep 12, 2024
1 parent 29dadad commit 11c404f
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 9 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
## 4.0.0-dev.3
**💥 Breaking Changes**\
* Refactored `AlarmSettings` model.
* Ignore oncoming alarm if another alarm is ringing.
* [Android] Update kotlin version to `1.8.0`.

## 4.0.0-dev.2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,15 @@ class AlarmService : Service() {
val id = intent.getIntExtra("id", 0)
val action = intent.getStringExtra(AlarmReceiver.EXTRA_ALARM_ACTION)

Log.d("AlarmService", "ringing alarms: $ringingAlarmIds")
if (ringingAlarmIds.isNotEmpty()) {
Log.d("AlarmService", "An alarm is already ringing. Ignoring new alarm with id: $id")
unsaveAlarm(id)
return START_NOT_STICKY
}

if (action == "STOP_ALARM" && id != 0) {
AlarmStorage(this).unsaveAlarm(id)
AlarmPlugin.eventSink?.success(mapOf(
"id" to id,
"method" to "stop"
))
stopAlarm(id)
unsaveAlarm(id)
return START_NOT_STICKY
}

Expand Down Expand Up @@ -129,6 +131,15 @@ class AlarmService : Service() {
return START_STICKY
}

fun unsaveAlarm(id: Int) {
AlarmStorage(this).unsaveAlarm(id)
AlarmPlugin.eventSink?.success(mapOf(
"id" to id,
"method" to "stop"
))
stopAlarm(id)
}

fun stopAlarm(id: Int) {
try {
val playingIds = audioService?.getPlayingMediaPlayersIds() ?: listOf()
Expand Down
18 changes: 16 additions & 2 deletions ios/Classes/SwiftAlarmPlugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,11 @@ public class SwiftAlarmPlugin: NSObject, FlutterPlugin {
}
}

func stopAlarmFromNotification(id: Int) {
func unsaveAlarm(id: Int) {
AlarmStorage.shared.unsaveAlarm(id: id)
safeModifyResources {
self.stopAlarm(id: id, cancelNotif: true, result: { _ in })
}
NSLog("SwiftAlarmPlugin: stopAlarmFromNotification...")
channel.invokeMethod("alarmStoppedFromNotification", arguments: ["id": id])
}

Expand Down Expand Up @@ -253,7 +252,22 @@ public class SwiftAlarmPlugin: NSObject, FlutterPlugin {
}
}

private func isAnyAlarmRinging() -> Bool {
for (_, alarmConfig) in self.alarms {
if let audioPlayer = alarmConfig.audioPlayer, audioPlayer.isPlaying, audioPlayer.currentTime > 0 {
return true
}
}
return false
}

private func handleAlarmAfterDelay(id: Int) {
if self.isAnyAlarmRinging() {
NSLog("SwiftAlarmPlugin: Ignoring alarm with id \(id) because another alarm is already ringing.")
self.unsaveAlarm(id: id)
return
}

safeModifyResources {
guard let alarm = self.alarms[id], let audioPlayer = alarm.audioPlayer else {
return
Expand Down
2 changes: 1 addition & 1 deletion ios/Classes/services/NotificationManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class NotificationManager: NSObject, UNUserNotificationCenterDelegate {
switch identifier {
case "STOP_ACTION":
NSLog("Stop action triggered for notification: \(notification.request.identifier)")
SwiftAlarmPlugin.shared.stopAlarmFromNotification(id: id)
SwiftAlarmPlugin.shared.unsaveAlarm(id: id)
default:
break
}
Expand Down

0 comments on commit 11c404f

Please sign in to comment.