Przeglądaj źródła

Merge pull request #9884 from nextcloud/creationTime

Correct handling of creation timestamp
Álvaro Brey 3 lat temu
rodzic
commit
3383a6781a

+ 7 - 4
src/androidTest/java/com/owncloud/android/UploadIT.java

@@ -426,6 +426,13 @@ public class UploadIT extends AbstractOnServerIT {
         String remotePath = "/testFile.txt";
         OCUpload ocUpload = new OCUpload(file.getAbsolutePath(), remotePath, account.name);
 
+        long creationTimestamp = Files.readAttributes(file.toPath(), BasicFileAttributes.class)
+            .creationTime()
+            .to(TimeUnit.SECONDS);
+
+        // wait a bit to simulate a later upload, so we can verify if creation date is set correct
+        shortSleep();
+
         assertTrue(
             new UploadFileOperation(
                 uploadsStorageManager,
@@ -446,10 +453,6 @@ public class UploadIT extends AbstractOnServerIT {
                 .isSuccess()
                   );
 
-        long creationTimestamp = Files.readAttributes(file.toPath(), BasicFileAttributes.class)
-            .creationTime()
-            .to(TimeUnit.SECONDS);
-
         long uploadTimestamp = System.currentTimeMillis() / 1000;
 
         // RefreshFolderOperation

+ 15 - 8
src/main/java/com/owncloud/android/operations/UploadFileOperation.java

@@ -61,6 +61,7 @@ import com.owncloud.android.lib.resources.files.model.RemoteFile;
 import com.owncloud.android.operations.common.SyncOperation;
 import com.owncloud.android.utils.EncryptionUtils;
 import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.FileUtil;
 import com.owncloud.android.utils.MimeType;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.UriUtils;
@@ -512,8 +513,9 @@ public class UploadFileOperation extends SyncOperation {
             }
 
             // Get the last modification date of the file from the file system
-            Long timeStampLong = originalFile.lastModified() / 1000;
-            String timeStamp = timeStampLong.toString();
+            String lastModifiedTimestamp = Long.toString(originalFile.lastModified() / 1000);
+
+            Long creationTimestamp = FileUtil.getCreationTimestamp(originalFile);
 
             /***** E2E *****/
 
@@ -586,9 +588,10 @@ public class UploadFileOperation extends SyncOperation {
                                                                         mFile.getParentRemotePath() + encryptedFileName,
                                                                         mFile.getMimeType(),
                                                                         mFile.getEtagInConflict(),
-                                                                        timeStamp,
+                                                                        lastModifiedTimestamp,
                                                                         onWifiConnection,
                                                                         token,
+                                                                        creationTimestamp,
                                                                         mDisableRetries
                 );
             } else {
@@ -596,7 +599,8 @@ public class UploadFileOperation extends SyncOperation {
                                                                  mFile.getParentRemotePath() + encryptedFileName,
                                                                  mFile.getMimeType(),
                                                                  mFile.getEtagInConflict(),
-                                                                 timeStamp,
+                                                                 lastModifiedTimestamp,
+                                                                 creationTimestamp,
                                                                  token,
                                                                  mDisableRetries
                 );
@@ -776,8 +780,9 @@ public class UploadFileOperation extends SyncOperation {
             }
 
             // Get the last modification date of the file from the file system
-            Long timeStampLong = originalFile.lastModified() / 1000;
-            String timeStamp = timeStampLong.toString();
+            String lastModifiedTimestamp = Long.toString(originalFile.lastModified() / 1000);
+
+            final Long creationTimestamp = FileUtil.getCreationTimestamp(originalFile);
 
             FileChannel channel = null;
             try {
@@ -826,7 +831,8 @@ public class UploadFileOperation extends SyncOperation {
                                                                         mFile.getRemotePath(),
                                                                         mFile.getMimeType(),
                                                                         mFile.getEtagInConflict(),
-                                                                        timeStamp,
+                                                                        lastModifiedTimestamp,
+                                                                        creationTimestamp,
                                                                         onWifiConnection,
                                                                         mDisableRetries);
             } else {
@@ -834,7 +840,8 @@ public class UploadFileOperation extends SyncOperation {
                                                                  mFile.getRemotePath(),
                                                                  mFile.getMimeType(),
                                                                  mFile.getEtagInConflict(),
-                                                                 timeStamp,
+                                                                 lastModifiedTimestamp,
+                                                                 creationTimestamp,
                                                                  mDisableRetries);
             }
 

+ 2 - 0
src/main/java/com/owncloud/android/providers/DocumentsStorageProvider.java

@@ -72,6 +72,7 @@ import com.owncloud.android.operations.RemoveFileOperation;
 import com.owncloud.android.operations.RenameFileOperation;
 import com.owncloud.android.ui.activity.SettingsActivity;
 import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.FileUtil;
 import com.owncloud.android.utils.MimeTypeUtil;
 
 import org.nextcloud.providers.cursors.FileCursor;
@@ -538,6 +539,7 @@ public class DocumentsStorageProvider extends DocumentsProvider {
                                                                      mimeType,
                                                                      "",
                                                                      String.valueOf(System.currentTimeMillis() / 1000),
+                                                                     FileUtil.getCreationTimestamp(emptyFile),
                                                                      false)
             .execute(client);
 

+ 25 - 0
src/main/java/com/owncloud/android/utils/FileUtil.java

@@ -20,9 +20,17 @@
 
 package com.owncloud.android.utils;
 
+import android.os.Build;
 import android.text.TextUtils;
 
+import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.lib.resources.files.UploadFileRemoteOperation;
+
 import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.concurrent.TimeUnit;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -52,4 +60,21 @@ public final class FileUtil {
             return "";
         }
     }
+
+    public static @Nullable
+    Long getCreationTimestamp(File file) {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+            return null;
+        }
+
+        try {
+            return Files.readAttributes(file.toPath(), BasicFileAttributes.class)
+                .creationTime()
+                .to(TimeUnit.SECONDS);
+        } catch (IOException e) {
+            Log_OC.e(UploadFileRemoteOperation.class.getSimpleName(),
+                     "Failed to read creation timestamp for file: " + file.getName());
+            return null;
+        }
+    }
 }