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 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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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) }
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user