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

Commit b630daac authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Fix infinite draw loop

Both Chip and NavBarPill were sharing the same Drawable instance, but
rendering them in different sizes.

This caused setBounds() to be called twice with different values, forcing
the drawable callback to invoke invalidateSelf() at every frame.

Bug: 424295289
Fixes: 424295289
Test: perfetto trace
Test: atest AmbientCueViewModelTest
Test: atest AmbientCueInteractorTest
Test: atest FilterUtilsTest
Flag: EXEMPT bugfix
Change-Id: I97ad8b1a6849e2428f3547db25b69c6e73f38762
parent 7f48fbe0
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -90,7 +90,7 @@ fun Chip(action: ActionViewModel, modifier: Modifier = Modifier) {
                )
                )
                .padding(start = 12.dp, end = 16.dp, top = 4.dp, bottom = 4.dp),
                .padding(start = 12.dp, end = 16.dp, top = 4.dp, bottom = 4.dp),
    ) {
    ) {
        val painter = rememberDrawablePainter(action.icon.drawable)
        val painter = rememberDrawablePainter(action.icon.large)
        Image(
        Image(
            painter = painter,
            painter = painter,
            contentDescription = stringResource(id = R.string.ambient_cue_icon_content_description),
            contentDescription = stringResource(id = R.string.ambient_cue_icon_content_description),
+3 −5
Original line number Original line Diff line number Diff line
@@ -43,7 +43,6 @@ import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.FilledIconButton
import androidx.compose.material3.FilledIconButton
import androidx.compose.material3.Icon
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButtonColors
import androidx.compose.material3.IconButtonDefaults
import androidx.compose.material3.IconButtonDefaults
import androidx.compose.material3.LocalMinimumInteractiveComponentSize
import androidx.compose.material3.LocalMinimumInteractiveComponentSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.MaterialTheme
@@ -70,8 +69,8 @@ import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.Dp
@@ -79,7 +78,6 @@ import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.fastForEachIndexed
import androidx.compose.ui.util.fastForEachIndexed
import androidx.compose.ui.util.lerp
import androidx.compose.ui.util.lerp
import com.android.compose.PlatformIconButton
import com.android.compose.ui.graphics.painter.rememberDrawablePainter
import com.android.compose.ui.graphics.painter.rememberDrawablePainter
import com.android.systemui.ambientcue.ui.compose.modifier.animatedActionBorder
import com.android.systemui.ambientcue.ui.compose.modifier.animatedActionBorder
import com.android.systemui.ambientcue.ui.utils.FilterUtils
import com.android.systemui.ambientcue.ui.utils.FilterUtils
@@ -276,7 +274,7 @@ fun NavBarPill(
                                            .padding(start = 6.dp, end = 6.dp),
                                            .padding(start = 6.dp, end = 6.dp),
                                ) {
                                ) {
                                    Image(
                                    Image(
                                        painter = rememberDrawablePainter(action.icon.drawable),
                                        painter = rememberDrawablePainter(action.icon.small),
                                        contentDescription =
                                        contentDescription =
                                            stringResource(
                                            stringResource(
                                                id = R.string.ambient_cue_icon_content_description
                                                id = R.string.ambient_cue_icon_content_description
@@ -318,7 +316,7 @@ fun NavBarPill(
                            } else {
                            } else {
                                // Smaller app icons
                                // Smaller app icons
                                Image(
                                Image(
                                    painter = rememberDrawablePainter(action.icon.drawable),
                                    painter = rememberDrawablePainter(action.icon.small),
                                    contentDescription = action.label,
                                    contentDescription = action.label,
                                    modifier =
                                    modifier =
                                        Modifier.then(
                                        Modifier.then(
+3 −7
Original line number Original line Diff line number Diff line
@@ -41,9 +41,8 @@ import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.FilledIconButton
import androidx.compose.material3.FilledIconButton
import androidx.compose.material3.IconButtonColors
import androidx.compose.material3.IconButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButtonDefaults
import androidx.compose.material3.LocalMinimumInteractiveComponentSize
import androidx.compose.material3.LocalMinimumInteractiveComponentSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.Text
@@ -75,7 +74,6 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastForEach
import com.android.compose.PlatformIconButton
import com.android.compose.ui.graphics.painter.rememberDrawablePainter
import com.android.compose.ui.graphics.painter.rememberDrawablePainter
import com.android.systemui.ambientcue.ui.compose.modifier.animatedActionBorder
import com.android.systemui.ambientcue.ui.compose.modifier.animatedActionBorder
import com.android.systemui.ambientcue.ui.utils.FilterUtils
import com.android.systemui.ambientcue.ui.utils.FilterUtils
@@ -295,9 +293,7 @@ private fun CloseButton(onCloseClick: () -> Unit, modifier: Modifier = Modifier)
        FilledIconButton(
        FilledIconButton(
            onClick = onCloseClick,
            onClick = onCloseClick,
            modifier =
            modifier =
                modifier
                modifier.clip(CircleShape).background(MaterialTheme.colorScheme.surfaceContainer),
                    .clip(CircleShape)
                    .background(MaterialTheme.colorScheme.surfaceContainer),
            colors =
            colors =
                IconButtonDefaults.filledIconButtonColors(
                IconButtonDefaults.filledIconButtonColors(
                    containerColor = Color.Transparent,
                    containerColor = Color.Transparent,
@@ -318,7 +314,7 @@ private fun CloseButton(onCloseClick: () -> Unit, modifier: Modifier = Modifier)
@Composable
@Composable
private fun Icon(action: ActionViewModel, backgroundColor: Color, modifier: Modifier = Modifier) {
private fun Icon(action: ActionViewModel, backgroundColor: Color, modifier: Modifier = Modifier) {
    Image(
    Image(
        painter = rememberDrawablePainter(action.icon.drawable),
        painter = rememberDrawablePainter(action.icon.small),
        contentDescription = stringResource(id = R.string.ambient_cue_icon_content_description),
        contentDescription = stringResource(id = R.string.ambient_cue_icon_content_description),
        modifier =
        modifier =
            modifier
            modifier
+11 −5
Original line number Original line Diff line number Diff line
@@ -87,11 +87,17 @@ class AmbientCueInteractorTest(flags: FlagsParameterization) : SysuiTestCase() {
                    ActionModel(
                    ActionModel(
                        icon =
                        icon =
                            IconModel(
                            IconModel(
                                small =
                                    applicationContext.resources.getDrawable(
                                    applicationContext.resources.getDrawable(
                                        R.drawable.ic_content_paste_spark,
                                        R.drawable.ic_content_paste_spark,
                                        applicationContext.theme,
                                        applicationContext.theme,
                                    ),
                                    ),
                                "test.icon",
                                large =
                                    applicationContext.resources.getDrawable(
                                        R.drawable.ic_content_paste_spark,
                                        applicationContext.theme,
                                    ),
                                iconId = "test.icon",
                            ),
                            ),
                        label = "Sunday Morning",
                        label = "Sunday Morning",
                        attribution = null,
                        attribution = null,
+3 −3
Original line number Original line Diff line number Diff line
@@ -42,7 +42,7 @@ class FilterUtilsTest : SysuiTestCase() {
    fun setUp() {
    fun setUp() {
        calendarAction1 =
        calendarAction1 =
            ActionViewModel(
            ActionViewModel(
                icon = IconViewModel(mock(), "calendar_icon", 0),
                icon = IconViewModel(mock(), mock(), "calendar_icon", 0),
                label = "Sunday Morning",
                label = "Sunday Morning",
                attribution = null,
                attribution = null,
                onClick = {},
                onClick = {},
@@ -51,7 +51,7 @@ class FilterUtilsTest : SysuiTestCase() {
            )
            )
        calendarAction2 =
        calendarAction2 =
            ActionViewModel(
            ActionViewModel(
                icon = IconViewModel(mock(), "calendar_icon", 0),
                icon = IconViewModel(mock(), mock(), "calendar_icon", 0),
                label = "Sunday Evening",
                label = "Sunday Evening",
                attribution = null,
                attribution = null,
                onClick = {},
                onClick = {},
@@ -60,7 +60,7 @@ class FilterUtilsTest : SysuiTestCase() {
            )
            )
        mapsAction =
        mapsAction =
            ActionViewModel(
            ActionViewModel(
                icon = IconViewModel(mock(), "map_icon", 0),
                icon = IconViewModel(mock(), mock(), "map_icon", 0),
                label = "Philz Coffee San Carlos",
                label = "Philz Coffee San Carlos",
                onClick = {},
                onClick = {},
                onLongClick = {},
                onLongClick = {},
Loading