From 6acf3843e24f330c8886568488b1116527dec3f0 Mon Sep 17 00:00:00 2001 From: Vincent Te Date: Fri, 1 May 2026 14:16:10 +0200 Subject: [PATCH 1/3] fix: On Xiaomi phone, lastModified is wrong so we fallback on the current time --- .../java/com/infomaniak/drive/data/api/ApiRepository.kt | 3 ++- .../main/java/com/infomaniak/drive/data/api/UploadTask.kt | 7 +++---- .../java/com/infomaniak/drive/data/models/UploadFile.kt | 8 +++++++- .../com/infomaniak/drive/data/services/UploadWorker.kt | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/infomaniak/drive/data/api/ApiRepository.kt b/app/src/main/java/com/infomaniak/drive/data/api/ApiRepository.kt index 0972f65ae2..ef86d3d1ea 100644 --- a/app/src/main/java/com/infomaniak/drive/data/api/ApiRepository.kt +++ b/app/src/main/java/com/infomaniak/drive/data/api/ApiRepository.kt @@ -66,6 +66,7 @@ import com.infomaniak.drive.data.models.upload.UploadSession.StartUploadSession import com.infomaniak.drive.data.models.upload.ValidChunks import com.infomaniak.drive.utils.AccountUtils import okhttp3.OkHttpClient +import java.util.Date import com.infomaniak.core.auth.networking.HttpClient.okHttpClientLongTimeoutWithTokenInterceptor as okHttpClientLongTimeout import com.infomaniak.core.ksuite.myksuite.ui.network.ApiRoutes as MyKSuiteApiRoutes @@ -242,7 +243,7 @@ object ApiRepository : ApiRepositoryCore() { conflictOption = ConflictOption.RENAME, directoryPath = remoteSubFolder, createdAt = uploadFile.fileCreatedAt, - lastModifiedAt = uploadFile.fileModifiedAt, + lastModifiedAt = Date(uploadFile.getLastModified()), ) ApiController.callApi>(uploadUrl, POST) diff --git a/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt b/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt index 619977ce04..149086eaab 100644 --- a/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt +++ b/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt @@ -79,6 +79,7 @@ import splitties.experimental.ExperimentalSplittiesApi import java.io.FileNotFoundException import java.io.IOException import java.io.InputStream +import java.util.Date import kotlin.concurrent.atomics.AtomicLong import kotlin.concurrent.atomics.ExperimentalAtomicApi import kotlin.concurrent.atomics.minusAssign @@ -170,7 +171,7 @@ class UploadTask( fileSize = uploadFile.fileSize, conflictOption = uploadFile.uploadConflictOption(), createdAt = uploadFile.fileCreatedAt, - lastModifiedAt = uploadFile.fileModifiedAt, + lastModifiedAt = Date(uploadFile.getLastModified()), ) uploadChunkUnchecked(inputStream, httpClient, url = url, length = uploadFile.fileSize) } @@ -459,14 +460,12 @@ class UploadTask( } private fun UploadFile.prepareUploadSession(totalChunks: Int): String? { - val currentTimeMillis = System.currentTimeMillis() - val lastModifiedAt = if (fileModifiedAt.time > currentTimeMillis) currentTimeMillis else fileModifiedAt.time val sessionBody = UploadSession.StartSessionBody( conflict = uploadConflictOption(), createdAt = if (fileCreatedAt == null) null else fileCreatedAt!!.time / 1_000L, directoryId = remoteFolder, fileName = fileName, - lastModifiedAt = lastModifiedAt / 1_000L, + lastModifiedAt = getLastModified(), subDirectoryPath = remoteSubFolder ?: "", totalChunks = totalChunks, totalSize = fileSize, diff --git a/app/src/main/java/com/infomaniak/drive/data/models/UploadFile.kt b/app/src/main/java/com/infomaniak/drive/data/models/UploadFile.kt index 97bc26bcd3..fa14ab2953 100644 --- a/app/src/main/java/com/infomaniak/drive/data/models/UploadFile.kt +++ b/app/src/main/java/com/infomaniak/drive/data/models/UploadFile.kt @@ -78,7 +78,7 @@ open class UploadFile( fun isSchemeFile() = getUriObject().scheme.equals(ContentResolver.SCHEME_FILE) fun createSubFolder(parent: String, createDatedSubFolders: Boolean) { - remoteSubFolder = parent + if (createDatedSubFolders) "/${fileModifiedAt.format("yyyy/MM")}" else "" + remoteSubFolder = parent + if (createDatedSubFolders) "/${Date(getLastModified()).format("yyyy/MM")}" else "" } fun store(coroutineContext: CoroutineContext = EmptyCoroutineContext, customRealm: Realm? = null) { @@ -154,6 +154,12 @@ open class UploadFile( } } + fun getLastModified(): Long { + val currentTimeMillis = System.currentTimeMillis() + val lastModifiedAt = if (fileModifiedAt.time > currentTimeMillis) currentTimeMillis else fileModifiedAt.time + return lastModifiedAt / 1_000L + } + private fun deleteIfExistsInternal(keepFile: Boolean = false, realm: Realm) { val uploadFileProxy = uploadFileByUriQuery(realm, uri).findFirst() ?: return // Cancel session if exists diff --git a/app/src/main/java/com/infomaniak/drive/data/services/UploadWorker.kt b/app/src/main/java/com/infomaniak/drive/data/services/UploadWorker.kt index 1cca3bbef8..a7a4630968 100644 --- a/app/src/main/java/com/infomaniak/drive/data/services/UploadWorker.kt +++ b/app/src/main/java/com/infomaniak/drive/data/services/UploadWorker.kt @@ -419,7 +419,7 @@ class UploadWorker(appContext: Context, params: WorkerParameters) : CoroutineWor deleteIfExists(keepFile = isSync()) // If is an ACTION_OPEN_DOCUMENT exception and the file is older than August 17, 2022 we ignore sentry - if (fileModifiedAt < Date(1660736262000) && exception.message?.contains("ACTION_OPEN_DOCUMENT") == true) return + if (Date(getLastModified()) < Date(1660736262000) && exception.message?.contains("ACTION_OPEN_DOCUMENT") == true) return if (exception !is IllegalStateException) Sentry.captureException(exception) } From 3cb270cbf1d83805333b99a35c92747c6c06137d Mon Sep 17 00:00:00 2001 From: Vincent Te Date: Fri, 1 May 2026 14:25:51 +0200 Subject: [PATCH 2/3] chore: Remove conversion to seconds --- .../main/java/com/infomaniak/drive/data/models/UploadFile.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/infomaniak/drive/data/models/UploadFile.kt b/app/src/main/java/com/infomaniak/drive/data/models/UploadFile.kt index fa14ab2953..b224aa7482 100644 --- a/app/src/main/java/com/infomaniak/drive/data/models/UploadFile.kt +++ b/app/src/main/java/com/infomaniak/drive/data/models/UploadFile.kt @@ -157,7 +157,7 @@ open class UploadFile( fun getLastModified(): Long { val currentTimeMillis = System.currentTimeMillis() val lastModifiedAt = if (fileModifiedAt.time > currentTimeMillis) currentTimeMillis else fileModifiedAt.time - return lastModifiedAt / 1_000L + return lastModifiedAt } private fun deleteIfExistsInternal(keepFile: Boolean = false, realm: Realm) { From 36bc4b9582cb2c024a1cb5c05ae1ffc136b41f46 Mon Sep 17 00:00:00 2001 From: Vincent Te Date: Fri, 1 May 2026 14:33:03 +0200 Subject: [PATCH 3/3] chore: Code review --- app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt b/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt index 149086eaab..caaf8e384f 100644 --- a/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt +++ b/app/src/main/java/com/infomaniak/drive/data/api/UploadTask.kt @@ -465,7 +465,7 @@ class UploadTask( createdAt = if (fileCreatedAt == null) null else fileCreatedAt!!.time / 1_000L, directoryId = remoteFolder, fileName = fileName, - lastModifiedAt = getLastModified(), + lastModifiedAt = getLastModified() / 1_000L, subDirectoryPath = remoteSubFolder ?: "", totalChunks = totalChunks, totalSize = fileSize,