TF-868: Unread/new emails are not loaded when opening folder

This commit is contained in:
ManhNTX
2022-09-07 10:32:04 +07:00
committed by Dat H. Pham
parent c213892746
commit 98f297f24d
13 changed files with 152 additions and 75 deletions
@@ -0,0 +1,22 @@
# 16. Fix some wrong cases email list presents
Date: 2022-09-13
## Status
- Issue: Mailbox A has cache with more than 20 filtered emails.
Then come back this mailbox in the next time, read-emails are not showed correctly.
## Context
- Root cause: list email cached not enough.
## Decision
- Fill the cache with the first page of this mailbox at the first time open this mailbox.
- Get only the first page in the cache when open mailbox
## Consequences
- Email list presents correctly
@@ -32,7 +32,7 @@ abstract class ThreadDataSource {
}
);
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption});
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption, UnsignedInt? limit});
Future<void> update({List<Email>? updated, List<Email>? created, List<EmailId>? destroyed});
@@ -46,9 +46,9 @@ class LocalThreadDataSourceImpl extends ThreadDataSource {
}
@override
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption}) {
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption, UnsignedInt? limit}) {
return Future.sync(() async {
return await _emailCacheManager.getAllEmail(inMailboxId: inMailboxId, sort: sort, filterOption: filterOption ?? FilterMessageOption.all);
return await _emailCacheManager.getAllEmail(inMailboxId: inMailboxId, sort: sort, filterOption: filterOption ?? FilterMessageOption.all, limit: limit);
}).catchError((error) {
throw error;
});
@@ -65,7 +65,7 @@ class ThreadDataSourceImpl extends ThreadDataSource {
}
@override
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption}) {
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption, UnsignedInt? limit}) {
throw UnimplementedError();
}
@@ -1,5 +1,5 @@
import 'package:core/core.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:model/model.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
@@ -21,6 +21,7 @@ class EmailCacheManager {
Future<List<Email>> getAllEmail({
MailboxId? inMailboxId,
Set<Comparator>? sort,
UnsignedInt? limit,
FilterMessageOption filterOption = FilterMessageOption.all
}) async {
final emailCacheList = inMailboxId != null
@@ -35,6 +36,10 @@ class EmailCacheManager {
emailList.sortBy(comparator);
}
}
if (limit != null && emailList.length > limit.value.toInt()) {
return emailList.getRange(0, limit.value.toInt()).toList();
}
return emailList;
}
@@ -8,6 +8,7 @@ import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:jmap_dart_client/jmap/core/state.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart';
@@ -47,6 +48,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
mapDataSource[DataSourceType.local]!.getAllEmailCache(
inMailboxId: emailFilter?.mailboxId,
sort: sort,
limit: limit,
filterOption: emailFilter?.filterOption),
stateDataSource.getState(StateType.email)
]).then((List response) {
@@ -64,7 +66,14 @@ class ThreadRepositoryImpl extends ThreadRepository {
sort: sort,
filter: emailFilter?.filter,
properties: propertiesCreated);
if (_isApproveFilterOption(emailFilter?.filterOption, networkEmailResponse.emailList)) {
_getFirstPage(
accountId,
sort: sort,
mailboxId: emailFilter?.mailboxId,
propertiesCreated: propertiesCreated,
);
}
yield networkEmailResponse;
} else {
yield localEmailResponse;
@@ -127,6 +136,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
mapDataSource[DataSourceType.local]!.getAllEmailCache(
inMailboxId: emailFilter?.mailboxId,
sort: sort,
limit: limit,
filterOption: emailFilter?.filterOption),
stateDataSource.getState(StateType.email)
]).then((List response) {
@@ -136,6 +146,31 @@ class ThreadRepositoryImpl extends ThreadRepository {
yield newEmailResponse;
}
bool _isApproveFilterOption(FilterMessageOption? filterOption, List<Email>? listEmailResponse) {
return filterOption != FilterMessageOption.all && listEmailResponse!.isNotEmpty;
}
Future<EmailsResponse> _getFirstPage(
AccountId accountId,
{
Set<Comparator>? sort,
MailboxId? mailboxId,
Properties? propertiesCreated,
Filter? filter,
}
) async {
final networkEmailResponse = await mapDataSource[DataSourceType.network]!.getAllEmail(
accountId,
limit: ThreadConstants.defaultLimit,
sort: sort,
filter: filter ?? EmailFilterCondition(inMailbox: mailboxId),
properties: propertiesCreated,
);
await _updateEmailCache(newCreated: networkEmailResponse.emailList);
return networkEmailResponse;
}
Future<List<Email>?> _combineEmailCache({
List<Email>? emailUpdated,
Properties? updatedProperties,
@@ -185,19 +220,17 @@ class ThreadRepositoryImpl extends ThreadRepository {
AccountId accountId,
State currentState,
{
UnsignedInt? limit,
Set<Comparator>? sort,
EmailFilter? emailFilter,
Properties? propertiesCreated,
Properties? propertiesUpdated,
MailboxId? inMailboxId,
FilterMessageOption? filterOption,
}
) async* {
log('ThreadRepositoryImpl::refreshChanges(): $currentState');
final localEmailList = await mapDataSource[DataSourceType.local]!.getAllEmailCache(
inMailboxId: inMailboxId,
inMailboxId: emailFilter?.mailboxId,
sort: sort,
filterOption: filterOption);
filterOption: emailFilter?.filterOption);
EmailChangeResponse? emailChangeResponse;
bool hasMoreChanges = true;
@@ -237,13 +270,26 @@ class ThreadRepositoryImpl extends ThreadRepository {
}
final newEmailResponse = await Future.wait([
mapDataSource[DataSourceType.local]!.getAllEmailCache(inMailboxId: inMailboxId, sort: sort, filterOption: filterOption),
mapDataSource[DataSourceType.local]!.getAllEmailCache(inMailboxId: emailFilter?.mailboxId, sort: sort, filterOption: emailFilter?.filterOption),
stateDataSource.getState(StateType.email)
]).then((List response) {
return EmailsResponse(emailList: response.first, state: response.last);
});
yield newEmailResponse;
if (!newEmailResponse.hasEmails()
|| (newEmailResponse.emailList?.length ?? 0) < ThreadConstants.defaultLimit.value) {
final networkEmailResponse = await _getFirstPage(
accountId,
sort: sort,
filter: emailFilter?.filter,
mailboxId: emailFilter?.mailboxId,
propertiesCreated: propertiesCreated,
);
yield networkEmailResponse;
} else {
yield newEmailResponse;
}
}
@override
@@ -5,12 +5,14 @@ import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
class GetEmailRequest with EquatableMixin {
final AccountId accountId;
final UnsignedInt? limit;
final Set<Comparator>? sort;
final Filter? filter;
final FilterMessageOption? filterOption;
final Properties? properties;
final EmailId? lastEmailId;
@@ -18,10 +20,11 @@ class GetEmailRequest with EquatableMixin {
this.limit,
this.sort,
this.filter,
this.filterOption,
this.properties,
this.lastEmailId,
});
@override
List<Object?> get props => [limit, sort, filter, properties, lastEmailId];
List<Object?> get props => [limit, sort, filter, properties, lastEmailId, filterOption];
}
@@ -1,7 +1,5 @@
import 'dart:async';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
@@ -12,9 +10,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart';
import 'package:dartz/dartz.dart' as dartz;
abstract class ThreadRepository {
Stream<EmailsResponse> getAllEmail(
@@ -33,10 +29,9 @@ abstract class ThreadRepository {
jmap.State currentState,
{
Set<Comparator>? sort,
EmailFilter? emailFilter,
Properties? propertiesCreated,
Properties? propertiesUpdated,
MailboxId? inMailboxId,
FilterMessageOption? filterOption,
}
);
@@ -3,9 +3,8 @@ import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
import 'package:model/model.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
@@ -23,8 +22,7 @@ class RefreshChangesEmailsInMailboxInteractor {
Set<Comparator>? sort,
Properties? propertiesCreated,
Properties? propertiesUpdated,
MailboxId? inMailboxId,
FilterMessageOption? filterOption,
EmailFilter? emailFilter,
}
) async* {
yield Right<Failure, Success>(RefreshingState());
@@ -37,8 +35,7 @@ class RefreshChangesEmailsInMailboxInteractor {
sort: sort,
propertiesCreated: propertiesCreated,
propertiesUpdated: propertiesUpdated,
inMailboxId: inMailboxId,
filterOption: filterOption)
emailFilter: emailFilter)
.map(_toGetEmailState);
} catch (e) {
yield Left(RefreshChangesAllEmailFailure(e));
@@ -431,8 +431,10 @@ class ThreadController extends BaseController {
sort: _sortOrder,
propertiesCreated: ThreadConstants.propertiesDefault,
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
inMailboxId: _currentMailboxId,
filterOption: mailboxDashBoardController.filterMessageOption.value
emailFilter: EmailFilter(
filter: _getFilterCondition(),
filterOption: mailboxDashBoardController.filterMessageOption.value,
mailboxId: _currentMailboxId),
));
}
}
@@ -446,6 +448,7 @@ class ThreadController extends BaseController {
_accountId!,
limit: ThreadConstants.defaultLimit,
sort: _sortOrder,
filterOption: mailboxDashBoardController.filterMessageOption.value,
filter: _getFilterCondition(isLoadMore: true),
properties: ThreadConstants.propertiesDefault,
lastEmailId: emailList.last.id)
@@ -453,9 +456,15 @@ class ThreadController extends BaseController {
}
}
bool _ableAppendLoadMore(List<PresentationEmail> listEmail) {
return !(emailList.where((email) => (email.mailboxIds != null && !email.mailboxIds!.keys.contains(currentMailbox?.id)) || emailList.contains(email)).isNotEmpty);
}
void _loadMoreEmailsSuccess(LoadMoreEmailsSuccess success) {
if (success.emailList.isNotEmpty) {
emailList.addAll(success.emailList);
if (_ableAppendLoadMore(success.emailList)){
emailList.addAll(success.emailList);
}
} else {
canLoadMore = false;
}
@@ -1,29 +1,29 @@
// Mocks generated by Mockito 5.0.17 from annotations
// Mocks generated by Mockito 5.2.0 from annotations
// in tmail_ui_user/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.dart.
// Do not manually edit this file.
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i3;
import 'package:jmap_dart_client/jmap/account_id.dart' as _i5;
import 'package:jmap_dart_client/jmap/core/filter/filter.dart' as _i15;
import 'package:jmap_dart_client/jmap/core/filter/filter.dart' as _i13;
import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i9;
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart' as _i7;
import 'package:jmap_dart_client/jmap/core/state.dart' as _i10;
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart' as _i6;
import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i14;
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i11;
import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i12;
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i14;
import 'package:mockito/mockito.dart' as _i1;
import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart'
as _i8;
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart'
as _i4;
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'
as _i12;
import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart'
as _i13;
as _i11;
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'
as _i2;
// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
@@ -64,34 +64,32 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
_i3.Stream<_i4.EmailsResponse> refreshChanges(
_i5.AccountId? accountId, _i10.State? currentState,
{Set<_i7.Comparator>? sort,
_i8.EmailFilter? emailFilter,
_i9.Properties? propertiesCreated,
_i9.Properties? propertiesUpdated,
_i11.MailboxId? inMailboxId,
_i12.FilterMessageOption? filterOption}) =>
_i9.Properties? propertiesUpdated}) =>
(super.noSuchMethod(
Invocation.method(#refreshChanges, [
accountId,
currentState
], {
#sort: sort,
#emailFilter: emailFilter,
#propertiesCreated: propertiesCreated,
#propertiesUpdated: propertiesUpdated,
#inMailboxId: inMailboxId,
#filterOption: filterOption
#propertiesUpdated: propertiesUpdated
}),
returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>);
@override
_i3.Stream<_i4.EmailsResponse> loadMoreEmails(
_i13.GetEmailRequest? emailRequest) =>
_i11.GetEmailRequest? emailRequest) =>
(super.noSuchMethod(Invocation.method(#loadMoreEmails, [emailRequest]),
returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>);
@override
_i3.Future<List<_i14.Email>> searchEmails(_i5.AccountId? accountId,
_i3.Future<List<_i12.Email>> searchEmails(_i5.AccountId? accountId,
{_i6.UnsignedInt? limit,
Set<_i7.Comparator>? sort,
_i15.Filter? filter,
_i13.Filter? filter,
_i9.Properties? properties}) =>
(super.noSuchMethod(
Invocation.method(#searchEmails, [
@@ -102,13 +100,13 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
#filter: filter,
#properties: properties
}),
returnValue: Future<List<_i14.Email>>.value(<_i14.Email>[]))
as _i3.Future<List<_i14.Email>>);
returnValue: Future<List<_i12.Email>>.value(<_i12.Email>[]))
as _i3.Future<List<_i12.Email>>);
@override
_i3.Future<List<_i14.EmailId>> emptyTrashFolder(
_i5.AccountId? accountId, _i11.MailboxId? trashMailboxId) =>
_i3.Future<List<_i12.EmailId>> emptyTrashFolder(
_i5.AccountId? accountId, _i14.MailboxId? trashMailboxId) =>
(super.noSuchMethod(
Invocation.method(#emptyTrashFolder, [accountId, trashMailboxId]),
returnValue: Future<List<_i14.EmailId>>.value(<_i14.EmailId>[]))
as _i3.Future<List<_i14.EmailId>>);
returnValue: Future<List<_i12.EmailId>>.value(<_i12.EmailId>[]))
as _i3.Future<List<_i12.EmailId>>);
}
@@ -9,6 +9,7 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
@@ -40,7 +41,8 @@ void main() {
sort: Set()..add(EmailComparator(EmailComparatorProperty.sentAt)..setIsAscending(false)),
propertiesCreated: ThreadConstants.propertiesDefault,
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
inMailboxId: MailboxFixtures.inboxMailbox.id
emailFilter: EmailFilter(
mailboxId: MailboxFixtures.inboxMailbox.id)
)).thenAnswer((_) => Stream.fromIterable({
EmailsResponse(
emailList: {
@@ -59,7 +61,9 @@ void main() {
sort: Set()..add(EmailComparator(EmailComparatorProperty.sentAt)..setIsAscending(false)),
propertiesCreated: ThreadConstants.propertiesDefault,
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
inMailboxId: MailboxFixtures.inboxMailbox.id);
emailFilter: EmailFilter(
mailboxId: MailboxFixtures.inboxMailbox.id),
);
final states = await streamStates.toList();
@@ -1,29 +1,29 @@
// Mocks generated by Mockito 5.0.17 from annotations
// Mocks generated by Mockito 5.2.0 from annotations
// in tmail_ui_user/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.dart.
// Do not manually edit this file.
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i3;
import 'package:jmap_dart_client/jmap/account_id.dart' as _i5;
import 'package:jmap_dart_client/jmap/core/filter/filter.dart' as _i15;
import 'package:jmap_dart_client/jmap/core/filter/filter.dart' as _i13;
import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i9;
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart' as _i7;
import 'package:jmap_dart_client/jmap/core/state.dart' as _i10;
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart' as _i6;
import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i14;
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i11;
import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i12;
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i14;
import 'package:mockito/mockito.dart' as _i1;
import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart'
as _i8;
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart'
as _i4;
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'
as _i12;
import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart'
as _i13;
as _i11;
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'
as _i2;
// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
@@ -64,34 +64,32 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
_i3.Stream<_i4.EmailsResponse> refreshChanges(
_i5.AccountId? accountId, _i10.State? currentState,
{Set<_i7.Comparator>? sort,
_i8.EmailFilter? emailFilter,
_i9.Properties? propertiesCreated,
_i9.Properties? propertiesUpdated,
_i11.MailboxId? inMailboxId,
_i12.FilterMessageOption? filterOption}) =>
_i9.Properties? propertiesUpdated}) =>
(super.noSuchMethod(
Invocation.method(#refreshChanges, [
accountId,
currentState
], {
#sort: sort,
#emailFilter: emailFilter,
#propertiesCreated: propertiesCreated,
#propertiesUpdated: propertiesUpdated,
#inMailboxId: inMailboxId,
#filterOption: filterOption
#propertiesUpdated: propertiesUpdated
}),
returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>);
@override
_i3.Stream<_i4.EmailsResponse> loadMoreEmails(
_i13.GetEmailRequest? emailRequest) =>
_i11.GetEmailRequest? emailRequest) =>
(super.noSuchMethod(Invocation.method(#loadMoreEmails, [emailRequest]),
returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>);
@override
_i3.Future<List<_i14.Email>> searchEmails(_i5.AccountId? accountId,
_i3.Future<List<_i12.Email>> searchEmails(_i5.AccountId? accountId,
{_i6.UnsignedInt? limit,
Set<_i7.Comparator>? sort,
_i15.Filter? filter,
_i13.Filter? filter,
_i9.Properties? properties}) =>
(super.noSuchMethod(
Invocation.method(#searchEmails, [
@@ -102,13 +100,13 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
#filter: filter,
#properties: properties
}),
returnValue: Future<List<_i14.Email>>.value(<_i14.Email>[]))
as _i3.Future<List<_i14.Email>>);
returnValue: Future<List<_i12.Email>>.value(<_i12.Email>[]))
as _i3.Future<List<_i12.Email>>);
@override
_i3.Future<List<_i14.EmailId>> emptyTrashFolder(
_i5.AccountId? accountId, _i11.MailboxId? trashMailboxId) =>
_i3.Future<List<_i12.EmailId>> emptyTrashFolder(
_i5.AccountId? accountId, _i14.MailboxId? trashMailboxId) =>
(super.noSuchMethod(
Invocation.method(#emptyTrashFolder, [accountId, trashMailboxId]),
returnValue: Future<List<_i14.EmailId>>.value(<_i14.EmailId>[]))
as _i3.Future<List<_i14.EmailId>>);
returnValue: Future<List<_i12.EmailId>>.value(<_i12.EmailId>[]))
as _i3.Future<List<_i12.EmailId>>);
}