Skip to content

Commit ea217f9

Browse files
Merge branch 'cryptomator:develop' into feature/thumbnail-playground
2 parents 8a2b3d6 + 45f7d0e commit ea217f9

File tree

60 files changed

+1956
-209
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+1956
-209
lines changed

data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxCloudNodeFactory.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import com.dropbox.core.v2.files.Metadata
77
internal object DropboxCloudNodeFactory {
88

99
fun from(parent: DropboxFolder, metadata: FileMetadata): DropboxFile {
10-
return DropboxFile(parent, metadata.name, metadata.pathDisplay, metadata.size, metadata.serverModified)
10+
return DropboxFile(parent, metadata.name, metadata.pathDisplay, metadata.size, metadata.clientModified)
1111
}
1212

1313
@JvmStatic

data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxImpl.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import org.cryptomator.util.file.LruFileCacheUtil.Companion.retrieveFromLruCache
3939
import java.io.File
4040
import java.io.IOException
4141
import java.io.OutputStream
42+
import java.util.Date
4243
import timber.log.Timber
4344

4445
internal class DropboxImpl(cloud: DropboxCloud, context: Context) {
@@ -167,6 +168,7 @@ internal class DropboxImpl(cloud: DropboxCloud, context: Context) {
167168
client() //
168169
.files() //
169170
.uploadBuilder(file.path) //
171+
.withClientModified(data.modifiedDate(context).orElse(Date())) //
170172
.withMode(writeMode) //
171173
.uploadAndFinish(it)
172174
}

data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudNodeFactory.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,7 @@ internal object OnedriveCloudNodeFactory {
7474
}
7575

7676
private fun lastModified(item: DriveItem): Date? {
77-
return item.lastModifiedDateTime?.let {
78-
return Date.from(it.toInstant())
79-
}
77+
return item.fileSystemInfo?.lastModifiedDateTime?.let { clientDate -> Date.from(clientDate.toInstant()) }
78+
?: item.lastModifiedDateTime?.let { serverDate -> Date.from(serverDate.toInstant()) }
8079
}
8180
}

data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.microsoft.graph.http.GraphServiceException
55
import com.microsoft.graph.models.DriveItem
66
import com.microsoft.graph.models.DriveItemCreateUploadSessionParameterSet
77
import com.microsoft.graph.models.DriveItemUploadableProperties
8+
import com.microsoft.graph.models.FileSystemInfo
89
import com.microsoft.graph.models.Folder
910
import com.microsoft.graph.models.ItemReference
1011
import com.microsoft.graph.options.Option
@@ -39,6 +40,8 @@ import org.cryptomator.util.file.LruFileCacheUtil.Companion.retrieveFromLruCache
3940
import java.io.File
4041
import java.io.IOException
4142
import java.io.OutputStream
43+
import java.time.OffsetDateTime
44+
import java.time.ZoneId
4245
import java.util.Date
4346
import java.util.concurrent.CompletableFuture
4447
import java.util.concurrent.ExecutionException
@@ -202,14 +205,21 @@ internal class OnedriveImpl(private val cloud: OnedriveCloud, private val client
202205
}
203206
progressAware.onProgress(Progress.completed(UploadState.upload(file)))
204207
return try {
205-
OnedriveCloudNodeFactory.file(file.parent, result.get(), Date())
208+
val driveItem: DriveItem = result.get()
209+
val lastModifiedDate = getLastModifiedDateTime(driveItem) ?: Date()
210+
OnedriveCloudNodeFactory.file(file.parent, driveItem, lastModifiedDate)
206211
} catch (e: ExecutionException) {
207212
throw FatalBackendException(e)
208213
} catch (e: InterruptedException) {
209214
throw FatalBackendException(e)
210215
}
211216
}
212217

218+
private fun getLastModifiedDateTime(driveItem: DriveItem): Date? {
219+
return driveItem.fileSystemInfo?.lastModifiedDateTime?.let { clientDate -> Date.from(clientDate.toInstant()) }
220+
?: driveItem.lastModifiedDateTime?.let { serverDate -> Date.from(serverDate.toInstant()) }
221+
}
222+
213223
@Throws(NoSuchCloudFileException::class)
214224
private fun uploadFile(file: OnedriveFile, data: DataSource, progressAware: ProgressAware<UploadState>, result: CompletableFuture<DriveItem>, conflictBehaviorOption: Option, size: Long) {
215225
data.open(context)?.use { inputStream ->
@@ -228,12 +238,26 @@ internal class OnedriveImpl(private val cloud: OnedriveCloud, private val client
228238
.putAsync(CopyStream.toByteArray(it)) //
229239
.whenComplete { driveItem, error ->
230240
run {
231-
if (error == null) {
241+
val modifiedDate = data.modifiedDate(context)
242+
if (error != null) {
243+
result.completeExceptionally(error)
244+
return@whenComplete
245+
}
246+
if (modifiedDate.isPresent) {
247+
patchAsyncLastModifiedDate(parentNodeInfo, driveItem, modifiedDate.get())
248+
.whenComplete { driveItem, error ->
249+
if (error == null) {
250+
progressAware.onProgress(Progress.completed(UploadState.upload(file)))
251+
result.complete(driveItem)
252+
cacheNodeInfo(file, driveItem)
253+
} else {
254+
result.completeExceptionally(error)
255+
}
256+
}
257+
} else { // current date is the default, no need to patch()
232258
progressAware.onProgress(Progress.completed(UploadState.upload(file)))
233259
result.complete(driveItem)
234260
cacheNodeInfo(file, driveItem)
235-
} else {
236-
result.completeExceptionally(error)
237261
}
238262
}
239263
}
@@ -244,13 +268,32 @@ internal class OnedriveImpl(private val cloud: OnedriveCloud, private val client
244268
} ?: throw FatalBackendException("InputStream shouldn't bee null")
245269
}
246270

271+
private fun patchAsyncLastModifiedDate(parentNodeInfo: OnedriveIdCache.NodeInfo, driveItem: DriveItem, modifiedDate: Date): CompletableFuture<DriveItem> {
272+
val diffItem = DriveItem()
273+
diffItem.fileSystemInfo = FileSystemInfo()
274+
diffItem.fileSystemInfo!!.lastModifiedDateTime = OffsetDateTime.ofInstant(modifiedDate.toInstant(), ZoneId.systemDefault())
275+
return drive(parentNodeInfo.driveId) //
276+
.items(driveItem.id!!) //
277+
.buildRequest() //
278+
.patchAsync(diffItem) //
279+
}
280+
247281
@Throws(IOException::class, NoSuchCloudFileException::class)
248282
private fun chunkedUploadFile(file: OnedriveFile, data: DataSource, progressAware: ProgressAware<UploadState>, result: CompletableFuture<DriveItem>, conflictBehaviorOption: Option, size: Long) {
249283
val parentNodeInfo = requireNodeInfo(file.parent)
284+
285+
val props = DriveItemUploadableProperties()
286+
val modifiedDate = data.modifiedDate(context)
287+
288+
if (modifiedDate.isPresent) {
289+
props.fileSystemInfo = FileSystemInfo()
290+
props.fileSystemInfo!!.lastModifiedDateTime = OffsetDateTime.ofInstant(modifiedDate.get().toInstant(), ZoneId.systemDefault())
291+
}
292+
250293
drive(parentNodeInfo.driveId) //
251294
.items(parentNodeInfo.id) //
252295
.itemWithPath(file.name) //
253-
.createUploadSession(DriveItemCreateUploadSessionParameterSet.newBuilder().withItem(DriveItemUploadableProperties()).build()) //
296+
.createUploadSession(DriveItemCreateUploadSessionParameterSet.newBuilder().withItem(props).build()) //
254297
.buildRequest() //
255298
.post()?.let { uploadSession ->
256299
data.open(context)?.use { inputStream ->

data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ internal class PCloudImpl(private val cloud: PCloud, private val client: ApiClie
208208
}
209209
return try {
210210
client //
211-
.createFile(file.parent.path, file.name, pCloudDataSource, Date(), listener, uploadOptions) //
211+
.createFile(file.parent.path, file.name, pCloudDataSource, data.modifiedDate(context).orElse(Date()), listener, uploadOptions) //
212212
.execute()
213213
} catch (ex: ApiError) {
214214
handleApiError(ex, file.name)

data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package org.cryptomator.data.cloud.googledrive
33
import android.content.Context
44
import com.google.api.client.googleapis.json.GoogleJsonResponseException
55
import com.google.api.client.http.HttpResponseException
6+
import com.google.api.client.util.DateTime
67
import com.google.api.services.drive.Drive
78
import com.google.api.services.drive.model.File
89
import com.google.api.services.drive.model.Revision
@@ -25,6 +26,7 @@ import org.cryptomator.util.file.LruFileCacheUtil
2526
import org.cryptomator.util.file.LruFileCacheUtil.Companion.retrieveFromLruCache
2627
import java.io.IOException
2728
import java.io.OutputStream
29+
import java.util.Date
2830
import timber.log.Timber
2931

3032
internal class GoogleDriveImpl(context: Context, googleDriveCloud: GoogleDriveCloud, idCache: GoogleDriveIdCache) {
@@ -203,6 +205,7 @@ internal class GoogleDriveImpl(context: Context, googleDriveCloud: GoogleDriveCl
203205
val metadata = File()
204206
metadata.name = file.name
205207
progressAware.onProgress(Progress.started(UploadState.upload(file)))
208+
metadata.setModifiedTime(DateTime(data.modifiedDate(context).orElse(Date())))
206209
val uploadedFile = if (file.driveId != null && replace) {
207210
updateFile(file, data, progressAware, size, metadata)
208211
} else {

data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplDecorator.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,7 @@ abstract class CryptoImplDecorator(
598598
progressAware.onProgress(Progress.progress(UploadState.encryption(cryptoFile)).between(0).and(ciphertextSize).withValue(encrypted))
599599
}
600600
encryptingWritableByteChannel.close()
601+
data.modifiedDate(context).ifPresent { encryptedTmpFile.setLastModified(it.time) }
601602
progressAware.onProgress(Progress.completed(UploadState.encryption(cryptoFile)))
602603
return writeFromTmpFile(data, cryptoFile, encryptedTmpFile, progressAware, replace)
603604
}

data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplVaultFormat7.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,7 @@ open class CryptoImplVaultFormat7 : CryptoImplDecorator {
506506
progressAware.onProgress(Progress.progress(UploadState.encryption(cloudFile)).between(0).and(ciphertextSize).withValue(encrypted))
507507
}
508508
encryptingWritableByteChannel.close()
509+
data.modifiedDate(context).ifPresent { encryptedTmpFile.setLastModified(it.time) }
509510
progressAware.onProgress(Progress.completed(UploadState.encryption(cloudFile)))
510511
val targetFile = targetFile(cryptoFile, cloudFile, replace)
511512
return file(

data/src/main/java/org/cryptomator/data/cloud/webdav/WebDavImpl.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import org.cryptomator.domain.usecases.cloud.Progress
2323
import org.cryptomator.domain.usecases.cloud.UploadState
2424
import java.io.IOException
2525
import java.io.OutputStream
26+
import java.util.Date
2627
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
2728

2829
internal class WebDavImpl(private val cloud: WebDavCloud, private val connectionHandler: ConnectionHandlerHandlerImpl, private val context: Context) {
@@ -133,7 +134,7 @@ internal class WebDavImpl(private val cloud: WebDavCloud, private val connection
133134
)
134135
}
135136
}.use {
136-
connectionHandler.writeFile(absoluteUriFrom(uploadFile.path), it)
137+
connectionHandler.writeFile(absoluteUriFrom(uploadFile.path), it, data.modifiedDate(context).orElse(Date()))
137138
}
138139
} ?: throw FatalBackendException("InputStream shouldn't bee null")
139140

data/src/main/java/org/cryptomator/data/cloud/webdav/network/ConnectionHandlerHandlerImpl.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import org.cryptomator.data.cloud.webdav.WebDavNode
55
import org.cryptomator.domain.CloudFolder
66
import org.cryptomator.domain.exception.BackendException
77
import java.io.InputStream
8+
import java.util.Date
89
import javax.inject.Inject
910

1011
class ConnectionHandlerHandlerImpl @Inject internal constructor(httpClient: WebDavCompatibleHttpClient) {
@@ -27,8 +28,8 @@ class ConnectionHandlerHandlerImpl @Inject internal constructor(httpClient: WebD
2728
}
2829

2930
@Throws(BackendException::class)
30-
fun writeFile(url: String, inputStream: InputStream) {
31-
webDavClient.writeFile(url, inputStream)
31+
fun writeFile(url: String, inputStream: InputStream, modifiedDate: Date) {
32+
webDavClient.writeFile(url, inputStream, modifiedDate)
3233
}
3334

3435
@Throws(BackendException::class)

0 commit comments

Comments
 (0)