Fix cleaning saved chapters

This commit is contained in:
Koitharu
2024-11-18 18:59:17 +02:00
parent 09c049ea9d
commit 67a5ef016c
8 changed files with 24 additions and 13 deletions

View File

@@ -93,7 +93,13 @@ abstract class CoroutineIntentService : BaseService() {
fun stop() {
synchronized(this) {
cancelReceiver?.let { unregisterReceiver(it) }
cancelReceiver?.let {
try {
unregisterReceiver(it)
} catch (e: IllegalArgumentException) {
e.printStackTraceDebug()
}
}
isStopped = true
}
if (isForeground) {

View File

@@ -166,8 +166,9 @@ abstract class ChaptersPagesViewModel(
fun download(chaptersIds: Set<Long>?, allowMeteredNetwork: Boolean) {
launchJob(Dispatchers.Default) {
val manga = requireManga()
val task = DownloadTask(
mangaId = requireManga().id,
mangaId = manga.id,
isPaused = false,
isSilent = false,
chaptersIds = chaptersIds?.toLongArray(),
@@ -175,7 +176,7 @@ abstract class ChaptersPagesViewModel(
format = null,
allowMeteredNetwork = allowMeteredNetwork,
)
downloadScheduler.schedule(setOf(task))
downloadScheduler.schedule(setOf(manga to task))
onDownloadStarted.call(Unit)
}
}

View File

@@ -13,7 +13,6 @@ import kotlinx.coroutines.flow.MutableStateFlow
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.getPreferredBranch
import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga
import org.koitharu.kotatsu.core.parser.MangaDataRepository
import org.koitharu.kotatsu.core.parser.MangaRepository
import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.core.prefs.DownloadFormat
@@ -38,7 +37,6 @@ import javax.inject.Inject
@HiltViewModel
class DownloadDialogViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
private val mangaDataRepository: MangaDataRepository,
private val scheduler: DownloadWorker.Scheduler,
private val localStorageManager: LocalStorageManager,
private val localMangaRepository: LocalMangaRepository,
@@ -94,8 +92,7 @@ class DownloadDialogViewModel @Inject constructor(
launchLoadingJob(Dispatchers.Default) {
val tasks = mangaDetails.get().map { m ->
val chapters = checkNotNull(m.chapters) { "Manga \"${m.title}\" cannot be loaded" }
mangaDataRepository.storeManga(m)
DownloadTask(
m to DownloadTask(
mangaId = m.id,
isPaused = !startNow,
isSilent = false,

View File

@@ -433,6 +433,7 @@ class DownloadWorker @AssistedInject constructor(
@Reusable
class Scheduler @Inject constructor(
@ApplicationContext private val context: Context,
private val mangaDataRepository: MangaDataRepository,
private val workManager: WorkManager,
) {
@@ -507,11 +508,12 @@ class DownloadWorker @AssistedInject constructor(
}
}
suspend fun schedule(tasks: Collection<DownloadTask>) {
suspend fun schedule(tasks: Collection<Pair<Manga, DownloadTask>>) {
if (tasks.isEmpty()) {
return
}
val requests = tasks.map { task ->
val requests = tasks.map { (manga, task) ->
mangaDataRepository.storeManga(manga)
OneTimeWorkRequestBuilder<DownloadWorker>()
.setConstraints(createConstraints(task.allowMeteredNetwork))
.addTag(TAG)

View File

@@ -77,7 +77,7 @@ class DeleteReadChaptersUseCase @Inject constructor(
return null
}
val branch = (chapters.findById(history.chapterId) ?: return null).branch
val filteredChapters = manga.manga.getChapters(branch).takeWhile { it.id != history.chapterId }
val filteredChapters = chapters.filter { x -> x.branch == branch }.takeWhile { it.id != history.chapterId }
return if (filteredChapters.isEmpty()) {
null
} else {

View File

@@ -8,6 +8,7 @@ import android.view.View
import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatDelegate
import androidx.collection.ArraySet
import androidx.core.view.postDelayed
import androidx.fragment.app.viewModels
import androidx.preference.ListPreference
@@ -15,6 +16,7 @@ import androidx.preference.MultiSelectListPreference
import androidx.preference.Preference
import androidx.preference.TwoStatePreference
import androidx.preference.forEach
import androidx.preference.get
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import dagger.hilt.android.AndroidEntryPoint
@@ -54,6 +56,7 @@ class UserDataSettingsFragment : BasePreferenceFragment(R.string.data_and_privac
lateinit var activityRecreationHandle: ActivityRecreationHandle
private val viewModel: UserDataSettingsViewModel by viewModels()
private val loadingPrefs = HashSet<String>()
private val backupSelectCall = registerForActivityResult(
ActivityResultContracts.OpenDocument(),
@@ -106,8 +109,9 @@ class UserDataSettingsFragment : BasePreferenceFragment(R.string.data_and_privac
pref.values = settings.searchSuggestionTypes.mapToSet { it.name }
}
viewModel.loadingKeys.observe(viewLifecycleOwner) { keys ->
preferenceScreen.forEach { pref ->
pref.isEnabled = pref.key !in keys
loadingPrefs.addAll(keys)
loadingPrefs.forEach { prefKey ->
findPreference<Preference>(prefKey)!!.isEnabled = prefKey !in keys
}
}
viewModel.onError.observeEvent(viewLifecycleOwner, SnackbarErrorObserver(listView, this))

View File

@@ -4,6 +4,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.cancelAndJoin
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf

View File

@@ -262,7 +262,7 @@ class TrackWorker @AssistedInject constructor(
format = null,
allowMeteredNetwork = settings.allowDownloadOnMeteredNetwork != TriStateOption.DISABLED,
)
downloadSchedulerLazy.get().schedule(setOf(task))
downloadSchedulerLazy.get().schedule(setOf(mangaUpdates.manga to task))
}
}
}