From 8407a414c58a3737d5fec9fae449553a66c9fb32 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 15 Jun 2024 14:03:38 +0300 Subject: [PATCH] Fix crashes --- .../org/koitharu/kotatsu/core/ui/BaseViewModel.kt | 2 +- .../kotatsu/details/ui/DetailsViewModel.kt | 4 ++++ .../reader/ui/pager/webtoon/WebtoonScalingFrame.kt | 14 ++++++++++---- .../kotatsu/stats/domain/StatsCollector.kt | 8 +++++++- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseViewModel.kt index 6a3940709..d895efa5b 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseViewModel.kt @@ -68,7 +68,7 @@ abstract class BaseViewModel : ViewModel() { errorEvent.call(error) } - protected inline suspend fun withLoading(block: () -> T): T = try { + protected inline fun withLoading(block: () -> T): T = try { loadingCounter.increment() block() } finally { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt index f7f332801..5d1d6c798 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt @@ -93,15 +93,19 @@ class DetailsViewModel @Inject constructor( val details = MutableStateFlow(intent.manga?.let { MangaDetails(it, null, null, false) }) val manga = details.map { x -> x?.toManga() } + .withErrorHandling() .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, null) val history = historyRepository.observeOne(mangaId) + .withErrorHandling() .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, null) val favouriteCategories = interactor.observeFavourite(mangaId) + .withErrorHandling() .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, emptySet()) val isStatsAvailable = statsRepository.observeHasStats(mangaId) + .withErrorHandling() .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, false) val remoteManga = MutableStateFlow(null) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonScalingFrame.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonScalingFrame.kt index f39e5e0cd..8393aacaf 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonScalingFrame.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonScalingFrame.kt @@ -221,7 +221,14 @@ class WebtoonScalingFrame @JvmOverloads constructor( syncMatrixValues() } - private fun scaleChild(newScale: Float, focusX: Float, focusY: Float) { + private fun scaleChild( + newScale: Float, + focusX: Float, + focusY: Float, + ): Boolean { + if (scale.isNaN() || scale == 0f) { + return false + } val factor = newScale / scale if (newScale > 1) { translateBounds.set( @@ -240,13 +247,12 @@ class WebtoonScalingFrame @JvmOverloads constructor( } transformMatrix.postScale(factor, factor, focusX, focusY) invalidateTarget() + return true } - override fun onScale(detector: ScaleGestureDetector): Boolean { val newScale = (scale * detector.scaleFactor).coerceIn(MIN_SCALE, MAX_SCALE) - scaleChild(newScale, detector.focusX, detector.focusY) - return true + return scaleChild(newScale, detector.focusX, detector.focusY) } override fun onScaleBegin(detector: ScaleGestureDetector): Boolean { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/stats/domain/StatsCollector.kt b/app/src/main/kotlin/org/koitharu/kotatsu/stats/domain/StatsCollector.kt index bba53f050..f9b145fdd 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/stats/domain/StatsCollector.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/stats/domain/StatsCollector.kt @@ -9,6 +9,8 @@ import kotlinx.coroutines.launch import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.util.RetainedLifecycleCoroutineScope +import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug +import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.stats.data.StatsEntity import javax.inject.Inject @@ -62,7 +64,11 @@ class StatsCollector @Inject constructor( private fun commit(entity: StatsEntity) { viewModelScope.launch(Dispatchers.Default) { - db.getStatsDao().upsert(entity) + runCatchingCancellable { + db.getStatsDao().upsert(entity) + }.onFailure { e -> + e.printStackTraceDebug() + } } }