TF-867 [Android] Share image with TeamMail app but image is not add to inline image

This commit is contained in:
ManhNTX
2022-08-25 10:09:15 +07:00
committed by Dat H. Pham
parent cf6a1673ae
commit 36bec1c9d5
16 changed files with 133 additions and 30 deletions
@@ -11,6 +11,7 @@ import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
import 'package:tmail_ui_user/features/caching/config/hive_cache_config.dart';
import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart';
import 'package:tmail_ui_user/features/login/data/network/config/authorization_isolate_interceptors.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_credential_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_stored_token_oidc_state.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart';
@@ -30,6 +31,7 @@ import 'package:tmail_ui_user/main/routes/route_navigation.dart';
abstract class ReloadableController extends BaseController {
final DynamicUrlInterceptors _dynamicUrlInterceptors = Get.find<DynamicUrlInterceptors>();
final AuthorizationInterceptors _authorizationInterceptors = Get.find<AuthorizationInterceptors>();
final AuthorizationIsolateInterceptors _authorizationIsolateInterceptors = Get.find<AuthorizationIsolateInterceptors>();
final GetSessionInteractor _getSessionInteractor = Get.find<GetSessionInteractor>();
final DeleteCredentialInteractor _deleteCredentialInteractor = Get.find<DeleteCredentialInteractor>();
final CachingManager _cachingManager = Get.find<CachingManager>();
@@ -95,6 +97,10 @@ abstract class ReloadableController extends BaseController {
credentialViewState.userName.userName,
credentialViewState.password.value,
);
_authorizationIsolateInterceptors.setBasicAuthorization(
credentialViewState.userName.userName,
credentialViewState.password.value,
);
}
void _handleGetCredentialSuccess(GetCredentialViewState credentialViewState) {
@@ -138,6 +144,7 @@ abstract class ReloadableController extends BaseController {
_languageCacheManager.removeLanguage(),
]);
_authorizationInterceptors.clear();
_authorizationIsolateInterceptors.clear();
await HiveCacheConfig().closeHive();
_goToLogin(arguments: LoginArguments(LoginFormType.credentialForm));
}
@@ -151,6 +158,7 @@ abstract class ReloadableController extends BaseController {
_cachingManager.clearAll(),
_languageCacheManager.removeLanguage(),
]);
_authorizationIsolateInterceptors.clear();
_authorizationInterceptors.clear();
await HiveCacheConfig().closeHive();
_goToLogin(arguments: LoginArguments(LoginFormType.ssoForm));
@@ -166,6 +174,9 @@ abstract class ReloadableController extends BaseController {
_authorizationInterceptors.setTokenAndAuthorityOidc(
newToken: tokenOidcSuccess.tokenOidc.toToken(),
newConfig: tokenOidcSuccess.oidcConfiguration);
_authorizationIsolateInterceptors.setTokenAndAuthorityOidc(
newToken: tokenOidcSuccess.tokenOidc.toToken(),
newConfig: tokenOidcSuccess.oidcConfiguration);
}
void injectAutoCompleteBindings() {
@@ -53,7 +53,7 @@ import 'package:tmail_ui_user/features/upload/data/datasource_impl/attachment_up
import 'package:tmail_ui_user/features/upload/data/network/file_uploader.dart';
import 'package:tmail_ui_user/features/upload/domain/usecases/local_file_picker_interactor.dart';
import 'package:tmail_ui_user/features/upload/presentation/controller/upload_controller.dart';
import 'package:worker_manager/worker_manager.dart';
import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart';
class ComposerBindings extends BaseBindings {
@@ -64,7 +64,7 @@ class ComposerBindings extends BaseBindings {
}
void _bindingsUtils() {
Get.lazyPut(() => FileUploader(Get.find<DioClient>(), Get.find<Executor>()));
Get.lazyPut(() => FileUploader(Get.find<DioClient>(tag: BindingTag.isoLateTag)));
}
@override
@@ -171,6 +171,7 @@ class ComposerBindings extends BaseBindings {
void dispose() {
Get.delete<UploadController>();
Get.delete<RichTextWebController>();
Get.delete<RichTextMobileTabletController>();
Get.delete<ComposerController>();
}
}
@@ -245,7 +245,9 @@ class ComposerController extends BaseController {
listIdentities.value = success.identities!
.where((identity) => identity.mayDelete == true)
.toList();
selectIdentity(listIdentities.first);
if (listIdentities.isNotEmpty) {
selectIdentity(listIdentities.first);
}
}
} else if (success is DownloadImageAsBase64Success) {
if(kIsWeb) {
@@ -19,6 +19,7 @@ import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache
import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart';
import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart';
import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart';
import 'package:tmail_ui_user/features/login/data/network/config/authorization_isolate_interceptors.dart';
import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart';
import 'package:tmail_ui_user/features/login/data/repository/account_repository_impl.dart';
import 'package:tmail_ui_user/features/login/data/repository/authentication_oidc_repository_impl.dart';
@@ -42,6 +43,7 @@ class HomeBindings extends BaseBindings {
Get.find<GetAuthenticatedAccountInteractor>(),
Get.find<DynamicUrlInterceptors>(),
Get.find<AuthorizationInterceptors>(),
Get.find<AuthorizationIsolateInterceptors>(),
Get.find<CleanupEmailCacheInteractor>(),
Get.find<EmailReceiveManager>(),
Get.find<CleanupRecentSearchCacheInteractor>(),
@@ -12,6 +12,7 @@ import 'package:tmail_ui_user/features/cleanup/domain/model/recent_search_cleanu
import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_email_cache_interactor.dart';
import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_search_cache_interactor.dart';
import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart';
import 'package:tmail_ui_user/features/login/data/network/config/authorization_isolate_interceptors.dart';
import 'package:tmail_ui_user/features/login/domain/state/check_oidc_is_available_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_credential_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_stored_token_oidc_state.dart';
@@ -30,6 +31,7 @@ class HomeController extends BaseController {
final GetAuthenticatedAccountInteractor _getAuthenticatedAccountInteractor;
final DynamicUrlInterceptors _dynamicUrlInterceptors;
final AuthorizationInterceptors _authorizationInterceptors;
final AuthorizationIsolateInterceptors _authorizationIsolateInterceptors;
final CleanupEmailCacheInteractor _cleanupEmailCacheInteractor;
final EmailReceiveManager _emailReceiveManager;
final CleanupRecentSearchCacheInteractor _cleanupRecentSearchCacheInteractor;
@@ -42,6 +44,7 @@ class HomeController extends BaseController {
this._getAuthenticatedAccountInteractor,
this._dynamicUrlInterceptors,
this._authorizationInterceptors,
this._authorizationIsolateInterceptors,
this._cleanupEmailCacheInteractor,
this._emailReceiveManager,
this._cleanupRecentSearchCacheInteractor,
@@ -176,6 +179,9 @@ class HomeController extends BaseController {
_authorizationInterceptors.setTokenAndAuthorityOidc(
newToken: storedTokenOidcSuccess.tokenOidc.toToken(),
newConfig: storedTokenOidcSuccess.oidcConfiguration);
_authorizationIsolateInterceptors.setTokenAndAuthorityOidc(
newToken: storedTokenOidcSuccess.tokenOidc.toToken(),
newConfig: storedTokenOidcSuccess.oidcConfiguration);
pushAndPop(AppRoutes.SESSION);
}
@@ -185,6 +191,10 @@ class HomeController extends BaseController {
credentialViewState.userName.userName,
credentialViewState.password.value,
);
_authorizationIsolateInterceptors.setBasicAuthorization(
credentialViewState.userName.userName,
credentialViewState.password.value,
);
pushAndPop(AppRoutes.SESSION);
}
}
@@ -0,0 +1,65 @@
import 'dart:convert';
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:core/core.dart';
import 'package:model/account/authentication_type.dart';
import 'package:model/oidc/oidc_configuration.dart';
import 'package:model/oidc/token.dart';
class AuthorizationIsolateInterceptors extends QueuedInterceptorsWrapper {
AuthenticationType _authenticationType = AuthenticationType.none;
OIDCConfiguration? _configOIDC;
Token? _token;
String? _authorization;
void setBasicAuthorization(String? userName, String? password) {
_authorization = base64Encode(utf8.encode('$userName:$password'));
_authenticationType = AuthenticationType.basic;
}
void setTokenAndAuthorityOidc({Token? newToken, OIDCConfiguration? newConfig}) {
_token = newToken;
_configOIDC = newConfig;
_authenticationType = AuthenticationType.oidc;
log('AuthorizationIsolateInterceptors::setToken(): newToken: $newToken');
log('AuthorizationIsolateInterceptors::setToken(): tokenId: ${newToken?.tokenIdHash}');
log('AuthorizationIsolateInterceptors::setToken(): EXPIRE_DATE: ${newToken?.expiredTime?.toIso8601String()}');
}
OIDCConfiguration? get oidcConfig => _configOIDC;
AuthenticationType get authenticationType => _authenticationType;
@override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
switch(_authenticationType) {
case AuthenticationType.basic:
if (_authorization != null) {
options.headers[HttpHeaders.authorizationHeader] = _getAuthorizationAsBasicHeader(_authorization);
}
break;
case AuthenticationType.oidc:
if (_token != null && _token?.isTokenValid() == true) {
options.headers[HttpHeaders.authorizationHeader] = _getTokenAsBearerHeader(_token!.token);
}
break;
case AuthenticationType.none:
break;
}
super.onRequest(options, handler);
}
String _getAuthorizationAsBasicHeader(String? authorization) => 'Basic $authorization';
String _getTokenAsBearerHeader(String token) => 'Bearer $token';
void clear() {
_authorization = null;
_token = null;
_configOIDC = null;
_authenticationType = AuthenticationType.none;
}
}
@@ -13,6 +13,7 @@ import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache
import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart';
import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart';
import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart';
import 'package:tmail_ui_user/features/login/data/network/config/authorization_isolate_interceptors.dart';
import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart';
import 'package:tmail_ui_user/features/login/data/repository/account_repository_impl.dart';
import 'package:tmail_ui_user/features/login/data/repository/authentication_oidc_repository_impl.dart';
@@ -39,6 +40,7 @@ class LoginBindings extends BaseBindings {
Get.find<AuthenticationInteractor>(),
Get.find<DynamicUrlInterceptors>(),
Get.find<AuthorizationInterceptors>(),
Get.find<AuthorizationIsolateInterceptors>(),
Get.find<CheckOIDCIsAvailableInteractor>(),
Get.find<GetOIDCConfigurationInteractor>(),
Get.find<GetTokenOIDCInteractor>(),
@@ -9,6 +9,7 @@ import 'package:get/get.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart';
import 'package:tmail_ui_user/features/login/data/network/config/authorization_isolate_interceptors.dart';
import 'package:tmail_ui_user/features/login/domain/state/authenticate_oidc_on_browser_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/authentication_user_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/check_oidc_is_available_state.dart';
@@ -35,6 +36,7 @@ class LoginController extends BaseController {
final AuthenticationInteractor _authenticationInteractor;
final DynamicUrlInterceptors _dynamicUrlInterceptors;
final AuthorizationInterceptors _authorizationInterceptors;
final AuthorizationIsolateInterceptors _authorizationIsolateInterceptors;
final CheckOIDCIsAvailableInteractor _checkOIDCIsAvailableInteractor;
final GetOIDCConfigurationInteractor _getOIDCConfigurationInteractor;
final GetTokenOIDCInteractor _getTokenOIDCInteractor;
@@ -52,6 +54,7 @@ class LoginController extends BaseController {
this._authenticationInteractor,
this._dynamicUrlInterceptors,
this._authorizationInterceptors,
this._authorizationIsolateInterceptors,
this._checkOIDCIsAvailableInteractor,
this._getOIDCConfigurationInteractor,
this._getTokenOIDCInteractor,
@@ -300,6 +303,9 @@ class LoginController extends BaseController {
_authorizationInterceptors.setTokenAndAuthorityOidc(
newToken: success.tokenOIDC.toToken(),
newConfig: config);
_authorizationIsolateInterceptors.setTokenAndAuthorityOidc(
newToken: success.tokenOIDC.toToken(),
newConfig: config);
pushAndPop(AppRoutes.SESSION);
}
@@ -315,6 +321,7 @@ class LoginController extends BaseController {
loginState.value = LoginState(Right(success));
_dynamicUrlInterceptors.changeBaseUrl(kIsWeb ? AppConfig.baseUrl : _urlText);
_authorizationInterceptors.setBasicAuthorization(_userNameText, _passwordText);
_authorizationIsolateInterceptors.setBasicAuthorization(_userNameText, _passwordText);
pushAndPop(AppRoutes.SESSION);
}
@@ -29,9 +29,8 @@ class MailboxIsolateWorker {
final ThreadAPI _threadApi;
final EmailAPI _emailApi;
final Executor _isolateExecutor;
MailboxIsolateWorker(this._threadApi, this._emailApi, this._isolateExecutor);
MailboxIsolateWorker(this._threadApi, this._emailApi);
Future<List<Email>> markAsMailboxRead(
AccountId accountId,
@@ -46,7 +45,7 @@ class MailboxIsolateWorker {
totalEmailUnread,
onProgressController);
} else {
final result = await _isolateExecutor.execute(
final result = await Executor().execute(
arg1: MailboxMarkAsReadArguments(
_threadApi,
_emailApi,
@@ -70,7 +70,6 @@ class MailboxDashBoardController extends ReloadableController {
final ResponsiveUtils _responsiveUtils = Get.find<ResponsiveUtils>();
final EmailReceiveManager _emailReceiveManager = Get.find<EmailReceiveManager>();
final SearchController searchController = Get.find<SearchController>();
final Executor _isolateExecutor = Get.find<Executor>();
final DownloadController downloadController = Get.find<DownloadController>();
final MoveToMailboxInteractor _moveToMailboxInteractor;
@@ -94,7 +93,6 @@ class MailboxDashBoardController extends ReloadableController {
final composerOverlayState = ComposerOverlayState.inActive.obs;
final viewStateMarkAsReadMailbox = Rx<Either<Failure, Success>>(Right(UIState.idle));
final vacationResponse = Rxn<VacationResponse>();
Session? sessionCurrent;
Map<Role, MailboxId> mapDefaultMailboxId = {};
Map<MailboxId, PresentationMailbox> mapMailbox = {};
@@ -123,10 +121,9 @@ class MailboxDashBoardController extends ReloadableController {
@override
void onInit() {
_registerProgressState();
_registerNetworkConnectivityState();
_registerPendingEmailAddress();
_registerPendingFileInfo();
_initializeIsolateExecutor();
super.onInit();
}
@@ -134,6 +131,8 @@ class MailboxDashBoardController extends ReloadableController {
void onReady() {
log('MailboxDashBoardController::onReady()');
dispatchRoute(AppRoutes.THREAD);
_registerPendingEmailAddress();
_registerPendingFileInfo();
_setSessionCurrent();
_getUserProfile();
_getVacationResponse();
@@ -266,7 +265,7 @@ class MailboxDashBoardController extends ReloadableController {
_fileReceiveManagerStreamSubscription =
_emailReceiveManager.pendingFileInfo.stream.listen((listFile) {
log('MailboxDashBoardController::_registerPendingFileInfo(): ${listFile.length}');
if (listFile.isNotEmpty) {
if (listFile.isNotEmpty && sessionCurrent != null) {
_emailReceiveManager.clearPendingFileInfo();
final arguments = ComposerArguments(
emailActionType: EmailActionType.edit,
@@ -278,9 +277,7 @@ class MailboxDashBoardController extends ReloadableController {
});
}
void _initializeIsolateExecutor() async {
await _isolateExecutor.warmUp(log: BuildUtils.isDebugMode);
void _registerProgressState() async {
progressState.listen((state) {
viewStateMarkAsReadMailbox.value = state;
});
@@ -647,7 +644,7 @@ class MailboxDashBoardController extends ReloadableController {
_fileReceiveManagerStreamSubscription.cancel();
_connectivityStreamSubscription.cancel();
_progressStateController.close();
_isolateExecutor.dispose();
Executor().dispose();
Get.delete<DownloadController>();
super.onClose();
}
@@ -19,9 +19,8 @@ import 'package:worker_manager/worker_manager.dart';
class ThreadIsolateWorker {
final ThreadAPI _threadAPI;
final EmailAPI _emailAPI;
final Executor _isolateExecutor;
ThreadIsolateWorker(this._threadAPI, this._emailAPI, this._isolateExecutor);
ThreadIsolateWorker(this._threadAPI, this._emailAPI);
Future<List<EmailId>> emptyTrashFolder(
AccountId accountId,
@@ -31,7 +30,7 @@ class ThreadIsolateWorker {
if (BuildUtils.isWeb) {
return _emptyTrashFolderOnWeb(accountId, mailboxId, updateDestroyedEmailCache);
} else {
final result = await _isolateExecutor.execute(
final result = await Executor().execute(
arg1: EmptyTrashFolderArguments(_threadAPI, _emailAPI, accountId, mailboxId),
fun1: _emptyTrashFolderAction,
notification: (value) {
@@ -17,9 +17,8 @@ import 'package:worker_manager/worker_manager.dart' as worker;
class FileUploader {
final DioClient _dioClient;
final worker.Executor _isolateExecutor;
FileUploader(this._dioClient, this._isolateExecutor);
FileUploader(this._dioClient);
Future<Attachment?> uploadAttachment(
UploadTaskId uploadId,
@@ -36,7 +35,7 @@ class FileUploader {
uploadUri,
cancelToken: cancelToken);
} else {
final attachmentUploaded = await _isolateExecutor.execute(
final attachmentUploaded = await worker.Executor().execute(
arg1: UploadFileArguments(
_dioClient,
uploadId,
+2
View File
@@ -11,6 +11,7 @@ import 'package:tmail_ui_user/main/localizations/app_localizations_delegate.dart
import 'package:tmail_ui_user/main/localizations/localization_service.dart';
import 'package:tmail_ui_user/main/pages/app_pages.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:worker_manager/worker_manager.dart';
void main() async {
initLogger(() async {
@@ -23,6 +24,7 @@ void main() async {
));
await MainBindings().dependencies();
await HiveCacheConfig().setUp();
await Executor().warmUp();
await dotenv.load(fileName: 'env.file');
runApp(const TMailApp());
});
@@ -0,0 +1,3 @@
class BindingTag {
static const isoLateTag = 'isoLateTag';
}
@@ -13,6 +13,7 @@ import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.da
import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart';
import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart';
import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart';
import 'package:tmail_ui_user/features/login/data/network/config/authorization_isolate_interceptors.dart';
import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart';
import 'package:tmail_ui_user/features/login/data/utils/library_platform/app_auth_plugin/app_auth_plugin.dart';
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
@@ -21,7 +22,7 @@ import 'package:tmail_ui_user/features/manage_account/data/network/manage_accoun
import 'package:tmail_ui_user/features/session/data/network/session_api.dart';
import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart';
import 'package:tmail_ui_user/features/thread/data/network/thread_isolate_worker.dart';
import 'package:worker_manager/worker_manager.dart';
import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart';
class NetworkBindings extends Bindings {
@@ -45,7 +46,9 @@ class NetworkBindings extends Bindings {
void _bindingDio() {
_bindingBaseOption();
Get.put(Dio(Get.find<BaseOptions>()));
Get.put(Dio(Get.find<BaseOptions>()), tag: BindingTag.isoLateTag);
Get.put(DioClient(Get.find<Dio>()));
Get.put(DioClient(Get.find<Dio>(tag: BindingTag.isoLateTag)), tag: BindingTag.isoLateTag);
Get.put(const FlutterAppAuth());
Get.put(AppAuthWebPlugin());
Get.put(OIDCHttpClient(Get.find<DioClient>()));
@@ -55,16 +58,20 @@ class NetworkBindings extends Bindings {
void _bindingInterceptors() {
Get.put(DynamicUrlInterceptors());
Get.put(AuthorizationIsolateInterceptors());
Get.put(AuthorizationInterceptors(
Get.find<Dio>(),
Get.find<AuthenticationClientBase>(),
Get.find<TokenOidcCacheManager>(),
Get.find<AccountCacheManager>()
Get.find<AccountCacheManager>(),
));
Get.find<Dio>(tag: BindingTag.isoLateTag).interceptors.add(Get.find<DynamicUrlInterceptors>());
Get.find<Dio>(tag: BindingTag.isoLateTag).interceptors.add(Get.find<AuthorizationIsolateInterceptors>());
Get.find<Dio>().interceptors.add(Get.find<DynamicUrlInterceptors>());
Get.find<Dio>().interceptors.add(Get.find<AuthorizationInterceptors>());
if (kDebugMode) {
Get.find<Dio>().interceptors.add(LogInterceptor(requestBody: true));
Get.find<Dio>(tag: BindingTag.isoLateTag).interceptors.add(LogInterceptor(requestBody: true));
}
}
@@ -92,14 +99,11 @@ class NetworkBindings extends Bindings {
}
void _bindingIsolateWorker() {
Get.put(Executor());
Get.put(ThreadIsolateWorker(
Get.find<ThreadAPI>(),
Get.find<EmailAPI>(),
Get.find<Executor>()));
Get.find<EmailAPI>()));
Get.put(MailboxIsolateWorker(
Get.find<ThreadAPI>(),
Get.find<EmailAPI>(),
Get.find<Executor>()));
Get.find<EmailAPI>()));
}
}
+1 -1
View File
@@ -176,7 +176,7 @@ dependencies:
percent_indicator: 4.2.2
# Isolate
worker_manager: 4.4.0
worker_manager: 4.4.6
async: 2.8.2