Avoid unnecessary recompositions
This commit is contained in:
parent
d42564240d
commit
5ffbf67f8b
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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) }
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user