Fix crashes
This commit is contained in:
@@ -35,6 +35,7 @@ class BookmarksSheetViewModel @Inject constructor(
|
|||||||
|
|
||||||
val content: StateFlow<List<ListModel>> = bookmarksRepository.observeBookmarks(manga)
|
val content: StateFlow<List<ListModel>> = bookmarksRepository.observeBookmarks(manga)
|
||||||
.map { mapList(it) }
|
.map { mapList(it) }
|
||||||
|
.withErrorHandling()
|
||||||
.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Lazily, listOf(LoadingFooter()))
|
.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Lazily, listOf(LoadingFooter()))
|
||||||
|
|
||||||
private suspend fun mapList(bookmarks: List<Bookmark>): List<ListModel> {
|
private suspend fun mapList(bookmarks: List<Bookmark>): List<ListModel> {
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class DoubleMangaLoadUseCase @Inject constructor(
|
|||||||
private val recoverUseCase: RecoverMangaUseCase,
|
private val recoverUseCase: RecoverMangaUseCase,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
operator fun invoke(manga: Manga): Flow<DoubleManga> = flow<DoubleManga> {
|
operator fun invoke(manga: Manga): Flow<DoubleManga> = flow {
|
||||||
var lastValue: DoubleManga? = null
|
var lastValue: DoubleManga? = null
|
||||||
var emitted = false
|
var emitted = false
|
||||||
invokeImpl(manga).collect {
|
invokeImpl(manga).collect {
|
||||||
|
|||||||
@@ -87,8 +87,7 @@ class ReaderViewModel @Inject constructor(
|
|||||||
private var pageSaveJob: Job? = null
|
private var pageSaveJob: Job? = null
|
||||||
private var bookmarkJob: Job? = null
|
private var bookmarkJob: Job? = null
|
||||||
private var stateChangeJob: Job? = null
|
private var stateChangeJob: Job? = null
|
||||||
private val currentState =
|
private val currentState = MutableStateFlow<ReaderState?>(savedStateHandle[ReaderActivity.EXTRA_STATE])
|
||||||
MutableStateFlow<ReaderState?>(savedStateHandle[ReaderActivity.EXTRA_STATE])
|
|
||||||
private val mangaData = MutableStateFlow(intent.manga?.let { DoubleManga(it) })
|
private val mangaData = MutableStateFlow(intent.manga?.let { DoubleManga(it) })
|
||||||
private val mangaFlow: Flow<Manga?>
|
private val mangaFlow: Flow<Manga?>
|
||||||
get() = mangaData.map { it?.any }
|
get() = mangaData.map { it?.any }
|
||||||
@@ -326,7 +325,7 @@ class ReaderViewModel @Inject constructor(
|
|||||||
mangaData.value = manga
|
mangaData.value = manga
|
||||||
val mangaFlow = doubleMangaLoadUseCase(intent)
|
val mangaFlow = doubleMangaLoadUseCase(intent)
|
||||||
manga = mangaFlow.first { x -> x.any != null }
|
manga = mangaFlow.first { x -> x.any != null }
|
||||||
chaptersLoader.init(viewModelScope, mangaFlow)
|
chaptersLoader.init(viewModelScope, mangaFlow.withErrorHandling())
|
||||||
// determine mode
|
// determine mode
|
||||||
val singleManga = manga.requireAny()
|
val singleManga = manga.requireAny()
|
||||||
// obtain state
|
// obtain state
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package org.koitharu.kotatsu.tracker.data
|
package org.koitharu.kotatsu.tracker.data
|
||||||
|
|
||||||
import java.util.*
|
|
||||||
import org.koitharu.kotatsu.core.db.entity.toManga
|
import org.koitharu.kotatsu.core.db.entity.toManga
|
||||||
import org.koitharu.kotatsu.core.db.entity.toMangaTags
|
import org.koitharu.kotatsu.core.db.entity.toMangaTags
|
||||||
import org.koitharu.kotatsu.tracker.domain.model.TrackingLogItem
|
import org.koitharu.kotatsu.tracker.domain.model.TrackingLogItem
|
||||||
|
import java.util.Date
|
||||||
|
|
||||||
fun TrackLogWithManga.toTrackingLogItem(counters: MutableMap<Long, Int>): TrackingLogItem {
|
fun TrackLogWithManga.toTrackingLogItem(counters: MutableMap<Long, Int>): TrackingLogItem {
|
||||||
val chaptersList = trackLog.chapters.split('\n').filterNot { x -> x.isEmpty() }
|
val chaptersList = trackLog.chapters.split('\n').filterNot { x -> x.isEmpty() }
|
||||||
@@ -16,7 +16,7 @@ fun TrackLogWithManga.toTrackingLogItem(counters: MutableMap<Long, Int>): Tracki
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun MutableMap<Long, Int>.decrement(key: Long, count: Int): Boolean {
|
private fun MutableMap<Long, Int>.decrement(key: Long, count: Int): Boolean = synchronized(this) {
|
||||||
val counter = get(key)
|
val counter = get(key)
|
||||||
if (counter == null || counter <= 0) {
|
if (counter == null || counter <= 0) {
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import org.koitharu.kotatsu.tracker.domain.model.MangaTracking
|
|||||||
import org.koitharu.kotatsu.tracker.domain.model.MangaUpdates
|
import org.koitharu.kotatsu.tracker.domain.model.MangaUpdates
|
||||||
import org.koitharu.kotatsu.tracker.domain.model.TrackingLogItem
|
import org.koitharu.kotatsu.tracker.domain.model.TrackingLogItem
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
private const val NO_ID = 0L
|
private const val NO_ID = 0L
|
||||||
@@ -34,7 +35,7 @@ class TrackingRepository @Inject constructor(
|
|||||||
private val db: MangaDatabase,
|
private val db: MangaDatabase,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private var isGcCalled = false
|
private var isGcCalled = AtomicBoolean(false)
|
||||||
|
|
||||||
suspend fun getNewChaptersCount(mangaId: Long): Int {
|
suspend fun getNewChaptersCount(mangaId: Long): Int {
|
||||||
return db.tracksDao.findNewChapters(mangaId) ?: 0
|
return db.tracksDao.findNewChapters(mangaId) ?: 0
|
||||||
@@ -227,9 +228,8 @@ class TrackingRepository @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun gcIfNotCalled() {
|
private suspend fun gcIfNotCalled() {
|
||||||
if (!isGcCalled) {
|
if (isGcCalled.compareAndSet(false, true)) {
|
||||||
gc()
|
gc()
|
||||||
isGcCalled = true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user