Custom Notification Tones (#5527)

* added foundation for custom notifications

* feat: add localizations for tone names

also, if available, include the pro sound in the element x sound list

* use a static file location to store the notification tone

and update the file at that location when selected

* if there's a problem previewing or setting the alert tone, toast the user with the error

* rename tone directory

* create NotificationToneManager to handle tone business logic

* conform to project formatting

* assign custom sound to actual notifications

* dry up notification generation in the nse

* add compilation condition for including notification alert tone and remove from share extension

* swift format had some opinions

* flatten the notification tone ui, removing system/elementx designations

* fix stored file url breaking due to sandbox path changes

* tone manager can import custom tones and provide a list of imported tones

* ui support for custom tones

* can delete custom imported tones

* sort the custom tones

* add additional preset sounds

* can choose caf files for custom sounds and fix location persistence issues

* store sound locations with relative links

this is a better solution than storing bookmarks since bookmark resolution can be variable and differ from freshly derived urls

* add docs for new notification features

* run tone conversion in background

* resolved several ai found issues

* added protocol and mocks for notification tone manager

* added tests for notification settings screen vm interactions with the tone manager

* add tests for notification tone manager

* rename element tone names per feedback

* move custom tone option to the top of the notification tone list

* rename Tone to Sound for consistency with Android

* remove additional bundled tones

* restore accidentally deleted Element Default sound file

* system alert tones are filtered by what's available on the system prior to finalizing the collection

* Add a couple more caf file conversion log statements

* Simplify the notification sound conversion logic

* Update notification sound strings in sync with Android

* update xcodeproj after rebase

* remove conditional compilation and include NotificationAlertSound in share extension

* Use AudioPlayer instead of custom tone previewer and remove the previewer

* rename NotificationTone

* Consolidate and move errors to top of NotificationToneManager

* tone manager no longer depends on userinterfacecontroller

* Move static Tone properties to NotificationToneManager

* resolve view model initializer feedback

* update xcodeproj

* fatalerror when tone manager cannot init

* Remove banner icon on alert tone error

* fixup review feedback

* Moved URL handling to NotificationToneManager
This commit is contained in:
Michael
2026-05-20 07:40:34 -05:00
committed by GitHub
parent cb1c89be9d
commit dd0de4d7b0
22 changed files with 1213 additions and 17 deletions
@@ -11,3 +11,37 @@
"soft_logout_signin_notice" = "Your homeserver (%1$s) admin has signed you out of your account %2$s (%3$s).";
"soft_logout_signin_title" = "Sign in";
"untranslated" = "Untranslated";
"screen_notification_settings_sound_system_tri_tone" = "Tri-tone";
"screen_notification_settings_sound_system_chime" = "Chime";
"screen_notification_settings_sound_system_glass" = "Glass";
"screen_notification_settings_sound_system_horn" = "Horn";
"screen_notification_settings_sound_system_bell" = "Bell";
"screen_notification_settings_sound_system_electronic" = "Electronic";
"screen_notification_settings_sound_system_alert" = "Alert";
"screen_notification_settings_sound_system_bloom" = "Bloom";
"screen_notification_settings_sound_system_calypso" = "Calypso";
"screen_notification_settings_sound_system_anticipate" = "Anticipate";
"screen_notification_settings_sound_system_choo_choo" = "Choo Choo";
"screen_notification_settings_sound_system_descent" = "Descent";
"screen_notification_settings_sound_system_fanfare" = "Fanfare";
"screen_notification_settings_sound_system_ladder" = "Ladder";
"screen_notification_settings_sound_system_minuet" = "Minuet";
"screen_notification_settings_sound_system_news_flash" = "News Flash";
"screen_notification_settings_sound_system_noir" = "Noir";
"screen_notification_settings_sound_system_sherwood_forest" = "Sherwood Forest";
"screen_notification_settings_sound_system_spell" = "Spell";
"screen_notification_settings_sound_system_suspense" = "Suspense";
"screen_notification_settings_sound_system_telegraph" = "Telegraph";
"screen_notification_settings_sound_system_tiptoes" = "Tiptoes";
"screen_notification_settings_sound_system_typewriters" = "Typewriters";
"screen_notification_settings_sound_system_update" = "Update";
"screen_notification_settings_sound_system_swish" = "Swish";
"screen_notification_settings_sound_system_tweet" = "Tweet";
"screen_notification_settings_sound_element_default" = "Element Default";
"screen_notification_settings_sound_element_fade" = "Element Fade";
"screen_notification_settings_sound_custom_sound_button_title" = "Custom sound...";
"screen_notification_settings_sound_section_title" = "Sound";
"screen_notification_settings_sound_set_sound_error_title" = "Problem setting alert sound";
"screen_notification_settings_sound_preview_sound_error_title" = "Problem previewing alert sound";
"screen_notification_settings_sound_import_sound_error_title" = "Error importing file";
"screen_notification_settings_sound_delete_sound_error_title" = "Error deleting file";