diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/CoroutineIntentService.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/CoroutineIntentService.kt index cdd48998f..04c4c7eb6 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/CoroutineIntentService.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/CoroutineIntentService.kt @@ -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) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/ChaptersPagesViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/ChaptersPagesViewModel.kt index b4e013441..b7e20b006 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/ChaptersPagesViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/ChaptersPagesViewModel.kt @@ -166,8 +166,9 @@ abstract class ChaptersPagesViewModel( fun download(chaptersIds: Set?, 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) } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/dialog/DownloadDialogViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/dialog/DownloadDialogViewModel.kt index efc8a4ccd..6dd2ebf06 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/dialog/DownloadDialogViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/dialog/DownloadDialogViewModel.kt @@ -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, diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt b/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt index ccb79fea3..8aed8f1d4 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/download/ui/worker/DownloadWorker.kt @@ -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) { + suspend fun schedule(tasks: Collection>) { if (tasks.isEmpty()) { return } - val requests = tasks.map { task -> + val requests = tasks.map { (manga, task) -> + mangaDataRepository.storeManga(manga) OneTimeWorkRequestBuilder() .setConstraints(createConstraints(task.allowMeteredNetwork)) .addTag(TAG) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/local/domain/DeleteReadChaptersUseCase.kt b/app/src/main/kotlin/org/koitharu/kotatsu/local/domain/DeleteReadChaptersUseCase.kt index e4b1c71c1..2a77be6ee 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/local/domain/DeleteReadChaptersUseCase.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/local/domain/DeleteReadChaptersUseCase.kt @@ -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 { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/userdata/UserDataSettingsFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/userdata/UserDataSettingsFragment.kt index b52a1c3e3..e85a1beee 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/userdata/UserDataSettingsFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/userdata/UserDataSettingsFragment.kt @@ -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() 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(prefKey)!!.isEnabled = prefKey !in keys } } viewModel.onError.observeEvent(viewLifecycleOwner, SnackbarErrorObserver(listView, this)) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/userdata/UserDataSettingsViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/userdata/UserDataSettingsViewModel.kt index 533658a32..ed87944c0 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/userdata/UserDataSettingsViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/userdata/UserDataSettingsViewModel.kt @@ -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 diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/work/TrackWorker.kt b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/work/TrackWorker.kt index f8fe0f4f3..8f2e55dc8 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/work/TrackWorker.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/work/TrackWorker.kt @@ -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)) } } }