From d2055e80e2cf2372181c5b2fe9bb688fac706e36 Mon Sep 17 00:00:00 2001 From: terry-brett Date: Fri, 8 Mar 2024 11:44:32 +0100 Subject: [PATCH 01/11] add new voice message recorder component update voice message recorder with iOS 17 style --- android/app/build.gradle | 6 +- assets/fonts/WaveformIcon.ttf | Bin 0 -> 1908 bytes ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + .../custom/custom_waveform_icon.dart | 11 ++ .../text_field/conversation_text_field.dart | 40 +++---- .../widgets/text_field/text_field_suffix.dart | 11 +- .../text_field/voice_message_recorder.dart | 110 ++++++++++++++++++ macos/Flutter/Flutter-Debug.xcconfig | 1 + macos/Flutter/Flutter-Release.xcconfig | 1 + macos/Podfile | 43 +++++++ pubspec.yaml | 8 +- 12 files changed, 196 insertions(+), 37 deletions(-) create mode 100644 assets/fonts/WaveformIcon.ttf create mode 100644 lib/app/components/custom/custom_waveform_icon.dart create mode 100644 lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart create mode 100644 macos/Podfile diff --git a/android/app/build.gradle b/android/app/build.gradle index 6fe6632bc..6f92e7878 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -115,9 +115,9 @@ android { release { productFlavors.joel.signingConfig signingConfigs.debug productFlavors.tanay.signingConfig signingConfigs.debug - productFlavors.alpha.signingConfig signingConfigs.release - productFlavors.beta.signingConfig signingConfigs.release - productFlavors.prod.signingConfig signingConfigs.release + productFlavors.alpha.signingConfig signingConfigs.debug + productFlavors.beta.signingConfig signingConfigs.debug + productFlavors.prod.signingConfig signingConfigs.debug minifyEnabled false shrinkResources false } diff --git a/assets/fonts/WaveformIcon.ttf b/assets/fonts/WaveformIcon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b78d47113aa9114cc97960e61b4bdba65547582c GIT binary patch literal 1908 zcmd^A&x;&I7=6{cJYTAuk*|G4d5iLTqi+X)&42Sb<-gg3wmWKl z^3RVy0A`c=FFKChocru{oA?&{$qtFhug#x`zh%#N`qAdpDiOpV9Hv~qVdEVoo0m9b z`u1iZ_TyFR4^x(&-FI$&x_uO|W@%Fn{6X~RxOokjJV$*QjNPp7^r&|zt5Ic>Zbr@o&Lp|wt0i+udEk1GfVOoj>I;W;>Xxw z-pNQgi5x=3{kXT8xB$=UGQ_n~m10Y(ukJTbRNt^Hp2ks>@FLaKla)gU_s?dI9DDvi z3a9xw#Xl!vn?eeUe+$)ozFN4GOm}A<5Y2HSnzOllKKI{^XA1e85h{H5!(5?|6Yt%} zcNDy?*z3E95kG}rb^JhWHy42!N=aS@CQ;YeB!59;i}>DqIKeN=yPD6CzozjtPT&KL zvp9e+)$OyMpr0*#ud%>kQP(9`|X` jz8KdvB72JOY-!K@)!#ui^?!I&GlU^bWHxw~ehB;zACwvC literal 0 HcmV?d00001 diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee85..ec97fc6f3 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee85..c4855bfe2 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/lib/app/components/custom/custom_waveform_icon.dart b/lib/app/components/custom/custom_waveform_icon.dart new file mode 100644 index 000000000..8921c4dd0 --- /dev/null +++ b/lib/app/components/custom/custom_waveform_icon.dart @@ -0,0 +1,11 @@ +import 'package:flutter/widgets.dart'; + +// iOS 17 waveform icon for iMessage + +class WaveformIconData extends IconData { + const WaveformIconData(int codePoint) + : super( + codePoint, + fontFamily: 'WaveFormIcon', + ); +} diff --git a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart index 7f20a895a..67a019d77 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart @@ -10,6 +10,7 @@ import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/send_a import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/picked_attachments_holder.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/reply_holder.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart'; +import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart'; import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/models/models.dart'; @@ -19,6 +20,7 @@ import 'package:bluebubbles/utils/share.dart'; import 'package:chunked_stream/chunked_stream.dart'; import 'package:collection/collection.dart'; import 'package:emojis/emoji.dart'; +import 'package:faker/faker.dart'; import 'package:file_picker/file_picker.dart' hide PlatformFile; import 'package:file_picker/file_picker.dart' as pf; import 'package:flutter/cupertino.dart'; @@ -566,7 +568,7 @@ class ConversationTextFieldState extends CustomState focusNode != null; + bool get isRecording => recorderController?.isRecording ?? false; + @override Widget build(BuildContext context) { return Focus( @@ -827,7 +816,7 @@ class TextFieldComponent extends StatelessWidget { decoration: iOS ? BoxDecoration( border: Border.fromBorderSide(BorderSide( - color: context.theme.colorScheme.properSurface, + color: isRecording ? Color(0xFF1C0606) : context.theme.colorScheme.properSurface, width: 1.5, )), borderRadius: BorderRadius.circular(20), @@ -956,13 +945,14 @@ class TextFieldComponent extends StatelessWidget { enabledBorder: InputBorder.none, border: InputBorder.none, focusedBorder: InputBorder.none, - fillColor: Colors.transparent, + filled: isRecording, + fillColor: isRecording ? Color(0xFF1C0606) : Colors.transparent, hintStyle: context.theme.extension()!.bubbleText.copyWith(color: context.theme.colorScheme.outline), suffixIconConstraints: const BoxConstraints(minHeight: 0), suffixIcon: samsung && !isChatCreator ? null : Padding( - padding: EdgeInsets.only(right: iOS ? 0.0 : 5.0), + padding: EdgeInsets.only(right: 5.0), child: TextFieldSuffix( subjectTextController: subjectTextController, textController: textController, diff --git a/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart b/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart index d234af67b..a695c87e6 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart @@ -1,5 +1,6 @@ import 'package:audio_waveforms/audio_waveforms.dart'; +import 'package:bluebubbles/app/components/custom/custom_waveform_icon.dart'; import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/attachment/audio_player.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/send_button.dart'; @@ -73,7 +74,7 @@ class _TextFieldSuffixState extends OptimizedState { ? null : !isChatCreator && !showRecording ? context.theme.colorScheme.outline - : context.theme.colorScheme.primary, + : Color(0xFF7E1116), shape: const CircleBorder(), padding: const EdgeInsets.all(0), maximumSize: kIsDesktop ? const Size(40, 40) : const Size(32, 32), @@ -83,12 +84,12 @@ class _TextFieldSuffixState extends OptimizedState { child: isLinuxArm64 ? const SizedBox(height: 40) : !isChatCreator && !showRecording ? CupertinoIconWrapper(icon: Icon( - iOS ? CupertinoIcons.mic : Icons.mic_none, - color: iOS ? context.theme.colorScheme.outline : context.theme.colorScheme.properOnSurface, - size: 20, + iOS ? WaveformIconData(0xe800) : Icons.mic_none, + color: iOS ? Color(0xFFff6f61) : context.theme.colorScheme.properOnSurface, + size: iOS ? 17 : 20, )) : CupertinoIconWrapper(icon: Icon( iOS ? CupertinoIcons.stop_fill : Icons.stop_circle, - color: iOS ? context.theme.colorScheme.onPrimary : context.theme.colorScheme.properOnSurface, + color: iOS ? Color(0xFFFF1B30) : context.theme.colorScheme.properOnSurface, size: 15, )), onPressed: () async { diff --git a/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart b/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart new file mode 100644 index 000000000..f5088c89c --- /dev/null +++ b/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart @@ -0,0 +1,110 @@ +import 'dart:async'; + +import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; +import 'package:bluebubbles/helpers/helpers.dart'; +import 'package:bluebubbles/services/services.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:audio_waveforms/audio_waveforms.dart'; +import 'package:flutter/cupertino.dart'; + +const Color _iOSWavesColor = CupertinoDynamicColor.withBrightness( + color: Color(0xFFFF1B30), + darkColor: Color(0xFFFF1B30), +); + +const Color _iOSVoiceRecorderBackgroundColor = + CupertinoDynamicColor.withBrightness( + color: Color(0xFF1C0606), + darkColor: Color(0xFF1C0606), +); + +class VoiceMessageRecorder extends StatefulWidget { + const VoiceMessageRecorder({ + super.key, + required this.recorderController, + required this.textFieldSize, + required this.iOS, + required this.samsung, + }); + + final RecorderController? recorderController; + + final Size textFieldSize; + + final bool iOS; + + final bool samsung; + + @override + _VoiceMessageRecorderState createState() => _VoiceMessageRecorderState(); +} + +class _VoiceMessageRecorderState extends State { + late Stream recordingDurationStream; + + @override + void initState() { + recordingDurationStream = widget.recorderController!.onCurrentDuration; + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(left: 1), + child: Row( + children: [ + AudioWaveforms( + size: Size( + widget.textFieldSize.width - (widget.samsung ? 0 : 105), + widget.textFieldSize.height - 15), + recorderController: widget.recorderController!, + padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), + waveStyle: WaveStyle( + waveColor: widget.iOS ? _iOSWavesColor : Colors.white, + waveCap: StrokeCap.square, + spacing: 4.0, + showBottom: true, + extendWaveform: true, + showMiddleLine: false, + ), + decoration: BoxDecoration( + border: Border.fromBorderSide(BorderSide( + color: widget.iOS + ? _iOSVoiceRecorderBackgroundColor + : context.theme.colorScheme.outline, + width: 1, + )), + borderRadius: BorderRadius.circular(20), + color: widget.iOS + ? _iOSVoiceRecorderBackgroundColor + : context.theme.colorScheme.properSurface, + ), + ), + Center( + child: StreamBuilder( + stream: recordingDurationStream, + builder: (context, snapshot) { + if (snapshot.hasData) { + final minutes = snapshot.data!.inMinutes; + + final seconds = (snapshot.data!.inSeconds % 60) + .toString() + .padLeft(2, '0'); + + return Text( + '$minutes:$seconds', + style: TextStyle(color: Color(0xFFff6f61)), + ); + } else { + return Container(); + } + }, + ), + ), + ], + )); + } +} diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig index c2efd0b60..4b81f9b2d 100644 --- a/macos/Flutter/Flutter-Debug.xcconfig +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig index c2efd0b60..5caa9d157 100644 --- a/macos/Flutter/Flutter-Release.xcconfig +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Podfile b/macos/Podfile new file mode 100644 index 000000000..c795730db --- /dev/null +++ b/macos/Podfile @@ -0,0 +1,43 @@ +platform :osx, '10.14' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/pubspec.yaml b/pubspec.yaml index d54e00a38..f5cb4ef70 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -228,10 +228,10 @@ flutter_native_splash: # The following section is specific to Flutter. flutter: - # fonts: - # - family: AppleColorEmoji - # fonts: - # - asset: assets/fonts/AppleColorEmoji.ttf + fonts: + - family: WaveformIcon + fonts: + - asset: assets/fonts/WaveformIcon.ttf # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in From f2cdaee256ef22f9b9866ef3f4546d08d6d28448 Mon Sep 17 00:00:00 2001 From: terry-brett Date: Fri, 8 Mar 2024 13:10:07 +0100 Subject: [PATCH 02/11] change text field background when recording starts --- .../text_field/conversation_text_field.dart | 56 +++++++++++++++++-- .../text_field/voice_message_recorder.dart | 6 +- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart index 67a019d77..2a3b48beb 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart @@ -774,7 +774,7 @@ class ConversationTextFieldState extends CustomState initialAttachments; + @override + State createState() => TextFieldComponentState(); +} + + +class TextFieldComponentState extends State { + late final ConversationViewController? controller; + late final FocusNode? focusNode; + late final RecorderController? recorderController; + late final List initialAttachments; + late final MentionTextEditingController textController; + late final SpellCheckTextEditingController subjectTextController; + late final sendMessage; + + late final ValueNotifier isRecordingNotifier; + TextFieldComponentState() : isRecordingNotifier = ValueNotifier(false); + + @override + void initState() { + super.initState(); + controller = widget.controller; + focusNode = widget.focusNode; + recorderController = widget.recorderController; + initialAttachments = widget.initialAttachments; + textController = widget.textController; + subjectTextController = widget.subjectTextController; + sendMessage = widget.sendMessage; + + // add a listener to recorderController to update isRecordingNotifier + recorderController?.addListener(() { + isRecordingNotifier.value = recorderController?.isRecording ?? false; + }); + } + + @override + void dispose() { + // dispose of the ValueNotifier when the state is disposed + isRecordingNotifier.dispose(); + super.dispose(); + } + bool get iOS => ss.settings.skin.value == Skins.iOS; bool get samsung => ss.settings.skin.value == Skins.Samsung; @@ -803,8 +844,6 @@ class TextFieldComponent extends StatelessWidget { bool get isChatCreator => focusNode != null; - bool get isRecording => recorderController?.isRecording ?? false; - @override Widget build(BuildContext context) { return Focus( @@ -812,7 +851,10 @@ class TextFieldComponent extends StatelessWidget { onKeyEvent: (_, ev) => handleKey(_, ev, context, isChatCreator), child: Padding( padding: const EdgeInsets.only(right: 5.0), - child: Container( + child: ValueListenableBuilder( + valueListenable: isRecordingNotifier, + builder: (context, isRecording, child) { + return Container( decoration: iOS ? BoxDecoration( border: Border.fromBorderSide(BorderSide( @@ -945,8 +987,8 @@ class TextFieldComponent extends StatelessWidget { enabledBorder: InputBorder.none, border: InputBorder.none, focusedBorder: InputBorder.none, - filled: isRecording, - fillColor: isRecording ? Color(0xFF1C0606) : Colors.transparent, + filled: isRecordingNotifier.value, + fillColor: isRecordingNotifier.value ? Color(0xFF1C0606) : Colors.transparent, hintStyle: context.theme.extension()!.bubbleText.copyWith(color: context.theme.colorScheme.outline), suffixIconConstraints: const BoxConstraints(minHeight: 0), suffixIcon: samsung && !isChatCreator @@ -1063,6 +1105,8 @@ class TextFieldComponent extends StatelessWidget { ], ), ), + ); + } ), ), ); diff --git a/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart b/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart index f5088c89c..b0dd5e6e2 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart @@ -1,12 +1,10 @@ import 'dart:async'; -import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; +import 'package:audio_waveforms/audio_waveforms.dart'; import 'package:bluebubbles/helpers/helpers.dart'; -import 'package:bluebubbles/services/services.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:audio_waveforms/audio_waveforms.dart'; -import 'package:flutter/cupertino.dart'; const Color _iOSWavesColor = CupertinoDynamicColor.withBrightness( color: Color(0xFFFF1B30), From 26c4a4c15880837e1e9f98e16687148e4664c3a4 Mon Sep 17 00:00:00 2001 From: terry-brett <85226033+terry-brett@users.noreply.github.com> Date: Tue, 12 Mar 2024 09:19:29 +0100 Subject: [PATCH 03/11] add dark mode support --- .../colors/voice_message_recorder_colors.dart | 22 +++++++++++++++++++ .../text_field/conversation_text_field.dart | 10 ++++----- .../widgets/text_field/text_field_suffix.dart | 7 +++--- .../text_field/voice_message_recorder.dart | 17 ++++---------- 4 files changed, 35 insertions(+), 21 deletions(-) create mode 100644 lib/app/layouts/conversation_view/colors/voice_message_recorder_colors.dart diff --git a/lib/app/layouts/conversation_view/colors/voice_message_recorder_colors.dart b/lib/app/layouts/conversation_view/colors/voice_message_recorder_colors.dart new file mode 100644 index 000000000..642d70a45 --- /dev/null +++ b/lib/app/layouts/conversation_view/colors/voice_message_recorder_colors.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; + +const Color iOSWavesColor = CupertinoDynamicColor.withBrightness( + color: Color(0xFFFF3B30), + darkColor: Color(0xFFFF1B30), +); + +const Color iOSVoiceRecorderBackgroundColor = CupertinoDynamicColor.withBrightness( + color: Color(0xFFFFF5F4), + darkColor: Color(0xFF1C0606), +); + +const Color iOSStopIconColor = CupertinoDynamicColor.withBrightness( + color: Color(0xFFFF3B30), + darkColor: Color(0xFFff6f61), +); + +const Color iOSStopIconBackground = CupertinoDynamicColor.withBrightness( + color: Color(0xFFFFD2CF), + darkColor: Color(0xFF7E1116), +); \ No newline at end of file diff --git a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart index 2a3b48beb..e4232bfc5 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart @@ -11,6 +11,7 @@ import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/pic import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/reply_holder.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart'; +import 'package:bluebubbles/app/layouts/conversation_view/colors/voice_message_recorder_colors.dart'; import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/models/models.dart'; @@ -20,9 +21,8 @@ import 'package:bluebubbles/utils/share.dart'; import 'package:chunked_stream/chunked_stream.dart'; import 'package:collection/collection.dart'; import 'package:emojis/emoji.dart'; -import 'package:faker/faker.dart'; -import 'package:file_picker/file_picker.dart' hide PlatformFile; import 'package:file_picker/file_picker.dart' as pf; +import 'package:file_picker/file_picker.dart' hide PlatformFile; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -858,7 +858,7 @@ class TextFieldComponentState extends State { decoration: iOS ? BoxDecoration( border: Border.fromBorderSide(BorderSide( - color: isRecording ? Color(0xFF1C0606) : context.theme.colorScheme.properSurface, + color: (isRecording & iOS) ? CupertinoDynamicColor.resolve(iOSVoiceRecorderBackgroundColor, context) : context.theme.colorScheme.properSurface, width: 1.5, )), borderRadius: BorderRadius.circular(20), @@ -987,8 +987,8 @@ class TextFieldComponentState extends State { enabledBorder: InputBorder.none, border: InputBorder.none, focusedBorder: InputBorder.none, - filled: isRecordingNotifier.value, - fillColor: isRecordingNotifier.value ? Color(0xFF1C0606) : Colors.transparent, + filled: (isRecording & iOS), + fillColor: (isRecording & iOS) ? CupertinoDynamicColor.resolve(iOSVoiceRecorderBackgroundColor, context) : Colors.transparent, hintStyle: context.theme.extension()!.bubbleText.copyWith(color: context.theme.colorScheme.outline), suffixIconConstraints: const BoxConstraints(minHeight: 0), suffixIcon: samsung && !isChatCreator diff --git a/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart b/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart index a695c87e6..fe889d668 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart @@ -5,6 +5,7 @@ import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart' import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/attachment/audio_player.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/send_button.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/effects/send_effect_picker.dart'; +import 'package:bluebubbles/app/layouts/conversation_view/colors/voice_message_recorder_colors.dart'; import 'package:bluebubbles/app/wrappers/cupertino_icon_wrapper.dart'; import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; import 'package:bluebubbles/helpers/helpers.dart'; @@ -74,7 +75,7 @@ class _TextFieldSuffixState extends OptimizedState { ? null : !isChatCreator && !showRecording ? context.theme.colorScheme.outline - : Color(0xFF7E1116), + : CupertinoDynamicColor.resolve(iOSStopIconBackground, context), shape: const CircleBorder(), padding: const EdgeInsets.all(0), maximumSize: kIsDesktop ? const Size(40, 40) : const Size(32, 32), @@ -85,11 +86,11 @@ class _TextFieldSuffixState extends OptimizedState { !isChatCreator && !showRecording ? CupertinoIconWrapper(icon: Icon( iOS ? WaveformIconData(0xe800) : Icons.mic_none, - color: iOS ? Color(0xFFff6f61) : context.theme.colorScheme.properOnSurface, + color: iOS ? CupertinoDynamicColor.resolve(iOSStopIconColor, context) : context.theme.colorScheme.properOnSurface, size: iOS ? 17 : 20, )) : CupertinoIconWrapper(icon: Icon( iOS ? CupertinoIcons.stop_fill : Icons.stop_circle, - color: iOS ? Color(0xFFFF1B30) : context.theme.colorScheme.properOnSurface, + color: iOS ? CupertinoDynamicColor.resolve(iOSWavesColor, context) : context.theme.colorScheme.properOnSurface, size: 15, )), onPressed: () async { diff --git a/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart b/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart index b0dd5e6e2..9909f9227 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart @@ -1,21 +1,12 @@ import 'dart:async'; +import 'package:bluebubbles/app/layouts/conversation_view/colors/voice_message_recorder_colors.dart'; import 'package:audio_waveforms/audio_waveforms.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -const Color _iOSWavesColor = CupertinoDynamicColor.withBrightness( - color: Color(0xFFFF1B30), - darkColor: Color(0xFFFF1B30), -); - -const Color _iOSVoiceRecorderBackgroundColor = - CupertinoDynamicColor.withBrightness( - color: Color(0xFF1C0606), - darkColor: Color(0xFF1C0606), -); class VoiceMessageRecorder extends StatefulWidget { const VoiceMessageRecorder({ @@ -61,7 +52,7 @@ class _VoiceMessageRecorderState extends State { recorderController: widget.recorderController!, padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), waveStyle: WaveStyle( - waveColor: widget.iOS ? _iOSWavesColor : Colors.white, + waveColor: widget.iOS ? iOSWavesColor : Colors.white, waveCap: StrokeCap.square, spacing: 4.0, showBottom: true, @@ -71,13 +62,13 @@ class _VoiceMessageRecorderState extends State { decoration: BoxDecoration( border: Border.fromBorderSide(BorderSide( color: widget.iOS - ? _iOSVoiceRecorderBackgroundColor + ? CupertinoDynamicColor.resolve(iOSVoiceRecorderBackgroundColor, context) : context.theme.colorScheme.outline, width: 1, )), borderRadius: BorderRadius.circular(20), color: widget.iOS - ? _iOSVoiceRecorderBackgroundColor + ? CupertinoDynamicColor.resolve(iOSVoiceRecorderBackgroundColor, context) : context.theme.colorScheme.properSurface, ), ), From 45f890d680a7b7b3c542ded7e0f08080c009db94 Mon Sep 17 00:00:00 2001 From: terry-brett <85226033+terry-brett@users.noreply.github.com> Date: Tue, 12 Mar 2024 13:21:37 +0100 Subject: [PATCH 04/11] fix spacing for voice recorder widget --- .../text_field/voice_message_recorder.dart | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart b/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart index 9909f9227..ad5f2ffa8 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart @@ -47,10 +47,10 @@ class _VoiceMessageRecorderState extends State { children: [ AudioWaveforms( size: Size( - widget.textFieldSize.width - (widget.samsung ? 0 : 105), + widget.textFieldSize.width - getWidth(widget.iOS, widget.samsung), widget.textFieldSize.height - 15), recorderController: widget.recorderController!, - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), + padding: EdgeInsets.symmetric(vertical: 5, horizontal: widget.iOS ? 10 : 15), // need extra spacing in case of iOS for recording duration waveStyle: WaveStyle( waveColor: widget.iOS ? iOSWavesColor : Colors.white, waveCap: StrokeCap.square, @@ -72,7 +72,9 @@ class _VoiceMessageRecorderState extends State { : context.theme.colorScheme.properSurface, ), ), - Center( + Visibility( + visible: widget.iOS, + child: Center( child: StreamBuilder( stream: recordingDurationStream, builder: (context, snapshot) { @@ -93,7 +95,19 @@ class _VoiceMessageRecorderState extends State { }, ), ), + ), ], )); } + + int getWidth(bool iOS, bool samsung){ + if (samsung){ + // width for samsung style + return 0; + } else if (iOS){ + return 105; + } + // for material + return 80; + } } From a684c4e99e53fd8cf986af9266478af2f679780d Mon Sep 17 00:00:00 2001 From: terry-brett <85226033+terry-brett@users.noreply.github.com> Date: Tue, 12 Mar 2024 13:51:02 +0100 Subject: [PATCH 05/11] remove unnecessary changes --- android/app/build.gradle | 6 +++--- ios/Flutter/Debug.xcconfig | 1 - ios/Flutter/Release.xcconfig | 1 - macos/Flutter/Flutter-Debug.xcconfig | 1 - macos/Flutter/Flutter-Release.xcconfig | 1 - 5 files changed, 3 insertions(+), 7 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 6f92e7878..6fe6632bc 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -115,9 +115,9 @@ android { release { productFlavors.joel.signingConfig signingConfigs.debug productFlavors.tanay.signingConfig signingConfigs.debug - productFlavors.alpha.signingConfig signingConfigs.debug - productFlavors.beta.signingConfig signingConfigs.debug - productFlavors.prod.signingConfig signingConfigs.debug + productFlavors.alpha.signingConfig signingConfigs.release + productFlavors.beta.signingConfig signingConfigs.release + productFlavors.prod.signingConfig signingConfigs.release minifyEnabled false shrinkResources false } diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index ec97fc6f3..592ceee85 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1,2 +1 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index c4855bfe2..592ceee85 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1,2 +1 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig index 4b81f9b2d..c2efd0b60 100644 --- a/macos/Flutter/Flutter-Debug.xcconfig +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -1,2 +1 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig index 5caa9d157..c2efd0b60 100644 --- a/macos/Flutter/Flutter-Release.xcconfig +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -1,2 +1 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" From 99953b52dce0adf0d64729e3b4079996225beb2c Mon Sep 17 00:00:00 2001 From: terry-brett <85226033+terry-brett@users.noreply.github.com> Date: Tue, 12 Mar 2024 14:36:43 +0100 Subject: [PATCH 06/11] Delete Podfile --- macos/Podfile | 43 ------------------------------------------- 1 file changed, 43 deletions(-) delete mode 100644 macos/Podfile diff --git a/macos/Podfile b/macos/Podfile deleted file mode 100644 index c795730db..000000000 --- a/macos/Podfile +++ /dev/null @@ -1,43 +0,0 @@ -platform :osx, '10.14' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_macos_podfile_setup - -target 'Runner' do - use_frameworks! - use_modular_headers! - - flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) - target 'RunnerTests' do - inherit! :search_paths - end -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_macos_build_settings(target) - end -end From 610d1bb83c7762e9123bbb200a47e99530891a03 Mon Sep 17 00:00:00 2001 From: terry-brett <85226033+terry-brett@users.noreply.github.com> Date: Sun, 28 Apr 2024 15:28:08 +0200 Subject: [PATCH 07/11] remove custom waveform font --- assets/fonts/WaveformIcon.ttf | Bin 1908 -> 0 bytes .../components/custom/custom_waveform_icon.dart | 11 ----------- .../widgets/text_field/text_field_suffix.dart | 7 +++---- pubspec.yaml | 12 ++++++------ 4 files changed, 9 insertions(+), 21 deletions(-) delete mode 100644 assets/fonts/WaveformIcon.ttf delete mode 100644 lib/app/components/custom/custom_waveform_icon.dart diff --git a/assets/fonts/WaveformIcon.ttf b/assets/fonts/WaveformIcon.ttf deleted file mode 100644 index b78d47113aa9114cc97960e61b4bdba65547582c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1908 zcmd^A&x;&I7=6{cJYTAuk*|G4d5iLTqi+X)&42Sb<-gg3wmWKl z^3RVy0A`c=FFKChocru{oA?&{$qtFhug#x`zh%#N`qAdpDiOpV9Hv~qVdEVoo0m9b z`u1iZ_TyFR4^x(&-FI$&x_uO|W@%Fn{6X~RxOokjJV$*QjNPp7^r&|zt5Ic>Zbr@o&Lp|wt0i+udEk1GfVOoj>I;W;>Xxw z-pNQgi5x=3{kXT8xB$=UGQ_n~m10Y(ukJTbRNt^Hp2ks>@FLaKla)gU_s?dI9DDvi z3a9xw#Xl!vn?eeUe+$)ozFN4GOm}A<5Y2HSnzOllKKI{^XA1e85h{H5!(5?|6Yt%} zcNDy?*z3E95kG}rb^JhWHy42!N=aS@CQ;YeB!59;i}>DqIKeN=yPD6CzozjtPT&KL zvp9e+)$OyMpr0*#ud%>kQP(9`|X` jz8KdvB72JOY-!K@)!#ui^?!I&GlU^bWHxw~ehB;zACwvC diff --git a/lib/app/components/custom/custom_waveform_icon.dart b/lib/app/components/custom/custom_waveform_icon.dart deleted file mode 100644 index 8921c4dd0..000000000 --- a/lib/app/components/custom/custom_waveform_icon.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:flutter/widgets.dart'; - -// iOS 17 waveform icon for iMessage - -class WaveformIconData extends IconData { - const WaveformIconData(int codePoint) - : super( - codePoint, - fontFamily: 'WaveFormIcon', - ); -} diff --git a/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart b/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart index fe889d668..960747e38 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart @@ -1,6 +1,5 @@ import 'package:audio_waveforms/audio_waveforms.dart'; -import 'package:bluebubbles/app/components/custom/custom_waveform_icon.dart'; import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/attachment/audio_player.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/send_button.dart'; @@ -85,12 +84,12 @@ class _TextFieldSuffixState extends OptimizedState { child: isLinuxArm64 ? const SizedBox(height: 40) : !isChatCreator && !showRecording ? CupertinoIconWrapper(icon: Icon( - iOS ? WaveformIconData(0xe800) : Icons.mic_none, + iOS ? CupertinoIcons.waveform : Icons.mic_none, color: iOS ? CupertinoDynamicColor.resolve(iOSStopIconColor, context) : context.theme.colorScheme.properOnSurface, - size: iOS ? 17 : 20, + size: iOS ? 24 : 20, // Waveform icon appears smaller, using size 24 )) : CupertinoIconWrapper(icon: Icon( iOS ? CupertinoIcons.stop_fill : Icons.stop_circle, - color: iOS ? CupertinoDynamicColor.resolve(iOSWavesColor, context) : context.theme.colorScheme.properOnSurface, + color: iOS ? context.theme.colorScheme.primary : context.theme.colorScheme.properOnSurface, size: 15, )), onPressed: () async { diff --git a/pubspec.yaml b/pubspec.yaml index 001c98e1a..b08778a83 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ description: Send iMessages on Android using BlueBubbles! # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.13.2+66 +version: 1.13.3+67 publish_to: none environment: @@ -253,10 +253,10 @@ flutter_native_splash: # The following section is specific to Flutter. flutter: - fonts: - - family: WaveformIcon - fonts: - - asset: assets/fonts/WaveformIcon.ttf + # fonts: + # - family: AppleColorEmoji + # fonts: + # - asset: assets/fonts/AppleColorEmoji.ttf # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in @@ -336,4 +336,4 @@ msix_config: languages: en-us architecture: x64 capabilities: internetClient, location, microphone, webcam - protocol_activation: imessage + protocol_activation: imessage \ No newline at end of file From 18aa9bb34f879fa773ca7f358dc8ab2d3569c149 Mon Sep 17 00:00:00 2001 From: terry-brett <85226033+terry-brett@users.noreply.github.com> Date: Sun, 28 Apr 2024 16:07:43 +0200 Subject: [PATCH 08/11] use themed colours and remove custom colour --- .../colors/voice_message_recorder_colors.dart | 22 ------------------- .../text_field/conversation_text_field.dart | 10 ++++----- .../widgets/text_field/text_field_suffix.dart | 7 +++--- .../text_field/voice_message_recorder.dart | 9 ++++---- 4 files changed, 12 insertions(+), 36 deletions(-) delete mode 100644 lib/app/layouts/conversation_view/colors/voice_message_recorder_colors.dart diff --git a/lib/app/layouts/conversation_view/colors/voice_message_recorder_colors.dart b/lib/app/layouts/conversation_view/colors/voice_message_recorder_colors.dart deleted file mode 100644 index 642d70a45..000000000 --- a/lib/app/layouts/conversation_view/colors/voice_message_recorder_colors.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/cupertino.dart'; - -const Color iOSWavesColor = CupertinoDynamicColor.withBrightness( - color: Color(0xFFFF3B30), - darkColor: Color(0xFFFF1B30), -); - -const Color iOSVoiceRecorderBackgroundColor = CupertinoDynamicColor.withBrightness( - color: Color(0xFFFFF5F4), - darkColor: Color(0xFF1C0606), -); - -const Color iOSStopIconColor = CupertinoDynamicColor.withBrightness( - color: Color(0xFFFF3B30), - darkColor: Color(0xFFff6f61), -); - -const Color iOSStopIconBackground = CupertinoDynamicColor.withBrightness( - color: Color(0xFFFFD2CF), - darkColor: Color(0xFF7E1116), -); \ No newline at end of file diff --git a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart index e4232bfc5..a8fc85500 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart @@ -11,7 +11,6 @@ import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/pic import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/reply_holder.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart'; -import 'package:bluebubbles/app/layouts/conversation_view/colors/voice_message_recorder_colors.dart'; import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/models/models.dart'; @@ -858,7 +857,7 @@ class TextFieldComponentState extends State { decoration: iOS ? BoxDecoration( border: Border.fromBorderSide(BorderSide( - color: (isRecording & iOS) ? CupertinoDynamicColor.resolve(iOSVoiceRecorderBackgroundColor, context) : context.theme.colorScheme.properSurface, + color: (isRecording & iOS) ? context.theme.colorScheme.primary.withOpacity(1.0) : context.theme.colorScheme.properSurface, width: 1.5, )), borderRadius: BorderRadius.circular(20), @@ -981,14 +980,15 @@ class TextFieldComponentState extends State { ? "New Message" : ss.settings.recipientAsPlaceholder.value == true ? chat!.getTitle() - : chat!.isTextForwarding + : (chat!.isTextForwarding && !isRecording) ? "Text Forwarding" - : "iMessage", + : (!isRecording) // Only show iMessage when not recording + ? "iMessage" : "", enabledBorder: InputBorder.none, border: InputBorder.none, focusedBorder: InputBorder.none, filled: (isRecording & iOS), - fillColor: (isRecording & iOS) ? CupertinoDynamicColor.resolve(iOSVoiceRecorderBackgroundColor, context) : Colors.transparent, + fillColor: (isRecording & iOS) ? context.theme.colorScheme.primary.withOpacity(0.3) : Colors.transparent, hintStyle: context.theme.extension()!.bubbleText.copyWith(color: context.theme.colorScheme.outline), suffixIconConstraints: const BoxConstraints(minHeight: 0), suffixIcon: samsung && !isChatCreator diff --git a/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart b/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart index 960747e38..a14385b49 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart @@ -1,10 +1,9 @@ import 'package:audio_waveforms/audio_waveforms.dart'; import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart'; +import 'package:bluebubbles/app/layouts/conversation_view/widgets/effects/send_effect_picker.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/attachment/audio_player.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/send_button.dart'; -import 'package:bluebubbles/app/layouts/conversation_view/widgets/effects/send_effect_picker.dart'; -import 'package:bluebubbles/app/layouts/conversation_view/colors/voice_message_recorder_colors.dart'; import 'package:bluebubbles/app/wrappers/cupertino_icon_wrapper.dart'; import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; import 'package:bluebubbles/helpers/helpers.dart'; @@ -74,7 +73,7 @@ class _TextFieldSuffixState extends OptimizedState { ? null : !isChatCreator && !showRecording ? context.theme.colorScheme.outline - : CupertinoDynamicColor.resolve(iOSStopIconBackground, context), + : context.theme.colorScheme.primary.withOpacity(0.4), shape: const CircleBorder(), padding: const EdgeInsets.all(0), maximumSize: kIsDesktop ? const Size(40, 40) : const Size(32, 32), @@ -85,7 +84,7 @@ class _TextFieldSuffixState extends OptimizedState { !isChatCreator && !showRecording ? CupertinoIconWrapper(icon: Icon( iOS ? CupertinoIcons.waveform : Icons.mic_none, - color: iOS ? CupertinoDynamicColor.resolve(iOSStopIconColor, context) : context.theme.colorScheme.properOnSurface, + color: iOS ? context.theme.colorScheme.outline : context.theme.colorScheme.properOnSurface, size: iOS ? 24 : 20, // Waveform icon appears smaller, using size 24 )) : CupertinoIconWrapper(icon: Icon( iOS ? CupertinoIcons.stop_fill : Icons.stop_circle, diff --git a/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart b/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart index ad5f2ffa8..951534e1c 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:bluebubbles/app/layouts/conversation_view/colors/voice_message_recorder_colors.dart'; import 'package:audio_waveforms/audio_waveforms.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:flutter/cupertino.dart'; @@ -52,7 +51,7 @@ class _VoiceMessageRecorderState extends State { recorderController: widget.recorderController!, padding: EdgeInsets.symmetric(vertical: 5, horizontal: widget.iOS ? 10 : 15), // need extra spacing in case of iOS for recording duration waveStyle: WaveStyle( - waveColor: widget.iOS ? iOSWavesColor : Colors.white, + waveColor: widget.iOS ? context.theme.colorScheme.primary : Colors.white, waveCap: StrokeCap.square, spacing: 4.0, showBottom: true, @@ -62,13 +61,13 @@ class _VoiceMessageRecorderState extends State { decoration: BoxDecoration( border: Border.fromBorderSide(BorderSide( color: widget.iOS - ? CupertinoDynamicColor.resolve(iOSVoiceRecorderBackgroundColor, context) + ? Colors.transparent : context.theme.colorScheme.outline, width: 1, )), borderRadius: BorderRadius.circular(20), color: widget.iOS - ? CupertinoDynamicColor.resolve(iOSVoiceRecorderBackgroundColor, context) + ? Colors.transparent : context.theme.colorScheme.properSurface, ), ), @@ -87,7 +86,7 @@ class _VoiceMessageRecorderState extends State { return Text( '$minutes:$seconds', - style: TextStyle(color: Color(0xFFff6f61)), + style: TextStyle(color: context.theme.colorScheme.primary), ); } else { return Container(); From 81c0a041e78c21419ae06f606bc5ab97f3ded7e8 Mon Sep 17 00:00:00 2001 From: terry-brett <85226033+terry-brett@users.noreply.github.com> Date: Sun, 28 Apr 2024 16:23:38 +0200 Subject: [PATCH 09/11] Update pubspec.yaml --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index b08778a83..2c636e79b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ description: Send iMessages on Android using BlueBubbles! # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.13.3+67 +version: 1.13.2+66 publish_to: none environment: From 48e24777e020d8f32e55f442a7bd0df0f3913f71 Mon Sep 17 00:00:00 2001 From: terry-brett <85226033+terry-brett@users.noreply.github.com> Date: Sun, 28 Apr 2024 16:25:13 +0200 Subject: [PATCH 10/11] Update pubspec.yaml --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 2c636e79b..5ef2f0ae1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -336,4 +336,4 @@ msix_config: languages: en-us architecture: x64 capabilities: internetClient, location, microphone, webcam - protocol_activation: imessage \ No newline at end of file + protocol_activation: imessage From 14a21ce775113b96015bdd839e844926c8860dae Mon Sep 17 00:00:00 2001 From: terry-brett <85226033+terry-brett@users.noreply.github.com> Date: Sun, 23 Jun 2024 12:31:46 +0200 Subject: [PATCH 11/11] Change white waveform color to properOnSurface for better visibility --- .../widgets/text_field/voice_message_recorder.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart b/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart index 951534e1c..3a2021dbd 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/voice_message_recorder.dart @@ -51,7 +51,7 @@ class _VoiceMessageRecorderState extends State { recorderController: widget.recorderController!, padding: EdgeInsets.symmetric(vertical: 5, horizontal: widget.iOS ? 10 : 15), // need extra spacing in case of iOS for recording duration waveStyle: WaveStyle( - waveColor: widget.iOS ? context.theme.colorScheme.primary : Colors.white, + waveColor: widget.iOS ? context.theme.colorScheme.primary : context.theme.colorScheme.properOnSurface, waveCap: StrokeCap.square, spacing: 4.0, showBottom: true,