diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml index e8dde2010845..e486f250387e 100644 --- a/.github/workflows/gradle-wrapper-validation.yml +++ b/.github/workflows/gradle-wrapper-validation.yml @@ -19,4 +19,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - uses: gradle/wrapper-validation-action@a494d935f4b56874c4a5a87d19af7afcf3a163d0 # v2.0.1 + - uses: gradle/wrapper-validation-action@85cde3f5a1033b2adc2442631c24b530f1183a1a # v2.1.0 diff --git a/app/build.gradle b/app/build.gradle index c9c7a6712379..0651fcf90092 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -340,7 +340,7 @@ dependencies { testImplementation 'junit:junit:4.13.2' testImplementation "org.mockito:mockito-core:$mockitoVersion" testImplementation "androidx.test:core:$androidxTestVersion" - testImplementation 'org.json:json:20231013' + testImplementation 'org.json:json:20240205' testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion" testImplementation 'androidx.arch.core:core-testing:2.2.0' testImplementation "io.mockk:mockk:$mockkVersion" diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt index 9c343e640c71..8c71a8b6677e 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt @@ -39,7 +39,11 @@ import com.owncloud.android.db.OCUpload import com.owncloud.android.db.UploadResult import com.owncloud.android.files.services.NameCollisionPolicy import com.owncloud.android.lib.common.network.OnDatatransferProgressListener +import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.lib.resources.files.ReadFileRemoteOperation +import com.owncloud.android.lib.resources.files.model.RemoteFile +import com.owncloud.android.utils.FileUtil import java.io.File import javax.inject.Inject @@ -255,6 +259,25 @@ class FileUploadHelper { } } + @Suppress("MagicNumber") + fun isSameFileOnRemote(user: User, localFile: File, remotePath: String, context: Context): Boolean { + // Compare remote file to local file + val localLastModifiedTimestamp = localFile.lastModified() / 1000 // remote file timestamp in milli not micro sec + val localCreationTimestamp = FileUtil.getCreationTimestamp(localFile) + val localSize: Long = localFile.length() + + val operation = ReadFileRemoteOperation(remotePath) + val result: RemoteOperationResult<*> = operation.execute(user, context) + if (result.isSuccess) { + val remoteFile = result.data[0] as RemoteFile + return remoteFile.size == localSize && + localCreationTimestamp != null && + localCreationTimestamp == remoteFile.creationTimestamp && + remoteFile.modifiedTimestamp == localLastModifiedTimestamp * 1000 + } + return false + } + class UploadNotificationActionReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val accountName = intent.getStringExtra(FileUploadWorker.EXTRA_ACCOUNT_NAME) diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt index 2397e3bed7bb..b00d3a37354f 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt @@ -259,6 +259,14 @@ class FileUploadWorker( return } + // Only notify if it is not same file on remote that causes conflict + if (uploadResult.code == ResultCode.SYNC_CONFLICT && FileUploadHelper().isSameFileOnRemote( + uploadFileOperation.user, File(uploadFileOperation.storagePath), uploadFileOperation.remotePath, context + ) + ) { + return + } + val notDelayed = uploadResult.code !in setOf( ResultCode.DELAYED_FOR_WIFI, ResultCode.DELAYED_FOR_CHARGING, diff --git a/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java b/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java index acc9dc9cd79a..be3fdf15e1dc 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java @@ -34,6 +34,7 @@ import com.nextcloud.client.account.CurrentAccountProvider; import com.nextcloud.client.account.User; +import com.nextcloud.client.jobs.upload.FileUploadHelper; import com.nextcloud.client.jobs.upload.FileUploadWorker; import com.owncloud.android.MainApp; import com.owncloud.android.db.OCUpload; @@ -44,6 +45,7 @@ import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.operations.UploadFileOperation; +import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -737,6 +739,25 @@ public void updateDatabaseUploadResult(RemoteOperationResult uploadResult, Uploa upload.getRemotePath(), localPath ); + } else if (uploadResult.getCode() == RemoteOperationResult.ResultCode.SYNC_CONFLICT && + new FileUploadHelper().isSameFileOnRemote( + upload.getUser(), new File(upload.getStoragePath()), upload.getRemotePath(), upload.getContext())) { + + updateUploadStatus( + upload.getOCUploadId(), + UploadStatus.UPLOAD_SUCCEEDED, + UploadResult.SAME_FILE_CONFLICT, + upload.getRemotePath(), + localPath + ); + } else if (uploadResult.getCode() == RemoteOperationResult.ResultCode.LOCAL_FILE_NOT_FOUND) { + updateUploadStatus( + upload.getOCUploadId(), + UploadStatus.UPLOAD_SUCCEEDED, + UploadResult.FILE_NOT_FOUND, + upload.getRemotePath(), + localPath + ); } else { updateUploadStatus( upload.getOCUploadId(), diff --git a/app/src/main/java/com/owncloud/android/db/UploadResult.java b/app/src/main/java/com/owncloud/android/db/UploadResult.java index 17533f0413be..919be585cb19 100644 --- a/app/src/main/java/com/owncloud/android/db/UploadResult.java +++ b/app/src/main/java/com/owncloud/android/db/UploadResult.java @@ -45,7 +45,8 @@ public enum UploadResult { SYNC_CONFLICT(19), CANNOT_CREATE_FILE(20), LOCAL_STORAGE_NOT_COPIED(21), - QUOTA_EXCEEDED(22); + QUOTA_EXCEEDED(22), + SAME_FILE_CONFLICT(23); private final int value; @@ -107,6 +108,8 @@ public static UploadResult fromValue(int value) { return LOCAL_STORAGE_NOT_COPIED; case 22: return QUOTA_EXCEEDED; + case 23: + return SAME_FILE_CONFLICT; } return UNKNOWN; } diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java index 5012cd15f5d1..3a5e26fc9732 100755 --- a/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java @@ -29,6 +29,7 @@ import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.net.Uri; import android.text.format.DateUtils; @@ -259,6 +260,7 @@ public void onBindViewHolder(SectionedViewHolder holder, int section, int relati itemViewHolder.binding.uploadRemotePath.setVisibility(View.VISIBLE); itemViewHolder.binding.uploadFileSize.setVisibility(View.VISIBLE); itemViewHolder.binding.uploadStatus.setVisibility(View.VISIBLE); + itemViewHolder.binding.uploadStatus.setTypeface(null, Typeface.NORMAL); itemViewHolder.binding.uploadProgressBar.setVisibility(View.GONE); // Update information depending of upload details @@ -300,6 +302,15 @@ public void onBindViewHolder(SectionedViewHolder holder, int section, int relati case UPLOAD_FAILED -> itemViewHolder.binding.uploadDate.setVisibility(View.GONE); case UPLOAD_SUCCEEDED -> itemViewHolder.binding.uploadStatus.setVisibility(View.GONE); } + + // show status if same file conflict or local file deleted + if (item.getUploadStatus() == UploadStatus.UPLOAD_SUCCEEDED && item.getLastResult() != UploadResult.UPLOADED){ + itemViewHolder.binding.uploadStatus.setVisibility(View.VISIBLE); + itemViewHolder.binding.uploadStatus.setTypeface(null, Typeface.BOLD); + itemViewHolder.binding.uploadDate.setVisibility(View.GONE); + itemViewHolder.binding.uploadFileSize.setVisibility(View.GONE); + } + itemViewHolder.binding.uploadStatus.setText(status); // bind listeners to perform actions @@ -612,7 +623,13 @@ private String getStatusText(OCUpload upload) { break; case UPLOAD_SUCCEEDED: - status = parentActivity.getString(R.string.uploads_view_upload_status_succeeded); + if (upload.getLastResult() == UploadResult.SAME_FILE_CONFLICT){ + status = parentActivity.getString(R.string.uploads_view_upload_status_succeeded_same_file); + }else if (upload.getLastResult() == UploadResult.FILE_NOT_FOUND) { + status = getUploadFailedStatusText(upload.getLastResult()); + } else { + status = parentActivity.getString(R.string.uploads_view_upload_status_succeeded); + } break; case UPLOAD_FAILED: diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8ba77bc10d47..28509ebd0180 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -153,6 +153,7 @@ Failed/pending restart Uploaded Completed + Same file found on remote, skipping upload Cancelled Connection error Credentials error diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys index 1c1a83bfc79d..2095a4621aed 100644 --- a/gradle/verification-keyring.keys +++ b/gradle/verification-keyring.keys @@ -5069,6 +5069,40 @@ D78JpXJRgHL1vib++Q== =dGtv -----END PGP PUBLIC KEY BLOCK----- +pub 2D6641C6AF88103E +uid Maven Central Java.net import (Used to sign artifacts imported from Java.net repos) + +sub 376179DC810188ED +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBEvHiBERBACWsrXr/oU5TYqCoX2pGlKVop38NX9/klFswZue0YMrAlEP3cid +nQS7TYgEbUUIe25FFX7EsaiLoBDO0xKDcbO21vddThcBwF/cTwVrBvHThMECI1jX +BUthK1UHgtn4JgFCmRSg8YVvG7jd2EU+TetdLiagwqF5aJpW8HlYjlkWZwCguQwG +tsB0aNyAM47PEmaPdRsqd3sEAIyLOe6UdvuZaS45j0oNp35llY/FzXATI9cZJu8B +HBjPtadKSkHUqiGoY1GFWw+DJXAwGiVuISOuiIzj9V7JYRDPmm5KMQphU9Wt66Vo +dLB5821lg1aLsLxwT08q7lPsbfkdzpV6IEs6Xpjiixc36T3wtW/USLhKkSwhPMeJ +EWJfA/9wq71QBxjDqOVtfddX6lCBaLP22SSZ0UIfkL3cPKFu1BlHqm1W4g/TtppQ +i50NLN820IRDsZFQYK/c3e6uX1je5ovsro4C4mtex0e1Z1TULVeVooAnX/yjK8CF +Ftggucz0ti56cqpfjhpbn1JtVJdrZ9V4vc97qOXoyRxx/v4sa7RtTWF2ZW4gQ2Vu +dHJhbCBKYXZhLm5ldCBpbXBvcnQgKFVzZWQgdG8gc2lnbiBhcnRpZmFjdHMgaW1w +b3J0ZWQgZnJvbSBKYXZhLm5ldCByZXBvcykgPHJlcG9zaXRvcnlAc29uYXR5cGUu +Y29tPrkCDQRLx4gYEAgArRqEyhMVJS+IzyZkNirv++XDskoFFWbMF1u3xmBNGeZo +vmuXdsfonVaYjGIW3KU/RfHzyaHwe2DWnPXkz1duRD3ZU4FwIWLaZhEm9I1Uf+B+ +6rUYj8u1ZUk/P6pY1m0ADPbrj1TS13HAyX8QoKm4qjaqMTtgheCJ05GIsqeqSk3R +9GWEE2WPoO5IiUh8iy/xK+poufNVxRJUeMD6rn7WfK3pmtPF55elPVJnCiEnUBkm +pcdfCo/bAp9u/0MbGkFunXvs0kwi7AK8DilC1JT7htsbWkLWN7kBcHNlt8sjMlge +gEku0f7pOrlabVTydHL36bmAQwxN14NfgDJKG8fh/wADBQf/TfAnCFsHoQ8rig70 +zMQ16YSSHL0nrzAID/44Db5kji7+iD9P7a4jZd/nyIqzKeeJOqfN4t+F5xVgmdc0 +335JRRsIzsa0t3VE0+6yjEDAueBJvjyZtxKlBgDMUXR0h2TFxTCekN0BYnmkjVhL +xhuOvkUNNwff0JRlTMBTd7q1ImYF00xUoo4YCd0X++VsviduNT3rS/G9OIbqwswj +de+XKTraowpbRADse5HFPfZNbB1qJdWWY1CZC0JCVKwZ8rVpHWqmxK6H8JKqJwt1 +XGw6pHhkkeBCaeh/JVY9N0jLMBWUATJdvQqPcR6sb25co9UkNXpEOCrRnzjsyVj5 +++jlQYhJBBgRAgAJBQJLx4gYAhsMAAoJEC1mQcaviBA+FSUAnR5Xi/qPEHd1cXSp +wdAqGKwCen3WAJwIsFD8tHGarvnRqo0ij3FERxwR3A== +=TljG +-----END PGP PUBLIC KEY BLOCK----- + pub 347CD0EAED975C5F uid Eric Vergnaud @@ -5214,6 +5248,111 @@ q/tSGRQHXTwG53qejlUtKI315ZizOhJiniSDx4fZaK2zB9RlZkrnd1Y= =KPJF -----END PGP PUBLIC KEY BLOCK----- +pub 36F224409991B46C +uid Lukhnos Liu + +sub AA1C6859520DE0B7 +sub D137C32FD6897607 +sub 4F91D100EB1F597B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +BRj7Sg== +=lSNM +-----END PGP PUBLIC KEY BLOCK----- + pub 379CE192D401AB61 uid Bintray (by JFrog) diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 6218f14a9085..21d6433ab0ff 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -8,7 +8,6 @@ - @@ -118,6 +117,7 @@ + @@ -134,6 +134,7 @@ + @@ -245,6 +246,7 @@ + @@ -270,6 +272,7 @@ + @@ -3061,6 +3064,14 @@ + + + + + + + +