Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac54a44c authored by Fabián Kozynski's avatar Fabián Kozynski
Browse files

Prevent recomposition of VerticalSpannedGrid

We cached the span lists (instead of creating a new one in each
recomposition), because they are unstable. That way, if the contents
don't change, the VerticalSpannedGrid is not recomposed.

Also, move key into the spanned grid.

Test: manual, changes in surrounding code of SpannedGrid don't recompose
it if the spans don't change
Bug: 389985793
Flag: com.android.systemui.qs_ui_refactor_compose_fragment

Change-Id: Ib3e7c9239f7a35b8396b8e7dca07ba3727a06de3
parent 8a131dbc
Loading
Loading
Loading
Loading
+18 −10
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.runtime.Composable
import androidx.compose.runtime.key
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.Layout
@@ -63,6 +64,7 @@ fun HorizontalSpannedGrid(
    rowSpacing: Dp,
    spans: List<Int>,
    modifier: Modifier = Modifier,
    keys: (spanIndex: Int) -> Any = { it },
    composables: @Composable BoxScope.(spanIndex: Int) -> Unit,
) {
    SpannedGrid(
@@ -72,6 +74,7 @@ fun HorizontalSpannedGrid(
        spans = spans,
        isVertical = false,
        modifier = modifier,
        keys = keys,
        composables = composables,
    )
}
@@ -103,6 +106,7 @@ fun VerticalSpannedGrid(
    rowSpacing: Dp,
    spans: List<Int>,
    modifier: Modifier = Modifier,
    keys: (spanIndex: Int) -> Any = { it },
    composables: @Composable BoxScope.(spanIndex: Int) -> Unit,
) {
    SpannedGrid(
@@ -112,6 +116,7 @@ fun VerticalSpannedGrid(
        spans = spans,
        isVertical = true,
        modifier = modifier,
        keys = keys,
        composables = composables,
    )
}
@@ -124,6 +129,7 @@ private fun SpannedGrid(
    spans: List<Int>,
    isVertical: Boolean,
    modifier: Modifier = Modifier,
    keys: (spanIndex: Int) -> Any = { it },
    composables: @Composable BoxScope.(spanIndex: Int) -> Unit,
) {
    val crossAxisArrangement = Arrangement.spacedBy(crossAxisSpacing)
@@ -167,6 +173,7 @@ private fun SpannedGrid(
    Layout(
        {
            (0 until spans.size).map { spanIndex ->
                key(keys(spanIndex)) {
                    Box(
                        Modifier.semantics {
                            collectionItemInfo =
@@ -180,6 +187,7 @@ private fun SpannedGrid(
                        composables(spanIndex)
                    }
                }
            }
        },
        modifier.semantics { collectionInfo = CollectionInfo(spans.size, 1) },
    ) { measurables, constraints ->
+2 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.haptics.msdl.qs

import android.service.quicksettings.Tile
import androidx.compose.runtime.Stable
import com.android.systemui.Flags
import com.android.systemui.animation.Expandable
import com.android.systemui.dagger.SysUISingleton
@@ -175,6 +176,7 @@ constructor(
}

@SysUISingleton
@Stable
class TileHapticsViewModelFactoryProvider
@Inject
constructor(private val tileHapticsViewModelFactory: TileHapticsViewModel.Factory) {
+2 −2
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

package com.android.systemui.qs.panels.ui.compose

import android.processor.immutability.Immutable
import androidx.compose.runtime.Stable
import com.android.compose.animation.Bounceable
import com.android.systemui.qs.panels.shared.model.SizedTile
import com.android.systemui.qs.panels.ui.model.GridCell
@@ -24,7 +24,7 @@ import com.android.systemui.qs.panels.ui.model.TileGridCell
import com.android.systemui.qs.panels.ui.viewmodel.BounceableTileViewModel
import com.android.systemui.qs.panels.ui.viewmodel.TileViewModel

@Immutable
@Stable
data class BounceableInfo(
    val bounceable: BounceableTileViewModel,
    val previousTile: Bounceable?,
+16 −16
Original line number Diff line number Diff line
@@ -19,8 +19,8 @@ package com.android.systemui.qs.panels.ui.compose
import androidx.compose.foundation.layout.Box
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.key
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
@@ -49,6 +49,8 @@ fun ContentScope.QuickQuickSettings(
    val squishiness by viewModel.squishinessViewModel.squishiness.collectAsStateWithLifecycle()
    val scope = rememberCoroutineScope()

    val spans by remember(sizedTiles) { derivedStateOf { sizedTiles.fastMap { it.width } } }

    DisposableEffect(tiles) {
        val token = Any()
        tiles.forEach { it.startListening(token) }
@@ -62,13 +64,13 @@ fun ContentScope.QuickQuickSettings(
            columns = columns,
            columnSpacing = dimensionResource(R.dimen.qs_tile_margin_horizontal),
            rowSpacing = dimensionResource(R.dimen.qs_tile_margin_vertical),
            spans = sizedTiles.fastMap { it.width },
            spans = spans,
            modifier = Modifier.sysuiResTag("qqs_tile_layout"),
            keys = { sizedTiles[it].tile.spec },
        ) { spanIndex ->
            val it = sizedTiles[spanIndex]
            val column = cellIndex % columns
            cellIndex += it.width
            key(it.tile.spec) {
            Tile(
                tile = it.tile,
                iconOnly = it.isIcon,
@@ -76,12 +78,10 @@ fun ContentScope.QuickQuickSettings(
                squishiness = { squishiness },
                coroutineScope = scope,
                bounceableInfo = bounceables.bounceableInfo(it, spanIndex, column, columns),
                    tileHapticsViewModelFactoryProvider =
                        viewModel.tileHapticsViewModelFactoryProvider,
                tileHapticsViewModelFactoryProvider = viewModel.tileHapticsViewModelFactoryProvider,
                // There should be no QuickQuickSettings when the details view is enabled.
                detailsViewModel = null,
            )
        }
    }
}
}
+15 −14
Original line number Diff line number Diff line
@@ -18,8 +18,8 @@ package com.android.systemui.qs.panels.ui.compose.infinitegrid

import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.key
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
@@ -86,16 +86,18 @@ constructor(
        val scope = rememberCoroutineScope()
        var cellIndex = 0

        val spans by remember(sizedTiles) { derivedStateOf { sizedTiles.fastMap { it.width } } }

        VerticalSpannedGrid(
            columns = columns,
            columnSpacing = dimensionResource(R.dimen.qs_tile_margin_horizontal),
            rowSpacing = dimensionResource(R.dimen.qs_tile_margin_vertical),
            spans = sizedTiles.fastMap { it.width },
            spans = spans,
            keys = { sizedTiles[it].tile.spec },
        ) { spanIndex ->
            val it = sizedTiles[spanIndex]
            val column = cellIndex % columns
            cellIndex += it.width
            key(it.tile.spec) {
            Tile(
                tile = it.tile,
                iconOnly = iconTilesViewModel.isIconTile(it.tile.spec),
@@ -108,7 +110,6 @@ constructor(
            )
        }
    }
    }

    @Composable
    override fun EditTileGrid(
Loading