diff --git a/app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt index faef3409a1..e2f4461236 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt @@ -40,10 +40,9 @@ import eu.kanade.presentation.browse.components.BrowseSourceComfortableGrid import eu.kanade.presentation.browse.components.BrowseSourceCompactGrid import eu.kanade.presentation.browse.components.BrowseSourceList import eu.kanade.presentation.browse.components.BrowseSourceToolbar -import eu.kanade.presentation.components.DownloadedOnlyModeBanner +import eu.kanade.presentation.components.AppStateBanners import eu.kanade.presentation.components.EmptyScreen import eu.kanade.presentation.components.ExtendedFloatingActionButton -import eu.kanade.presentation.components.IncognitoModeBanner import eu.kanade.presentation.components.LoadingScreen import eu.kanade.presentation.components.Scaffold import eu.kanade.tachiyomi.R @@ -90,12 +89,8 @@ fun BrowseSourceScreen( onSearch = { presenter.search() }, scrollBehavior = scrollBehavior, ) - if (downloadedOnlyMode) { - DownloadedOnlyModeBanner() - } - if (incognitoMode) { - IncognitoModeBanner() - } + + AppStateBanners(downloadedOnlyMode, incognitoMode) } }, floatingActionButton = { @@ -140,7 +135,7 @@ fun BrowseSourceScreen( ) }, label = { - Text(text = stringResource(id = R.string.popular)) + Text(text = stringResource(R.string.popular)) }, ) if (presenter.source?.supportsLatest == true) { @@ -159,7 +154,7 @@ fun BrowseSourceScreen( ) }, label = { - Text(text = stringResource(id = R.string.latest)) + Text(text = stringResource(R.string.latest)) }, ) } @@ -176,7 +171,7 @@ fun BrowseSourceScreen( ) }, label = { - Text(text = stringResource(id = R.string.action_filter)) + Text(text = stringResource(R.string.action_filter)) }, ) } @@ -195,7 +190,7 @@ fun BrowseSourceFloatingActionButton( AnimatedVisibility(visible = isVisible) { ExtendedFloatingActionButton( modifier = modifier, - text = { Text(text = stringResource(id = R.string.action_filter)) }, + text = { Text(text = stringResource(R.string.action_filter)) }, icon = { Icon(Icons.Outlined.FilterList, contentDescription = "") }, onClick = onFabClick, ) diff --git a/app/src/main/java/eu/kanade/presentation/browse/MigrateSourceScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/MigrateSourceScreen.kt index 91c3c4d9f1..be6fd1cfdc 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/MigrateSourceScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/MigrateSourceScreen.kt @@ -1,5 +1,6 @@ package eu.kanade.presentation.browse +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -84,7 +85,7 @@ fun MigrateSourceList( stickyHeader(key = "header") { Row( modifier = Modifier - .animateItemPlacement() + .background(MaterialTheme.colorScheme.background) .padding(start = horizontalPadding), verticalAlignment = Alignment.CenterVertically, ) { @@ -109,14 +110,9 @@ fun MigrateSourceList( } } - item(key = "title") { - } - items( items = list, - key = { (source, _) -> - source.id - }, + key = { (source, _) -> source.id }, ) { (source, count) -> MigrateSourceItem( modifier = Modifier.animateItemPlacement(), diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceComfortableGrid.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceComfortableGrid.kt index 24b366fc37..9bfd6ee07f 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceComfortableGrid.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceComfortableGrid.kt @@ -102,7 +102,7 @@ fun BrowseSourceComfortableGridItem( }, badgesStart = { if (manga.favorite) { - Badge(text = stringResource(id = R.string.in_library)) + Badge(text = stringResource(R.string.in_library)) } }, ) diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceCompactGrid.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceCompactGrid.kt index 08fb8fa06e..573737f851 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceCompactGrid.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceCompactGrid.kt @@ -113,7 +113,7 @@ fun BrowseSourceCompactGridItem( }, badgesStart = { if (manga.favorite) { - Badge(text = stringResource(id = R.string.in_library)) + Badge(text = stringResource(R.string.in_library)) } }, content = { diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceDialogs.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceDialogs.kt index bc6e05f316..1479ee08f0 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceDialogs.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceDialogs.kt @@ -18,7 +18,7 @@ fun RemoveMangaDialog( onDismissRequest = onDismissRequest, dismissButton = { TextButton(onClick = onDismissRequest) { - Text(text = stringResource(id = android.R.string.cancel)) + Text(text = stringResource(android.R.string.cancel)) } }, confirmButton = { @@ -28,11 +28,11 @@ fun RemoveMangaDialog( onConfirm() }, ) { - Text(text = stringResource(id = R.string.action_remove)) + Text(text = stringResource(R.string.action_remove)) } }, title = { - Text(text = stringResource(id = R.string.are_you_sure)) + Text(text = stringResource(R.string.are_you_sure)) }, text = { Text(text = stringResource(R.string.remove_manga)) diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceList.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceList.kt index 6c0ed83b24..aee4ee435c 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceList.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceList.kt @@ -91,7 +91,7 @@ fun BrowseSourceListItem( onLongClick = onLongClick, badges = { if (manga.favorite) { - Badge(text = stringResource(id = R.string.in_library)) + Badge(text = stringResource(R.string.in_library)) } }, content = { diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt index 83246f2e44..47b6d081d8 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt @@ -85,24 +85,24 @@ fun BrowseSourceRegularToolbar( AppBarActions( actions = listOf( AppBar.Action( - title = stringResource(id = R.string.action_search), + title = stringResource(R.string.action_search), icon = Icons.Outlined.Search, onClick = onSearchClick, ), AppBar.Action( - title = stringResource(id = R.string.action_display_mode), + title = stringResource(R.string.action_display_mode), icon = Icons.Filled.ViewModule, onClick = { selectingDisplayMode = true }, ), if (isLocalSource) { AppBar.Action( - title = stringResource(id = R.string.label_help), + title = stringResource(R.string.label_help), icon = Icons.Outlined.Help, onClick = onHelpClick, ) } else { AppBar.Action( - title = stringResource(id = R.string.action_web_view), + title = stringResource(R.string.action_web_view), icon = Icons.Outlined.Public, onClick = onWebViewClick, ) @@ -114,7 +114,7 @@ fun BrowseSourceRegularToolbar( onDismissRequest = { selectingDisplayMode = false }, ) { DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.action_display_comfortable_grid)) }, + text = { Text(text = stringResource(R.string.action_display_comfortable_grid)) }, onClick = { onDisplayModeChange(LibraryDisplayMode.ComfortableGrid) }, trailingIcon = { if (displayMode == LibraryDisplayMode.ComfortableGrid) { @@ -126,7 +126,7 @@ fun BrowseSourceRegularToolbar( }, ) DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.action_display_grid)) }, + text = { Text(text = stringResource(R.string.action_display_grid)) }, onClick = { onDisplayModeChange(LibraryDisplayMode.CompactGrid) }, trailingIcon = { if (displayMode == LibraryDisplayMode.CompactGrid) { @@ -138,7 +138,7 @@ fun BrowseSourceRegularToolbar( }, ) DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.action_display_list)) }, + text = { Text(text = stringResource(R.string.action_display_list)) }, onClick = { onDisplayModeChange(LibraryDisplayMode.List) }, trailingIcon = { if (displayMode == LibraryDisplayMode.List) { diff --git a/app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt b/app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt index be451b9d37..2c5d38dc0a 100644 --- a/app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt +++ b/app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt @@ -51,6 +51,7 @@ fun CategoryCreateDialog( label = { Text(text = stringResource(R.string.name)) }, + singleLine = true, ) }, ) @@ -98,6 +99,7 @@ fun CategoryRenameDialog( label = { Text(text = stringResource(R.string.name)) }, + singleLine = true, ) }, ) diff --git a/app/src/main/java/eu/kanade/presentation/components/AppBar.kt b/app/src/main/java/eu/kanade/presentation/components/AppBar.kt index e3a28118da..165f7dc782 100644 --- a/app/src/main/java/eu/kanade/presentation/components/AppBar.kt +++ b/app/src/main/java/eu/kanade/presentation/components/AppBar.kt @@ -144,12 +144,7 @@ fun AppBar( scrollBehavior = scrollBehavior, ) - if (downloadedOnlyMode) { - DownloadedOnlyModeBanner() - } - if (incognitoMode) { - IncognitoModeBanner() - } + AppStateBanners(downloadedOnlyMode, incognitoMode) } } diff --git a/app/src/main/java/eu/kanade/presentation/components/Banners.kt b/app/src/main/java/eu/kanade/presentation/components/Banners.kt index fa5ee4620f..f234832a47 100644 --- a/app/src/main/java/eu/kanade/presentation/components/Banners.kt +++ b/app/src/main/java/eu/kanade/presentation/components/Banners.kt @@ -1,6 +1,7 @@ package eu.kanade.presentation.components import androidx.compose.foundation.background +import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme @@ -13,7 +14,20 @@ import androidx.compose.ui.unit.dp import eu.kanade.tachiyomi.R @Composable -fun DownloadedOnlyModeBanner() { +fun ColumnScope.AppStateBanners( + downloadedOnlyMode: Boolean, + incognitoMode: Boolean, +) { + if (downloadedOnlyMode) { + DownloadedOnlyModeBanner() + } + if (incognitoMode) { + IncognitoModeBanner() + } +} + +@Composable +private fun DownloadedOnlyModeBanner() { Text( text = stringResource(R.string.label_downloaded_only), modifier = Modifier @@ -27,7 +41,7 @@ fun DownloadedOnlyModeBanner() { } @Composable -fun IncognitoModeBanner() { +private fun IncognitoModeBanner() { Text( text = stringResource(R.string.pref_incognito_mode), modifier = Modifier diff --git a/app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt b/app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt index 9ad3cdfc0a..9284af56df 100644 --- a/app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt @@ -76,12 +76,7 @@ fun TabbedScreen( } } - if (downloadedOnlyMode) { - DownloadedOnlyModeBanner() - } - if (incognitoMode) { - IncognitoModeBanner() - } + AppStateBanners(downloadedOnlyMode, incognitoMode) HorizontalPager( count = tabs.size, diff --git a/app/src/main/java/eu/kanade/presentation/library/components/LibraryTabs.kt b/app/src/main/java/eu/kanade/presentation/library/components/LibraryTabs.kt index b256805f13..7ca634a6f4 100644 --- a/app/src/main/java/eu/kanade/presentation/library/components/LibraryTabs.kt +++ b/app/src/main/java/eu/kanade/presentation/library/components/LibraryTabs.kt @@ -13,8 +13,7 @@ import androidx.compose.ui.unit.dp import com.google.accompanist.pager.PagerState import eu.kanade.domain.category.model.Category import eu.kanade.presentation.category.visualName -import eu.kanade.presentation.components.DownloadedOnlyModeBanner -import eu.kanade.presentation.components.IncognitoModeBanner +import eu.kanade.presentation.components.AppStateBanners import eu.kanade.presentation.components.TabIndicator import eu.kanade.presentation.components.TabText import kotlinx.coroutines.launch @@ -51,11 +50,7 @@ fun LibraryTabs( ) } } - if (isDownloadOnly) { - DownloadedOnlyModeBanner() - } - if (isIncognitoMode) { - IncognitoModeBanner() - } + + AppStateBanners(isDownloadOnly, isIncognitoMode) } } diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaAppBar.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaAppBar.kt index ca2ab237cb..1cacfe5371 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaAppBar.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaAppBar.kt @@ -28,9 +28,8 @@ import androidx.compose.ui.draw.alpha import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import eu.kanade.presentation.components.DownloadedOnlyModeBanner +import eu.kanade.presentation.components.AppStateBanners import eu.kanade.presentation.components.DropdownMenu -import eu.kanade.presentation.components.IncognitoModeBanner import eu.kanade.presentation.manga.DownloadAction import eu.kanade.tachiyomi.R @@ -198,11 +197,6 @@ fun MangaAppBar( ), ) - if (downloadedOnlyMode) { - DownloadedOnlyModeBanner() - } - if (incognitoMode) { - IncognitoModeBanner() - } + AppStateBanners(downloadedOnlyMode, incognitoMode) } } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/database/ClearDatabaseScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/database/ClearDatabaseScreen.kt index ee19250a9f..54601e0926 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/database/ClearDatabaseScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/database/ClearDatabaseScreen.kt @@ -1,5 +1,6 @@ package eu.kanade.presentation.more.settings.database +import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import eu.kanade.presentation.components.Scaffold @@ -7,7 +8,6 @@ import eu.kanade.presentation.more.settings.database.components.ClearDatabaseCon import eu.kanade.presentation.more.settings.database.components.ClearDatabaseDeleteDialog import eu.kanade.presentation.more.settings.database.components.ClearDatabaseFloatingActionButton import eu.kanade.presentation.more.settings.database.components.ClearDatabaseToolbar -import eu.kanade.presentation.util.plus import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.setting.database.ClearDatabasePresenter import eu.kanade.tachiyomi.util.system.toast @@ -18,6 +18,7 @@ fun ClearDatabaseScreen( navigateUp: () -> Unit, ) { val context = LocalContext.current + val lazyListState = rememberLazyListState() Scaffold( topBar = { scrollBehavior -> ClearDatabaseToolbar( @@ -31,6 +32,7 @@ fun ClearDatabaseScreen( floatingActionButton = { ClearDatabaseFloatingActionButton( isVisible = presenter.selection.isNotEmpty(), + lazyListState = lazyListState, onClickDelete = { presenter.dialog = ClearDatabasePresenter.Dialog.Delete(presenter.selection) }, @@ -40,6 +42,7 @@ fun ClearDatabaseScreen( ClearDatabaseContent( state = presenter, contentPadding = paddingValues, + lazyListState = lazyListState, onClickSelection = { source -> presenter.toggleSelection(source) }, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/database/components/ClearDatabaseContent.kt b/app/src/main/java/eu/kanade/presentation/more/settings/database/components/ClearDatabaseContent.kt index 43f0241849..fe9b3b085e 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/database/components/ClearDatabaseContent.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/database/components/ClearDatabaseContent.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource @@ -19,12 +20,14 @@ import eu.kanade.tachiyomi.R fun ClearDatabaseContent( state: ClearDatabaseState, contentPadding: PaddingValues, + lazyListState: LazyListState, onClickSelection: (Source) -> Unit, ) { Crossfade(targetState = state.isEmpty.not()) { _state -> when (_state) { true -> FastScrollLazyColumn( contentPadding = contentPadding + WindowInsets.navigationBars.asPaddingValues(), + state = lazyListState, ) { items(state.items) { sourceWithCount -> ClearDatabaseItem( diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/database/components/ClearDatabaseFloatingActionButton.kt b/app/src/main/java/eu/kanade/presentation/more/settings/database/components/ClearDatabaseFloatingActionButton.kt index 1a13441d12..fe6b2bbdbb 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/database/components/ClearDatabaseFloatingActionButton.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/database/components/ClearDatabaseFloatingActionButton.kt @@ -4,6 +4,7 @@ import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.lazy.LazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Delete import androidx.compose.material3.Icon @@ -12,11 +13,14 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import eu.kanade.presentation.components.ExtendedFloatingActionButton +import eu.kanade.presentation.util.isScrolledToEnd +import eu.kanade.presentation.util.isScrollingUp import eu.kanade.tachiyomi.R @Composable fun ClearDatabaseFloatingActionButton( isVisible: Boolean, + lazyListState: LazyListState, onClickDelete: () -> Unit, ) { AnimatedVisibility( @@ -33,6 +37,7 @@ fun ClearDatabaseFloatingActionButton( Icon(Icons.Outlined.Delete, contentDescription = "") }, onClick = onClickDelete, + expanded = lazyListState.isScrollingUp() || lazyListState.isScrolledToEnd(), ) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadController.kt index ec46f6e637..3329095966 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadController.kt @@ -174,20 +174,20 @@ class DownloadController : onDismissRequest = { onExpanded(false) }, ) { DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.action_reorganize_by)) }, + text = { Text(text = stringResource(R.string.action_reorganize_by)) }, children = { DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.action_order_by_upload_date)) }, + text = { Text(text = stringResource(R.string.action_order_by_upload_date)) }, children = { DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.action_newest)) }, + text = { Text(text = stringResource(R.string.action_newest)) }, onClick = { reorderQueue({ it.download.chapter.date_upload }, true) onExpanded(false) }, ) DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.action_oldest)) }, + text = { Text(text = stringResource(R.string.action_oldest)) }, onClick = { reorderQueue({ it.download.chapter.date_upload }, false) onExpanded(false) @@ -196,17 +196,17 @@ class DownloadController : }, ) DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.action_order_by_chapter_number)) }, + text = { Text(text = stringResource(R.string.action_order_by_chapter_number)) }, children = { DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.action_asc)) }, + text = { Text(text = stringResource(R.string.action_asc)) }, onClick = { reorderQueue({ it.download.chapter.chapter_number }, false) onExpanded(false) }, ) DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.action_desc)) }, + text = { Text(text = stringResource(R.string.action_desc)) }, onClick = { reorderQueue({ it.download.chapter.chapter_number }, true) onExpanded(false) @@ -217,7 +217,7 @@ class DownloadController : }, ) DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.action_cancel_all)) }, + text = { Text(text = stringResource(R.string.action_cancel_all)) }, onClick = { presenter.clearQueue(context) onExpanded(false)