diff --git a/lib/core/configuration.dart b/lib/core/configuration.dart index 4bbb41bbf..fb80df333 100644 --- a/lib/core/configuration.dart +++ b/lib/core/configuration.dart @@ -76,7 +76,12 @@ class Configuration { FlutterSecureStorage _secureStorage; String _tempDirectory; String _thumbnailCacheDirectory; - String _sharedMediaDirectory; + // 6th July 22: Remove this after 3 months. Hopefully, active users + // will migrate to newer version of the app, where shared media is stored + // on appSupport directory which OS won't clean up automatically + String _sharedTempMediaDirectory; + + String _sharedDocumentsMediaDirectory; String _volatilePassword; final _secureStorageOptionsIOS = @@ -106,8 +111,10 @@ class Configuration { var tempDirectoryPath = (await getTemporaryDirectory()).path; _thumbnailCacheDirectory = tempDirectoryPath + "/thumbnail-cache"; io.Directory(_thumbnailCacheDirectory).createSync(recursive: true); - _sharedMediaDirectory = tempDirectoryPath + "/ente-shared-media"; - io.Directory(_sharedMediaDirectory).createSync(recursive: true); + _sharedTempMediaDirectory = tempDirectoryPath + "/ente-shared-media"; + io.Directory(_sharedTempMediaDirectory).createSync(recursive: true); + _sharedDocumentsMediaDirectory = _documentsDirectory + "/ente-shared-media"; + io.Directory(_sharedDocumentsMediaDirectory).createSync(recursive: true); if (!_preferences.containsKey(tokenKey)) { await _secureStorage.deleteAll(iOptions: _secureStorageOptionsIOS); } else { @@ -470,8 +477,12 @@ class Configuration { return _thumbnailCacheDirectory; } - String getSharedMediaCacheDirectory() { - return _sharedMediaDirectory; + String getOldSharedMediaCacheDirectory() { + return _sharedTempMediaDirectory; + } + + String getSharedMediaDirectory() { + return _sharedDocumentsMediaDirectory; } bool hasConfiguredAccount() { diff --git a/lib/core/constants.dart b/lib/core/constants.dart index 359fc317e..cc3a2c8ff 100644 --- a/lib/core/constants.dart +++ b/lib/core/constants.dart @@ -15,7 +15,9 @@ const int kGalleryLoadStartTime = -8000000000000000; // Wednesday, March 6, 1748 const int kGalleryLoadEndTime = 9223372036854775807; // 2^63 -1 // used to identify which ente file are available in app cache -const String kSharedMediaIdentifier = 'ente-shared://'; +// todo: 6Jun22: delete old media identifier after 3 months +const String kOldSharedMediaIdentifier = 'ente-shared://'; +const String kSharedMediaIdentifier = 'ente-shared-media://'; const int kMaxLivePhotoToastCount = 2; const String kLivePhotoToastCounterKey = "show_live_photo_toast"; diff --git a/lib/models/file.dart b/lib/models/file.dart index ccda02d34..226396bc0 100644 --- a/lib/models/file.dart +++ b/lib/models/file.dart @@ -222,7 +222,9 @@ class File { } bool isSharedMediaToAppSandbox() { - return localID != null && localID.startsWith(kSharedMediaIdentifier); + return localID != null && + (localID.startsWith(kOldSharedMediaIdentifier) || + localID.startsWith(kSharedMediaIdentifier)); } bool hasLocation() { diff --git a/lib/utils/delete_file_util.dart b/lib/utils/delete_file_util.dart index 1c1d359d1..885774184 100644 --- a/lib/utils/delete_file_util.dart +++ b/lib/utils/delete_file_util.dart @@ -7,7 +7,6 @@ import 'package:device_info/device_info.dart'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; import 'package:photo_manager/photo_manager.dart'; -import 'package:photos/core/configuration.dart'; import 'package:photos/core/constants.dart'; import 'package:photos/core/event_bus.dart'; import 'package:photos/db/files_db.dart'; @@ -309,7 +308,8 @@ Future deleteLocalFiles( final List localAssetIDs = []; final List localSharedMediaIDs = []; for (String id in localIDs) { - if (id.startsWith(kSharedMediaIdentifier)) { + if (id.startsWith(kOldSharedMediaIdentifier) || + id.startsWith(kSharedMediaIdentifier)) { localSharedMediaIDs.add(id); } else { localAssetIDs.add(id); @@ -434,9 +434,7 @@ Future> _tryDeleteSharedMediaFiles(List localIDs) { final List actuallyDeletedIDs = []; try { return Future.forEach(localIDs, (id) async { - String localPath = Configuration.instance.getSharedMediaCacheDirectory() + - "/" + - id.replaceAll(kSharedMediaIdentifier, ''); + String localPath = getSharedMediaPathFromLocalID(id); try { // verify the file exists as the OS may have already deleted it from cache if (io.File(localPath).existsSync()) { diff --git a/lib/utils/file_uploader.dart b/lib/utils/file_uploader.dart index 2b523b098..e7348b09e 100644 --- a/lib/utils/file_uploader.dart +++ b/lib/utils/file_uploader.dart @@ -344,6 +344,7 @@ class FileUploader { (_isBackground ? "_bg" : "") + ".encrypted"; MediaUploadData mediaUploadData; + var uploadCompleted = false; try { _logger.info( @@ -463,6 +464,7 @@ class FileUploader { Bus.instance.fire(LocalPhotosUpdatedEvent([remoteFile])); } _logger.info("File upload complete for " + remoteFile.toString()); + uploadCompleted = true; return remoteFile; } catch (e, s) { if (!(e is NoActiveSubscriptionError || @@ -474,10 +476,14 @@ class FileUploader { } rethrow; } finally { - if (io.Platform.isIOS && - mediaUploadData != null && - mediaUploadData.sourceFile != null) { - await mediaUploadData.sourceFile.delete(); + if (mediaUploadData != null && mediaUploadData.sourceFile != null) { + // delete the file from app's internal cache if it was copied to app + // for upload. Shared Media should only be cleared when the upload + // succeeds. + if (io.Platform.isIOS || + (uploadCompleted && file.isSharedMediaToAppSandbox())) { + await mediaUploadData.sourceFile.delete(); + } } if (io.File(encryptedFilePath).existsSync()) { await io.File(encryptedFilePath).delete(); diff --git a/lib/utils/file_util.dart b/lib/utils/file_util.dart index 25fcd8134..b1ed5575e 100644 --- a/lib/utils/file_util.dart +++ b/lib/utils/file_util.dart @@ -86,9 +86,19 @@ Future _getLocalDiskFile( } String getSharedMediaFilePath(ente.File file) { - return Configuration.instance.getSharedMediaCacheDirectory() + - "/" + - file.localID.replaceAll(kSharedMediaIdentifier, ''); + return getSharedMediaPathFromLocalID(file.localID); +} + +String getSharedMediaPathFromLocalID(String localID) { + if (localID.startsWith(kOldSharedMediaIdentifier)) { + return Configuration.instance.getOldSharedMediaCacheDirectory() + + "/" + + localID.replaceAll(kOldSharedMediaIdentifier, ''); + } else { + return Configuration.instance.getSharedMediaDirectory() + + "/" + + localID.replaceAll(kSharedMediaIdentifier, ''); + } } void preloadThumbnail(ente.File file) { diff --git a/lib/utils/share_util.dart b/lib/utils/share_util.dart index b9404890e..fc91fb043 100644 --- a/lib/utils/share_util.dart +++ b/lib/utils/share_util.dart @@ -79,9 +79,7 @@ Future> convertIncomingSharedMediaToFile( enteFile.title = basename(media.path); var ioFile = dartio.File(media.path); ioFile = ioFile.renameSync( - Configuration.instance.getSharedMediaCacheDirectory() + - "/" + - enteFile.title, + Configuration.instance.getSharedMediaDirectory() + "/" + enteFile.title, ); enteFile.localID = kSharedMediaIdentifier + enteFile.title; enteFile.collectionID = collectionID;