diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt index 70db5bee..5855582e 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt @@ -32,7 +32,6 @@ import com.google.accompanist.pager.rememberPagerState import com.google.accompanist.systemuicontroller.rememberSystemUiController import de.mm20.launcher2.ktx.isAtLeastApiLevel import de.mm20.launcher2.ui.R -import de.mm20.launcher2.ui.ktx.toDp import de.mm20.launcher2.ui.launcher.search.SearchBar import de.mm20.launcher2.ui.launcher.search.SearchBarLevel import de.mm20.launcher2.ui.launcher.search.SearchColumn @@ -57,6 +56,12 @@ fun PagerScaffold( val widgetsScrollState = rememberScrollState() val searchScrollState = rememberScrollState() + val isWidgetsScrollZero by remember { + derivedStateOf { + widgetsScrollState.value == 0 + } + } + val systemUiController = rememberSystemUiController() val colorSurface = MaterialTheme.colorScheme.surface @@ -81,10 +86,12 @@ fun PagerScaffold( ) } - val blurWallpaper by derivedStateOf { - isSearchOpen || pagerState.currentPage == 0 && pagerState.currentPageOffset > 0.5f || - pagerState.currentPage == 1 && pagerState.currentPageOffset <= 0.5f || - widgetsScrollState.value > 0 + val blurWallpaper by remember { + derivedStateOf { + isSearchOpen || pagerState.currentPage == 0 && pagerState.currentPageOffset > 0.5f || + pagerState.currentPage == 1 && pagerState.currentPageOffset <= 0.5f || + !isWidgetsScrollZero + } } val density = LocalDensity.current @@ -133,7 +140,6 @@ fun PagerScaffold( Box( modifier = modifier ) { - var size by remember { mutableStateOf(IntSize.Zero) } HorizontalPager( count = 2, @@ -161,15 +167,19 @@ fun PagerScaffold( if (it == 0) { val editModePadding by animateDpAsState(if (isWidgetEditMode) 56.dp else 0.dp) - val showClockPadding by derivedStateOf { - widgetsScrollState.value == 0 - } val clockPadding by animateDpAsState( - if (showClockPadding) 64.dp else 0.dp + if (isWidgetsScrollZero) 64.dp else 0.dp ) + var size by remember { mutableStateOf(IntSize.Zero) } + + val clockHeight by remember { + derivedStateOf { + with(density) { size.height.toDp() } - (64.dp - clockPadding) + } + } + WidgetColumn( - modifier = - Modifier + modifier = Modifier .fillMaxSize() .onSizeChanged { size = it @@ -177,8 +187,8 @@ fun PagerScaffold( .verticalScroll(widgetsScrollState) .padding(start = 8.dp, end = 8.dp, top = 8.dp, bottom = 64.dp) .padding(top = editModePadding), - clockHeight = size.height.toDp() - (64.dp - clockPadding), - clockBottomPadding = clockPadding, + clockHeight = { clockHeight }, + clockBottomPadding = { clockPadding }, editMode = isWidgetEditMode, onEditModeChange = { viewModel.setWidgetEditMode(it) @@ -202,12 +212,14 @@ fun PagerScaffold( ) } - val searchBarLevel by derivedStateOf { - when { - pagerState.isScrollInProgress -> SearchBarLevel.Raised - !isSearchOpen && widgetsScrollState.value == 0 -> SearchBarLevel.Resting - isSearchOpen && searchScrollState.value == 0 -> SearchBarLevel.Active - else -> SearchBarLevel.Raised + val searchBarLevel by remember { + derivedStateOf { + when { + pagerState.isScrollInProgress -> SearchBarLevel.Raised + !isSearchOpen && isWidgetsScrollZero -> SearchBarLevel.Resting + isSearchOpen && searchScrollState.value == 0 -> SearchBarLevel.Active + else -> SearchBarLevel.Raised + } } } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt index 50dbde26..674def0f 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt @@ -42,7 +42,6 @@ import com.google.accompanist.systemuicontroller.rememberSystemUiController import de.mm20.launcher2.ktx.isAtLeastApiLevel import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.ktx.animateTo -import de.mm20.launcher2.ui.ktx.toDp import de.mm20.launcher2.ui.launcher.search.SearchBar import de.mm20.launcher2.ui.launcher.search.SearchBarLevel import de.mm20.launcher2.ui.launcher.search.SearchColumn @@ -104,8 +103,10 @@ fun PullDownScaffold( val maxSearchBarOffset = with(density) { 128.dp.toPx() } - val blurWallpaper by derivedStateOf { - isSearchOpen || offsetY.value > toggleSearchThreshold || widgetsScrollState.value > 0 + val blurWallpaper by remember { + derivedStateOf { + isSearchOpen || offsetY.value > toggleSearchThreshold || widgetsScrollState.value > 0 + } } @@ -242,6 +243,13 @@ fun PullDownScaffold( if (it == 0) { val offset = calculateCurrentOffsetForPage(0).absoluteValue val editModePadding by animateDpAsState(if (isWidgetEditMode) 56.dp else 0.dp) + val clockHeight by remember { + derivedStateOf { + with(density) { + size.height.toDp() + } + } + } WidgetColumn( modifier = Modifier @@ -255,7 +263,7 @@ fun PullDownScaffold( .verticalScroll(widgetsScrollState) .padding(8.dp) .padding(top = editModePadding), - clockHeight = size.height.toDp(), + clockHeight = { clockHeight }, editMode = isWidgetEditMode, onEditModeChange = { viewModel.setWidgetEditMode(it) @@ -279,13 +287,15 @@ fun PullDownScaffold( ) } - val searchBarLevel by derivedStateOf { - when { - offsetY.value != 0f -> SearchBarLevel.Raised - isSearchOpen && searchScrollState.value == 0 -> SearchBarLevel.Active - isSearchOpen && searchScrollState.value > 0 -> SearchBarLevel.Raised - widgetsScrollState.value > 0 -> SearchBarLevel.Raised - else -> SearchBarLevel.Resting + val searchBarLevel by remember { + derivedStateOf { + when { + offsetY.value != 0f -> SearchBarLevel.Raised + isSearchOpen && searchScrollState.value == 0 -> SearchBarLevel.Active + isSearchOpen && searchScrollState.value > 0 -> SearchBarLevel.Raised + widgetsScrollState.value > 0 -> SearchBarLevel.Raised + else -> SearchBarLevel.Resting + } } } val searchBarFocused by viewModel.searchBarFocused.observeAsState(false) diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetColumn.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetColumn.kt index ff3ec735..6738cd43 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetColumn.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetColumn.kt @@ -7,7 +7,6 @@ import android.content.Intent import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.core.Animatable import androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter @@ -49,8 +48,8 @@ import kotlinx.coroutines.launch @Composable fun WidgetColumn( modifier: Modifier = Modifier, - clockHeight: Dp = 0.dp, - clockBottomPadding: Dp = 0.dp, + clockHeight: () -> Dp = { 0.dp }, + clockBottomPadding: () -> Dp = { 0.dp }, editMode: Boolean = false, onEditModeChange: (Boolean) -> Unit, ) { @@ -93,8 +92,8 @@ fun WidgetColumn( Box( modifier = Modifier .fillMaxWidth() - .height(clockHeight) - .padding(bottom = clockBottomPadding), + .height(clockHeight()) + .padding(bottom = clockBottomPadding()), contentAlignment = Alignment.BottomCenter ) { ClockWidget( @@ -102,8 +101,8 @@ fun WidgetColumn( ) } } - val widgets by viewModel.widgets.observeAsState(emptyList()) Column { + val widgets by viewModel.widgets.observeAsState(emptyList()) val swapThresholds = remember(widgets) { Array(widgets.size) { floatArrayOf(0f, 0f) } }