From fcbe107fe78c89a148ae0911c3bbf46dce5460fa Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sat, 25 Dec 2021 14:19:28 +0900 Subject: [PATCH] [Reader] Enable Gesture, Adjusted BrokenImage tint [NetworkCache] Don't download existing file again --- app/build.gradle.kts | 2 +- .../pupil/sources/composable/ReaderBase.kt | 6 ++- .../xyz/quaver/pupil/util/NetworkCache.kt | 49 ++++++++++--------- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 23b1ca12..1c3fccd4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -137,7 +137,7 @@ dependencies { implementation("ru.noties.markwon:core:3.1.0") implementation("xyz.quaver:documentfilex:0.7.1") - implementation("xyz.quaver:subsampledimage:0.0.1-alpha15-SNAPSHOT") + implementation("xyz.quaver:subsampledimage:0.0.1-alpha16-SNAPSHOT") implementation("com.google.guava:guava:31.0.1-jre") diff --git a/app/src/main/java/xyz/quaver/pupil/sources/composable/ReaderBase.kt b/app/src/main/java/xyz/quaver/pupil/sources/composable/ReaderBase.kt index d55de41c..86e1b7fe 100644 --- a/app/src/main/java/xyz/quaver/pupil/sources/composable/ReaderBase.kt +++ b/app/src/main/java/xyz/quaver/pupil/sources/composable/ReaderBase.kt @@ -511,7 +511,9 @@ fun ReaderItem( horizontalArrangement = Arrangement.Center ) { images.let { if (readerOptions.orientation.isReverse) it.reversed() else it }.forEach { (index, imageSize, imageSource) -> - val state = rememberSubSampledImageState() + val state = rememberSubSampledImageState().apply { + isGestureEnabled = true + } val modifier = when { imageSize == null -> Modifier.weight(1f).height(heightDp) @@ -527,7 +529,7 @@ fun ReaderItem( val progress = model.progressList.getOrNull(index) ?: 0f if (progress == Float.NEGATIVE_INFINITY) - Icon(Icons.Filled.BrokenImage, null, tint = Orange500) + Icon(Icons.Filled.BrokenImage, null) else if (progress.isFinite()) Column( horizontalAlignment = Alignment.CenterHorizontally diff --git a/app/src/main/java/xyz/quaver/pupil/util/NetworkCache.kt b/app/src/main/java/xyz/quaver/pupil/util/NetworkCache.kt index af1b8e24..187df3b2 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/NetworkCache.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/NetworkCache.kt @@ -123,39 +123,44 @@ class NetworkCache(context: Context) : DIAware { requests[url] = networkScope.launch { runCatching { - cacheDir.mkdirs() - file.createNewFile() + if (file.exists()) { + progressFlow.emit(Float.POSITIVE_INFINITY) + } else { + cacheDir.mkdirs() + file.createNewFile() - client.request(request).execute { httpResponse -> - if (!httpResponse.status.isSuccess()) throw IOException("${request.url} failed with code ${httpResponse.status.value}") - val responseChannel: ByteReadChannel = httpResponse.receive() - val contentLength = httpResponse.contentLength() ?: -1 - var readBytes = 0f + client.request(request).execute { httpResponse -> + if (!httpResponse.status.isSuccess()) throw IOException("${request.url} failed with code ${httpResponse.status.value}") + val responseChannel: ByteReadChannel = httpResponse.receive() + val contentLength = httpResponse.contentLength() ?: -1 + var readBytes = 0f - file.outputStream().use { outputStream -> - outputStream.channel.truncate(0) - while (!responseChannel.isClosedForRead) { - if (!isActive) { - file.delete() - break - } - - val packet = responseChannel.readRemaining(DEFAULT_BUFFER_SIZE.toLong()) - while (!packet.isEmpty) { + file.outputStream().use { outputStream -> + outputStream.channel.truncate(0) + while (!responseChannel.isClosedForRead) { if (!isActive) { file.delete() break } - val bytes = packet.readBytes() - outputStream.write(bytes) + val packet = + responseChannel.readRemaining(DEFAULT_BUFFER_SIZE.toLong()) + while (!packet.isEmpty) { + if (!isActive) { + file.delete() + break + } - readBytes += bytes.size - progressFlow.emit(readBytes / contentLength) + val bytes = packet.readBytes() + outputStream.write(bytes) + + readBytes += bytes.size + progressFlow.emit(readBytes / contentLength) + } } } + progressFlow.emit(Float.POSITIVE_INFINITY) } - progressFlow.emit(Float.POSITIVE_INFINITY) } }.onFailure { logger.warning(it)