Avoid unnecessary recompositions

This commit is contained in:
MM20 2022-05-14 23:32:15 +02:00
parent d42564240d
commit 5ffbf67f8b
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
3 changed files with 58 additions and 37 deletions

View File

@ -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
}
}
}

View File

@ -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)

View File

@ -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) }
}