ソースを参照

Fix share to ente upload

Neeraj Gupta 3 年 前
コミット
ca1d9388e2

+ 16 - 5
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() {

+ 3 - 1
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";

+ 3 - 1
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() {

+ 3 - 5
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<bool> deleteLocalFiles(
   final List<String> localAssetIDs = [];
   final List<String> 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<List<String>> _tryDeleteSharedMediaFiles(List<String> localIDs) {
   final List<String> 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()) {

+ 10 - 4
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();

+ 13 - 3
lib/utils/file_util.dart

@@ -86,9 +86,19 @@ Future<io.File> _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) {

+ 1 - 3
lib/utils/share_util.dart

@@ -79,9 +79,7 @@ Future<List<File>> 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;