diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt index 159b3f736..11db5cd5f 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt @@ -74,7 +74,6 @@ import androidx.compose.runtime.State import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.currentCompositeKeyHash import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -86,6 +85,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalViewConfiguration import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -352,22 +352,25 @@ class MainActivity : EhActivity() { } val currentDestination by navController.currentDestinationAsState() val lockDrawerHandle = remember { mutableStateListOf() } - var snackbarFabPadding by remember { mutableIntStateOf(0) } + var snackbarFabPadding by remember { mutableStateOf(0.dp) } val drawerLocked = lockDrawerHandle.isNotEmpty() val viewConfiguration = LocalViewConfiguration.current + val density = LocalDensity.current CompositionLocalProvider( LocalNavDrawerState provides navDrawerState, LocalSideSheetState provides sideSheetState, LocalDrawerLockHandle provides lockDrawerHandle, LocalSnackbarHostState provides snackbarState, - LocalSnackbarFabPadding provides animateDpAsState(snackbarFabPadding.dp, label = "SnackbarFabPadding"), + LocalSnackbarFabPadding provides animateDpAsState(snackbarFabPadding, label = "SnackbarFabPadding"), ) { Scaffold( snackbarHost = { SnackbarHost( hostState = snackbarState, modifier = Modifier.onGloballyPositioned { - snackbarFabPadding = it.size.height + with(density) { + snackbarFabPadding = it.size.height.toDp() + } }, ) }, diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt index 6a639bc9c..bfec2f38f 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.MutatePriority import androidx.compose.foundation.MutatorMutex import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding @@ -20,7 +21,9 @@ import androidx.compose.material3.Icon import androidx.compose.material3.SmallFloatingActionButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.Stable +import androidx.compose.runtime.State import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -32,8 +35,11 @@ import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.layout.layout +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import androidx.compose.ui.util.lerp +import com.hippo.ehviewer.ui.LocalSnackbarFabPadding import com.hippo.ehviewer.ui.tools.delegateSnapshotUpdate import eu.kanade.tachiyomi.util.lang.launchIO import kotlinx.coroutines.CancellationException @@ -42,6 +48,15 @@ import kotlinx.coroutines.launch import moe.tarsin.coroutines.onEachLatest import moe.tarsin.coroutines.runSuspendCatching +@Stable +@ReadOnlyComposable +private fun State.asBottomPaddingValues() = object : PaddingValues { + override fun calculateBottomPadding() = value + override fun calculateLeftPadding(layoutDirection: LayoutDirection) = 0.dp + override fun calculateRightPadding(layoutDirection: LayoutDirection) = 0.dp + override fun calculateTopPadding() = 0.dp +} + enum class FabLayoutValue { Hidden, Primary, @@ -108,6 +123,7 @@ fun FabLayout( rotateWhenExpand: Boolean = true, fabBuilder: FabBuilder.() -> Unit, ) { + val snackbarPadding = LocalSnackbarFabPadding.current.asBottomPaddingValues() val updatedHidden by rememberUpdatedState(hidden) val updatedExpanded by rememberUpdatedState(expanded) val newState = when { @@ -142,7 +158,7 @@ fun FabLayout( } val appearState by state.appearProgress.asState() Box( - modifier = Modifier.fillMaxSize().navigationBarsPadding().padding(16.dp), + modifier = Modifier.fillMaxSize().navigationBarsPadding().padding(16.dp).padding(snackbarPadding), contentAlignment = Alignment.BottomEnd, ) { Box(