diff --git a/contact/pubspec.lock b/contact/pubspec.lock index cbf82dd47..afc4ca752 100644 --- a/contact/pubspec.lock +++ b/contact/pubspec.lock @@ -304,6 +304,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + fk_user_agent: + dependency: transitive + description: + name: fk_user_agent + sha256: fd6c94e120786985a292d12f61422a581f4e851148d5940af38b819357b8ad0d + url: "https://pub.dev" + source: hosted + version: "2.1.0" flex_color_picker: dependency: transitive description: @@ -671,6 +679,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017" + url: "https://pub.dev" + source: hosted + version: "4.2.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + url: "https://pub.dev" + source: hosted + version: "2.0.1" path: dependency: transitive description: diff --git a/core/lib/utils/application_manager.dart b/core/lib/utils/application_manager.dart new file mode 100644 index 000000000..c7b291c47 --- /dev/null +++ b/core/lib/utils/application_manager.dart @@ -0,0 +1,49 @@ + +import 'package:core/utils/app_logger.dart'; +import 'package:core/utils/platform_info.dart'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:fk_user_agent/fk_user_agent.dart'; +import 'package:package_info_plus/package_info_plus.dart'; + +class ApplicationManager { + + final DeviceInfoPlugin _deviceInfoPlugin; + + ApplicationManager(this._deviceInfoPlugin); + + Future getPackageInfo() async { + final packageInfo = await PackageInfo.fromPlatform(); + log('ApplicationManager::getPackageInto: $packageInfo'); + return packageInfo; + } + + Future getVersion() async { + final version = (await getPackageInfo()).version; + log('ApplicationManager::getVersion: $version'); + return version; + } + + Future getUserAgent() async { + try { + String userAgent; + if (PlatformInfo.isWeb) { + final webBrowserInfo = await _deviceInfoPlugin.webBrowserInfo; + userAgent = webBrowserInfo.userAgent ?? ''; + } else { + await FkUserAgent.init(); + userAgent = FkUserAgent.userAgent ?? ''; + FkUserAgent.release(); + } + return userAgent; + } catch(e) { + logError('ApplicationManager::getUserAgent: Exception: $e'); + return ''; + } + } + + Future generateApplicationUserAgent() async { + final userAgent = await getUserAgent(); + final version = await getVersion(); + return 'Team-Mail/$version $userAgent'; + } +} \ No newline at end of file diff --git a/core/pubspec.lock b/core/pubspec.lock index 994ccee13..108265136 100644 --- a/core/pubspec.lock +++ b/core/pubspec.lock @@ -185,6 +185,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.1.4" + fk_user_agent: + dependency: "direct main" + description: + name: fk_user_agent + sha256: fd6c94e120786985a292d12f61422a581f4e851148d5940af38b819357b8ad0d + url: "https://pub.dev" + source: hosted + version: "2.1.0" flex_color_picker: dependency: "direct main" description: @@ -440,6 +448,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017" + url: "https://pub.dev" + source: hosted + version: "4.2.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + url: "https://pub.dev" + source: hosted + version: "2.0.1" path: dependency: transitive description: diff --git a/core/pubspec.yaml b/core/pubspec.yaml index 8c8531d11..6f94e72e0 100644 --- a/core/pubspec.yaml +++ b/core/pubspec.yaml @@ -75,6 +75,10 @@ dependencies: printing: 5.12.0 + package_info_plus: 4.2.0 + + fk_user_agent: 2.1.0 + dev_dependencies: flutter_test: sdk: flutter diff --git a/lib/features/base/base_controller.dart b/lib/features/base/base_controller.dart index 97b14ba25..eacf5b8cb 100644 --- a/lib/features/base/base_controller.dart +++ b/lib/features/base/base_controller.dart @@ -8,6 +8,7 @@ import 'package:core/presentation/utils/app_toast.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/views/toast/tmail_toast.dart'; import 'package:core/utils/app_logger.dart'; +import 'package:core/utils/application_manager.dart'; import 'package:core/utils/fps_manager.dart'; import 'package:core/utils/platform_info.dart'; import 'package:dartz/dartz.dart'; @@ -76,6 +77,7 @@ abstract class BaseController extends GetxController final ImagePaths imagePaths = Get.find(); final ResponsiveUtils responsiveUtils = Get.find(); final Uuid uuid = Get.find(); + final ApplicationManager applicationManager = Get.find(); bool _isFcmEnabled = false; diff --git a/lib/features/base/widget/application_version_widget.dart b/lib/features/base/widget/application_version_widget.dart new file mode 100644 index 000000000..38eab2716 --- /dev/null +++ b/lib/features/base/widget/application_version_widget.dart @@ -0,0 +1,44 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/utils/application_manager.dart'; +import 'package:flutter/material.dart'; + +class ApplicationVersionWidget extends StatelessWidget { + + final ApplicationManager applicationManager; + final EdgeInsetsGeometry? padding; + final String? title; + final TextStyle? textStyle; + + const ApplicationVersionWidget({ + super.key, + required this.applicationManager, + this.title, + this.textStyle, + this.padding, + }); + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: applicationManager.getVersion(), + builder: (context, snapshot) { + if (snapshot.hasData) { + return Padding( + padding: padding ?? const EdgeInsets.only(top: 6), + child: Text( + '${title ?? 'v.'}${snapshot.data}', + textAlign: TextAlign.center, + style: textStyle ?? Theme.of(context).textTheme.labelMedium?.copyWith( + fontSize: 13, + color: AppColor.colorContentEmail, + fontWeight: FontWeight.w500 + ), + ), + ); + } else { + return const SizedBox.shrink(); + } + } + ); + } +} diff --git a/lib/features/composer/presentation/composer_bindings.dart b/lib/features/composer/presentation/composer_bindings.dart index 6f9bc469a..341bcd4be 100644 --- a/lib/features/composer/presentation/composer_bindings.dart +++ b/lib/features/composer/presentation/composer_bindings.dart @@ -207,7 +207,6 @@ class ComposerBindings extends BaseBindings { Get.lazyPut(() => UploadController(Get.find())); Get.lazyPut(() => RichTextWebController()); Get.lazyPut(() => ComposerController( - Get.find(), Get.find(), Get.find(), Get.find(), diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 8132dcbca..f0717c2d2 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -10,7 +10,6 @@ import 'package:device_info_plus/device_info_plus.dart'; import 'package:dropdown_button2/dropdown_button2.dart'; import 'package:file_picker/file_picker.dart'; import 'package:filesize/filesize.dart'; -import 'package:fk_user_agent/fk_user_agent.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -123,7 +122,6 @@ class ComposerController extends BaseController with DragDropFileMixin { final LocalFilePickerInteractor _localFilePickerInteractor; final LocalImagePickerInteractor _localImagePickerInteractor; - final DeviceInfoPlugin _deviceInfoPlugin; final GetEmailContentInteractor _getEmailContentInteractor; final GetAllIdentitiesInteractor _getAllIdentitiesInteractor; final UploadController uploadController; @@ -189,7 +187,6 @@ class ComposerController extends BaseController with DragDropFileMixin { late bool _isEmailBodyLoaded; ComposerController( - this._deviceInfoPlugin, this._localFilePickerInteractor, this._localImagePickerInteractor, this._getEmailContentInteractor, @@ -209,11 +206,7 @@ class ComposerController extends BaseController with DragDropFileMixin { createFocusNodeInput(); scrollControllerEmailAddress.addListener(_scrollControllerEmailAddressListener); _listenStreamEvent(); - if (PlatformInfo.isMobile) { - WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { - await FkUserAgent.init(); - }); - } else { + if (PlatformInfo.isWeb) { WidgetsBinding.instance.addPostFrameCallback((_) { _listenBrowserEventAction(); }); @@ -244,9 +237,6 @@ class ComposerController extends BaseController with DragDropFileMixin { _subscriptionOnDragOver?.cancel(); _subscriptionOnDragLeave?.cancel(); _subscriptionOnDrop?.cancel(); - if (PlatformInfo.isMobile) { - FkUserAgent.release(); - } super.onClose(); } @@ -729,7 +719,7 @@ class ComposerController extends BaseController with DragDropFileMixin { attachments.addAll(listInlineEmailBodyPart); } - final userAgent = await userAgentPlatform; + final userAgent = await applicationManager.getUserAgent(); log('ComposerController::_generateEmail(): userAgent: $userAgent'); Map mailboxIds = {}; @@ -814,21 +804,6 @@ class ComposerController extends BaseController with DragDropFileMixin { } } - Future get userAgentPlatform async { - String userAgent; - try { - if (kIsWeb) { - final webBrowserInfo = await _deviceInfoPlugin.webBrowserInfo; - userAgent = webBrowserInfo.userAgent ?? ''; - } else { - userAgent = FkUserAgent.userAgent ?? ''; - } - } catch (e) { - userAgent = ''; - } - return 'Team-Mail/${mailboxDashBoardController.appInformation.value?.version} $userAgent'; - } - void validateInformationBeforeSending(BuildContext context) async { if (isSendEmailLoading.isTrue) { return; diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index d660d8d1f..cd892d688 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:model/model.dart'; -import 'package:package_info_plus/package_info_plus.dart'; +import 'package:tmail_ui_user/features/base/widget/application_version_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/base_mailbox_view.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; @@ -85,13 +85,25 @@ class MailboxView extends BaseMailboxView { : const SizedBox.shrink(), ), Obx(() { - final appInformation = controller.mailboxDashBoardController.appInformation.value; - if (appInformation != null - && !controller.isSelectionEnabled()) { - if (controller.responsiveUtils.isLandscapeMobile(context)) { - return const SizedBox.shrink(); - } - return _buildVersionInformation(context, appInformation); + if (!controller.isSelectionEnabled() && controller.responsiveUtils.isPortraitMobile(context)) { + return Container( + color: AppColor.colorBgMailbox, + width: double.infinity, + padding: const EdgeInsets.all(16), + child: SafeArea( + top: false, + child: ApplicationVersionWidget( + applicationManager: controller.applicationManager, + padding: EdgeInsets.zero, + title: '${AppLocalizations.of(context).version} ', + textStyle: Theme.of(context).textTheme.labelMedium?.copyWith( + fontSize: 16, + color: AppColor.colorContentEmail, + fontWeight: FontWeight.w500 + ), + ), + ), + ); } else { return const SizedBox.shrink(); } @@ -365,20 +377,4 @@ class MailboxView extends BaseMailboxView { } }).toList() ?? []; } - - Widget _buildVersionInformation(BuildContext context, PackageInfo packageInfo) { - return Container( - color: AppColor.colorBgMailbox, - width: double.infinity, - padding: const EdgeInsets.all(16), - child: SafeArea( - top: false, - child: Text( - '${AppLocalizations.of(context).version} ${packageInfo.version}', - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 16, color: AppColor.colorContentEmail, fontWeight: FontWeight.w500), - ), - ), - ); - } } \ No newline at end of file diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index 07e490094..4dbab42c8 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -3,7 +3,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:model/model.dart'; -import 'package:package_info_plus/package_info_plus.dart'; +import 'package:tmail_ui_user/features/base/widget/application_version_widget.dart'; import 'package:tmail_ui_user/features/base/widget/scrollbar_list_view.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/base_mailbox_view.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart'; @@ -68,13 +68,10 @@ class MailboxView extends BaseMailboxView { textStyle: const TextStyle(color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold), logoSVG: controller.imagePaths.icTMailLogo ), - Obx(() { - if (controller.mailboxDashBoardController.appInformation.value != null) { - return _buildVersionInformation(context, controller.mailboxDashBoardController.appInformation.value!); - } else { - return const SizedBox.shrink(); - } - }), + ApplicationVersionWidget( + applicationManager: controller.mailboxDashBoardController.applicationManager, + padding: const EdgeInsets.only(top: 4), + ) ]) ); } @@ -331,15 +328,4 @@ class MailboxView extends BaseMailboxView { controller.mailboxDashBoardController.dragSelectedMultipleEmailToMailboxAction(listEmails, presentationMailbox); } } - - Widget _buildVersionInformation(BuildContext context, PackageInfo packageInfo) { - return Container( - padding: const EdgeInsets.only(top: 4), - child: Text( - 'v.${packageInfo.version}', - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 13, color: AppColor.colorContentEmail, fontWeight: FontWeight.w500), - ), - ); - } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 2a56ca648..a3773f68d 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -23,7 +23,6 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/vacation/vacation_response.dart'; import 'package:model/model.dart'; -import 'package:package_info_plus/package_info_plus.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:rxdart/transformers.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.dart'; @@ -203,7 +202,6 @@ class MailboxDashBoardController extends ReloadableController { final mailboxUIAction = Rxn(); final emailUIAction = Rxn(); final dashboardRoute = DashboardRoutes.waiting.obs; - final appInformation = Rxn(); final currentSelectMode = SelectMode.INACTIVE.obs; final filterMessageOption = FilterMessageOption.all.obs; final listEmailSelected = [].obs; @@ -281,7 +279,6 @@ class MailboxDashBoardController extends ReloadableController { _registerPendingEmailContents(); _registerPendingFileInfo(); _handleArguments(); - _getAppVersion(); super.onReady(); } @@ -541,12 +538,6 @@ class MailboxDashBoardController extends ReloadableController { _handleNotificationMessageFromEmailId(arguments.emailId); } - Future _getAppVersion() async { - final info = await PackageInfo.fromPlatform(); - log('MailboxDashBoardController::_getAppVersion(): ${info.version}'); - appInformation.value = info; - } - void _getVacationResponse() { if (accountId.value != null && _getAllVacationInteractor != null) { consumeState(_getAllVacationInteractor!.execute(accountId.value!)); @@ -1941,12 +1932,16 @@ class MailboxDashBoardController extends ReloadableController { } void _storeSendingEmailInCaseOfSendingFailureInMobile(SendEmailFailure failure) { - if (PlatformInfo.isMobile) { + if (PlatformInfo.isMobile && + failure.session != null && + failure.accountId != null && + failure.emailRequest != null + ) { _tryToStoreSendingEmail( - failure.session, - failure.accountId, - failure.emailRequest, - failure.mailboxRequest + failure.session!, + failure.accountId!, + failure.emailRequest!, + failure.mailboxRequest ); } } diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index 1386e7dc1..622fa1d07 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -5,6 +5,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:model/extensions/username_extension.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/base/widget/application_version_widget.dart'; import 'package:tmail_ui_user/features/base/widget/popup_item_no_icon_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_view_web.dart'; import 'package:tmail_ui_user/features/email/presentation/email_view.dart'; @@ -76,21 +77,9 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { logoSVG: controller.imagePaths.icTMailLogo, onTapCallback: controller.redirectToInboxAction, ), - Obx(() { - if (controller.appInformation.value != null) { - return Padding(padding: const EdgeInsets.only(top: 6), - child: Text( - 'v${controller.appInformation.value!.version}', - textAlign: TextAlign.center, - style: const TextStyle( - fontSize: 13, - color: AppColor.colorContentEmail, - fontWeight: FontWeight.w500), - )); - } else { - return const SizedBox.shrink(); - } - }), + ApplicationVersionWidget( + applicationManager: controller.applicationManager + ) ]) ), Expanded(child: Container( @@ -340,7 +329,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { : const SizedBox.shrink(), const SizedBox(width: 24), Obx(() => (AvatarBuilder() - ..text(controller.sessionCurrent?.username.firstCharacter ?? '') + ..text(controller.accountId.value != null + ? controller.sessionCurrent?.username.firstCharacter ?? '' + : '' + ) ..backgroundColor(Colors.white) ..textColor(Colors.black) ..context(context) diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart index 2c7a77ca8..1cc6b2404 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -10,7 +10,6 @@ import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/vacation/vacation_response.dart'; import 'package:model/model.dart'; -import 'package:package_info_plus/package_info_plus.dart'; import 'package:rule_filter/rule_filter/capability_rule_filter.dart'; import 'package:server_settings/server_settings/capability_server_settings.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.dart'; @@ -44,7 +43,6 @@ class ManageAccountDashBoardController extends ReloadableController { GetAllVacationInteractor? _getAllVacationInteractor; UpdateVacationInteractor? _updateVacationInteractor; - final appInformation = Rxn(); final accountId = Rxn(); final accountMenuItemSelected = AccountMenuItem.profiles.obs; final settingsPageLevel = SettingsPageLevel.universal.obs; @@ -66,7 +64,6 @@ class ManageAccountDashBoardController extends ReloadableController { void onReady() { _initialPageLevel(); _getArguments(); - _getAppVersion(); super.onReady(); } @@ -151,12 +148,6 @@ class ManageAccountDashBoardController extends ReloadableController { } } - Future _getAppVersion() async { - final info = await PackageInfo.fromPlatform(); - log('ManageAccountDashBoardController::_getAppVersion(): ${info.version}'); - appInformation.value = info; - } - void _getVacationResponse() { if (accountId.value != null && _getAllVacationInteractor != null) { consumeState(_getAllVacationInteractor!.execute(accountId.value!)); diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_view.dart b/lib/features/manage_account/presentation/manage_account_dashboard_view.dart index 1190fd097..efb63fabf 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_view.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_view.dart @@ -9,6 +9,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/base/state/banner_state.dart'; +import 'package:tmail_ui_user/features/base/widget/application_version_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/user_setting_popup_menu_mixin.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/always_read_receipt/always_read_receipt_view.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_view.dart'; @@ -55,18 +56,9 @@ class ManageAccountDashBoardView extends GetWidget controller.backToMailboxDashBoard(context: context), ), - Obx(() { - if (controller.appInformation.value != null) { - return Padding(padding: const EdgeInsets.only(top: 6), - child: Text( - 'v.${controller.appInformation.value!.version}', - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 13, color: AppColor.colorContentEmail, fontWeight: FontWeight.w500), - )); - } else { - return const SizedBox.shrink(); - } - }), + ApplicationVersionWidget( + applicationManager: controller.applicationManager + ) ]) ), Expanded(child: Padding( diff --git a/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart b/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart index 7de028f2b..7154338c6 100644 --- a/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart +++ b/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart @@ -4,6 +4,7 @@ import 'package:core/utils/direction_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/widget/application_version_widget.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/widgets/account_menu_item_tile_builder.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -31,20 +32,10 @@ class ManageAccountMenuView extends GetWidget { textStyle: const TextStyle(color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold), logoSVG: controller.imagePaths.icTMailLogo ), - Obx(() { - if (controller.dashBoardController.appInformation.value != null) { - return Padding( - padding: const EdgeInsets.only(top: 4), - child: Text( - 'v.${controller.dashBoardController.appInformation.value!.version}', - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 13, color: AppColor.colorContentEmail, fontWeight: FontWeight.w500), - ), - ); - } else { - return const SizedBox.shrink(); - } - }), + ApplicationVersionWidget( + applicationManager: controller.dashBoardController.applicationManager, + padding: const EdgeInsets.only(top: 4), + ) ]) ), if (!controller.responsiveUtils.isWebDesktop(context)) diff --git a/lib/main/bindings/core/core_bindings.dart b/lib/main/bindings/core/core_bindings.dart index 389a91fcb..fea26aee3 100644 --- a/lib/main/bindings/core/core_bindings.dart +++ b/lib/main/bindings/core/core_bindings.dart @@ -3,6 +3,7 @@ import 'package:core/data/utils/device_manager.dart'; import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/app_toast.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; +import 'package:core/utils/application_manager.dart'; import 'package:core/utils/config/app_config_loader.dart'; import 'package:core/utils/file_utils.dart'; import 'package:core/utils/platform_info.dart'; @@ -62,6 +63,7 @@ class CoreBindings extends Bindings { Get.put(AppConfigLoader()); Get.put(FileUtils()); Get.put(PrintUtils()); + Get.put(ApplicationManager(Get.find())); } void _bindingIsolate() { diff --git a/model/pubspec.lock b/model/pubspec.lock index 2361d5268..aee232529 100644 --- a/model/pubspec.lock +++ b/model/pubspec.lock @@ -304,6 +304,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + fk_user_agent: + dependency: transitive + description: + name: fk_user_agent + sha256: fd6c94e120786985a292d12f61422a581f4e851148d5940af38b819357b8ad0d + url: "https://pub.dev" + source: hosted + version: "2.1.0" flex_color_picker: dependency: transitive description: @@ -648,6 +656,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017" + url: "https://pub.dev" + source: hosted + version: "4.2.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + url: "https://pub.dev" + source: hosted + version: "2.0.1" path: dependency: transitive description: diff --git a/pubspec.lock b/pubspec.lock index 0f8d80bcd..7d5ccb764 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -594,7 +594,7 @@ packages: source: hosted version: "1.1.0" fk_user_agent: - dependency: "direct main" + dependency: transitive description: name: fk_user_agent sha256: fd6c94e120786985a292d12f61422a581f4e851148d5940af38b819357b8ad0d @@ -1272,7 +1272,7 @@ packages: source: hosted version: "2.1.0" package_info_plus: - dependency: "direct main" + dependency: transitive description: name: package_info_plus sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017" diff --git a/pubspec.yaml b/pubspec.yaml index 45f423df5..3b82ed947 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -152,16 +152,12 @@ dependencies: hive: 2.2.3 - fk_user_agent: 2.1.0 - pointer_interceptor: 0.9.1 rxdart: 0.27.7 connectivity_plus: 3.0.3 - package_info_plus: 4.2.0 - dropdown_button2: 2.0.0 flutter_staggered_grid_view: 0.6.2 diff --git a/test/features/email/presentation/controller/single_email_controller_test.dart b/test/features/email/presentation/controller/single_email_controller_test.dart index a64474e93..79491b713 100644 --- a/test/features/email/presentation/controller/single_email_controller_test.dart +++ b/test/features/email/presentation/controller/single_email_controller_test.dart @@ -1,6 +1,7 @@ import 'dart:ui'; import 'package:core/core.dart'; +import 'package:core/utils/application_manager.dart'; import 'package:dartz/dartz.dart' hide State; import 'package:flutter_test/flutter_test.dart'; import 'package:get/get.dart'; @@ -86,6 +87,7 @@ const fallbackGenerators = { MockSpec(), MockSpec(), MockSpec(), + MockSpec(), ]) void main() { TestWidgetsFlutterBinding.ensureInitialized(); @@ -118,6 +120,7 @@ void main() { final printEmailInteractor = MockPrintEmailInteractor(); final storeEventAttendanceStatusInteractor = MockStoreEventAttendanceStatusInteractor(); final printUtils = MockPrintUtils(); + final applicationManager = MockApplicationManager(); late SingleEmailController singleEmailController; @@ -151,6 +154,7 @@ void main() { Get.put(responsiveUtils); Get.put(uuid); Get.put(printUtils); + Get.put(applicationManager); when(mailboxDashboardController.accountId).thenReturn(Rxn(testAccountId)); when(uuid.v4()).thenReturn(testTaskId); @@ -257,7 +261,7 @@ void main() { BlobCalendarEvent( blobId: blobId, calendarEventList: [calendarEvent])])); - + // act singleEmailController.onCalendarEventReplyAction(EventActionType.no, emailId); await untilCalled(rejectCalendarEventInteractor.execute(any, any, any, any));