From 255e73717861c9b51124ddaba02af5c7d058a1e4 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Mon, 22 May 2023 20:35:28 +0200 Subject: [PATCH] Improve bottom sheet dialogs --- .../ui/component/BottomSheetDialog.kt | 38 +++++++++++-------- .../sheets/CustomizeSearchableSheet.kt | 3 +- .../ui/launcher/sheets/EditFavoritesSheet.kt | 5 +-- .../searchactions/EditSearchActionSheet.kt | 5 +-- .../ui/settings/tags/EditTagSheet.kt | 5 +-- 5 files changed, 26 insertions(+), 30 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 e7ce5e66..94fca0f5 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 @@ -14,11 +14,15 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +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.material.FixedThreshold @@ -31,7 +35,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocal import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -41,7 +44,6 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clipToBounds import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color @@ -55,8 +57,6 @@ import androidx.compose.ui.unit.Velocity import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties -import androidx.compose.ui.window.Popup -import androidx.compose.ui.window.PopupProperties import de.mm20.launcher2.ui.ktx.toDp import de.mm20.launcher2.ui.ktx.toPixels import kotlinx.coroutines.launch @@ -69,8 +69,7 @@ fun BottomSheetDialog( actions: @Composable RowScope.() -> Unit = {}, confirmButton: @Composable (() -> Unit)? = null, dismissButton: @Composable (() -> Unit)? = null, - swipeToDismiss: () -> Boolean = { true }, - dismissOnBackPress: () -> Boolean = { true }, + dismissible: () -> Boolean = { true }, content: @Composable (paddingValues: PaddingValues) -> Unit, ) { val scope = rememberCoroutineScope() @@ -79,13 +78,13 @@ fun BottomSheetDialog( initialValue = SwipeState.Dismiss, confirmStateChange = { if (it == SwipeState.Dismiss) { - if (swipeToDismiss()) { + if (dismissible()) { onDismissRequest() } else return@SwipeableState false } return@SwipeableState true - } + }, ) } @@ -141,9 +140,10 @@ fun BottomSheetDialog( ) { Dialog( properties = DialogProperties( - dismissOnBackPress = dismissOnBackPress(), - dismissOnClickOutside = swipeToDismiss(), + dismissOnBackPress = dismissible(), + dismissOnClickOutside = dismissible(), usePlatformDefaultWidth = false, + decorFitsSystemWindows = false, ), onDismissRequest = onDismissRequest, ) { @@ -161,9 +161,9 @@ fun BottomSheetDialog( Box(modifier = Modifier .background(MaterialTheme.colorScheme.scrim.copy(alpha = scrimAlpha)) .fillMaxSize() - .pointerInput(onDismissRequest, swipeToDismiss) { + .pointerInput(onDismissRequest, dismissible) { detectTapGestures { - if (swipeToDismiss()) { + if (dismissible()) { scope.launch { swipeState.animateTo(SwipeState.Dismiss) onDismissRequest() @@ -201,7 +201,6 @@ fun BottomSheetDialog( Surface( modifier = Modifier .nestedScroll(nestedScrollConnection) - .animateContentSize() .onSizeChanged { height = it.height.toFloat() } @@ -217,7 +216,7 @@ fun BottomSheetDialog( FractionalThreshold(0.5f) } }, - resistance = null + resistance = null, ) .fillMaxWidth() .weight(1f, false), @@ -238,7 +237,8 @@ fun BottomSheetDialog( Box( modifier = Modifier .fillMaxWidth() - .wrapContentHeight(), + .wrapContentHeight() + .animateContentSize(), propagateMinConstraints = true, contentAlignment = Alignment.Center ) { @@ -250,7 +250,6 @@ fun BottomSheetDialog( if (confirmButton != null || dismissButton != null) { val elevation by animateDpAsState(if (swipeState.offset.value == 0f) 0.dp else 1.dp) - val alpha by animateFloatAsState(if (swipeState.targetValue == SwipeState.Dismiss) 0f else 1f) Surface( modifier = Modifier .wrapContentHeight() @@ -277,6 +276,13 @@ fun BottomSheetDialog( } } + + Box( + modifier = Modifier + .windowInsetsBottomHeight(WindowInsets.systemBars) + .fillMaxWidth() + .background(MaterialTheme.colorScheme.surface) + ) } } } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/CustomizeSearchableSheet.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/CustomizeSearchableSheet.kt index 585ed6ec..213f4e29 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/CustomizeSearchableSheet.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/CustomizeSearchableSheet.kt @@ -79,8 +79,7 @@ fun CustomizeSearchableSheet( title = { Text(stringResource(if (pickIcon) R.string.icon_picker_title else R.string.menu_customize)) }, - swipeToDismiss = { !pickIcon }, - dismissOnBackPress = { !pickIcon }, + dismissible = { !pickIcon }, confirmButton = { if (pickIcon) { OutlinedButton(onClick = { viewModel.closeIconPicker() }) { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheet.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheet.kt index 871ceb5b..1afb577e 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheet.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheet.kt @@ -115,10 +115,7 @@ fun EditFavoritesSheet( } ) }, - swipeToDismiss = { - createShortcutTarget == null - }, - dismissOnBackPress = { + dismissible = { createShortcutTarget == null }, confirmButton = { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/searchactions/EditSearchActionSheet.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/searchactions/EditSearchActionSheet.kt index 0fe834ca..875ffc20 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/searchactions/EditSearchActionSheet.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/searchactions/EditSearchActionSheet.kt @@ -113,10 +113,7 @@ fun EditSearchActionSheet( viewModel.onDismiss() onDismiss() }, - dismissOnBackPress = { - page != EditSearchActionPage.PickIcon - }, - swipeToDismiss = { + dismissible = { page != EditSearchActionPage.PickIcon }, confirmButton = when (page) { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tags/EditTagSheet.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tags/EditTagSheet.kt index 034d8bba..5e0db8fc 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tags/EditTagSheet.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tags/EditTagSheet.kt @@ -103,12 +103,9 @@ fun EditTagSheet( if (viewModel.page == EditTagSheetPage.CustomizeTag) viewModel.save() onDismiss() }, - swipeToDismiss = { + dismissible = { !(!isCreatingNewTag && viewModel.page == EditTagSheetPage.PickItems) }, - dismissOnBackPress = { - !(!isCreatingNewTag && viewModel.page == EditTagSheetPage.PickItems) - } ) { when (viewModel.page) { EditTagSheetPage.CreateTag -> CreateNewTagPage(viewModel, it)