diff --git a/assets/fonts/NotoColorEmoji.ttf b/assets/fonts/NotoColorEmoji.ttf new file mode 100644 index 00000000..943741df Binary files /dev/null and b/assets/fonts/NotoColorEmoji.ttf differ diff --git a/lib/src/visual/components/emoji_picker.bottom.dart b/lib/src/visual/components/emoji_picker.bottom.dart index 1fa65465..86ac02c0 100755 --- a/lib/src/visual/components/emoji_picker.bottom.dart +++ b/lib/src/visual/components/emoji_picker.bottom.dart @@ -53,8 +53,12 @@ class EmojiPickerBottom extends StatelessWidget { config: Config( height: 400, locale: Localizations.localeOf(context), + checkPlatformCompatibility: false, emojiTextStyle: TextStyle( fontSize: 24 * (Platform.isIOS ? 1.2 : 1), + fontFamilyFallback: Platform.isAndroid + ? const ['NotoColorEmoji'] + : null, ), emojiViewConfig: EmojiViewConfig( backgroundColor: context.color.surfaceContainer, diff --git a/lib/src/visual/themes/dark.dart b/lib/src/visual/themes/dark.dart index ec302fab..775b2c09 100644 --- a/lib/src/visual/themes/dark.dart +++ b/lib/src/visual/themes/dark.dart @@ -1,15 +1,24 @@ +import 'dart:io'; import 'package:flutter/material.dart'; -final ThemeData darkTheme = ThemeData.dark().copyWith( - colorScheme: ColorScheme.fromSeed( - brightness: Brightness.dark, - seedColor: const Color(0xFF57CC99), - surface: const Color.fromARGB(255, 20, 18, 23), - surfaceContainer: const Color.fromARGB(255, 45, 41, 54), - surfaceContainerLow: const Color.fromARGB(255, 38, 34, 45), - surfaceContainerHigh: const Color.fromARGB(255, 52, 48, 62), - ), - inputDecorationTheme: const InputDecorationTheme( - border: OutlineInputBorder(), - ), -); +final ThemeData darkTheme = () { + final base = ThemeData.dark().copyWith( + colorScheme: ColorScheme.fromSeed( + brightness: Brightness.dark, + seedColor: const Color(0xFF57CC99), + surface: const Color.fromARGB(255, 20, 18, 23), + surfaceContainer: const Color.fromARGB(255, 45, 41, 54), + surfaceContainerLow: const Color.fromARGB(255, 38, 34, 45), + surfaceContainerHigh: const Color.fromARGB(255, 52, 48, 62), + ), + inputDecorationTheme: const InputDecorationTheme( + border: OutlineInputBorder(), + ), + ); + return base.copyWith( + textTheme: base.textTheme.apply( + fontFamily: Platform.isAndroid ? 'sans-serif' : null, + fontFamilyFallback: Platform.isAndroid ? const ['NotoColorEmoji'] : null, + ), + ); +}(); diff --git a/lib/src/visual/themes/light.dart b/lib/src/visual/themes/light.dart index e7a0df8d..7d59b5b5 100644 --- a/lib/src/visual/themes/light.dart +++ b/lib/src/visual/themes/light.dart @@ -1,16 +1,25 @@ +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:twonly/src/utils/misc.dart'; const primaryColor = Color(0xFF57CC99); -final ThemeData lightTheme = ThemeData( - colorScheme: ColorScheme.fromSeed( - seedColor: primaryColor, - ), - inputDecorationTheme: const InputDecorationTheme( - border: OutlineInputBorder(), - ), -); +final ThemeData lightTheme = () { + final base = ThemeData( + colorScheme: ColorScheme.fromSeed( + seedColor: primaryColor, + ), + inputDecorationTheme: const InputDecorationTheme( + border: OutlineInputBorder(), + ), + ); + return base.copyWith( + textTheme: base.textTheme.apply( + fontFamily: Platform.isAndroid ? 'sans-serif' : null, + fontFamilyFallback: Platform.isAndroid ? const ['NotoColorEmoji'] : null, + ), + ); +}(); final ButtonStyle primaryColorButtonStyle = FilledButton.styleFrom( backgroundColor: primaryColor, diff --git a/lib/src/visual/views/camera/share_image_editor_components/layers/emoji.layer.dart b/lib/src/visual/views/camera/share_image_editor_components/layers/emoji.layer.dart index 133a79ea..79fff13e 100755 --- a/lib/src/visual/views/camera/share_image_editor_components/layers/emoji.layer.dart +++ b/lib/src/visual/views/camera/share_image_editor_components/layers/emoji.layer.dart @@ -1,3 +1,4 @@ +import 'dart:io'; import 'dart:ui' as ui; import 'package:flutter/material.dart'; @@ -242,7 +243,13 @@ class _ScreenshotEmojiState extends State { key: _boundaryKey, child: Text( widget.emoji, - style: const TextStyle(fontSize: 94), + style: TextStyle( + fontSize: 94, + fontFamily: Platform.isAndroid ? 'sans-serif' : null, + fontFamilyFallback: Platform.isAndroid + ? const ['NotoColorEmoji'] + : null, + ), ), ), ), diff --git a/lib/src/visual/views/chats/media_viewer_components/reaction_buttons.comp.dart b/lib/src/visual/views/chats/media_viewer_components/reaction_buttons.comp.dart index 4e88e842..549f2af2 100644 --- a/lib/src/visual/views/chats/media_viewer_components/reaction_buttons.comp.dart +++ b/lib/src/visual/views/chats/media_viewer_components/reaction_buttons.comp.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:io'; import 'dart:math'; import 'package:flutter/material.dart'; @@ -305,6 +306,10 @@ class _ParticlePainter extends CustomPainter { style: TextStyle( fontSize: 24 * p.currentScale, color: Colors.black.withValues(alpha: p.opacity), + fontFamily: Platform.isAndroid ? 'sans-serif' : null, + fontFamilyFallback: Platform.isAndroid + ? const ['NotoColorEmoji'] + : null, ), ); textPainter diff --git a/pubspec.yaml b/pubspec.yaml index c9e27762..091dde13 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -212,3 +212,9 @@ flutter: - assets/passwords/ - CHANGELOG.md + fonts: + - family: NotoColorEmoji + fonts: + - asset: assets/fonts/NotoColorEmoji.ttf + +