diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 678b86a..54044fb 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -556,6 +556,10 @@ "channels_editChannel": "Edit channel", "channels_muteChannel": "Mute channel", "channels_unmuteChannel": "Unmute channel", + "channels_notifications": "Notifications", + "channels_notifyAll": "All messages", + "channels_notifyMentionsOnly": "Mentions only", + "channels_notifyOff": "Off", "channels_deleteChannel": "Delete channel", "channels_deleteChannelConfirm": "Delete \"{name}\"? This cannot be undone.", "@channels_deleteChannelConfirm": { diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index ab5a0eb..3af670b 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -2212,6 +2212,30 @@ abstract class AppLocalizations { /// **'Unmute channel'** String get channels_unmuteChannel; + /// No description provided for @channels_notifications. + /// + /// In en, this message translates to: + /// **'Notifications'** + String get channels_notifications; + + /// No description provided for @channels_notifyAll. + /// + /// In en, this message translates to: + /// **'All messages'** + String get channels_notifyAll; + + /// No description provided for @channels_notifyMentionsOnly. + /// + /// In en, this message translates to: + /// **'Mentions only'** + String get channels_notifyMentionsOnly; + + /// No description provided for @channels_notifyOff. + /// + /// In en, this message translates to: + /// **'Off'** + String get channels_notifyOff; + /// No description provided for @channels_deleteChannel. /// /// In en, this message translates to: diff --git a/lib/l10n/app_localizations_bg.dart b/lib/l10n/app_localizations_bg.dart index 1dc52be..f6ec54a 100644 --- a/lib/l10n/app_localizations_bg.dart +++ b/lib/l10n/app_localizations_bg.dart @@ -1186,6 +1186,18 @@ class AppLocalizationsBg extends AppLocalizations { @override String get channels_unmuteChannel => 'Включи известията на канала'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Изтрий канала'; diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index a71083b..8ed1ad4 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -1181,6 +1181,18 @@ class AppLocalizationsDe extends AppLocalizations { @override String get channels_unmuteChannel => 'Kanal Stummschaltung aufheben'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Lösche den Kanal'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index caa4ccd..0c2f5a4 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -1162,6 +1162,18 @@ class AppLocalizationsEn extends AppLocalizations { @override String get channels_unmuteChannel => 'Unmute channel'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Delete channel'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index f9c59e8..c738200 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -1182,6 +1182,18 @@ class AppLocalizationsEs extends AppLocalizations { @override String get channels_unmuteChannel => 'Activar canal'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Eliminar canal'; diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index bb5c9c2..b4e705a 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -1187,6 +1187,18 @@ class AppLocalizationsFr extends AppLocalizations { @override String get channels_unmuteChannel => 'Réactiver les notifications du canal'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Supprimer le canal'; diff --git a/lib/l10n/app_localizations_hu.dart b/lib/l10n/app_localizations_hu.dart index 2bbdc07..7696db2 100644 --- a/lib/l10n/app_localizations_hu.dart +++ b/lib/l10n/app_localizations_hu.dart @@ -1187,6 +1187,18 @@ class AppLocalizationsHu extends AppLocalizations { @override String get channels_unmuteChannel => 'Engedje be a hangot'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Mozdony törlése'; diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart index 7d99e44..61871f8 100644 --- a/lib/l10n/app_localizations_it.dart +++ b/lib/l10n/app_localizations_it.dart @@ -1183,6 +1183,18 @@ class AppLocalizationsIt extends AppLocalizations { @override String get channels_unmuteChannel => 'Attiva notifiche canale'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Elimina canale'; diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index 9c65198..11d249a 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -1130,6 +1130,18 @@ class AppLocalizationsJa extends AppLocalizations { @override String get channels_unmuteChannel => 'ミュートを解除する'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'チャンネルを削除する'; diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index 4a91d0f..ae6f9dc 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -1125,6 +1125,18 @@ class AppLocalizationsKo extends AppLocalizations { @override String get channels_unmuteChannel => '채널 음소거 해제'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => '채널 삭제'; diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index a691455..6b4de2e 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -1173,6 +1173,18 @@ class AppLocalizationsNl extends AppLocalizations { @override String get channels_unmuteChannel => 'Kanaal dempen opheffen'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Kanaal verwijderen'; diff --git a/lib/l10n/app_localizations_pl.dart b/lib/l10n/app_localizations_pl.dart index 7c65e59..5d99cfe 100644 --- a/lib/l10n/app_localizations_pl.dart +++ b/lib/l10n/app_localizations_pl.dart @@ -1193,6 +1193,18 @@ class AppLocalizationsPl extends AppLocalizations { @override String get channels_unmuteChannel => 'Wyłącz wyciszenie kanału'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Usuń kanał'; diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 773f522..adaaeff 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -1183,6 +1183,18 @@ class AppLocalizationsPt extends AppLocalizations { @override String get channels_unmuteChannel => 'Ativar canal'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Excluir canal'; diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index cf6c583..1cf1e62 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -1184,6 +1184,18 @@ class AppLocalizationsRu extends AppLocalizations { @override String get channels_unmuteChannel => 'Включить уведомления канала'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Удалить канал'; diff --git a/lib/l10n/app_localizations_sk.dart b/lib/l10n/app_localizations_sk.dart index 0e2ddfa..af77b6f 100644 --- a/lib/l10n/app_localizations_sk.dart +++ b/lib/l10n/app_localizations_sk.dart @@ -1173,6 +1173,18 @@ class AppLocalizationsSk extends AppLocalizations { @override String get channels_unmuteChannel => 'Zrušiť stlmenie kanála'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Odstrániť kanál'; diff --git a/lib/l10n/app_localizations_sl.dart b/lib/l10n/app_localizations_sl.dart index d5141a0..4e53853 100644 --- a/lib/l10n/app_localizations_sl.dart +++ b/lib/l10n/app_localizations_sl.dart @@ -1170,6 +1170,18 @@ class AppLocalizationsSl extends AppLocalizations { @override String get channels_unmuteChannel => 'Vklopi obvestila kanala'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Pošlji kanal'; diff --git a/lib/l10n/app_localizations_sv.dart b/lib/l10n/app_localizations_sv.dart index 24babd5..11801a8 100644 --- a/lib/l10n/app_localizations_sv.dart +++ b/lib/l10n/app_localizations_sv.dart @@ -1164,6 +1164,18 @@ class AppLocalizationsSv extends AppLocalizations { @override String get channels_unmuteChannel => 'Slå på ljud för kanal'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Ta bort kanal'; diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index 98e2487..79e1ec7 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -1179,6 +1179,18 @@ class AppLocalizationsUk extends AppLocalizations { @override String get channels_unmuteChannel => 'Увімкнути сповіщення каналу'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => 'Видалити канал'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index 0652e85..c74308e 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -1111,6 +1111,18 @@ class AppLocalizationsZh extends AppLocalizations { @override String get channels_unmuteChannel => '取消静音频道'; + @override + String get channels_notifications => 'Notifications'; + + @override + String get channels_notifyAll => 'All messages'; + + @override + String get channels_notifyMentionsOnly => 'Mentions only'; + + @override + String get channels_notifyOff => 'Off'; + @override String get channels_deleteChannel => '删除频道'; diff --git a/lib/screens/channels_screen.dart b/lib/screens/channels_screen.dart index c1c7c00..5e51d18 100644 --- a/lib/screens/channels_screen.dart +++ b/lib/screens/channels_screen.dart @@ -13,6 +13,7 @@ import '../connector/meshcore_connector.dart'; import '../l10n/l10n.dart'; import '../services/app_settings_service.dart'; import '../services/ui_view_state_service.dart'; +import '../models/app_settings.dart'; import '../models/channel.dart'; import '../models/community.dart'; import '../storage/community_store.dart'; @@ -492,6 +493,71 @@ class _ChannelsScreenState extends State ); } + /// Notify-mode storage key for [channel]: its PSK identity, so the setting + /// survives a rename and does not follow a reused slot (#259). + String _notifyKeyFor(Channel channel) => AppSettings.channelNotifyKey( + channelIndex: channel.index, + pskHex: channel.pskHex, + ); + + IconData _notifyModeIcon(ChannelNotifyMode mode) { + switch (mode) { + case ChannelNotifyMode.all: + return Icons.notifications_outlined; + case ChannelNotifyMode.mentionsOnly: + return Icons.alternate_email; + case ChannelNotifyMode.off: + return Icons.notifications_off_outlined; + } + } + + String _notifyModeLabel(BuildContext context, ChannelNotifyMode mode) { + switch (mode) { + case ChannelNotifyMode.all: + return context.l10n.channels_notifyAll; + case ChannelNotifyMode.mentionsOnly: + return context.l10n.channels_notifyMentionsOnly; + case ChannelNotifyMode.off: + return context.l10n.channels_notifyOff; + } + } + + void _showNotifyModeDialog(BuildContext context, Channel channel) { + final settingsService = context.read(); + final identityKey = _notifyKeyFor(channel); + final current = settingsService.channelNotifyMode( + identityKey: identityKey, + channelName: channel.name, + ); + + showDialog( + context: context, + builder: (dialogContext) => AlertDialog( + title: Text(dialogContext.l10n.channels_notifications), + contentPadding: const EdgeInsets.symmetric(vertical: 8), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + for (final mode in ChannelNotifyMode.values) + ListTile( + leading: Icon(_notifyModeIcon(mode)), + title: Text(_notifyModeLabel(dialogContext, mode)), + trailing: mode == current ? const Icon(Icons.check) : null, + onTap: () async { + Navigator.pop(dialogContext); + await settingsService.setChannelNotifyMode( + identityKey: identityKey, + channelName: channel.name, + mode: mode, + ); + }, + ), + ], + ), + ), + ); + } + void _showChannelActions( BuildContext context, MeshCoreConnector connector, @@ -500,7 +566,10 @@ class _ChannelsScreenState extends State ) { final parentContext = context; final settingsService = context.read(); - final isMuted = settingsService.isChannelMuted(channel.name); + final notifyMode = settingsService.channelNotifyMode( + identityKey: _notifyKeyFor(channel), + channelName: channel.name, + ); showModalBottomSheet( context: parentContext, @@ -531,22 +600,14 @@ class _ChannelsScreenState extends State }, ), ListTile( - leading: Icon( - isMuted - ? Icons.notifications_outlined - : Icons.notifications_off_outlined, - ), - title: Text( - isMuted - ? context.l10n.channels_unmuteChannel - : context.l10n.channels_muteChannel, - ), + leading: Icon(_notifyModeIcon(notifyMode)), + title: Text(context.l10n.channels_notifications), + subtitle: Text(_notifyModeLabel(context, notifyMode)), onTap: () async { Navigator.pop(sheetContext); - if (isMuted) { - await settingsService.unmuteChannel(channel.name); - } else { - await settingsService.muteChannel(channel.name); + await Future.delayed(const Duration(milliseconds: 100)); + if (parentContext.mounted) { + _showNotifyModeDialog(parentContext, channel); } }, ), diff --git a/untranslated.json b/untranslated.json index 2ef710f..56be62e 100644 --- a/untranslated.json +++ b/untranslated.json @@ -19,6 +19,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -73,6 +77,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -127,6 +135,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -181,6 +193,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -235,6 +251,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -289,6 +309,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -343,6 +367,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -397,6 +425,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -451,6 +483,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -505,6 +541,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -559,6 +599,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -613,6 +657,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -667,6 +715,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -721,6 +773,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -775,6 +831,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -829,6 +889,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute", @@ -883,6 +947,10 @@ "appSettings_clockSystem", "appSettings_clock12h", "appSettings_clock24h", + "channels_notifications", + "channels_notifyAll", + "channels_notifyMentionsOnly", + "channels_notifyOff", "chat_replyWithRoute", "channel_heardTooltip", "path_suggestedRoute",