diff --git a/integration_test/base/test_base.dart b/integration_test/base/test_base.dart index 50cddf73a..45a63ac21 100644 --- a/integration_test/base/test_base.dart +++ b/integration_test/base/test_base.dart @@ -19,7 +19,7 @@ class TestBase { description, config: const PatrolTesterConfig( settlePolicy: SettlePolicy.trySettle, - visibleTimeout: Duration(minutes: 1), + visibleTimeout: Duration(seconds: 30), printLogs: true, ), nativeAutomatorConfig: const NativeAutomatorConfig( diff --git a/integration_test/mixin/scenario_utils_mixin.dart b/integration_test/mixin/scenario_utils_mixin.dart index 0efeb1faf..5945be6cf 100644 --- a/integration_test/mixin/scenario_utils_mixin.dart +++ b/integration_test/mixin/scenario_utils_mixin.dart @@ -4,6 +4,7 @@ import 'dart:io' hide HttpClient; import 'package:collection/collection.dart'; import 'package:core/utils/app_logger.dart'; +import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/http/http_client.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; @@ -270,4 +271,8 @@ mixin ScenarioUtilsMixin { IdentityInteractorsBindings().dispose(); } + + Future hideKeyboard() async { + await SystemChannels.textInput.invokeMethod('TextInput.hide'); + } } diff --git a/integration_test/robots/composer_robot.dart b/integration_test/robots/composer_robot.dart index ef51d648c..e38d69010 100644 --- a/integration_test/robots/composer_robot.dart +++ b/integration_test/robots/composer_robot.dart @@ -10,6 +10,7 @@ import 'package:model/extensions/session_extension.dart'; import 'package:model/upload/file_info.dart'; import 'package:rich_text_composer/rich_text_composer.dart'; import 'package:tmail_ui_user/features/base/widget/popup_item_widget.dart'; +import 'package:tmail_ui_user/features/composer/domain/state/download_image_as_base64_state.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart'; import 'package:tmail_ui_user/features/composer/presentation/view/mobile/mobile_editor_view.dart'; @@ -33,13 +34,6 @@ class ComposerRobot extends CoreRobot { }) async { final finder = $(RecipientComposerWidget).which( (widget) => widget.prefix == prefixEmailAddress); - final isTextFieldFocused = finder - .which( - (view) => view.focusNode?.hasFocus ?? false) - .exists; - if (!isTextFieldFocused) { - await finder.tap(); - } await finder.enterTextWithoutTapAction(email); await $(RecipientSuggestionItemWidget) @@ -163,6 +157,10 @@ class ComposerRobot extends CoreRobot { fileSize: await file.length(), fileName: file.path.split('/').last, ))); + await controller.viewState.stream.firstWhere((state) => state.fold( + (failure) => false, + (success) => success is DownloadImageAsBase64Success, + )); } Future toggleReadReceipt() async { diff --git a/integration_test/robots/email_address_dialog_robot.dart b/integration_test/robots/email_address_dialog_robot.dart index eba225886..aca0451ee 100644 --- a/integration_test/robots/email_address_dialog_robot.dart +++ b/integration_test/robots/email_address_dialog_robot.dart @@ -12,7 +12,7 @@ class EmailAddressDialogRobot extends CoreRobot { } Future tapCopyEmailAddressButton(AppLocalizations appLocalizations) async { - await $(appLocalizations.copy_email_address).tap(); + await $(#copy_email_address).tap(); } Future tapComposeEmailButton(AppLocalizations appLocalizations) async { diff --git a/integration_test/robots/email_robot.dart b/integration_test/robots/email_robot.dart index b73f26c8a..afeb98d4c 100644 --- a/integration_test/robots/email_robot.dart +++ b/integration_test/robots/email_robot.dart @@ -1,7 +1,6 @@ -import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:tmail_ui_user/features/base/widget/material_text_button.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_back_button.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/information_sender_and_receiver_builder.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import '../base/core_robot.dart'; @@ -40,47 +39,42 @@ class EmailRobot extends CoreRobot { } Future tapMarkAsUnreadOptionInContextMenu() async { - await $(#markAsUnread_action).tap(); + await $(AppLocalizations().mark_as_unread).tap(); } Future tapEmailDetailedStarButton() async { - await $(#email_detailed_star_button).tap(); + await $(AppLocalizations().starred).tap(); + } + + Future tapEmailDetailedUnstarButton() async { + await $(AppLocalizations().not_starred).tap(); } Future tapEmailDetailedMoveEmailButton() async { - await $(#email_detailed_move_email_button).tap(); + await $(AppLocalizations().moveMessage).tap(); } Future tapEmailDetailedDeleteEmailButton() async { - await $(#email_detailed_delete_email_button).tap(); + await $(AppLocalizations().move_to_trash).tap(); } Future tapMarkAsSpamOptionInContextMenu() async { - await $(#moveToSpam_action).tap(); + await $(AppLocalizations().markAsSpam).tap(); } Future tapArchiveMessageOptionInContextMenu() async { - await $(#archiveMessage_action).tap(); + await $(AppLocalizations().archiveMessage).tap(); } Future tapSenderEmailAddress(String email) async { - await $(MaterialTextButton) - .which((widget) => widget.label.contains(email)) - .first - .tap(); + await $(InformationSenderAndReceiverBuilder).$(email).tap(); } Future tapRecipientEmailAddress(String email) async { - await $(TMailButtonWidget) - .which((widget) => widget.text.contains(email)) - .first - .tap(); + await $(InformationSenderAndReceiverBuilder).$(email).tap(); } Future longPressSenderEmailAddress(String email) async { - await $(MaterialTextButton) - .which((widget) => widget.label.contains(email)) - .first - .longPress(); + await $(InformationSenderAndReceiverBuilder).$(email).longPress(); } } \ No newline at end of file diff --git a/integration_test/robots/mailbox_menu_robot.dart b/integration_test/robots/mailbox_menu_robot.dart index edbf18917..b28944989 100644 --- a/integration_test/robots/mailbox_menu_robot.dart +++ b/integration_test/robots/mailbox_menu_robot.dart @@ -2,7 +2,6 @@ import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:core/presentation/views/text/text_field_builder.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/label_mailbox_item_widget.dart'; @@ -71,11 +70,7 @@ class MailboxMenuRobot extends CoreRobot { } Future closeMenu() async { - await $(IconButton) - .which((widget) { - return widget.tooltip == AppLocalizations().close; - }) - .tap(); + await $.native.swipe(from: const Offset(0.9, 0.5), to: const Offset(0, 0.5)); } int getCurrentInboxCount() { diff --git a/integration_test/robots/thread_robot.dart b/integration_test/robots/thread_robot.dart index 3db41e9fe..121eded02 100644 --- a/integration_test/robots/thread_robot.dart +++ b/integration_test/robots/thread_robot.dart @@ -57,14 +57,14 @@ class ThreadRobot extends CoreRobot { } Future selectAttachmentFilter() async { - await $(#filter_email_attachments).tap(); + await $(#attachments_filter).tap(); } Future selectUnreadFilter() async { - await $(#filter_email_unread).tap(); + await $(#unread_filter).tap(); } Future selectStarredFilter() async { - await $(#filter_email_starred).tap(); + await $(#starred_filter).tap(); } } \ No newline at end of file diff --git a/integration_test/scenarios/composer/upload_attachment_and_inline_image_scenario.dart b/integration_test/scenarios/composer/upload_attachment_and_inline_image_scenario.dart index cd21cf583..a3be37349 100644 --- a/integration_test/scenarios/composer/upload_attachment_and_inline_image_scenario.dart +++ b/integration_test/scenarios/composer/upload_attachment_and_inline_image_scenario.dart @@ -27,10 +27,11 @@ class ComposerUploadAttachmentAndInlineImageScenario extends BaseTestScenario { final png = await preparingPngWithName(pngName); await composerRobot.addAttachment(png); + await $.pumpAndSettle(); + await _expectAttachment(pngName); + await composerRobot.addInline(png); await $.pumpAndSettle(); - - _expectAttachment(pngName); await _expectInline(); await composerRobot.addAttachment(png); @@ -50,13 +51,11 @@ class ComposerUploadAttachmentAndInlineImageScenario extends BaseTestScenario { ); } - void _expectAttachment(String pngName) { - return expect( - $(AttachmentItemComposerWidget) - .which( - (widget) => widget.fileName.contains(pngName) - ), - findsOneWidget, + Future _expectAttachment(String pngName) async { + await expectViewVisible( + $(AttachmentItemComposerWidget).which( + (widget) => widget.fileName.contains(pngName), + ), ); } diff --git a/integration_test/scenarios/email_detailed/archive_email_scenario.dart b/integration_test/scenarios/email_detailed/archive_email_scenario.dart index 06fee1ae6..db6c13e1d 100644 --- a/integration_test/scenarios/email_detailed/archive_email_scenario.dart +++ b/integration_test/scenarios/email_detailed/archive_email_scenario.dart @@ -38,10 +38,10 @@ class ArchiveEmailScenario extends BaseTestScenario { _expectEmailDetailedMoreButtonVisible(); await emailRobot.tapEmailDetailedMoreButton(); - await $.pumpAndSettle(duration: const Duration(seconds: 2)); + await $.pumpAndSettle(duration: const Duration(seconds: 1)); await emailRobot.tapArchiveMessageOptionInContextMenu(); - await $.pumpAndSettle(duration: const Duration(seconds: 3)); + await $.pumpAndSettle(duration: const Duration(seconds: 1)); await emailRobot.onTapBackButton(); await $.pumpAndSettle(); diff --git a/integration_test/scenarios/email_detailed/delete_email_scenario.dart b/integration_test/scenarios/email_detailed/delete_email_scenario.dart index 0cd96991d..7836289e6 100644 --- a/integration_test/scenarios/email_detailed/delete_email_scenario.dart +++ b/integration_test/scenarios/email_detailed/delete_email_scenario.dart @@ -37,8 +37,9 @@ class DeleteEmailScenario extends BaseTestScenario { await threadRobot.openEmailWithSubject(subject); await $.pumpAndSettle(); + await emailRobot.tapEmailDetailedMoreButton(); await emailRobot.tapEmailDetailedDeleteEmailButton(); - await $.pumpAndSettle(duration: const Duration(seconds: 3)); + await $.pumpAndSettle(duration: const Duration(seconds: 1)); _expectEmailViewInvisible(); diff --git a/integration_test/scenarios/email_detailed/display_email_address_info_dialog_scenario.dart b/integration_test/scenarios/email_detailed/display_email_address_info_dialog_scenario.dart index 31f0031a3..200e49d54 100644 --- a/integration_test/scenarios/email_detailed/display_email_address_info_dialog_scenario.dart +++ b/integration_test/scenarios/email_detailed/display_email_address_info_dialog_scenario.dart @@ -52,7 +52,7 @@ class DisplayEmailAddressInfoDialogScenario extends BaseTestScenario { Future _expectEmailAddressInfoDialogVisible( AppLocalizations appLocalizations, ) async { - await expectViewVisible($(appLocalizations.copy_email_address)); + await expectViewVisible($(#copy_email_address)); await expectViewVisible($(appLocalizations.quickCreatingRule)); await expectViewVisible($(appLocalizations.compose_email)); } diff --git a/integration_test/scenarios/email_detailed/mark_as_star_email_scenario.dart b/integration_test/scenarios/email_detailed/mark_as_star_email_scenario.dart index fc8ce5fba..22974f8d0 100644 --- a/integration_test/scenarios/email_detailed/mark_as_star_email_scenario.dart +++ b/integration_test/scenarios/email_detailed/mark_as_star_email_scenario.dart @@ -1,6 +1,3 @@ - -import 'package:core/presentation/resources/image_paths.dart'; -import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:flutter_test/flutter_test.dart'; import '../../base/base_test_scenario.dart'; @@ -18,7 +15,6 @@ class MarkAsStarEmailScenario extends BaseTestScenario { const emailUser = String.fromEnvironment('BASIC_AUTH_EMAIL'); final threadRobot = ThreadRobot($); final emailRobot = EmailRobot($); - final imagePaths = ImagePaths(); await provisionEmail( [ @@ -34,32 +30,29 @@ class MarkAsStarEmailScenario extends BaseTestScenario { await threadRobot.openEmailWithSubject(subject); await $.pumpAndSettle(); - _expectEmailDetailedStarButtonVisible(); + await emailRobot.tapEmailDetailedMoreButton(); + await _expectEmailDetailedStarButtonVisible(); await emailRobot.tapEmailDetailedStarButton(); - await $.pumpAndSettle(duration: const Duration(seconds: 2)); - await _expectDisplayedStarIcon(imagePaths); + await $.pumpAndSettle(duration: const Duration(seconds: 1)); + await emailRobot.tapEmailDetailedMoreButton(); + await _expectDisplayedUnStarIcon(); - await emailRobot.tapEmailDetailedStarButton(); - await $.pumpAndSettle(duration: const Duration(seconds: 2)); - await _expectDisplayedUnStarIcon(imagePaths); + await emailRobot.tapEmailDetailedUnstarButton(); + await $.pumpAndSettle(duration: const Duration(seconds: 1)); + await emailRobot.tapEmailDetailedMoreButton(); + await _expectDisplayedStarIcon(); } - void _expectEmailDetailedStarButtonVisible() { - expect($(#email_detailed_star_button), findsOneWidget); + Future _expectEmailDetailedStarButtonVisible() async { + await expectViewVisible($(#markAsStarred_action)); } - Future _expectDisplayedStarIcon(ImagePaths imagePaths) async { - await expectViewVisible( - $(#email_detailed_star_button).which( - (widget) => widget.icon == imagePaths.icStar), - ); + Future _expectDisplayedStarIcon() async { + await expectViewVisible($(#markAsStarred_action)); } - Future _expectDisplayedUnStarIcon(ImagePaths imagePaths) async { - await expectViewVisible( - $(#email_detailed_star_button).which( - (widget) => widget.icon == imagePaths.icUnStar), - ); + Future _expectDisplayedUnStarIcon() async { + await expectViewVisible($(#unMarkAsStarred_action)); } } \ No newline at end of file diff --git a/integration_test/scenarios/email_detailed/move_email_to_folder_scenario.dart b/integration_test/scenarios/email_detailed/move_email_to_folder_scenario.dart index e37e98d21..280e3a6e0 100644 --- a/integration_test/scenarios/email_detailed/move_email_to_folder_scenario.dart +++ b/integration_test/scenarios/email_detailed/move_email_to_folder_scenario.dart @@ -38,6 +38,7 @@ class MoveEmailToFolderScenario extends BaseTestScenario { await threadRobot.openEmailWithSubject(subject); await $.pumpAndSettle(); + await emailRobot.tapEmailDetailedMoreButton(); await emailRobot.tapEmailDetailedMoveEmailButton(); await $.pumpAndSettle(duration: const Duration(seconds: 2)); diff --git a/integration_test/scenarios/email_detailed/reply_email_with_reply_to_scenario.dart b/integration_test/scenarios/email_detailed/reply_email_with_reply_to_scenario.dart index 0b1c7ea50..a434b093f 100644 --- a/integration_test/scenarios/email_detailed/reply_email_with_reply_to_scenario.dart +++ b/integration_test/scenarios/email_detailed/reply_email_with_reply_to_scenario.dart @@ -79,12 +79,15 @@ class ReplyEmailWithReplyToScenario extends BaseTestScenario { } Future _expectToFieldContainReplyToEmailAddress() async { - expect( - $(RecipientComposerWidget).which((widget) => - widget.prefix == PrefixEmailAddress.to && - isMatchingEmailList(widget.listEmailAddress, {'emma-reply-to@example.com'}) - ).visible, - isTrue, + await expectViewVisible( + $(RecipientComposerWidget).which( + (widget) => + widget.prefix == PrefixEmailAddress.to && + isMatchingEmailList( + widget.listEmailAddress, + {'emma-reply-to@example.com'}, + ), + ), ); } } \ No newline at end of file diff --git a/integration_test/scenarios/forward_email_scenario.dart b/integration_test/scenarios/forward_email_scenario.dart index 32b4314cd..b0628da4a 100644 --- a/integration_test/scenarios/forward_email_scenario.dart +++ b/integration_test/scenarios/forward_email_scenario.dart @@ -14,7 +14,7 @@ import '../robots/thread_robot.dart'; class ForwardEmailScenario extends BaseTestScenario { - static const String queryString = 'Fwd: Forward email to Bob'; + static const String queryString = 'Forward email'; const ForwardEmailScenario(super.$); diff --git a/integration_test/scenarios/save_as_template_scenario.dart b/integration_test/scenarios/save_as_template_scenario.dart index cd53f19f4..95586bd81 100644 --- a/integration_test/scenarios/save_as_template_scenario.dart +++ b/integration_test/scenarios/save_as_template_scenario.dart @@ -21,7 +21,7 @@ class SaveAsTemplateScenario extends BaseTestScenario { await _expectSaveToastSuccessVisible(); await composerRobot.addSubject('test subject'); - + await hideKeyboard(); await composerRobot.saveAsTemplate(); await _expectUpdateToastSuccessVisible(); diff --git a/integration_test/scenarios/thread_detail/thread_detail_reply_real_time_update_scenario.dart b/integration_test/scenarios/thread_detail/thread_detail_reply_real_time_update_scenario.dart index ab4b18006..181decc81 100644 --- a/integration_test/scenarios/thread_detail/thread_detail_reply_real_time_update_scenario.dart +++ b/integration_test/scenarios/thread_detail/thread_detail_reply_real_time_update_scenario.dart @@ -42,12 +42,15 @@ class ThreadDetailReplyRealTimeUpdateScenario extends BaseTestScenario { await composerRobot.grantContactPermission(); await composerRobot.addContent(replyContent); await composerRobot.sendEmail(imagePaths); - await $.waitUntilVisible($(ThreadDetailCollapsedEmail)); - expect( - $(ThreadDetailCollapsedEmail).which((widget) { - return widget.preview.contains(replyContent); - }), - findsOneWidget, - ); + + await _expectNewCollapsedEmail(replyContent); + } + + Future _expectNewCollapsedEmail(String replyContent) async { + final collapsedEmail = $(ThreadDetailCollapsedEmail) + .which((widget) { + return widget.preview.contains(replyContent); + }); + await expectViewVisible(collapsedEmail); } } \ No newline at end of file diff --git a/lib/features/base/widget/context_menu/context_menu_dialog_view.dart b/lib/features/base/widget/context_menu/context_menu_dialog_view.dart index 79fea1ddb..e49c32f90 100644 --- a/lib/features/base/widget/context_menu/context_menu_dialog_view.dart +++ b/lib/features/base/widget/context_menu/context_menu_dialog_view.dart @@ -18,6 +18,7 @@ class ContextMenuDialogView extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: actions.map((menuAction) => ContextMenuDialogItem( + key: menuAction.key != null ? Key(menuAction.key!) : null, menuAction: menuAction, onContextMenuActionClick: onContextMenuActionClick, )).toList(), diff --git a/lib/features/base/widget/context_menu/context_menu_item_action.dart b/lib/features/base/widget/context_menu/context_menu_item_action.dart index bedfc22b3..45274b699 100644 --- a/lib/features/base/widget/context_menu/context_menu_item_action.dart +++ b/lib/features/base/widget/context_menu/context_menu_item_action.dart @@ -6,11 +6,12 @@ typedef OnContextMenuActionClick = void Function(ContextMenuItemAction action); abstract class ContextMenuItemAction with EquatableMixin { final T action; + final String? key; - ContextMenuItemAction(this.action); + ContextMenuItemAction(this.action, {this.key}); @override - List get props => [action]; + List get props => [action, key]; String get actionName; @@ -33,7 +34,7 @@ mixin OptionalSelectedIcon { abstract class ContextMenuItemActionRequiredIcon extends ContextMenuItemAction with OptionalIcon { - ContextMenuItemActionRequiredIcon(super.action); + ContextMenuItemActionRequiredIcon(super.action, {super.key}); } abstract class ContextMenuItemActionRequiredSelectedIcon @@ -41,12 +42,12 @@ abstract class ContextMenuItemActionRequiredSelectedIcon final T? selectedAction; - ContextMenuItemActionRequiredSelectedIcon(super.action, this.selectedAction); + ContextMenuItemActionRequiredSelectedIcon(super.action, this.selectedAction, {super.key}); } abstract class ContextMenuItemActionRequiredFull extends ContextMenuItemAction with OptionalIcon, OptionalSelectedIcon { final T selectedAction; - ContextMenuItemActionRequiredFull(super.action, this.selectedAction); + ContextMenuItemActionRequiredFull(super.action, this.selectedAction, {super.key}); } \ No newline at end of file diff --git a/lib/features/base/widget/email_address_with_copy_widget.dart b/lib/features/base/widget/email_address_with_copy_widget.dart index 7d26b1eb2..91c2dd585 100644 --- a/lib/features/base/widget/email_address_with_copy_widget.dart +++ b/lib/features/base/widget/email_address_with_copy_widget.dart @@ -37,6 +37,7 @@ class EmailAddressWithCopyWidget extends StatelessWidget { ), if (label.isNotEmpty) TMailButtonWidget.fromIcon( + key: const ValueKey('copy_email_address'), icon: copyLabelIcon, backgroundColor: Colors.transparent, iconSize: 20, diff --git a/lib/features/email/presentation/model/context_item_email_action.dart b/lib/features/email/presentation/model/context_item_email_action.dart index 89c85e6ab..eb75ab3cb 100644 --- a/lib/features/email/presentation/model/context_item_email_action.dart +++ b/lib/features/email/presentation/model/context_item_email_action.dart @@ -13,8 +13,9 @@ class ContextItemEmailAction ContextItemEmailAction( super.action, this.appLocalizations, - this.imagePaths, - ); + this.imagePaths, { + super.key, + }); @override String get actionIcon => action.getIcon(imagePaths); diff --git a/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart b/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart index c2e18b23c..315e99c6c 100644 --- a/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart +++ b/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart @@ -591,6 +591,7 @@ class EmailActionReactor { action, AppLocalizations.of(currentContext!), imagePaths, + key: '${action.name}_action', ), ) .toList(), diff --git a/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart b/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart index 510ba0632..e67f0b272 100644 --- a/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart +++ b/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart @@ -162,7 +162,6 @@ class EmailViewAppBarWidget extends StatelessWidget { ); Widget _getMoveEmailButton(AppLocalizations appLocalizations) => TMailButtonWidget.fromIcon( - key: const Key('email_detailed_move_email_button'), icon: _imagePaths.icMoveEmail, iconSize: EmailViewAppBarWidgetStyles.buttonIconSize, iconColor: EmailViewAppBarWidgetStyles.iconColor, @@ -177,7 +176,6 @@ class EmailViewAppBarWidget extends StatelessWidget { ); Widget _getMarkStarButton(AppLocalizations applocalizations) => TMailButtonWidget.fromIcon( - key: const Key('email_detailed_star_button'), icon: presentationEmail.hasStarred ? _imagePaths.icStar : _imagePaths.icUnStar, @@ -200,7 +198,6 @@ class EmailViewAppBarWidget extends StatelessWidget { ); Widget _getDeleteButton(AppLocalizations applocalizations) => TMailButtonWidget.fromIcon( - key: const Key('email_detailed_delete_email_button'), icon: _imagePaths.icDeleteComposer, iconSize: EmailViewAppBarWidgetStyles.deleteButtonIconSize, iconColor: EmailViewAppBarWidgetStyles.iconColor, diff --git a/lib/features/thread/presentation/extensions/handle_select_message_filter_extension.dart b/lib/features/thread/presentation/extensions/handle_select_message_filter_extension.dart index 1f8784c48..4eaf79532 100644 --- a/lib/features/thread/presentation/extensions/handle_select_message_filter_extension.dart +++ b/lib/features/thread/presentation/extensions/handle_select_message_filter_extension.dart @@ -20,6 +20,7 @@ extension HandleSelectMessageFilterExtension on ThreadController { selectedOption, AppLocalizations.of(context), imagePaths, + key: '${filter.name}_filter', ); }).toList(); diff --git a/lib/features/thread/presentation/model/context_item_filter_message_option_action.dart b/lib/features/thread/presentation/model/context_item_filter_message_option_action.dart index cd1d7bf53..d7758ebaa 100644 --- a/lib/features/thread/presentation/model/context_item_filter_message_option_action.dart +++ b/lib/features/thread/presentation/model/context_item_filter_message_option_action.dart @@ -12,8 +12,9 @@ class ContextItemFilterMessageOptionAction super.action, super.selectedAction, this.appLocalizations, - this.imagePaths, - ); + this.imagePaths, { + super.key, + }); @override String get actionIcon => action.getContextMenuIcon(imagePaths); diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index f06bc8a0c..0126f7589 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -794,12 +794,6 @@ "placeholders_order": [], "placeholders": {} }, - "copy_email_address": "Copy email address", - "@copy_email_address": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, "compose_email": "Compose email", "@compose_email": { "type": "text", diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index a837bd31a..ab0390d5f 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -805,12 +805,6 @@ class AppLocalizations { name: 'hide'); } - String get copy_email_address { - return Intl.message( - 'Copy email address', - name: 'copy_email_address'); - } - String get compose_email { return Intl.message( 'Compose email', diff --git a/provisioning/integration_test/eml/reply_email/with-reply-to.eml b/provisioning/integration_test/eml/reply_email/with-reply-to.eml index 68a12052e..ad1bb6b24 100644 --- a/provisioning/integration_test/eml/reply_email/with-reply-to.eml +++ b/provisioning/integration_test/eml/reply_email/with-reply-to.eml @@ -13,7 +13,6 @@ User-Agent: Twake-Mail/0.13.2 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:131.0) Gecko/20100101 Firefox/131.0 Content-Type: multipart/alternative; boundary="-=Part.4f.450e1cfbcd355387.192d67ae03d.c367d8042fea24dd=-" -List-Post: ---=Part.4f.450e1cfbcd355387.192d67ae03d.c367d8042fea24dd=- Content-Type: text/plain; charset=UTF-8 diff --git a/provisioning/integration_test/provisioning.sh b/provisioning/integration_test/provisioning.sh index 4612ee994..162720577 100755 --- a/provisioning/integration_test/provisioning.sh +++ b/provisioning/integration_test/provisioning.sh @@ -2,7 +2,7 @@ # Define users and folders users=("alice" "bob" "brian" "charlotte" "david" "emma") -bobFolders=("Search Emails" "Forward Emails" "Disposition" "MailBase64" "Calendar" "Reply Emails" "Reply Emails") +bobFolders=("Search Emails" "Forward Emails" "Disposition" "MailBase64" "Calendar" "Reply Emails") # Add users for user in "${users[@]}"; do