diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt b/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt index 91332872b..d32bc4fc4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt @@ -7,14 +7,16 @@ import android.net.Uri import androidx.collection.LongSparseArray import androidx.collection.set import dagger.hilt.android.qualifiers.ApplicationContext -import java.io.File -import java.util.* -import java.util.concurrent.atomic.AtomicInteger -import java.util.zip.ZipFile -import javax.inject.Inject -import kotlinx.coroutines.* +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.async +import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.runInterruptible import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import okhttp3.OkHttpClient @@ -30,7 +32,15 @@ import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.util.await import org.koitharu.kotatsu.reader.ui.pager.ReaderPage import org.koitharu.kotatsu.utils.ext.connectivityManager +import org.koitharu.kotatsu.utils.ext.printStackTraceDebug import org.koitharu.kotatsu.utils.progress.ProgressDeferred +import java.io.File +import java.util.LinkedList +import java.util.concurrent.atomic.AtomicInteger +import java.util.zip.ZipFile +import javax.inject.Inject +import kotlin.coroutines.AbstractCoroutineContextElement +import kotlin.coroutines.CoroutineContext private const val PROGRESS_UNDEFINED = -1f private const val PREFETCH_LIMIT_DEFAULT = 10 @@ -43,7 +53,7 @@ class PageLoader @Inject constructor( private val mangaRepositoryFactory: MangaRepository.Factory, ) : Closeable { - val loaderScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + val loaderScope = CoroutineScope(SupervisorJob() + InternalErrorHandler() + Dispatchers.Default) private val connectivityManager = context.connectivityManager private val tasks = LongSparseArray>() @@ -197,4 +207,13 @@ class PageLoader @Inject constructor( val deferred = CompletableDeferred(file) return ProgressDeferred(deferred, emptyProgressFlow) } + + private class InternalErrorHandler : AbstractCoroutineContextElement(CoroutineExceptionHandler), + CoroutineExceptionHandler { + + override fun handleException(context: CoroutineContext, exception: Throwable) { + exception.printStackTraceDebug() + } + + } } diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt index 7bee7ca84..fa5aaaa22 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt @@ -132,7 +132,7 @@ class PageHolderDelegate( callback.onImageReady(file.toUri()) } catch (e: CancellationException) { throw e - } catch (e: Exception) { + } catch (e: Throwable) { state = State.ERROR error = e callback.onError(e)