From a9fe971337bbafa166a000fc1cf44b7cae9f2fc9 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Sat, 27 Dec 2025 01:03:46 +0600 Subject: [PATCH] Switch to M3E ExtendedFloatingActionButton (cherry picked from commit a39b5a56e853a9c11c0984b0385a2e60b0addc3a) --- .../BrowseSourceFloatingActionButton.kt | 4 +- .../CategoryFloatingActionButton.kt | 4 +- .../kanade/presentation/manga/MangaScreen.kt | 82 +++++------ .../migration/manga/MigrateMangaScreen.kt | 34 +++-- .../search/MigrateSourceSearchScreen.kt | 22 +-- .../ui/download/DownloadQueueScreen.kt | 70 +++++----- .../migration/config/MigrationConfigScreen.kt | 4 +- .../material/FloatingActionButton.kt | 131 ------------------ .../presentation/core/util/LazyListState.kt | 15 +- 9 files changed, 110 insertions(+), 256 deletions(-) delete mode 100644 presentation-core/src/main/java/tachiyomi/presentation/core/components/material/FloatingActionButton.kt diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceFloatingActionButton.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceFloatingActionButton.kt index 40b153c83..d5e797974 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceFloatingActionButton.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceFloatingActionButton.kt @@ -3,12 +3,12 @@ package eu.kanade.presentation.browse.components import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.FilterList import androidx.compose.material3.Icon +import androidx.compose.material3.SmallExtendedFloatingActionButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import tachiyomi.i18n.MR import tachiyomi.i18n.sy.SYMR -import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.i18n.stringResource @Composable @@ -17,7 +17,7 @@ fun BrowseSourceFloatingActionButton( onFabClick: () -> Unit, modifier: Modifier = Modifier, ) { - ExtendedFloatingActionButton( + SmallExtendedFloatingActionButton( modifier = modifier, text = { Text( diff --git a/app/src/main/java/eu/kanade/presentation/category/components/CategoryFloatingActionButton.kt b/app/src/main/java/eu/kanade/presentation/category/components/CategoryFloatingActionButton.kt index a151e9b2f..bb246b066 100644 --- a/app/src/main/java/eu/kanade/presentation/category/components/CategoryFloatingActionButton.kt +++ b/app/src/main/java/eu/kanade/presentation/category/components/CategoryFloatingActionButton.kt @@ -4,11 +4,11 @@ import androidx.compose.foundation.lazy.LazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Add import androidx.compose.material3.Icon +import androidx.compose.material3.SmallExtendedFloatingActionButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import tachiyomi.i18n.MR -import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.shouldExpandFAB @@ -18,7 +18,7 @@ fun CategoryFloatingActionButton( onCreate: () -> Unit, modifier: Modifier = Modifier, ) { - ExtendedFloatingActionButton( + SmallExtendedFloatingActionButton( text = { Text(text = stringResource(MR.strings.action_add)) }, icon = { Icon(imageVector = Icons.Outlined.Add, contentDescription = null) }, onClick = onCreate, diff --git a/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt index 72808c653..5a5d9d18e 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt @@ -1,10 +1,7 @@ package eu.kanade.presentation.manga import androidx.activity.compose.BackHandler -import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.animateFloatAsState -import androidx.compose.animation.fadeIn -import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -27,9 +24,11 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material3.Icon +import androidx.compose.material3.SmallExtendedFloatingActionButton import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text +import androidx.compose.material3.animateFloatingActionButton import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue @@ -101,7 +100,6 @@ import tachiyomi.domain.source.model.StubSource import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.TwoPanelBox import tachiyomi.presentation.core.components.VerticalFastScroller -import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.components.material.PullRefresh import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource @@ -418,25 +416,23 @@ private fun MangaScreenSmallImpl( val isFABVisible = remember(chapters) { chapters.fastAny { !it.chapter.read } && !isAnySelected } - AnimatedVisibility( - visible = isFABVisible, - enter = fadeIn(), - exit = fadeOut(), - ) { - ExtendedFloatingActionButton( - text = { - val isReading = remember(state.chapters) { - state.chapters.fastAny { it.chapter.read } - } - Text( - text = stringResource(if (isReading) MR.strings.action_resume else MR.strings.action_start), - ) - }, - icon = { Icon(imageVector = Icons.Filled.PlayArrow, contentDescription = null) }, - onClick = onContinueReading, - expanded = chapterListState.shouldExpandFAB(), - ) - } + SmallExtendedFloatingActionButton( + text = { + val isReading = remember(state.chapters) { + state.chapters.fastAny { it.chapter.read } + } + Text( + text = stringResource(if (isReading) MR.strings.action_resume else MR.strings.action_start), + ) + }, + icon = { Icon(imageVector = Icons.Filled.PlayArrow, contentDescription = null) }, + onClick = onContinueReading, + expanded = chapterListState.shouldExpandFAB(), + modifier = Modifier.animateFloatingActionButton( + visible = isFABVisible, + alignment = Alignment.BottomEnd, + ), + ) }, ) { contentPadding -> val topPadding = contentPadding.calculateTopPadding() @@ -737,27 +733,25 @@ fun MangaScreenLargeImpl( val isFABVisible = remember(chapters) { chapters.fastAny { !it.chapter.read } && !isAnySelected } - AnimatedVisibility( - visible = isFABVisible, - enter = fadeIn(), - exit = fadeOut(), - ) { - ExtendedFloatingActionButton( - text = { - val isReading = remember(state.chapters) { - state.chapters.fastAny { it.chapter.read } - } - Text( - text = stringResource( - if (isReading) MR.strings.action_resume else MR.strings.action_start, - ), - ) - }, - icon = { Icon(imageVector = Icons.Filled.PlayArrow, contentDescription = null) }, - onClick = onContinueReading, - expanded = chapterListState.shouldExpandFAB(), - ) - } + SmallExtendedFloatingActionButton( + text = { + val isReading = remember(state.chapters) { + state.chapters.fastAny { it.chapter.read } + } + Text( + text = stringResource( + if (isReading) MR.strings.action_resume else MR.strings.action_start, + ), + ) + }, + icon = { Icon(imageVector = Icons.Filled.PlayArrow, contentDescription = null) }, + onClick = onContinueReading, + expanded = chapterListState.shouldExpandFAB(), + modifier = Modifier.animateFloatingActionButton( + visible = isFABVisible, + alignment = Alignment.BottomEnd, + ), + ) }, ) { contentPadding -> PullRefresh( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrateMangaScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrateMangaScreen.kt index 0a090032a..e9e3e187c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrateMangaScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrateMangaScreen.kt @@ -9,11 +9,14 @@ import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.ArrowForward import androidx.compose.material3.Icon +import androidx.compose.material3.SmallExtendedFloatingActionButton import androidx.compose.material3.Text +import androidx.compose.material3.animateFloatingActionButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel @@ -29,7 +32,6 @@ import mihon.feature.migration.config.MigrationConfigScreen import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.FastScrollLazyColumn -import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen @@ -75,20 +77,22 @@ data class MigrateMangaScreen( ) }, floatingActionButton = { - if (state.selectionMode) { - ExtendedFloatingActionButton( - text = { Text(text = stringResource(MR.strings.migrationConfigScreen_continueButtonText)) }, - icon = { - Icon(imageVector = Icons.AutoMirrored.Outlined.ArrowForward, contentDescription = null) - }, - onClick = { - val selection = state.selection - screenModel.clearSelection() - navigator.push(MigrationConfigScreen(selection)) - }, - expanded = lazyListState.shouldExpandFAB(), - ) - } + SmallExtendedFloatingActionButton( + text = { Text(text = stringResource(MR.strings.migrationConfigScreen_continueButtonText)) }, + icon = { + Icon(imageVector = Icons.AutoMirrored.Outlined.ArrowForward, contentDescription = null) + }, + onClick = { + val selection = state.selection + screenModel.clearSelection() + navigator.push(MigrationConfigScreen(selection)) + }, + expanded = lazyListState.shouldExpandFAB(), + modifier = Modifier.animateFloatingActionButton( + visible = state.selectionMode, + alignment = Alignment.BottomEnd, + ), + ) }, ) { contentPadding -> if (state.isEmpty) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSourceSearchScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSourceSearchScreen.kt index 27c3c3db9..6cf0bbcb5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSourceSearchScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSourceSearchScreen.kt @@ -1,17 +1,20 @@ package eu.kanade.tachiyomi.ui.browse.migration.search -import androidx.compose.animation.AnimatedVisibility import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.FilterList import androidx.compose.material3.Icon +import androidx.compose.material3.SmallExtendedFloatingActionButton import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text +import androidx.compose.material3.animateFloatingActionButton import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalUriHandler import cafe.adriel.voyager.core.model.rememberScreenModel @@ -35,7 +38,6 @@ import mihon.presentation.core.util.collectAsLazyPagingItems import tachiyomi.core.common.Constants import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR -import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen @@ -74,13 +76,15 @@ data class MigrateSourceSearchScreen( ) }, floatingActionButton = { - AnimatedVisibility(visible = state.filters.isNotEmpty()) { - ExtendedFloatingActionButton( - text = { Text(text = stringResource(MR.strings.action_filter)) }, - icon = { Icon(Icons.Outlined.FilterList, contentDescription = null) }, - onClick = screenModel::openFilterSheet, - ) - } + SmallExtendedFloatingActionButton( + text = { Text(text = stringResource(MR.strings.action_filter)) }, + icon = { Icon(Icons.Outlined.FilterList, contentDescription = null) }, + onClick = screenModel::openFilterSheet, + modifier = Modifier.animateFloatingActionButton( + visible = state.filters.isNotEmpty(), + alignment = Alignment.BottomEnd, + ), + ) }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreen.kt index 8332c0c97..fd325a8be 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreen.kt @@ -1,9 +1,6 @@ package eu.kanade.tachiyomi.ui.download import android.view.LayoutInflater -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.fadeIn -import androidx.compose.animation.fadeOut import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row @@ -16,8 +13,10 @@ import androidx.compose.material.icons.outlined.Pause import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SmallExtendedFloatingActionButton import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.animateFloatingActionButton import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -56,7 +55,6 @@ import kotlinx.collections.immutable.persistentListOf import tachiyomi.core.common.util.lang.launchUI import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.Pill -import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen @@ -201,39 +199,37 @@ object DownloadQueueScreen : Screen() { ) }, floatingActionButton = { - AnimatedVisibility( - visible = downloadList.isNotEmpty(), - enter = fadeIn(), - exit = fadeOut(), - ) { - val isRunning by screenModel.isDownloaderRunning.collectAsState() - ExtendedFloatingActionButton( - text = { - val id = if (isRunning) { - MR.strings.action_pause - } else { - MR.strings.action_resume - } - Text(text = stringResource(id)) - }, - icon = { - val icon = if (isRunning) { - Icons.Outlined.Pause - } else { - Icons.Filled.PlayArrow - } - Icon(imageVector = icon, contentDescription = null) - }, - onClick = { - if (isRunning) { - screenModel.pauseDownloads() - } else { - screenModel.startDownloads() - } - }, - expanded = fabExpanded, - ) - } + val isRunning by screenModel.isDownloaderRunning.collectAsState() + SmallExtendedFloatingActionButton( + text = { + val id = if (isRunning) { + MR.strings.action_pause + } else { + MR.strings.action_resume + } + Text(text = stringResource(id)) + }, + icon = { + val icon = if (isRunning) { + Icons.Outlined.Pause + } else { + Icons.Filled.PlayArrow + } + Icon(imageVector = icon, contentDescription = null) + }, + onClick = { + if (isRunning) { + screenModel.pauseDownloads() + } else { + screenModel.startDownloads() + } + }, + expanded = fabExpanded, + modifier = Modifier.animateFloatingActionButton( + visible = downloadList.isNotEmpty(), + alignment = Alignment.BottomEnd, + ), + ) }, ) { contentPadding -> if (downloadList.isEmpty()) { diff --git a/app/src/main/java/mihon/feature/migration/config/MigrationConfigScreen.kt b/app/src/main/java/mihon/feature/migration/config/MigrationConfigScreen.kt index 2031fa315..ce1280276 100644 --- a/app/src/main/java/mihon/feature/migration/config/MigrationConfigScreen.kt +++ b/app/src/main/java/mihon/feature/migration/config/MigrationConfigScreen.kt @@ -20,6 +20,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.ListItem import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SmallExtendedFloatingActionButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -62,7 +63,6 @@ import tachiyomi.domain.source.service.SourceManager import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.Pill -import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @@ -144,7 +144,7 @@ class MigrationConfigScreen(private val mangaIds: Collection) : Screen() { ) }, floatingActionButton = { - ExtendedFloatingActionButton( + SmallExtendedFloatingActionButton( text = { Text(text = stringResource(MR.strings.migrationConfigScreen_continueButtonText)) }, icon = { Icon(imageVector = Icons.AutoMirrored.Outlined.ArrowForward, contentDescription = null) }, onClick = { diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/FloatingActionButton.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/FloatingActionButton.kt deleted file mode 100644 index c43a6849d..000000000 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/FloatingActionButton.kt +++ /dev/null @@ -1,131 +0,0 @@ -package tachiyomi.presentation.core.components.material - -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.core.CubicBezierEasing -import androidx.compose.animation.core.animateDpAsState -import androidx.compose.animation.core.tween -import androidx.compose.animation.expandHorizontally -import androidx.compose.animation.fadeIn -import androidx.compose.animation.fadeOut -import androidx.compose.animation.shrinkHorizontally -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.sizeIn -import androidx.compose.material3.FloatingActionButton -import androidx.compose.material3.FloatingActionButtonDefaults -import androidx.compose.material3.FloatingActionButtonElevation -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.contentColorFor -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.unit.dp - -/** - * ExtendedFloatingActionButton with custom transition between collapsed/expanded state. - * - * @see androidx.compose.material3.ExtendedFloatingActionButton - */ -@Composable -fun ExtendedFloatingActionButton( - text: @Composable () -> Unit, - icon: @Composable () -> Unit, - onClick: () -> Unit, - modifier: Modifier = Modifier, - expanded: Boolean = true, - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - shape: Shape = MaterialTheme.shapes.large, - containerColor: Color = MaterialTheme.colorScheme.primaryContainer, - contentColor: Color = contentColorFor(containerColor), - elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(), -) { - FloatingActionButton( - modifier = modifier, - onClick = onClick, - interactionSource = interactionSource, - shape = shape, - containerColor = containerColor, - contentColor = contentColor, - elevation = elevation, - ) { - val minWidth by animateDpAsState( - targetValue = if (expanded) ExtendedFabMinimumWidth else FabContainerWidth, - animationSpec = tween( - durationMillis = 500, - easing = EasingEmphasizedCubicBezier, - ), - label = "minWidth", - ) - val startPadding by animateDpAsState( - targetValue = if (expanded) ExtendedFabIconSize / 2 else 0.dp, - animationSpec = tween( - durationMillis = if (expanded) 300 else 900, - easing = EasingEmphasizedCubicBezier, - ), - label = "startPadding", - ) - - Row( - modifier = Modifier - .sizeIn(minWidth = minWidth) - .padding(start = startPadding), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center, - ) { - icon() - AnimatedVisibility( - visible = expanded, - enter = ExtendedFabExpandAnimation, - exit = ExtendedFabCollapseAnimation, - ) { - Box(modifier = Modifier.padding(start = ExtendedFabIconPadding, end = ExtendedFabTextPadding)) { - text() - } - } - } - } -} - -private val EasingLinearCubicBezier = CubicBezierEasing(0.0f, 0.0f, 1.0f, 1.0f) -private val EasingEmphasizedCubicBezier = CubicBezierEasing(0.2f, 0.0f, 0.0f, 1.0f) - -private val ExtendedFabMinimumWidth = 80.dp -private val ExtendedFabIconSize = 24.0.dp -private val ExtendedFabIconPadding = 12.dp -private val ExtendedFabTextPadding = 20.dp - -private val ExtendedFabCollapseAnimation = fadeOut( - animationSpec = tween( - durationMillis = 100, - easing = EasingLinearCubicBezier, - ), -) + shrinkHorizontally( - animationSpec = tween( - durationMillis = 500, - easing = EasingEmphasizedCubicBezier, - ), - shrinkTowards = Alignment.Start, -) - -private val ExtendedFabExpandAnimation = fadeIn( - animationSpec = tween( - durationMillis = 200, - delayMillis = 100, - easing = EasingLinearCubicBezier, - ), -) + expandHorizontally( - animationSpec = tween( - durationMillis = 500, - easing = EasingEmphasizedCubicBezier, - ), - expandFrom = Alignment.Start, -) - -private val FabContainerWidth = 56.0.dp diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/util/LazyListState.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/util/LazyListState.kt index cdabf1b49..bb07a3f5e 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/util/LazyListState.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/util/LazyListState.kt @@ -1,18 +1,5 @@ package tachiyomi.presentation.core.util import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.derivedStateOf -import androidx.compose.runtime.remember -@Composable -fun LazyListState.shouldExpandFAB(): Boolean { - return remember { - derivedStateOf { - (firstVisibleItemIndex == 0 && firstVisibleItemScrollOffset == 0) || - lastScrolledBackward || - !canScrollForward - } - } - .value -} +fun LazyListState.shouldExpandFAB(): Boolean = lastScrolledBackward || !canScrollForward || !canScrollBackward