diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/os/NetworkState.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/os/NetworkState.kt index 63907bdde..9f3224c65 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/os/NetworkState.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/os/NetworkState.kt @@ -19,7 +19,9 @@ class NetworkState( override fun onActive() { invalidate() val request = NetworkRequest.Builder() - .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) + .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET) .build() connectivityManager.registerNetworkCallback(request, callback) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/Network.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/Network.kt index 9f73ecfbf..eac104dc6 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/Network.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/Network.kt @@ -19,6 +19,8 @@ fun ConnectivityManager.isOnline(): Boolean { } private fun ConnectivityManager.isOnline(network: Network): Boolean { - val capabilities = getNetworkCapabilities(network) - return capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + val capabilities = getNetworkCapabilities(network) ?: return false + return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) + || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) + || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/DetailsLoadUseCase.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/DetailsLoadUseCase.kt index fc696db6c..837679389 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/DetailsLoadUseCase.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/DetailsLoadUseCase.kt @@ -60,8 +60,7 @@ class DetailsLoadUseCase @Inject constructor( } catch (e: IOException) { local?.await()?.manga?.also { localManga -> send(MangaDetails(localManga, null, localManga.description?.parseAsHtml(withImages = false), true)) - } - throw e + } ?: close(e) } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/local/data/LocalMangaMappingCache.kt b/app/src/main/kotlin/org/koitharu/kotatsu/local/data/LocalMangaMappingCache.kt new file mode 100644 index 000000000..7ef175a0d --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/local/data/LocalMangaMappingCache.kt @@ -0,0 +1,32 @@ +package org.koitharu.kotatsu.local.data + +import androidx.collection.MutableLongObjectMap +import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug +import org.koitharu.kotatsu.local.data.input.LocalMangaInput +import org.koitharu.kotatsu.local.domain.model.LocalManga +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable +import java.io.File + +class LocalMangaMappingCache { + + private val map = MutableLongObjectMap() + + suspend fun get(mangaId: Long): LocalManga? { + val file = synchronized(this) { + map[mangaId] + } ?: return null + return runCatchingCancellable { + LocalMangaInput.of(file).getManga() + }.onFailure { + it.printStackTraceDebug() + }.getOrNull() + } + + operator fun set(mangaId: Long, localManga: LocalManga?) = synchronized(this) { + if (localManga == null) { + map.remove(mangaId) + } else { + map[mangaId] = localManga.file + } + } +} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/local/data/LocalMangaRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/local/data/LocalMangaRepository.kt index 8bdf9a78d..6744ae347 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/local/data/LocalMangaRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/local/data/LocalMangaRepository.kt @@ -51,6 +51,7 @@ class LocalMangaRepository @Inject constructor( override val source = MangaSource.LOCAL private val locks = MultiMutex() + private val localMappingCache = LocalMangaMappingCache() override val isMultipleTagsSupported: Boolean = true override val isTagsExclusionSupported: Boolean = true @@ -141,6 +142,10 @@ class LocalMangaRepository @Inject constructor( } suspend fun findSavedManga(remoteManga: Manga): LocalManga? = runCatchingCancellable { + // very fast path + localMappingCache.get(remoteManga.id)?.let { + return@runCatchingCancellable it + } // fast path LocalMangaInput.find(storageManager.getReadableDirs(), remoteManga)?.let { return it.getManga() @@ -162,6 +167,8 @@ class LocalMangaRepository @Inject constructor( } } }.firstOrNull()?.getManga() + }.onSuccess { x: LocalManga? -> + localMappingCache[remoteManga.id] = x }.onFailure { it.printStackTraceDebug() }.getOrNull()