TF-629 Download file and get the contentType to open file in Android/iOS

This commit is contained in:
Dat PHAM HOANG
2022-06-08 22:25:00 +07:00
committed by Dat H. Pham
parent 40a470dc21
commit ee692d52a2
14 changed files with 179 additions and 114 deletions
@@ -1,3 +1,4 @@
import 'package:core/core.dart';
import 'package:dio/dio.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
@@ -19,7 +20,7 @@ abstract class EmailDataSource {
AccountRequest accountRequest
);
Future<String> exportAttachment(
Future<DownloadedResponse> exportAttachment(
Attachment attachment,
AccountId accountId,
String baseDownloadUrl,
@@ -1,3 +1,4 @@
import 'package:core/core.dart';
import 'package:dio/dio.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
@@ -55,7 +56,7 @@ class EmailDataSourceImpl extends EmailDataSource {
}
@override
Future<String> exportAttachment(
Future<DownloadedResponse> exportAttachment(
Attachment attachment,
AccountId accountId,
String baseDownloadUrl,
+11 -2
View File
@@ -23,9 +23,18 @@ import 'package:jmap_dart_client/jmap/mail/email/submission/email_submission.dar
import 'package:jmap_dart_client/jmap/mail/email/submission/email_submission_id.dart';
import 'package:jmap_dart_client/jmap/mail/email/submission/envelope.dart';
import 'package:jmap_dart_client/jmap/mail/email/submission/set/set_email_submission_method.dart';
import 'package:model/account/account_request.dart';
import 'package:model/account/authentication_type.dart';
import 'package:model/download/download_task_id.dart';
import 'package:model/email/attachment.dart';
import 'package:model/email/mark_star_action.dart';
import 'package:model/email/read_actions.dart';
import 'package:model/extensions/email_extension.dart';
import 'package:model/extensions/keyword_identifier_extension.dart';
import 'package:model/extensions/list_email_id_extension.dart';
import 'package:model/oidc/token.dart';
import 'package:path_provider/path_provider.dart';
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart';
@@ -198,7 +207,7 @@ class EmailAPI {
.toList();
}
Future<String> exportAttachment(
Future<DownloadedResponse> exportAttachment(
Attachment attachment,
AccountId accountId,
String baseDownloadUrl,
@@ -1,4 +1,5 @@
import 'package:core/core.dart';
import 'package:dio/dio.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
@@ -42,7 +43,7 @@ class EmailRepositoryImpl extends EmailRepository {
}
@override
Future<String> exportAttachment(
Future<DownloadedResponse> exportAttachment(
Attachment attachment,
AccountId accountId,
String baseDownloadUrl,
@@ -1,3 +1,4 @@
import 'package:core/core.dart';
import 'package:dio/dio.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
@@ -19,7 +20,7 @@ abstract class EmailRepository {
AccountRequest accountRequest
);
Future<String> exportAttachment(
Future<DownloadedResponse> exportAttachment(
Attachment attachment,
AccountId accountId,
String baseDownloadUrl,
@@ -1,16 +1,16 @@
import 'package:core/core.dart';
class ExportAttachmentSuccess extends UIState {
final String filePath;
final DownloadedResponse downloadedResponse;
ExportAttachmentSuccess(this.filePath);
ExportAttachmentSuccess(this.downloadedResponse);
@override
List<Object> get props => [filePath];
List<Object> get props => [downloadedResponse];
}
class ExportAttachmentFailure extends FeatureFailure {
final exception;
final dynamic exception;
ExportAttachmentFailure(this.exception);
@@ -35,7 +35,7 @@ class ExportAttachmentInteractor {
log('ExportAttachmentInteractor::execute(): account: $account');
final filePath = await Future.wait([
final downloadedResponse = await Future.wait([
if (account.authenticationType == AuthenticationType.oidc)
_authenticationOIDCRepository.getStoredTokenOIDC(account.id)
else
@@ -66,7 +66,7 @@ class ExportAttachmentInteractor {
accountRequest,
cancelToken);
});
yield Right<Failure, Success>(ExportAttachmentSuccess(filePath));
yield Right<Failure, Success>(ExportAttachmentSuccess(downloadedResponse));
} catch (exception) {
log('ExportAttachmentInteractor::execute(): exception: $exception');
yield Left<Failure, Success>(ExportAttachmentFailure(exception));
@@ -1,3 +1,5 @@
import 'dart:io';
import 'package:core/core.dart';
import 'package:dartz/dartz.dart';
import 'package:dio/dio.dart';
@@ -11,9 +13,12 @@ import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/model.dart';
import 'package:open_file/open_file.dart' as open_file;
import 'package:permission_handler/permission_handler.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:share/share.dart' as share_library;
import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
@@ -21,15 +26,15 @@ import 'package:tmail_ui_user/features/email/domain/state/download_attachment_fo
import 'package:tmail_ui_user/features/email/domain/state/download_attachments_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/export_attachment_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment_for_web_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/download_attachments_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/export_attachment_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_bottom_sheet_builder.dart';
@@ -37,12 +42,10 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:share/share.dart' as share_library;
class EmailController extends BaseController {
@@ -314,7 +317,26 @@ class EmailController extends BaseController {
void _exportAttachmentSuccessAction(Success success) async {
popBack();
if (success is ExportAttachmentSuccess) {
await share_library.Share.shareFiles([success.filePath]);
_openDownloadedPreviewWorkGroupDocument(success.downloadedResponse);
}
}
void _openDownloadedPreviewWorkGroupDocument(DownloadedResponse downloadedResponse) async {
log('EmailController::_openDownloadedPreviewWorkGroupDocument(): $downloadedResponse');
if (downloadedResponse.mediaType == null) {
await share_library.Share.shareFiles([downloadedResponse.filePath]);
}
final openResult = await open_file.OpenFile.open(
downloadedResponse.filePath,
type: Platform.isAndroid ? downloadedResponse.mediaType!.mimeType : null,
uti: Platform.isIOS ? downloadedResponse.mediaType!.getDocumentUti().value : null);
if (openResult.type != open_file.ResultType.done) {
logError('EmailController::_openDownloadedPreviewWorkGroupDocument(): no preview available');
if (currentContext != null) {
_appToast.showErrorToast(AppLocalizations.of(currentContext!).noPreviewAvailable);
}
}
}
@@ -1,6 +1,5 @@
import 'dart:io';
import 'package:core/core.dart';
import 'package:filesize/filesize.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
@@ -16,7 +15,6 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/attachment_fil
import 'package:tmail_ui_user/features/email/presentation/widgets/bottom_bar_mail_widget_builder.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:filesize/filesize.dart';
class EmailView extends GetView with NetworkConnectionMixin {
@@ -411,11 +409,7 @@ class EmailView extends GetView with NetworkConnectionMixin {
if (kIsWeb) {
emailController.downloadAttachmentForWeb(context, attachment);
} else {
if (Platform.isAndroid) {
emailController.downloadAttachments(context, [attachment]);
} else if (Platform.isIOS) {
emailController.exportAttachment(context, attachment);
}
emailController.exportAttachment(context, attachment);
}
}))
.build())