12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- package eu.kanade.presentation.components
- import androidx.activity.compose.BackHandler
- import androidx.compose.animation.core.tween
- import androidx.compose.animation.fadeIn
- import androidx.compose.animation.fadeOut
- import androidx.compose.animation.with
- import androidx.compose.foundation.layout.PaddingValues
- import androidx.compose.foundation.layout.WindowInsets
- import androidx.compose.foundation.layout.WindowInsetsSides
- import androidx.compose.foundation.layout.asPaddingValues
- import androidx.compose.foundation.layout.navigationBars
- import androidx.compose.foundation.layout.only
- import androidx.compose.runtime.Composable
- import androidx.compose.ui.unit.Dp
- import androidx.compose.ui.unit.dp
- import cafe.adriel.voyager.core.lifecycle.DisposableEffectIgnoringConfiguration
- import cafe.adriel.voyager.core.screen.Screen
- import cafe.adriel.voyager.navigator.Navigator
- import cafe.adriel.voyager.transitions.ScreenTransition
- import eu.kanade.presentation.util.isTabletUi
- import tachiyomi.presentation.core.components.AdaptiveSheet as AdaptiveSheetImpl
- @Composable
- fun NavigatorAdaptiveSheet(
- screen: Screen,
- tonalElevation: Dp = 1.dp,
- enableSwipeDismiss: (Navigator) -> Boolean = { true },
- onDismissRequest: () -> Unit,
- ) {
- Navigator(
- screen = screen,
- content = { sheetNavigator ->
- AdaptiveSheet(
- tonalElevation = tonalElevation,
- enableSwipeDismiss = enableSwipeDismiss(sheetNavigator),
- onDismissRequest = onDismissRequest,
- ) {
- ScreenTransition(
- navigator = sheetNavigator,
- transition = {
- fadeIn(animationSpec = tween(220, delayMillis = 90)) with
- fadeOut(animationSpec = tween(90))
- },
- )
- BackHandler(
- enabled = sheetNavigator.size > 1,
- onBack = sheetNavigator::pop,
- )
- }
- // Make sure screens are disposed no matter what
- if (sheetNavigator.parent?.disposeBehavior?.disposeNestedNavigators == false) {
- DisposableEffectIgnoringConfiguration {
- onDispose {
- sheetNavigator.items
- .asReversed()
- .forEach(sheetNavigator::dispose)
- }
- }
- }
- },
- )
- }
- /**
- * Sheet with adaptive position aligned to bottom on small screen, otherwise aligned to center
- * and will not be able to dismissed with swipe gesture.
- *
- * Max width of the content is set to 460 dp.
- */
- @Composable
- fun AdaptiveSheet(
- tonalElevation: Dp = 1.dp,
- enableSwipeDismiss: Boolean = true,
- onDismissRequest: () -> Unit,
- content: @Composable (PaddingValues) -> Unit,
- ) {
- val isTabletUi = isTabletUi()
- AdaptiveSheetImpl(
- isTabletUi = isTabletUi,
- tonalElevation = tonalElevation,
- enableSwipeDismiss = enableSwipeDismiss,
- onDismissRequest = onDismissRequest,
- ) {
- val contentPadding = if (isTabletUi) {
- PaddingValues()
- } else {
- WindowInsets.navigationBars.only(WindowInsetsSides.Bottom).asPaddingValues()
- }
- content(contentPadding)
- }
- }
|