Change bottom sheet positioning

This commit is contained in:
MM20 2023-08-26 19:32:05 +02:00
parent 7d48db455c
commit 7dea4eb98d
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
2 changed files with 28 additions and 9 deletions

View File

@ -28,7 +28,6 @@ import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.systemBars
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.windowInsetsBottomHeight
import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.shape.CornerSize import androidx.compose.foundation.shape.CornerSize
import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.BottomSheetDefaults
@ -55,10 +54,16 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntRect
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.Velocity import androidx.compose.ui.unit.Velocity
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Popup import androidx.compose.ui.window.Popup
import androidx.compose.ui.window.PopupPositionProvider
import androidx.compose.ui.window.PopupProperties import androidx.compose.ui.window.PopupProperties
import de.mm20.launcher2.ui.ktx.toPixels import de.mm20.launcher2.ui.ktx.toPixels
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -149,13 +154,20 @@ fun BottomSheetDialog(
CompositionLocalProvider( CompositionLocalProvider(
LocalAbsoluteTonalElevation provides 0.dp, LocalAbsoluteTonalElevation provides 0.dp,
) { ) {
val density = LocalDensity.current
val insets = WindowInsets.systemBars
WindowInsets
val positionProvider = remember(insets, density) {
BottomSheetPositionProvider(insets, density)
}
Popup( Popup(
alignment = Alignment.BottomCenter, popupPositionProvider = positionProvider,
properties = PopupProperties( properties = PopupProperties(
dismissOnBackPress = dismissible(), dismissOnBackPress = dismissible(),
dismissOnClickOutside = dismissible(), dismissOnClickOutside = dismissible(),
usePlatformDefaultWidth = false, usePlatformDefaultWidth = false,
focusable = true, focusable = true,
clippingEnabled = false,
), ),
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
) { ) {
@ -324,13 +336,6 @@ fun BottomSheetDialog(
} }
} }
Box(
modifier = Modifier
.windowInsetsBottomHeight(WindowInsets.systemBars)
.fillMaxWidth()
.background(MaterialTheme.colorScheme.surface)
)
} }
} }
} }
@ -339,4 +344,16 @@ fun BottomSheetDialog(
private enum class SwipeState { private enum class SwipeState {
Full, Peek, Dismiss Full, Peek, Dismiss
}
private class BottomSheetPositionProvider(val insets: WindowInsets, val density: Density): PopupPositionProvider {
override fun calculatePosition(
anchorBounds: IntRect,
windowSize: IntSize,
layoutDirection: LayoutDirection,
popupContentSize: IntSize
): IntOffset {
Log.d("MM20", "calculatePosition: anchorBounds=$anchorBounds, windowSize=$windowSize, layoutDirection=$layoutDirection, popupContentSize=$popupContentSize")
return IntOffset.Zero + IntOffset(insets.getLeft(density, layoutDirection), insets.getTop(density))
}
} }

View File

@ -9,6 +9,7 @@ import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.core.view.WindowCompat
import androidx.navigation.navArgument import androidx.navigation.navArgument
import com.google.accompanist.navigation.animation.AnimatedNavHost import com.google.accompanist.navigation.animation.AnimatedNavHost
import com.google.accompanist.navigation.animation.composable import com.google.accompanist.navigation.animation.composable
@ -61,6 +62,7 @@ class SettingsActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)
setContent { setContent {
val navController = rememberAnimatedNavController() val navController = rememberAnimatedNavController()