diff --git a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplDecorator.kt b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplDecorator.kt index 6b46325f4..80f01abc8 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplDecorator.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplDecorator.kt @@ -384,7 +384,7 @@ abstract class CryptoImplDecorator( val diskCache = cryptoFile.cloudFile.cloud?.type()?.let { getLruCacheFor(it) } val cacheKey = generateCacheKey(ciphertextFile) - val genThumbnail = isGenerateThumbnailsEnabled(diskCache, cryptoFile.name) + val genThumbnail = isThumbnailGenerationAvailable(diskCache, cryptoFile.name) val thumbnailWriter = PipedOutputStream() val thumbnailReader = PipedInputStream(thumbnailWriter) @@ -471,11 +471,30 @@ abstract class CryptoImplDecorator( return String.format("%s-%d", cloudFile.cloud?.id() ?: "common", cloudFile.path.hashCode()) } - private fun isGenerateThumbnailsEnabled(cache: DiskLruCache?, fileName: String): Boolean { - return sharedPreferencesHandler.useLruCache() && - sharedPreferencesHandler.generateThumbnails() != ThumbnailsOption.NEVER && - cache != null && - isImageMediaType(fileName) + private fun isThumbnailGenerationAvailable(cache: DiskLruCache?, fileName: String): Boolean { + return isGenerateThumbnailsEnabled() && cache != null && isImageMediaType(fileName) + } + + protected fun associateThumbnailIfInCache(list: List): List { + if (isGenerateThumbnailsEnabled()) { + val firstCryptoFile = list.find { it is CryptoFile } ?: return list + val cloudType = (firstCryptoFile as CryptoFile).cloudFile.cloud?.type() ?: return list + val diskCache = getLruCacheFor(cloudType) ?: return list + list.onEach { cryptoNode -> + if (cryptoNode is CryptoFile && isImageMediaType(cryptoNode.name)) { + val cacheKey = generateCacheKey(cryptoNode.cloudFile) + val cacheFile = diskCache[cacheKey] + if (cacheFile != null) { + cryptoNode.thumbnail = cacheFile + } + } + } + } + return list + } + + private fun isGenerateThumbnailsEnabled(): Boolean { + return sharedPreferencesHandler.useLruCache() && sharedPreferencesHandler.generateThumbnails() != ThumbnailsOption.NEVER } private fun storeThumbnail(cache: DiskLruCache?, cacheKey: String, thumbnailBitmap: Bitmap) { @@ -493,7 +512,7 @@ abstract class CryptoImplDecorator( thumbnailFile.delete() } - protected fun isImageMediaType(filename: String): Boolean { + private fun isImageMediaType(filename: String): Boolean { return (mimeTypes.fromFilename(filename) ?: MimeType.WILDCARD_MIME_TYPE).mediatype == "image" } diff --git a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplVaultFormat7.kt b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplVaultFormat7.kt index 8214d6b73..c6fa3bdab 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplVaultFormat7.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplVaultFormat7.kt @@ -165,18 +165,8 @@ open class CryptoImplVaultFormat7 : CryptoImplDecorator { } }.map { node -> ciphertextToCleartextNode(cryptoFolder, dirId, node) - }.onEach { cryptoNode -> - if (cryptoNode is CryptoFile && isImageMediaType(cryptoNode.name)) { - val cacheKey = generateCacheKey(cryptoNode.cloudFile) - cryptoNode.cloudFile.cloud?.type()?.let { cloudType -> - getLruCacheFor(cloudType)?.let { diskCache -> - val cacheFile = diskCache[cacheKey] - if (cacheFile != null) { - cryptoNode.thumbnail = cacheFile - } - } - } - } + }.also { + associateThumbnailIfInCache(it) }.toList().filterNotNull() } diff --git a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplVaultFormatPre7.kt b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplVaultFormatPre7.kt index d103ff720..a4b7328c8 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplVaultFormatPre7.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplVaultFormatPre7.kt @@ -128,21 +128,9 @@ internal class CryptoImplVaultFormatPre7( .filterIsInstance() .map { node -> ciphertextToCleartextNode(cryptoFolder, dirId, node) - }.onEach { cryptoNode -> - if (cryptoNode is CryptoFile && isImageMediaType(cryptoNode.name)) { - val cacheKey = generateCacheKey(cryptoNode.cloudFile) - cryptoNode.cloudFile.cloud?.type()?.let { cloudType -> - getLruCacheFor(cloudType)?.let { diskCache -> - val cacheFile = diskCache[cacheKey] - if (cacheFile != null) { - cryptoNode.thumbnail = cacheFile - } - } - } - } - } - .toList() - .filterNotNull() + }.also { + associateThumbnailIfInCache(it) + }.toList().filterNotNull() } @Throws(BackendException::class)