From f5451a68812f56d9427a9b771f6bed00f8fbd7e6 Mon Sep 17 00:00:00 2001 From: zbue <108109611+zbue@users.noreply.github.com> Date: Sun, 30 Oct 2022 22:57:33 +0800 Subject: [PATCH] Add ability to open random manga (#8232) * Add ability to open random manga * Use `getMangaForCategory` instead * Put it in overflow menu instead of using EFAB * Partial review changes * Merge remote-tracking branch 'refs/remotes/origin/patch-6' into patch-6 # Conflicts: # app/src/main/java/eu/kanade/presentation/library/LibraryScreen.kt * Merge remote-tracking branch 'refs/remotes/origin/patch-6' into patch-6 # Conflicts: # app/src/main/java/eu/kanade/presentation/library/LibraryScreen.kt * Wording changes --- .../presentation/library/LibraryScreen.kt | 2 + .../library/components/LibraryToolbar.kt | 42 +++++++++++++++++-- .../tachiyomi/ui/library/LibraryController.kt | 10 +++++ .../tachiyomi/ui/library/LibraryPresenter.kt | 2 +- i18n/src/main/res/values/strings.xml | 2 + 5 files changed, 54 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/library/LibraryScreen.kt b/app/src/main/java/eu/kanade/presentation/library/LibraryScreen.kt index d182ce8c25..3b4f97be49 100644 --- a/app/src/main/java/eu/kanade/presentation/library/LibraryScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/library/LibraryScreen.kt @@ -36,6 +36,7 @@ fun LibraryScreen( onClickInvertSelection: () -> Unit, onClickFilter: () -> Unit, onClickRefresh: (Category?) -> Boolean, + onClickOpenRandomManga: () -> Unit, ) { Scaffold( topBar = { scrollBehavior -> @@ -51,6 +52,7 @@ fun LibraryScreen( onClickInvertSelection = onClickInvertSelection, onClickFilter = onClickFilter, onClickRefresh = { onClickRefresh(null) }, + onClickOpenRandomManga = onClickOpenRandomManga, scrollBehavior = scrollBehavior.takeIf { !tabVisible }, // For scroll overlay when no tab ) }, diff --git a/app/src/main/java/eu/kanade/presentation/library/components/LibraryToolbar.kt b/app/src/main/java/eu/kanade/presentation/library/components/LibraryToolbar.kt index 30183dbdb0..297608cbef 100644 --- a/app/src/main/java/eu/kanade/presentation/library/components/LibraryToolbar.kt +++ b/app/src/main/java/eu/kanade/presentation/library/components/LibraryToolbar.kt @@ -1,15 +1,17 @@ package eu.kanade.presentation.library.components import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.FilterList import androidx.compose.material.icons.outlined.FlipToBack -import androidx.compose.material.icons.outlined.Refresh +import androidx.compose.material.icons.outlined.MoreVert import androidx.compose.material.icons.outlined.Search import androidx.compose.material.icons.outlined.SelectAll +import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LocalContentColor @@ -17,6 +19,10 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarScrollBehavior 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.platform.LocalFocusManager @@ -26,6 +32,7 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.sp import eu.kanade.presentation.components.AppBar +import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.components.Pill import eu.kanade.presentation.components.SearchToolbar import eu.kanade.presentation.library.LibraryState @@ -43,6 +50,7 @@ fun LibraryToolbar( onClickInvertSelection: () -> Unit, onClickFilter: () -> Unit, onClickRefresh: () -> Unit, + onClickOpenRandomManga: () -> Unit, scrollBehavior: TopAppBarScrollBehavior?, ) = when { state.selectionMode -> LibrarySelectionToolbar( @@ -85,6 +93,7 @@ fun LibraryToolbar( onClickSearch = { state.searchQuery = "" }, onClickFilter = onClickFilter, onClickRefresh = onClickRefresh, + onClickOpenRandomManga = onClickOpenRandomManga, scrollBehavior = scrollBehavior, ) } @@ -98,6 +107,7 @@ fun LibraryRegularToolbar( onClickSearch: () -> Unit, onClickFilter: () -> Unit, onClickRefresh: () -> Unit, + onClickOpenRandomManga: () -> Unit, scrollBehavior: TopAppBarScrollBehavior?, ) { val pillAlpha = if (isSystemInDarkTheme()) 0.12f else 0.08f @@ -127,8 +137,34 @@ fun LibraryRegularToolbar( IconButton(onClick = onClickFilter) { Icon(Icons.Outlined.FilterList, contentDescription = stringResource(R.string.action_filter), tint = filterTint) } - IconButton(onClick = onClickRefresh) { - Icon(Icons.Outlined.Refresh, contentDescription = stringResource(R.string.pref_category_library_update)) + var moreExpanded by remember { mutableStateOf(false) } + Box { + IconButton(onClick = { moreExpanded = !moreExpanded }) { + Icon( + imageVector = Icons.Outlined.MoreVert, + contentDescription = stringResource(R.string.abc_action_menu_overflow_description), + ) + } + val onDismissRequest = { moreExpanded = false } + DropdownMenu( + expanded = moreExpanded, + onDismissRequest = onDismissRequest, + ) { + DropdownMenuItem( + text = { Text(text = stringResource(R.string.pref_category_library_update)) }, + onClick = { + onClickRefresh() + onDismissRequest() + }, + ) + DropdownMenuItem( + text = { Text(text = stringResource(R.string.action_open_random_manga)) }, + onClick = { + onClickOpenRandomManga() + onDismissRequest() + }, + ) + } } }, incognitoMode = incognitoMode, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index 52d5c6da1b..e943d7a6b4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -43,6 +43,8 @@ class LibraryController( @Composable override fun ComposeContent() { val context = LocalContext.current + val getMangaForCategory = presenter.getMangaForCategory(page = presenter.activeCategory) + LibraryScreen( presenter = presenter, onMangaClicked = ::openManga, @@ -60,6 +62,14 @@ class LibraryController( context.toast(if (started) R.string.updating_category else R.string.update_already_running) started }, + onClickOpenRandomManga = { + val items = getMangaForCategory.map { it.libraryManga.manga.id } + if (getMangaForCategory.isNotEmpty()) { + openManga(items.random()) + } else { + context.toast(R.string.information_no_entries_found) + } + }, onClickInvertSelection = { presenter.invertSelection(presenter.activeCategory) }, onClickSelectAll = { presenter.selectAll(presenter.activeCategory) }, onClickUnselectAll = ::clearSelection, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt index 988b54e206..86ac680815 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt @@ -526,7 +526,7 @@ class LibraryPresenter( @Composable fun getMangaForCategory(page: Int): List { - val unfiltered = remember(categories, loadedManga) { + val unfiltered = remember(categories, loadedManga, page) { val categoryId = categories.getOrNull(page)?.id ?: -1 loadedManga[categoryId] ?: emptyList() } diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml index ce771f9155..baf4258219 100644 --- a/i18n/src/main/res/values/strings.xml +++ b/i18n/src/main/res/values/strings.xml @@ -72,6 +72,7 @@ Disable all Edit Add + Open random entry Add category Edit categories Rename category @@ -842,6 +843,7 @@ No recent updates Nothing read recently Your library is empty + No entries found in this category Getting started guide You have no categories. Tap the plus button to create one for organizing your library. You don\'t have any categories yet.