From 7dea4eb98d69d04e5dfb269c058e67da57316166 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sat, 26 Aug 2023 19:32:05 +0200 Subject: [PATCH] Change bottom sheet positioning --- .../ui/component/BottomSheetDialog.kt | 35 ++++++++++++++----- .../launcher2/ui/settings/SettingsActivity.kt | 2 ++ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/component/BottomSheetDialog.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/component/BottomSheetDialog.kt index 6c3a8133..66d98f80 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/component/BottomSheetDialog.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/component/BottomSheetDialog.kt @@ -28,7 +28,6 @@ import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.width -import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.shape.CornerSize 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.pointer.pointerInput 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.IntRect +import androidx.compose.ui.unit.IntSize +import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.Velocity import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Popup +import androidx.compose.ui.window.PopupPositionProvider import androidx.compose.ui.window.PopupProperties import de.mm20.launcher2.ui.ktx.toPixels import kotlinx.coroutines.launch @@ -149,13 +154,20 @@ fun BottomSheetDialog( CompositionLocalProvider( LocalAbsoluteTonalElevation provides 0.dp, ) { + val density = LocalDensity.current + val insets = WindowInsets.systemBars + WindowInsets + val positionProvider = remember(insets, density) { + BottomSheetPositionProvider(insets, density) + } Popup( - alignment = Alignment.BottomCenter, + popupPositionProvider = positionProvider, properties = PopupProperties( dismissOnBackPress = dismissible(), dismissOnClickOutside = dismissible(), usePlatformDefaultWidth = false, focusable = true, + clippingEnabled = false, ), 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 { 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)) + } } \ No newline at end of file diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt index cb3f9a38..192bec45 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt @@ -9,6 +9,7 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.core.view.WindowCompat import androidx.navigation.navArgument import com.google.accompanist.navigation.animation.AnimatedNavHost import com.google.accompanist.navigation.animation.composable @@ -61,6 +62,7 @@ class SettingsActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + WindowCompat.setDecorFitsSystemWindows(window, false) setContent { val navController = rememberAnimatedNavController()