Ability to start download paused

This commit is contained in:
Koitharu
2024-10-04 11:20:49 +03:00
parent 1290db4a7c
commit 5301cc7f97
9 changed files with 65 additions and 11 deletions

View File

@@ -0,0 +1,25 @@
package org.koitharu.kotatsu.core.ui.dialog
import android.content.Context
import androidx.annotation.UiContext
import org.koitharu.kotatsu.R
object CommonAlertDialogs {
fun showDownloadConfirmation(
@UiContext context: Context,
onConfirmed: (startPaused: Boolean) -> Unit,
) = buildAlertDialog(context, isCentered = true) {
var startPaused = false
setTitle(R.string.save_manga)
setIcon(R.drawable.ic_download)
setMessage(R.string.save_manga_confirm)
setCheckbox(R.string.start_download, true) { _, isChecked ->
startPaused = !isChecked
}
setPositiveButton(R.string.save) { _, _ ->
onConfirmed(startPaused)
}
setNegativeButton(android.R.string.cancel, null)
}.show()
}

View File

@@ -168,6 +168,7 @@ abstract class ChaptersPagesViewModel(
downloadScheduler.schedule(
manga = requireManga(),
chaptersIds = chaptersIds,
isPaused = false,
isSilent = false,
)
onDownloadStarted.call(Unit)

View File

@@ -128,7 +128,11 @@ class DownloadWorker @AssistedInject constructor(
val chaptersIds = inputData.getLongArray(CHAPTERS_IDS)?.takeUnless { it.isEmpty() }
val downloadedIds = getDoneChapters(manga)
return try {
withContext(PausingHandle()) {
val pausingHandle = PausingHandle()
if (inputData.getBoolean(START_PAUSED, false)) {
pausingHandle.pause()
}
withContext(pausingHandle) {
downloadMangaImpl(manga, chaptersIds, downloadedIds)
}
Result.success(currentState.toWorkData())
@@ -431,10 +435,16 @@ class DownloadWorker @AssistedInject constructor(
private val settings: AppSettings,
) {
suspend fun schedule(manga: Manga, chaptersIds: Collection<Long>?, isSilent: Boolean) {
suspend fun schedule(
manga: Manga,
chaptersIds: Collection<Long>?,
isPaused: Boolean,
isSilent: Boolean,
) {
dataRepository.storeManga(manga)
val data = Data.Builder()
.putLong(MANGA_ID, manga.id)
.putBoolean(START_PAUSED, isPaused)
.putBoolean(IS_SILENT, isSilent)
if (!chaptersIds.isNullOrEmpty()) {
data.putLongArray(CHAPTERS_IDS, chaptersIds.toLongArray())
@@ -442,11 +452,15 @@ class DownloadWorker @AssistedInject constructor(
scheduleImpl(listOf(data.build()))
}
suspend fun schedule(manga: Collection<Manga>) {
suspend fun schedule(
manga: Collection<Manga>,
isPaused: Boolean,
) {
val data = manga.map {
dataRepository.storeManga(it)
Data.Builder()
.putLong(MANGA_ID, it.id)
.putBoolean(START_PAUSED, isPaused)
.build()
}
scheduleImpl(data)
@@ -556,6 +570,7 @@ class DownloadWorker @AssistedInject constructor(
const val MANGA_ID = "manga_id"
const val CHAPTERS_IDS = "chapters"
const val IS_SILENT = "silent"
const val START_PAUSED = "paused"
const val TAG = "download"
}
}

View File

@@ -27,6 +27,7 @@ import org.koitharu.kotatsu.core.model.isLocal
import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.core.prefs.ListMode
import org.koitharu.kotatsu.core.ui.BaseFragment
import org.koitharu.kotatsu.core.ui.dialog.CommonAlertDialogs
import org.koitharu.kotatsu.core.ui.dialog.buildAlertDialog
import org.koitharu.kotatsu.core.ui.list.FitHeightGridLayoutManager
import org.koitharu.kotatsu.core.ui.list.FitHeightLinearLayoutManager
@@ -238,6 +239,7 @@ abstract class MangaListFragment :
}
override fun onFilterOptionClick(option: ListFilterOption) {
selectionController?.clear()
(viewModel as? QuickFilterListener)?.toggleFilterOption(option)
}
@@ -322,8 +324,11 @@ abstract class MangaListFragment :
}
R.id.action_save -> {
viewModel.download(selectedItems)
mode?.finish()
val itemsSnapshot = selectedItems
CommonAlertDialogs.showDownloadConfirmation(context ?: return false) { startPaused ->
mode?.finish()
viewModel.download(itemsSnapshot, isPaused = startPaused)
}
true
}

View File

@@ -46,9 +46,9 @@ abstract class MangaListViewModel(
abstract fun onRetry()
fun download(items: Set<Manga>) {
fun download(items: Set<Manga>, isPaused: Boolean) {
launchJob(Dispatchers.Default) {
downloadScheduler.schedule(items)
downloadScheduler.schedule(items, isPaused)
onDownloadStarted.call(Unit)
}
}

View File

@@ -17,6 +17,7 @@ import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver
import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.core.ui.BaseActivity
import org.koitharu.kotatsu.core.ui.dialog.CommonAlertDialogs
import org.koitharu.kotatsu.core.ui.list.ListSelectionController
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
import org.koitharu.kotatsu.core.ui.widgets.TipView
@@ -184,8 +185,11 @@ class SearchActivity :
}
R.id.action_save -> {
viewModel.download(collectSelectedItems())
mode?.finish()
val itemsSnapshot = collectSelectedItems()
CommonAlertDialogs.showDownloadConfirmation(this) { startPaused ->
mode?.finish()
viewModel.download(itemsSnapshot, isPaused = startPaused)
}
true
}

View File

@@ -109,9 +109,9 @@ class SearchViewModel @Inject constructor(
retryCounter.value += 1
}
fun download(items: Set<Manga>) {
fun download(items: Set<Manga>, isPaused: Boolean) {
launchJob(Dispatchers.Default) {
downloadScheduler.schedule(items)
downloadScheduler.schedule(items, isPaused)
onDownloadStarted.call(Unit)
}
}

View File

@@ -254,6 +254,7 @@ class TrackWorker @AssistedInject constructor(
downloadSchedulerLazy.get().schedule(
manga = mangaUpdates.manga,
chaptersIds = mangaUpdates.newChapters.mapToSet { it.id },
isPaused = false,
isSilent = true,
)
}

View File

@@ -738,4 +738,7 @@
<string name="user_manual">User manual</string>
<string name="telegram_group">Telegram group</string>
<string name="error_image_format">Unsupported image format: %s</string>
<string name="start_download">Start download</string>
<string name="save_manga_confirm">Save selected manga? This may consume traffic and disk space</string>
<string name="save_manga">Save manga</string>
</resources>