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