From 5d0543d0aae84522fde42b1b06f7838538394de8 Mon Sep 17 00:00:00 2001 From: arkon Date: Sun, 12 Feb 2023 15:25:09 -0500 Subject: [PATCH] Replace custom download amount with next 25 Simplifies things and maybe discourages whacky downloading behavior? Users can still range select in the chapters list to download custom amounts. (cherry picked from commit f6e6a7ddf1d32a55da81344b1ae360e16e5560e4) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt # app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt --- .../components/DownloadDropdownMenu.kt | 49 +++------- .../manga/MangaScreenConstants.kt | 2 +- .../DownloadCustomChaptersDialog.kt | 96 ------------------- .../ui/library/LibraryScreenModel.kt | 15 +-- .../kanade/tachiyomi/ui/library/LibraryTab.kt | 11 --- .../kanade/tachiyomi/ui/manga/MangaScreen.kt | 13 --- .../tachiyomi/ui/manga/MangaScreenModel.kt | 36 +++---- i18n/src/main/res/values/strings.xml | 9 +- 8 files changed, 29 insertions(+), 202 deletions(-) delete mode 100644 app/src/main/java/eu/kanade/presentation/manga/components/DownloadCustomChaptersDialog.kt diff --git a/app/src/main/java/eu/kanade/presentation/components/DownloadDropdownMenu.kt b/app/src/main/java/eu/kanade/presentation/components/DownloadDropdownMenu.kt index 6ac95a130..2ee7e95cb 100644 --- a/app/src/main/java/eu/kanade/presentation/components/DownloadDropdownMenu.kt +++ b/app/src/main/java/eu/kanade/presentation/components/DownloadDropdownMenu.kt @@ -3,6 +3,7 @@ package eu.kanade.presentation.components import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.stringResource import eu.kanade.presentation.manga.DownloadAction import eu.kanade.tachiyomi.R @@ -18,46 +19,18 @@ fun DownloadDropdownMenu( expanded = expanded, onDismissRequest = onDismissRequest, ) { - DropdownMenuItem( - text = { Text(text = stringResource(R.string.download_1)) }, - onClick = { - onDownloadClicked(DownloadAction.NEXT_1_CHAPTER) - onDismissRequest() - }, - ) - DropdownMenuItem( - text = { Text(text = stringResource(R.string.download_5)) }, - onClick = { - onDownloadClicked(DownloadAction.NEXT_5_CHAPTERS) - onDismissRequest() - }, - ) - DropdownMenuItem( - text = { Text(text = stringResource(R.string.download_10)) }, - onClick = { - onDownloadClicked(DownloadAction.NEXT_10_CHAPTERS) - onDismissRequest() - }, - ) - DropdownMenuItem( - text = { Text(text = stringResource(R.string.download_custom)) }, - onClick = { - onDownloadClicked(DownloadAction.CUSTOM) - onDismissRequest() - }, - ) - DropdownMenuItem( - text = { Text(text = stringResource(R.string.download_unread)) }, - onClick = { - onDownloadClicked(DownloadAction.UNREAD_CHAPTERS) - onDismissRequest() - }, - ) - if (includeDownloadAllOption) { + listOfNotNull( + DownloadAction.NEXT_1_CHAPTER to pluralStringResource(R.plurals.download_amount, 1, 1), + DownloadAction.NEXT_5_CHAPTERS to pluralStringResource(R.plurals.download_amount, 5, 5), + DownloadAction.NEXT_10_CHAPTERS to pluralStringResource(R.plurals.download_amount, 10, 10), + DownloadAction.NEXT_25_CHAPTERS to pluralStringResource(R.plurals.download_amount, 25, 25), + DownloadAction.UNREAD_CHAPTERS to stringResource(R.string.download_unread), + (DownloadAction.ALL_CHAPTERS to stringResource(R.string.download_all)).takeIf { includeDownloadAllOption }, + ).map { (downloadAction, string) -> DropdownMenuItem( - text = { Text(text = stringResource(R.string.download_all)) }, + text = { Text(text = string) }, onClick = { - onDownloadClicked(DownloadAction.ALL_CHAPTERS) + onDownloadClicked(downloadAction) onDismissRequest() }, ) diff --git a/app/src/main/java/eu/kanade/presentation/manga/MangaScreenConstants.kt b/app/src/main/java/eu/kanade/presentation/manga/MangaScreenConstants.kt index 030da46d6..8e85884cd 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/MangaScreenConstants.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/MangaScreenConstants.kt @@ -4,7 +4,7 @@ enum class DownloadAction { NEXT_1_CHAPTER, NEXT_5_CHAPTERS, NEXT_10_CHAPTERS, - CUSTOM, + NEXT_25_CHAPTERS, UNREAD_CHAPTERS, ALL_CHAPTERS, } diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/DownloadCustomChaptersDialog.kt b/app/src/main/java/eu/kanade/presentation/manga/components/DownloadCustomChaptersDialog.kt deleted file mode 100644 index 53d594434..000000000 --- a/app/src/main/java/eu/kanade/presentation/manga/components/DownloadCustomChaptersDialog.kt +++ /dev/null @@ -1,96 +0,0 @@ -package eu.kanade.presentation.manga.components - -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.ChevronLeft -import androidx.compose.material.icons.outlined.ChevronRight -import androidx.compose.material.icons.outlined.KeyboardDoubleArrowLeft -import androidx.compose.material.icons.outlined.KeyboardDoubleArrowRight -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.LocalTextStyle -import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.input.KeyboardType -import androidx.compose.ui.text.style.TextAlign -import eu.kanade.tachiyomi.R - -@Composable -fun DownloadCustomAmountDialog( - maxAmount: Int, - onDismissRequest: () -> Unit, - onConfirm: (Int) -> Unit, -) { - var amount by remember { mutableStateOf(0) } - AlertDialog( - onDismissRequest = onDismissRequest, - dismissButton = { - TextButton(onClick = onDismissRequest) { - Text(text = stringResource(R.string.action_cancel)) - } - }, - confirmButton = { - TextButton( - enabled = amount != 0, - onClick = { - onDismissRequest() - onConfirm(amount.coerceIn(0, maxAmount)) - }, - ) { - Text(text = stringResource(R.string.action_download)) - } - }, - title = { - Text(text = stringResource(R.string.custom_download)) - }, - text = { - val setAmount: (Int) -> Unit = { amount = it.coerceIn(0, maxAmount) } - Row( - verticalAlignment = Alignment.CenterVertically, - ) { - IconButton( - onClick = { setAmount(amount - 10) }, - enabled = amount > 0, - ) { - Icon(imageVector = Icons.Outlined.KeyboardDoubleArrowLeft, contentDescription = "-10") - } - IconButton( - onClick = { setAmount(amount - 1) }, - enabled = amount > 0, - ) { - Icon(imageVector = Icons.Outlined.ChevronLeft, contentDescription = "-1") - } - OutlinedTextField( - modifier = Modifier.weight(1f), - value = amount.toString(), - onValueChange = { setAmount(it.toIntOrNull() ?: 0) }, - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), - textStyle = LocalTextStyle.current.copy(textAlign = TextAlign.Center), - ) - IconButton( - onClick = { setAmount(amount + 1) }, - enabled = amount < maxAmount, - ) { - Icon(imageVector = Icons.Outlined.ChevronRight, contentDescription = "+1") - } - IconButton( - onClick = { setAmount(amount + 10) }, - enabled = amount < maxAmount, - ) { - Icon(imageVector = Icons.Outlined.KeyboardDoubleArrowRight, contentDescription = "+10") - } - } - }, - ) -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt index b27620a69..b1c13ba76 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt @@ -652,18 +652,8 @@ class LibraryScreenModel( DownloadAction.NEXT_1_CHAPTER -> downloadUnreadChapters(mangas, 1) DownloadAction.NEXT_5_CHAPTERS -> downloadUnreadChapters(mangas, 5) DownloadAction.NEXT_10_CHAPTERS -> downloadUnreadChapters(mangas, 10) + DownloadAction.NEXT_25_CHAPTERS -> downloadUnreadChapters(mangas, 25) DownloadAction.UNREAD_CHAPTERS -> downloadUnreadChapters(mangas, null) - DownloadAction.CUSTOM -> { - mutableState.update { state -> - state.copy( - dialog = Dialog.DownloadCustomAmount( - mangas, - selection.maxOf { it.unreadCount }.toInt(), - ), - ) - } - return - } else -> {} } clearSelection() @@ -675,7 +665,7 @@ class LibraryScreenModel( * @param mangas the list of manga. * @param amount the amount to queue or null to queue all */ - fun downloadUnreadChapters(mangas: List, amount: Int?) { + private fun downloadUnreadChapters(mangas: List, amount: Int?) { coroutineScope.launchNonCancellable { mangas.forEach { manga -> // SY --> @@ -1152,7 +1142,6 @@ class LibraryScreenModel( sealed class Dialog { data class ChangeCategory(val manga: List, val initialSelection: List>) : Dialog() data class DeleteManga(val manga: List) : Dialog() - data class DownloadCustomAmount(val manga: List, val max: Int) : Dialog() object SyncFavoritesWarning : Dialog() object SyncFavoritesConfirm : Dialog() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt index ea1e585ab..48186758b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt @@ -43,7 +43,6 @@ import eu.kanade.presentation.library.components.LibraryToolbar import eu.kanade.presentation.library.components.SyncFavoritesConfirmDialog import eu.kanade.presentation.library.components.SyncFavoritesProgressDialog import eu.kanade.presentation.library.components.SyncFavoritesWarningDialog -import eu.kanade.presentation.manga.components.DownloadCustomAmountDialog import eu.kanade.presentation.util.Tab import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.library.LibraryUpdateJob @@ -271,16 +270,6 @@ object LibraryTab : Tab { }, ) } - is LibraryScreenModel.Dialog.DownloadCustomAmount -> { - DownloadCustomAmountDialog( - maxAmount = dialog.max, - onDismissRequest = onDismissRequest, - onConfirm = { amount -> - screenModel.downloadUnreadChapters(dialog.manga, amount) - screenModel.clearSelection() - }, - ) - } LibraryScreenModel.Dialog.SyncFavoritesWarning -> { SyncFavoritesWarningDialog( onDismissRequest = onDismissRequest, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt index 439c39f75..4f024bcfe 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt @@ -36,7 +36,6 @@ import eu.kanade.presentation.manga.ChapterSettingsDialog import eu.kanade.presentation.manga.EditCoverAction import eu.kanade.presentation.manga.MangaScreen import eu.kanade.presentation.manga.components.DeleteChaptersDialog -import eu.kanade.presentation.manga.components.DownloadCustomAmountDialog import eu.kanade.presentation.manga.components.MangaCoverDialog import eu.kanade.presentation.manga.components.SelectScanlatorsDialog import eu.kanade.presentation.util.AssistContentScreen @@ -217,18 +216,6 @@ class MangaScreen( }, ) } - is MangaInfoScreenModel.Dialog.DownloadCustomAmount -> { - DownloadCustomAmountDialog( - maxAmount = dialog.max, - onDismissRequest = onDismissRequest, - onConfirm = { amount -> - val chaptersToDownload = screenModel.getUnreadChaptersSorted().take(amount) - if (chaptersToDownload.isNotEmpty()) { - screenModel.startDownload(chapters = chaptersToDownload, startNow = false) - } - }, - ) - } is MangaInfoScreenModel.Dialog.DuplicateManga -> DuplicateMangaDialog( onDismissRequest = onDismissRequest, onConfirm = { screenModel.toggleFavorite(onRemoved = {}, checkDuplicate = false) }, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt index acef73195..5fe17f0ed 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt @@ -129,8 +129,8 @@ class MangaInfoScreenModel( val smartSearched: Boolean, private val downloadPreferences: DownloadPreferences = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), - private val readerPreferences: ReaderPreferences = Injekt.get(), - private val uiPreferences: UiPreferences = Injekt.get(), + readerPreferences: ReaderPreferences = Injekt.get(), + uiPreferences: UiPreferences = Injekt.get(), private val trackManager: TrackManager = Injekt.get(), private val downloadManager: DownloadManager = Injekt.get(), private val downloadCache: DownloadCache = Injekt.get(), @@ -187,8 +187,8 @@ class MangaInfoScreenModel( get() = successState?.processedChapters val relativeTime by uiPreferences.relativeTime().asState(coroutineScope) - val skipFiltered by readerPreferences.skipFiltered().asState(coroutineScope) val dateFormat by mutableStateOf(UiPreferences.dateFormat(uiPreferences.dateFormat().get())) + private val skipFiltered by readerPreferences.skipFiltered().asState(coroutineScope) private val selectedPositions: Array = arrayOf(-1, -1) // first and last selected index in list private val selectedChapterIds: HashSet = HashSet() @@ -776,7 +776,7 @@ class MangaInfoScreenModel( /** * Returns true if the manga has any downloads. */ - fun hasDownloads(): Boolean { + private fun hasDownloads(): Boolean { val manga = successState?.manga ?: return false return downloadManager.getDownloadCount(manga) > 0 } @@ -1006,7 +1006,7 @@ class MangaInfoScreenModel( /** * Returns the list of filtered or all chapter items if [skipFiltered] is false. */ - fun getChapterItems(): List { + private fun getChapterItems(): List { return if (skipFiltered) filteredChapters.orEmpty().toList() else allChapters.orEmpty() } @@ -1018,13 +1018,13 @@ class MangaInfoScreenModel( return successState.chapters.getNextUnread(successState.manga) } - fun getUnreadChapters(): List { + private fun getUnreadChapters(): List { return getChapterItems() .filter { (chapter, dlStatus) -> !chapter.read && dlStatus == Download.State.NOT_DOWNLOADED } .map { it.chapter } } - fun getUnreadChaptersSorted(): List { + private fun getUnreadChaptersSorted(): List { val manga = successState?.manga ?: return emptyList() val chaptersSorted = getUnreadChapters().sortedWith(getChapterSort(manga)) // SY --> @@ -1035,7 +1035,7 @@ class MangaInfoScreenModel( return if (manga.sortDescending()) chaptersSorted.reversed() else chaptersSorted } - fun startDownload( + private fun startDownload( chapters: List, startNow: Boolean, ) { @@ -1095,19 +1095,16 @@ class MangaInfoScreenModel( DownloadAction.NEXT_1_CHAPTER -> getUnreadChaptersSorted().take(1) DownloadAction.NEXT_5_CHAPTERS -> getUnreadChaptersSorted().take(5) DownloadAction.NEXT_10_CHAPTERS -> getUnreadChaptersSorted().take(10) - DownloadAction.CUSTOM -> { - showDownloadCustomDialog() - return - } + DownloadAction.NEXT_25_CHAPTERS -> getUnreadChaptersSorted().take(25) DownloadAction.UNREAD_CHAPTERS -> getUnreadChapters() DownloadAction.ALL_CHAPTERS -> getChapterItems().map { it.chapter } } - if (!chaptersToDownload.isNullOrEmpty()) { + if (chaptersToDownload.isNotEmpty()) { startDownload(chaptersToDownload, false) } } - fun cancelDownload(chapterId: Long) { + private fun cancelDownload(chapterId: Long) { val activeDownload = downloadManager.getQueuedDownloadOrNull(chapterId) ?: return downloadManager.cancelQueuedDownloads(listOf(activeDownload)) updateDownloadState(activeDownload.apply { status = Download.State.NOT_DOWNLOADED }) @@ -1446,7 +1443,6 @@ class MangaInfoScreenModel( data class ChangeCategory(val manga: Manga, val initialSelection: List>) : Dialog() data class DeleteChapters(val chapters: List) : Dialog() data class DuplicateManga(val manga: Manga, val duplicate: Manga) : Dialog() - data class DownloadCustomAmount(val max: Int) : Dialog() // SY --> data class EditMangaInfo(val manga: Manga) : Dialog() @@ -1467,16 +1463,6 @@ class MangaInfoScreenModel( } } - private fun showDownloadCustomDialog() { - val max = getChapterItems().count() - mutableState.update { state -> - when (state) { - MangaScreenState.Loading -> state - is MangaScreenState.Success -> state.copy(dialog = Dialog.DownloadCustomAmount(max)) - } - } - } - fun showDeleteChapterDialog(chapters: List) { mutableState.update { state -> when (state) { diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml index df011743b..dbaf7b934 100755 --- a/i18n/src/main/res/values/strings.xml +++ b/i18n/src/main/res/values/strings.xml @@ -653,11 +653,10 @@ By chapter number By upload date Download - Download custom amount - Next chapter - Next 5 chapters - Next 10 chapters - Custom + + Next chapter + Next %d chapters + All Unread Custom cover