diff --git a/android/app/src/main/res/drawable-hdpi/ic_notification.png b/android/app/src/main/res/drawable-hdpi/ic_notification.png new file mode 100644 index 000000000..9e3469c45 Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/ic_notification.png differ diff --git a/android/app/src/main/res/drawable-mdpi/ic_notification.png b/android/app/src/main/res/drawable-mdpi/ic_notification.png new file mode 100644 index 000000000..b24f1c25e Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/ic_notification.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/ic_notification.png b/android/app/src/main/res/drawable-xhdpi/ic_notification.png new file mode 100644 index 000000000..7c5241243 Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/ic_notification.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_notification.png b/android/app/src/main/res/drawable-xxhdpi/ic_notification.png new file mode 100644 index 000000000..7cfbce6db Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/ic_notification.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_notification.png b/android/app/src/main/res/drawable-xxxhdpi/ic_notification.png new file mode 100644 index 000000000..3a7e4e29b Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/ic_notification.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_large_notification.png b/android/app/src/main/res/mipmap-hdpi/ic_large_notification.png new file mode 100644 index 000000000..4356e171a Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_large_notification.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_large_notification.png b/android/app/src/main/res/mipmap-mdpi/ic_large_notification.png new file mode 100644 index 000000000..509487bd2 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_large_notification.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_large_notification.png b/android/app/src/main/res/mipmap-xhdpi/ic_large_notification.png new file mode 100644 index 000000000..7bbc2889c Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_large_notification.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_large_notification.png b/android/app/src/main/res/mipmap-xxhdpi/ic_large_notification.png new file mode 100644 index 000000000..678118253 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_large_notification.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_large_notification.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_large_notification.png new file mode 100644 index 000000000..7f10bb01c Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_large_notification.png differ diff --git a/core/lib/presentation/utils/theme_utils.dart b/core/lib/presentation/utils/theme_utils.dart index ab03e4fe0..44ab20474 100644 --- a/core/lib/presentation/utils/theme_utils.dart +++ b/core/lib/presentation/utils/theme_utils.dart @@ -3,44 +3,57 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -ThemeData appTheme() { - return ThemeData( - scaffoldBackgroundColor: Colors.white, - fontFamily: ConstantsUI.fontApp, - appBarTheme: appBarTheme(), - textTheme: textTheme(), - visualDensity: VisualDensity.adaptivePlatformDensity, - ); -} +class ThemeUtils { -InputDecorationTheme inputDecorationTheme() { - OutlineInputBorder outlineInputBorder = OutlineInputBorder( - borderRadius: BorderRadius.circular(28), - borderSide: const BorderSide(color: AppColor.baseTextColor), - gapPadding: 10, - ); - return InputDecorationTheme( - floatingLabelBehavior: FloatingLabelBehavior.always, - contentPadding: const EdgeInsets.symmetric(horizontal: 42, vertical: 20), - enabledBorder: outlineInputBorder, - focusedBorder: outlineInputBorder, - border: outlineInputBorder, - ); -} + static ThemeData get appTheme { + return ThemeData( + scaffoldBackgroundColor: Colors.white, + fontFamily: ConstantsUI.fontApp, + appBarTheme: _appBarTheme, + textTheme: _textTheme, + visualDensity: VisualDensity.adaptivePlatformDensity, + ); + } -TextTheme textTheme() { - return const TextTheme( - bodyText1: TextStyle(color: AppColor.baseTextColor), - bodyText2: TextStyle(color: AppColor.baseTextColor), - ); -} + static TextTheme get _textTheme { + return const TextTheme( + bodyText1: TextStyle(color: AppColor.baseTextColor), + bodyText2: TextStyle(color: AppColor.baseTextColor), + ); + } -AppBarTheme appBarTheme() { - return const AppBarTheme( - color: Colors.white, - elevation: 0, - systemOverlayStyle: SystemUiOverlayStyle.light, - iconTheme: IconThemeData(color: Colors.black), - titleTextStyle: TextStyle(color: Color(0XFF8B8B8B), fontSize: 18), - ); + static AppBarTheme get _appBarTheme { + return const AppBarTheme( + color: Colors.white, + elevation: 0, + systemOverlayStyle: SystemUiOverlayStyle.light, + iconTheme: IconThemeData(color: Colors.black), + titleTextStyle: TextStyle(color: Color(0XFF8B8B8B), fontSize: 18), + ); + } + + static void setSystemLightUIStyle() { + SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( + systemNavigationBarColor: Colors.black, + systemNavigationBarIconBrightness: Brightness.light, + statusBarColor: Colors.black, + statusBarIconBrightness: Brightness.light, + )); + } + + static void setSystemDarkUIStyle() { + SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( + systemNavigationBarColor: Colors.white, + systemNavigationBarIconBrightness: Brightness.dark, + statusBarColor: Colors.white, + statusBarIconBrightness: Brightness.dark, + )); + } + + static void setStatusBarTransparentColor() { + SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + systemNavigationBarIconBrightness: Brightness.dark, + )); + } } \ No newline at end of file diff --git a/lib/features/home/presentation/home_view.dart b/lib/features/home/presentation/home_view.dart index 48dfd5007..eca67e6eb 100644 --- a/lib/features/home/presentation/home_view.dart +++ b/lib/features/home/presentation/home_view.dart @@ -1,7 +1,6 @@ -import 'package:core/core.dart'; +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/utils/theme_utils.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/home/presentation/home_controller.dart'; @@ -10,12 +9,7 @@ class HomeView extends GetWidget { @override Widget build(BuildContext context) { - SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( - systemNavigationBarColor: Colors.white, - systemNavigationBarIconBrightness: Brightness.dark, - statusBarColor: Colors.white, - statusBarIconBrightness: Brightness.dark, - )); + ThemeUtils.setSystemDarkUIStyle(); return Container( color: AppColor.primaryLightColor, diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index d6bb2d89e..cc8842a49 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -1,7 +1,6 @@ import 'package:core/core.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:model/model.dart'; @@ -26,9 +25,7 @@ class MailboxView extends GetWidget { @override Widget build(BuildContext context) { - SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - )); + ThemeUtils.setStatusBarTransparentColor(); return SafeArea(bottom: false, left: false, right: false, top: _responsiveUtils.isMobile(context), diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart index 2b3316293..471d627cc 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart @@ -1,4 +1,5 @@ import 'package:core/presentation/utils/responsive_utils.dart'; +import 'package:core/presentation/utils/theme_utils.dart'; import 'package:core/presentation/views/responsive/responsive_widget.dart'; import 'package:flutter/material.dart'; import 'package:focus_detector/focus_detector.dart'; @@ -27,7 +28,13 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { ); return FocusDetector( - onFocusGained: controller.refreshActionWhenBackToApp, + onFocusGained: () { + ThemeUtils.setSystemDarkUIStyle(); + if (controller.isDrawerOpen) { + ThemeUtils.setStatusBarTransparentColor(); + } + controller.refreshActionWhenBackToApp(); + }, child: Scaffold( drawerEnableOpenDragGesture: responsiveUtils.hasLeftMenuDrawerActive(context), body: Stack(children: [ diff --git a/lib/features/push_notification/presentation/notification/local_notification_config.dart b/lib/features/push_notification/presentation/notification/local_notification_config.dart index dab319ae1..427212d1b 100644 --- a/lib/features/push_notification/presentation/notification/local_notification_config.dart +++ b/lib/features/push_notification/presentation/notification/local_notification_config.dart @@ -44,7 +44,10 @@ class LocalNotificationConfig { importance: Importance.max, priority: Priority.high, setAsGroupSummary: setAsGroup, - styleInformation: styleInformation + styleInformation: styleInformation, + channelShowBadge: true, + showWhen: true, + largeIcon: const DrawableResourceAndroidBitmap('@mipmap/ic_large_notification') ), iOS: const DarwinNotificationDetails( presentSound: true, diff --git a/lib/features/push_notification/presentation/notification/local_notification_manager.dart b/lib/features/push_notification/presentation/notification/local_notification_manager.dart index be328289e..e2607decc 100644 --- a/lib/features/push_notification/presentation/notification/local_notification_manager.dart +++ b/lib/features/push_notification/presentation/notification/local_notification_manager.dart @@ -99,19 +99,18 @@ class LocalNotificationManager { String? payload }) async { final inboxStyleInformation = InboxStyleInformation( - [title, message ?? ''], - contentTitle: (emailAddress?.asString() ?? '').addBlockTag('b'), - summaryText: (emailAddress?.asString() ?? '').addBlockTag('b'), - htmlFormatTitle: true, - htmlFormatContent: true, + [message?.addBlockTag('p', attribute: 'style="color:#6D7885;"') ?? ''], + htmlFormatLines: true, + contentTitle: title, htmlFormatContentTitle: true, + summaryText: (emailAddress?.asString() ?? '').addBlockTag('b'), htmlFormatSummaryText: true, ); await _localNotificationsPlugin.show( id.hashCode, - title.addBlockTag('b'), - message ?? '', + null, + null, LocalNotificationConfig.instance.generateNotificationDetails(styleInformation: inboxStyleInformation), payload: payload ); @@ -123,11 +122,20 @@ class LocalNotificationManager { ?.getActiveNotifications(); if (activeNotifications != null && activeNotifications.isNotEmpty) { + final inboxStyleInformation = InboxStyleInformation( + [''], + summaryText: '${activeNotifications.length - 1} new emails'.addBlockTag('b'), + htmlFormatSummaryText: true, + ); + await _localNotificationsPlugin.show( 1995, - '', - '', - LocalNotificationConfig.instance.generateNotificationDetails(setAsGroup: true) + null, + null, + LocalNotificationConfig.instance.generateNotificationDetails( + setAsGroup: true, + styleInformation: inboxStyleInformation + ), ); } } diff --git a/lib/main.dart b/lib/main.dart index 671f7688b..a9f9af30b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,5 @@ import 'package:core/core.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/caching/config/hive_cache_config.dart'; @@ -16,12 +15,7 @@ import 'package:worker_manager/worker_manager.dart'; void main() async { initLogger(() async { WidgetsFlutterBinding.ensureInitialized(); - SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( - systemNavigationBarColor: Colors.black, - systemNavigationBarIconBrightness: Brightness.light, - statusBarColor: Colors.black, - statusBarIconBrightness: Brightness.light, - )); + ThemeUtils.setSystemLightUIStyle(); await MainBindings().dependencies(); await HiveCacheConfig().setUp(); await HiveCacheConfig.initializeEncryptionKey(); @@ -38,7 +32,7 @@ class TMailApp extends StatelessWidget { Widget build(BuildContext context) { return GetMaterialApp( debugShowCheckedModeBanner: false, - theme: appTheme(), + theme: ThemeUtils.appTheme, supportedLocales: LocalizationService.supportedLocales, localizationsDelegates: const [ AppLocalizationsDelegate(),