diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index d4fbe86b..fe0b6754 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -189,6 +189,8 @@ "supportedVersions": {} } }, + "sendTypingNotifications": "Send typing notifications", + "@sendTypingNotifications": {}, "sendOnEnter": "Send on enter", "@sendOnEnter": {}, "badServerVersionsException": "The homeserver supports the Spec versions:\n{serverVersions}\nBut this app supports only {supportedVersions}", diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index 92edca6b..20b74ab1 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -49,6 +49,7 @@ abstract class AppConfig { static bool showDirectChatsInSpaces = true; static bool separateChatTypes = false; static bool autoplayImages = true; + static bool sendTypingNotifications = true; static bool sendOnEnter = false; static bool experimentalVoip = false; static const bool hideTypingUsernames = false; diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index eeb3a16d..fc101798 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -26,6 +26,8 @@ abstract class SettingKeys { static const String dontAskForBootstrapKey = 'chat.fluffychat.dont_ask_bootstrap'; static const String autoplayImages = 'chat.fluffy.autoplay_images'; + static const String sendTypingNotifications = + 'chat.fluffy.send_typing_notifications'; static const String sendOnEnter = 'chat.fluffy.send_on_enter'; static const String experimentalVoip = 'chat.fluffy.experimental_voip'; } diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 355f8a60..93e96046 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -19,6 +19,7 @@ import 'package:scroll_to_index/scroll_to_index.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:vrouter/vrouter.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/chat/chat_view.dart'; import 'package:fluffychat/pages/chat/event_info_dialog.dart'; import 'package:fluffychat/pages/chat/recording_dialog.dart'; @@ -1139,19 +1140,24 @@ class ChatController extends State { } } } - typingCoolDown?.cancel(); - typingCoolDown = Timer(const Duration(seconds: 2), () { - typingCoolDown = null; - currentlyTyping = false; - room.setTyping(false); - }); - typingTimeout ??= Timer(const Duration(seconds: 30), () { - typingTimeout = null; - currentlyTyping = false; - }); - if (!currentlyTyping) { - currentlyTyping = true; - room.setTyping(true, timeout: const Duration(seconds: 30).inMilliseconds); + if (AppConfig.sendTypingNotifications) { + typingCoolDown?.cancel(); + typingCoolDown = Timer(const Duration(seconds: 2), () { + typingCoolDown = null; + currentlyTyping = false; + room.setTyping(false); + }); + typingTimeout ??= Timer(const Duration(seconds: 30), () { + typingTimeout = null; + currentlyTyping = false; + }); + if (!currentlyTyping) { + currentlyTyping = true; + room.setTyping( + true, + timeout: const Duration(seconds: 30).inMilliseconds, + ); + } } setState(() => inputText = text); } diff --git a/lib/pages/settings_chat/settings_chat_view.dart b/lib/pages/settings_chat/settings_chat_view.dart index cf4c0906..afff2aa1 100644 --- a/lib/pages/settings_chat/settings_chat_view.dart +++ b/lib/pages/settings_chat/settings_chat_view.dart @@ -66,6 +66,12 @@ class SettingsChatView extends StatelessWidget { defaultValue: AppConfig.autoplayImages, ), const Divider(), + SettingsSwitchListTile.adaptive( + title: L10n.of(context)!.sendTypingNotifications, + onChanged: (b) => AppConfig.sendTypingNotifications = b, + storeKey: SettingKeys.sendTypingNotifications, + defaultValue: AppConfig.sendTypingNotifications, + ), SettingsSwitchListTile.adaptive( title: L10n.of(context)!.sendOnEnter, onChanged: (b) => AppConfig.sendOnEnter = b, diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index c76f3265..8e52a8c9 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -489,6 +489,12 @@ class MatrixState extends State with WidgetsBindingObserver { store .getItemBool(SettingKeys.autoplayImages, AppConfig.autoplayImages) .then((value) => AppConfig.autoplayImages = value); + store + .getItemBool( + SettingKeys.sendTypingNotifications, + AppConfig.sendTypingNotifications, + ) + .then((value) => AppConfig.sendTypingNotifications = value); store .getItemBool(SettingKeys.sendOnEnter, AppConfig.sendOnEnter) .then((value) => AppConfig.sendOnEnter = value);