From d467a689337aaf8b66707efbddee06acd4e3d21c Mon Sep 17 00:00:00 2001 From: Aaron Date: Thu, 6 Nov 2025 23:47:48 +0100 Subject: [PATCH] Fix: Add custom sound support for alarms on Android --- .../src/main/java/com/expoalarmmodule/Alarm.java | 5 ++++- .../com/expoalarmmodule/ExpoAlarmModuleModule.java | 4 +++- .../src/main/java/com/expoalarmmodule/Helper.java | 13 ++++++++++++- .../src/main/java/com/expoalarmmodule/Manager.java | 9 ++++++--- src/models/Alarm.tsx | 2 ++ 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/com/expoalarmmodule/Alarm.java b/android/src/main/java/com/expoalarmmodule/Alarm.java index d12270b..6e230b6 100644 --- a/android/src/main/java/com/expoalarmmodule/Alarm.java +++ b/android/src/main/java/com/expoalarmmodule/Alarm.java @@ -55,7 +55,9 @@ public class Alarm implements Cloneable { String dismissText; String snoozeText; - Alarm(String uid, ArrayList days, ZonedDateTime date, int hour, int minutes, boolean showDismiss, boolean showSnooze, int snoozeInterval, String title, String description, boolean repeating, boolean active, String dismissText, String snoozeText) { + String sound; + + Alarm(String uid, ArrayList days, ZonedDateTime date, int hour, int minutes, boolean showDismiss, boolean showSnooze, int snoozeInterval, String title, String description, boolean repeating, boolean active, String dismissText, String snoozeText, String sound) { this.uid = uid; this.days = days; this.hour = hour; @@ -72,6 +74,7 @@ public class Alarm implements Cloneable { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { this.date = date; } + this.sound = sound } List getDates() { diff --git a/android/src/main/java/com/expoalarmmodule/ExpoAlarmModuleModule.java b/android/src/main/java/com/expoalarmmodule/ExpoAlarmModuleModule.java index 0aa62bb..4f36ba1 100644 --- a/android/src/main/java/com/expoalarmmodule/ExpoAlarmModuleModule.java +++ b/android/src/main/java/com/expoalarmmodule/ExpoAlarmModuleModule.java @@ -155,6 +155,8 @@ private Alarm parseAlarmObject (ReadableMap alarm) { String dismissText = alarm.hasKey("dismissText") ? alarm.getString("dismissText") : "Dismiss"; String snoozeText = alarm.hasKey("snoozeText") ? alarm.getString("snoozeText") : "Snooze"; + String sound = alarm.hasKey("sound") ? alarm.getString("sound") : null; + ArrayList days = new ArrayList<>(); ZonedDateTime date = null; @@ -176,7 +178,7 @@ private Alarm parseAlarmObject (ReadableMap alarm) { } } } - return new Alarm(uid, days, date, hour, minutes, showDismiss, showSnooze, snoozeInterval, title, description, repeating, active, dismissText, snoozeText); + return new Alarm(uid, days, date, hour, minutes, showDismiss, showSnooze, snoozeInterval, title, description, repeating, active, dismissText, snoozeText, sound); } private WritableMap serializeAlarmObject (Alarm alarm) throws Exception { diff --git a/android/src/main/java/com/expoalarmmodule/Helper.java b/android/src/main/java/com/expoalarmmodule/Helper.java index 7ef9a9b..50ab47a 100644 --- a/android/src/main/java/com/expoalarmmodule/Helper.java +++ b/android/src/main/java/com/expoalarmmodule/Helper.java @@ -13,6 +13,8 @@ import android.graphics.Color; import android.os.Build; import android.util.Log; +import android.media.RingtoneManager; +import android.net.Uri; import androidx.core.app.NotificationCompat; import androidx.core.content.ContextCompat; @@ -151,6 +153,15 @@ protected static Notification getNotification( String channelId = context.getResources().getString(R.string.notification_channel_id); PendingIntent pendingIntentDismiss = createActionIntent(context, alarmUid, id, "DISMISS_ACTION"); + + Alarm alarm = Storage.getAlarm(context, alarmUid); + Uri alarmSound; + if (alarm.sound != null && !alarm.sound.isEmpty()) { + alarmSound = Uri.parse("android.resource://" + context.getPackageName() + "/raw/" + alarm.sound); + } else { + alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); + } + NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channelId) .setSmallIcon(smallIconResId) @@ -163,7 +174,7 @@ protected static Notification getNotification( .setCategory(NotificationCompat.CATEGORY_ALARM) .setAutoCancel(true) .setOngoing(false) - .setSound(null) + .setSound(alarmSound) .setVibrate(null) .setContentIntent(createOnClickedIntent(context, alarmUid, id)) .setDeleteIntent(pendingIntentDismiss); diff --git a/android/src/main/java/com/expoalarmmodule/Manager.java b/android/src/main/java/com/expoalarmmodule/Manager.java index 569d3cb..b673263 100644 --- a/android/src/main/java/com/expoalarmmodule/Manager.java +++ b/android/src/main/java/com/expoalarmmodule/Manager.java @@ -112,11 +112,14 @@ static void disable(Context context, String alarmUid) { } static void start(Context context, String alarmUid) { + Alarm alarm = Storage.getAlarm(context, alarmUid); + if (alarm == null) return; + activeAlarmUid = alarmUid; sound = new Sound(context); - sound.play("default"); - - Log.d(TAG, "Starting " + activeAlarmUid); + sound.play(alarm.sound != null ? alarm.sound : "default"); + + Log.d(TAG, "Starting " + activeAlarmUid); } public static void stop(Context context) { diff --git a/src/models/Alarm.tsx b/src/models/Alarm.tsx index ecc2b74..fc5bc25 100644 --- a/src/models/Alarm.tsx +++ b/src/models/Alarm.tsx @@ -14,6 +14,7 @@ class Alarm { repeating?: boolean | undefined; active?: boolean | undefined; day?: string | Date | number[] | undefined; + sound?: string | undefined; constructor(params: any = null) { this.uid = getParam(params, 'uid'); @@ -29,6 +30,7 @@ class Alarm { this.repeating = getParam(params, 'repeating'); this.active = getParam(params, 'active'); this.day = getParam(params, 'day'); + this.sound = getParam(params, 'sound'); } static getEmpty() {