From 8c388a76f80d5548c326716ed1af7b1f8304c72f Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Thu, 9 Oct 2025 15:19:31 -0400 Subject: [PATCH] feat: add notification volume setting (#4310) --- lib/config/app_config.dart | 2 ++ lib/config/setting_keys.dart | 3 +++ .../settings_notifications.dart | 15 +++++++++++++ .../settings_notifications_view.dart | 22 +++++++++++++++++++ .../level_up/level_up_banner.dart | 1 + lib/pangea/common/utils/play_click_sound.dart | 6 ++++- .../local_notifications_extension.dart | 3 +++ lib/widgets/matrix.dart | 4 ++++ 8 files changed, 55 insertions(+), 1 deletion(-) diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index 4c28752ce..4b263af4a 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -194,6 +194,8 @@ abstract class AppConfig { "https://pangea-chat-client-assets.s3.us-east-1.amazonaws.com"; static String errorSubscriptionId = "pangea_subscription_error"; + + static double volume = 1.0; // Pangea# static void loadFromJson(Map json) { diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index 0fdd737e8..cae910913 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -34,6 +34,9 @@ abstract class SettingKeys { static const String showPresences = 'chat.fluffy.show_presences'; static const String displayNavigationRail = 'chat.fluffy.display_navigation_rail'; + // #Pangea + static const String volume = 'pangea.volume'; + // Pangea# } enum AppSettings { diff --git a/lib/pages/settings_notifications/settings_notifications.dart b/lib/pages/settings_notifications/settings_notifications.dart index 9ba74e930..84ab62b60 100644 --- a/lib/pages/settings_notifications/settings_notifications.dart +++ b/lib/pages/settings_notifications/settings_notifications.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/settings_notifications/push_rule_extensions.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; @@ -192,6 +193,20 @@ class SettingsNotificationsController extends State { } } + // #Pangea + final ValueNotifier volumeNotifier = + ValueNotifier(AppConfig.volume); + + void updateVolume(double value) { + volumeNotifier.value = value; + AppConfig.volume = value; + Matrix.of(context).store.setDouble( + SettingKeys.volume, + value, + ); + } + // Pangea# + @override Widget build(BuildContext context) => SettingsNotificationsView(this); } diff --git a/lib/pages/settings_notifications/settings_notifications_view.dart b/lib/pages/settings_notifications/settings_notifications_view.dart index cd1ea6c5d..d5efd9d31 100644 --- a/lib/pages/settings_notifications/settings_notifications_view.dart +++ b/lib/pages/settings_notifications/settings_notifications_view.dart @@ -48,6 +48,28 @@ class SettingsNotificationsView extends StatelessWidget { return SelectionArea( child: Column( children: [ + // #Pangea + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Row( + children: [ + const Icon(Icons.volume_up), + Expanded( + child: ValueListenableBuilder( + valueListenable: controller.volumeNotifier, + builder: (context, volume, _) { + return Slider( + value: volume, + max: 1.0, + onChanged: controller.updateVolume, + ); + }, + ), + ), + ], + ), + ), + // Pangea# if (pushRules != null) for (final category in pushCategories) ...[ ListTile( diff --git a/lib/pangea/analytics_misc/level_up/level_up_banner.dart b/lib/pangea/analytics_misc/level_up/level_up_banner.dart index 1dd5c6ab0..7947a5794 100644 --- a/lib/pangea/analytics_misc/level_up/level_up_banner.dart +++ b/lib/pangea/analytics_misc/level_up/level_up_banner.dart @@ -28,6 +28,7 @@ class LevelUpUtil { ) async { // Remove delay since GetAnalyticsController._onLevelUp is already async final player = AudioPlayer(); + player.setVolume(AppConfig.volume); // Wait for any existing snackbars to dismiss await _waitForSnackbars(context); diff --git a/lib/pangea/common/utils/play_click_sound.dart b/lib/pangea/common/utils/play_click_sound.dart index 652041165..2edb51bde 100644 --- a/lib/pangea/common/utils/play_click_sound.dart +++ b/lib/pangea/common/utils/play_click_sound.dart @@ -1,12 +1,16 @@ +import 'dart:math'; + import 'package:audioplayers/audioplayers.dart'; +import 'package:fluffychat/config/app_config.dart'; + class ClickPlayer { late AudioPlayer _player; ClickPlayer() { _player = AudioPlayer(); _player.setPlayerMode(PlayerMode.lowLatency); - _player.setVolume(0.5); + _player.setVolume(min(0.5, AppConfig.volume)); } Future play() async { diff --git a/lib/widgets/local_notifications_extension.dart b/lib/widgets/local_notifications_extension.dart index 06e7a40e9..a9bd77654 100644 --- a/lib/widgets/local_notifications_extension.dart +++ b/lib/widgets/local_notifications_extension.dart @@ -68,6 +68,9 @@ extension LocalNotificationsExtension on MatrixState { ); } + // #Pangea + _audioPlayer.volume = AppConfig.volume; + // Pangea# _audioPlayer.play(); html.Notification( diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 33d9d4385..8b053c7fb 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -528,6 +528,10 @@ class MatrixState extends State with WidgetsBindingObserver { AppConfig.displayNavigationRail = store.getBool(SettingKeys.displayNavigationRail) ?? AppConfig.displayNavigationRail; + + // #Pangea + AppConfig.volume = store.getDouble(SettingKeys.volume) ?? AppConfig.volume; + // Pangea# } @override