diff --git a/assets/sounds/click.ogg b/assets/sounds/click.ogg new file mode 100644 index 000000000..225eeb7ea Binary files /dev/null and b/assets/sounds/click.ogg differ diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index 8919e6a7a..80a40ac60 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -391,6 +391,8 @@ class Message extends StatelessWidget { showToolbar(pangeaMessageEvent); }, color: color, + clickPlayer: + controller.choreographer.clickPlayer, child: // Pangea# Container( @@ -519,6 +521,7 @@ class Message extends StatelessWidget { controller: controller, nextEvent: nextEvent, prevEvent: previousEvent, + isButton: isButton, // Pangea# ), if (event.hasAggregatedEvents( diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index b68cd0a8c..6b842a0a1 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -41,6 +41,7 @@ class MessageContent extends StatelessWidget { final ChatController controller; final Event? nextEvent; final Event? prevEvent; + final bool isButton; // Pangea# const MessageContent( @@ -55,6 +56,7 @@ class MessageContent extends StatelessWidget { required this.controller, this.nextEvent, this.prevEvent, + this.isButton = false, // Pangea# required this.borderRadius, }); @@ -331,6 +333,10 @@ class MessageContent extends StatelessWidget { return; } + if (isButton) { + controller.choreographer.clickPlayer.play(); + } + controller.showToolbar( event, pangeaMessageEvent: pangeaMessageEvent, diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index c6e2dac7f..4594711f9 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -17,6 +17,7 @@ import 'package:fluffychat/pangea/models/tokens_event_content_model.dart'; import 'package:fluffychat/pangea/utils/any_state_holder.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/utils/overlay.dart'; +import 'package:fluffychat/pangea/utils/play_click_sound.dart'; import 'package:fluffychat/pangea/widgets/chat/tts_controller.dart'; import 'package:fluffychat/pangea/widgets/igc/paywall_card.dart'; import 'package:flutter/foundation.dart'; @@ -42,6 +43,7 @@ class Choreographer { late AlternativeTranslator altTranslator; late ErrorService errorService; final tts = TtsController(); + final clickPlayer = ClickPlayer(); bool isFetching = false; int _timesClicked = 0; @@ -483,6 +485,7 @@ class Choreographer { _textController.dispose(); trialStream?.cancel(); tts.dispose(); + clickPlayer.dispose(); } LanguageModel? get l2Lang { diff --git a/lib/pangea/utils/play_click_sound.dart b/lib/pangea/utils/play_click_sound.dart new file mode 100644 index 000000000..31231c388 --- /dev/null +++ b/lib/pangea/utils/play_click_sound.dart @@ -0,0 +1,20 @@ +import 'package:audioplayers/audioplayers.dart'; + +class ClickPlayer { + late AudioPlayer _player; + + ClickPlayer() { + _player = AudioPlayer(); + _player.setPlayerMode(PlayerMode.lowLatency); + _player.setVolume(0.5); + } + + Future play() async { + await _player.stop(); + _player.play(AssetSource('sounds/click.ogg')); + } + + void dispose() { + _player.dispose(); + } +} diff --git a/lib/pangea/widgets/chat/message_toolbar_buttons.dart b/lib/pangea/widgets/chat/message_toolbar_buttons.dart index bfa3ab746..71a20189f 100644 --- a/lib/pangea/widgets/chat/message_toolbar_buttons.dart +++ b/lib/pangea/widgets/chat/message_toolbar_buttons.dart @@ -109,6 +109,8 @@ class ToolbarButtons extends StatelessWidget { onPressed: enabled ? () => overlayController.updateToolbarMode(mode) : null, + clickPlayer: overlayController + .widget.chatController.choreographer.clickPlayer, child: AnimatedContainer( duration: FluffyThemes.animationDuration, height: buttonSize, diff --git a/lib/pangea/widgets/pressable_button.dart b/lib/pangea/widgets/pressable_button.dart index ae84bc486..bb06fdce6 100644 --- a/lib/pangea/widgets/pressable_button.dart +++ b/lib/pangea/widgets/pressable_button.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:fluffychat/pangea/utils/play_click_sound.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -13,6 +14,7 @@ class PressableButton extends StatefulWidget { final void Function()? onPressed; final Stream? triggerAnimation; + final ClickPlayer? clickPlayer; const PressableButton({ required this.borderRadius, @@ -22,6 +24,7 @@ class PressableButton extends StatefulWidget { this.buttonHeight = 5, this.depressed = false, this.triggerAnimation, + this.clickPlayer, super.key, }); @@ -79,10 +82,11 @@ class PressableButtonState extends State if (_animationCompleter != null) { await _animationCompleter!.future; } - if (mounted) _controller.reverse(); + widget.clickPlayer?.play(); if (!kIsWeb) { HapticFeedback.mediumImpact(); } + if (mounted) _controller.reverse(); } void _onTapCancel() { diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 99fe9d9d6..8a1e26c05 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,7 @@ #include "generated_plugin_registrant.h" +#include #include #include #include @@ -20,6 +21,9 @@ #include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) audioplayers_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "AudioplayersLinuxPlugin"); + audioplayers_linux_plugin_register_with_registrar(audioplayers_linux_registrar); g_autoptr(FlPluginRegistrar) dynamic_color_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index de98e488d..7c2b2bd52 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_linux dynamic_color emoji_picker_flutter file_selector_linux diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 94d578564..011b37ee1 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,6 +7,7 @@ import Foundation import appkit_ui_element_colors import audio_session +import audioplayers_darwin import device_info_plus import dynamic_color import emoji_picker_flutter @@ -46,6 +47,7 @@ import window_to_front func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AppkitUiElementColorsPlugin.register(with: registry.registrar(forPlugin: "AppkitUiElementColorsPlugin")) AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) + AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) EmojiPickerFlutterPlugin.register(with: registry.registrar(forPlugin: "EmojiPickerFlutterPlugin")) diff --git a/pubspec.lock b/pubspec.lock index 31d245fd7..a1ea075e7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -97,6 +97,62 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.20" + audioplayers: + dependency: "direct main" + description: + name: audioplayers + sha256: c346ba5a39dc208f1bab55fc239855f573d69b0e832402114bf0b793622adc4d + url: "https://pub.dev" + source: hosted + version: "6.1.0" + audioplayers_android: + dependency: transitive + description: + name: audioplayers_android + sha256: de576b890befe27175c2f511ba8b742bec83765fa97c3ce4282bba46212f58e4 + url: "https://pub.dev" + source: hosted + version: "5.0.0" + audioplayers_darwin: + dependency: transitive + description: + name: audioplayers_darwin + sha256: e507887f3ff18d8e5a10a668d7bedc28206b12e10b98347797257c6ae1019c3b + url: "https://pub.dev" + source: hosted + version: "6.0.0" + audioplayers_linux: + dependency: transitive + description: + name: audioplayers_linux + sha256: "3d3d244c90436115417f170426ce768856d8fe4dfc5ed66a049d2890acfa82f9" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + audioplayers_platform_interface: + dependency: transitive + description: + name: audioplayers_platform_interface + sha256: "6834dd48dfb7bc6c2404998ebdd161f79cd3774a7e6779e1348d54a3bfdcfaa5" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + audioplayers_web: + dependency: transitive + description: + name: audioplayers_web + sha256: "3609bdf0e05e66a3d9750ee40b1e37f2a622c4edb796cc600b53a90a30a2ace4" + url: "https://pub.dev" + source: hosted + version: "5.0.1" + audioplayers_windows: + dependency: transitive + description: + name: audioplayers_windows + sha256: "8605762dddba992138d476f6a0c3afd9df30ac5b96039929063eceed416795c2" + url: "https://pub.dev" + source: hosted + version: "4.0.0" badges: dependency: "direct main" description: @@ -412,10 +468,10 @@ packages: dependency: transitive description: name: ffi - sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" file: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5a7cf83f7..2e05bd747 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,7 +6,7 @@ description: Learn a language while texting your friends. # Pangea# publish_to: none # On version bump also increase the build number for F-Droid -version: 1.23.17+3576 +version: 1.23.18+1 environment: sdk: ">=3.0.0 <4.0.0" @@ -111,6 +111,7 @@ dependencies: webrtc_interface: ^1.0.13 # #Pangea android_intent_plus: ^5.2.0 + audioplayers: ^6.1.0 country_picker: ^2.0.25 csv: ^6.0.0 dropdown_button2: ^2.3.9 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index cb606b32d..bd80c81e1 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,7 @@ #include "generated_plugin_registrant.h" +#include #include #include #include @@ -25,6 +26,8 @@ #include void RegisterPlugins(flutter::PluginRegistry* registry) { + AudioplayersWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin")); DynamicColorPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); EmojiPickerFlutterPluginCApiRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 981947647..095209a76 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_windows dynamic_color emoji_picker_flutter file_selector_windows