diff --git a/mobile/assets/i18n/en-US.json b/mobile/assets/i18n/en-US.json index 3d1fb4e4d6f3e..9dbe49589f75c 100644 --- a/mobile/assets/i18n/en-US.json +++ b/mobile/assets/i18n/en-US.json @@ -252,9 +252,10 @@ "home_page_share_err_local": "Can not share local assets via link, skipping", "home_page_upload_err_limit": "Can only upload a maximum of 30 assets at a time, skipping", "image_saved_successfully": "Image saved", - "image_viewer_page_state_provider_download_error": "Download Error", - "image_viewer_page_state_provider_download_started": "Download Started", - "image_viewer_page_state_provider_download_success": "Download Success", + "download_error": "Download Error", + "download_started": "Download started", + "download_sucess": "Download success", + "download_sucess_android": "The media has been downloaded to DCIM/Immich", "image_viewer_page_state_provider_share_error": "Share Error", "invalid_date": "Invalid date", "invalid_date_format": "Invalid date format", @@ -585,4 +586,4 @@ "viewer_remove_from_stack": "Remove from Stack", "viewer_stack_use_as_main_asset": "Use as Main Asset", "viewer_unstack": "Un-Stack" -} \ No newline at end of file +} diff --git a/mobile/lib/providers/asset_viewer/image_viewer_page_state.provider.dart b/mobile/lib/providers/asset_viewer/image_viewer_page_state.provider.dart index ee45e6bc5e56b..631011f200bbd 100644 --- a/mobile/lib/providers/asset_viewer/image_viewer_page_state.provider.dart +++ b/mobile/lib/providers/asset_viewer/image_viewer_page_state.provider.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; @@ -31,19 +33,21 @@ class ImageViewerStateNotifier extends StateNotifier { ImmichToast.show( context: context, - msg: 'image_viewer_page_state_provider_download_started'.tr(), + msg: 'download_started'.tr(), toastType: ToastType.info, gravity: ToastGravity.BOTTOM, ); - bool isSuccess = await _imageViewerService.downloadAssetToDevice(asset); + bool isSuccess = await _imageViewerService.downloadAsset(asset); if (isSuccess) { state = state.copyWith(downloadAssetStatus: DownloadAssetStatus.success); ImmichToast.show( context: context, - msg: 'image_viewer_page_state_provider_download_success'.tr(), + msg: Platform.isAndroid + ? 'download_sucess_android'.tr() + : 'download_sucess'.tr(), toastType: ToastType.success, gravity: ToastGravity.BOTTOM, ); @@ -52,7 +56,7 @@ class ImageViewerStateNotifier extends StateNotifier { state = state.copyWith(downloadAssetStatus: DownloadAssetStatus.error); ImmichToast.show( context: context, - msg: 'image_viewer_page_state_provider_download_error'.tr(), + msg: 'download_error'.tr(), toastType: ToastType.error, gravity: ToastGravity.BOTTOM, ); diff --git a/mobile/lib/services/image_viewer.service.dart b/mobile/lib/services/image_viewer.service.dart index e61573af379ae..9bcaba1d26b95 100644 --- a/mobile/lib/services/image_viewer.service.dart +++ b/mobile/lib/services/image_viewer.service.dart @@ -19,7 +19,7 @@ class ImageViewerService { ImageViewerService(this._apiService); - Future downloadAssetToDevice(Asset asset) async { + Future downloadAsset(Asset asset) async { File? imageFile; File? videoFile; try { @@ -82,18 +82,23 @@ class ImageViewerService { } final AssetEntity? entity; + final relativePath = Platform.isAndroid ? 'DCIM/Immich' : null; if (asset.isImage) { entity = await PhotoManager.editor.saveImage( res.bodyBytes, title: asset.fileName, + relativePath: relativePath, ); } else { final tempDir = await getTemporaryDirectory(); videoFile = await File('${tempDir.path}/${asset.fileName}').create(); videoFile.writeAsBytesSync(res.bodyBytes); - entity = await PhotoManager.editor - .saveVideo(videoFile, title: asset.fileName); + entity = await PhotoManager.editor.saveVideo( + videoFile, + title: asset.fileName, + relativePath: relativePath, + ); } return entity != null; } diff --git a/mobile/lib/widgets/asset_viewer/gallery_app_bar.dart b/mobile/lib/widgets/asset_viewer/gallery_app_bar.dart index fde0d2e82d617..6de8f5da33944 100644 --- a/mobile/lib/widgets/asset_viewer/gallery_app_bar.dart +++ b/mobile/lib/widgets/asset_viewer/gallery_app_bar.dart @@ -93,6 +93,10 @@ class GalleryAppBar extends ConsumerWidget { ); } + handleDownloadAsset() { + ref.read(imageViewerStateProvider.notifier).downloadAsset(asset, context); + } + return IgnorePointer( ignoring: !ref.watch(showControlsProvider), child: AnimatedOpacity( @@ -109,13 +113,7 @@ class GalleryAppBar extends ConsumerWidget { onFavorite: toggleFavorite, onRestorePressed: () => handleRestore(asset), onUploadPressed: asset.isLocal ? () => handleUpload(asset) : null, - onDownloadPressed: asset.isLocal - ? null - : () => - ref.read(imageViewerStateProvider.notifier).downloadAsset( - asset, - context, - ), + onDownloadPressed: asset.isLocal ? null : handleDownloadAsset, onToggleMotionVideo: onToggleMotionVideo, onAddToAlbumPressed: () => addToAlbum(asset), onActivitiesPressed: handleActivities,