Fix cleaning saved chapters

master
Koitharu 1 year ago
parent 09c049ea9d
commit 67a5ef016c
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

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

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

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

@ -433,6 +433,7 @@ class DownloadWorker @AssistedInject constructor(
@Reusable @Reusable
class Scheduler @Inject constructor( class Scheduler @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val mangaDataRepository: MangaDataRepository,
private val workManager: WorkManager, 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()) { if (tasks.isEmpty()) {
return return
} }
val requests = tasks.map { task -> val requests = tasks.map { (manga, task) ->
mangaDataRepository.storeManga(manga)
OneTimeWorkRequestBuilder<DownloadWorker>() OneTimeWorkRequestBuilder<DownloadWorker>()
.setConstraints(createConstraints(task.allowMeteredNetwork)) .setConstraints(createConstraints(task.allowMeteredNetwork))
.addTag(TAG) .addTag(TAG)

@ -77,7 +77,7 @@ class DeleteReadChaptersUseCase @Inject constructor(
return null return null
} }
val branch = (chapters.findById(history.chapterId) ?: return null).branch 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()) { return if (filteredChapters.isEmpty()) {
null null
} else { } else {

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

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

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

Loading…
Cancel
Save