Loading packages/SystemUI/multivalentTests/src/com/android/systemui/qs/external/ui/viewmodel/TileRequestDialogViewModelTest.kt +3 −3 Original line number Diff line number Diff line Loading @@ -89,7 +89,7 @@ class TileRequestDialogViewModelTest : SysuiTestCase() { expect.that(state).isEqualTo(expectedState.state) expect.that(handlesLongClick).isFalse() expect.that(handlesSecondaryClick).isFalse() expect.that(icon.get()).isEqualTo(defaultIcon) expect.that(icon).isEqualTo(defaultIcon) expect.that(sideDrawable).isNull() expect.that(accessibilityUiState).isEqualTo(expectedState.accessibilityUiState) } Loading @@ -112,7 +112,7 @@ class TileRequestDialogViewModelTest : SysuiTestCase() { expect.that(state).isEqualTo(expectedState.state) expect.that(handlesLongClick).isFalse() expect.that(handlesSecondaryClick).isFalse() expect.that(icon.get()).isEqualTo(QSTileImpl.DrawableIcon(loadedDrawable)) expect.that(icon).isEqualTo(QSTileImpl.DrawableIcon(loadedDrawable)) expect.that(sideDrawable).isNull() expect.that(accessibilityUiState).isEqualTo(expectedState.accessibilityUiState) } Loading @@ -135,7 +135,7 @@ class TileRequestDialogViewModelTest : SysuiTestCase() { underTest.activateIn(testScope) runCurrent() assertThat(underTest.uiState.icon.get()).isEqualTo(defaultIcon) assertThat(underTest.uiState.icon).isEqualTo(defaultIcon) } companion object { Loading packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/TileUiStateTest.kt +43 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.qs.panels.ui.viewmodel import android.content.res.Resources import android.content.res.mainResources import android.graphics.drawable.TestStubDrawable import android.service.quicksettings.Tile import android.widget.Button import android.widget.Switch Loading @@ -26,9 +27,12 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.plugins.qs.QSTile import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.qs.tileimpl.QSTileImpl.ResourceIcon import com.android.systemui.res.R import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import java.util.function.Supplier import org.junit.Test import org.junit.runner.RunWith Loading Loading @@ -263,6 +267,45 @@ class TileUiStateTest : SysuiTestCase() { .contains(resources.getString(R.string.tile_unavailable)) } @Test fun iconAndSupplier_prefersIcon() { val state = QSTile.State().apply { icon = ResourceIcon.get(R.drawable.android) iconSupplier = Supplier { QSTileImpl.DrawableIcon(TestStubDrawable()) } } val uiState = state.toUiState() assertThat(uiState.icon).isEqualTo(state.icon) } @Test fun iconOnly_hasIcon() { val state = QSTile.State().apply { icon = ResourceIcon.get(R.drawable.android) } val uiState = state.toUiState() assertThat(uiState.icon).isEqualTo(state.icon) } @Test fun supplierOnly_hasIcon() { val state = QSTile.State().apply { iconSupplier = Supplier { ResourceIcon.get(R.drawable.android) } } val uiState = state.toUiState() assertThat(uiState.icon).isEqualTo(state.iconSupplier.get()) } @Test fun noIconOrSupplier_iconNull() { val state = QSTile.State() val uiState = state.toUiState() assertThat(uiState.icon).isNull() } private fun QSTile.State.toUiState() = toUiState(resources) } Loading packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/BounceableInfo.kt +2 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.qs.panels.ui.compose import android.processor.immutability.Immutable import com.android.compose.animation.Bounceable import com.android.systemui.qs.panels.shared.model.SizedTile import com.android.systemui.qs.panels.ui.model.GridCell Loading @@ -23,6 +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 data class BounceableInfo( val bounceable: BounceableTileViewModel, val previousTile: Bounceable?, Loading packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/QuickQuickSettings.kt +15 −11 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect 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 Loading Loading @@ -67,6 +68,7 @@ fun SceneScope.QuickQuickSettings( val it = sizedTiles[spanIndex] val column = cellIndex % columns cellIndex += it.width key(it.tile.spec) { Tile( tile = it.tile, iconOnly = it.isIcon, Loading @@ -74,10 +76,12 @@ fun SceneScope.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, ) } } } } packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt +6 −4 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.qs.panels.ui.compose.infinitegrid import android.content.Context import android.graphics.drawable.Animatable import android.graphics.drawable.AnimatedVectorDrawable import android.graphics.drawable.Drawable Loading Loading @@ -83,7 +84,7 @@ private const val TEST_TAG_TOGGLE = "qs_tile_toggle_target" fun LargeTileContent( label: String, secondaryLabel: String?, icon: Icon, iconProvider: Context.() -> Icon, sideDrawable: Drawable?, colors: TileColors, squishiness: () -> Float, Loading Loading @@ -129,7 +130,7 @@ fun LargeTileContent( } ) { SmallTileContent( icon = icon, iconProvider = iconProvider, color = colors.icon, size = { CommonTileDefaults.LargeTileIconSize }, modifier = Modifier.align(Alignment.Center), Loading Loading @@ -194,14 +195,15 @@ fun LargeTileLabels( @Composable fun SmallTileContent( modifier: Modifier = Modifier, icon: Icon, iconProvider: Context.() -> Icon, color: Color, size: () -> Dp = { CommonTileDefaults.IconSize }, animateToEnd: Boolean = false, ) { val context = LocalContext.current val icon = iconProvider(context) val animatedColor by animateColorAsState(color, label = "QSTileIconColor") val iconModifier = modifier.size({ size().roundToPx() }, { size().roundToPx() }) val context = LocalContext.current val loadedDrawable = remember(icon, context) { when (icon) { Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/external/ui/viewmodel/TileRequestDialogViewModelTest.kt +3 −3 Original line number Diff line number Diff line Loading @@ -89,7 +89,7 @@ class TileRequestDialogViewModelTest : SysuiTestCase() { expect.that(state).isEqualTo(expectedState.state) expect.that(handlesLongClick).isFalse() expect.that(handlesSecondaryClick).isFalse() expect.that(icon.get()).isEqualTo(defaultIcon) expect.that(icon).isEqualTo(defaultIcon) expect.that(sideDrawable).isNull() expect.that(accessibilityUiState).isEqualTo(expectedState.accessibilityUiState) } Loading @@ -112,7 +112,7 @@ class TileRequestDialogViewModelTest : SysuiTestCase() { expect.that(state).isEqualTo(expectedState.state) expect.that(handlesLongClick).isFalse() expect.that(handlesSecondaryClick).isFalse() expect.that(icon.get()).isEqualTo(QSTileImpl.DrawableIcon(loadedDrawable)) expect.that(icon).isEqualTo(QSTileImpl.DrawableIcon(loadedDrawable)) expect.that(sideDrawable).isNull() expect.that(accessibilityUiState).isEqualTo(expectedState.accessibilityUiState) } Loading @@ -135,7 +135,7 @@ class TileRequestDialogViewModelTest : SysuiTestCase() { underTest.activateIn(testScope) runCurrent() assertThat(underTest.uiState.icon.get()).isEqualTo(defaultIcon) assertThat(underTest.uiState.icon).isEqualTo(defaultIcon) } companion object { Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/TileUiStateTest.kt +43 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.qs.panels.ui.viewmodel import android.content.res.Resources import android.content.res.mainResources import android.graphics.drawable.TestStubDrawable import android.service.quicksettings.Tile import android.widget.Button import android.widget.Switch Loading @@ -26,9 +27,12 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.plugins.qs.QSTile import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.qs.tileimpl.QSTileImpl.ResourceIcon import com.android.systemui.res.R import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import java.util.function.Supplier import org.junit.Test import org.junit.runner.RunWith Loading Loading @@ -263,6 +267,45 @@ class TileUiStateTest : SysuiTestCase() { .contains(resources.getString(R.string.tile_unavailable)) } @Test fun iconAndSupplier_prefersIcon() { val state = QSTile.State().apply { icon = ResourceIcon.get(R.drawable.android) iconSupplier = Supplier { QSTileImpl.DrawableIcon(TestStubDrawable()) } } val uiState = state.toUiState() assertThat(uiState.icon).isEqualTo(state.icon) } @Test fun iconOnly_hasIcon() { val state = QSTile.State().apply { icon = ResourceIcon.get(R.drawable.android) } val uiState = state.toUiState() assertThat(uiState.icon).isEqualTo(state.icon) } @Test fun supplierOnly_hasIcon() { val state = QSTile.State().apply { iconSupplier = Supplier { ResourceIcon.get(R.drawable.android) } } val uiState = state.toUiState() assertThat(uiState.icon).isEqualTo(state.iconSupplier.get()) } @Test fun noIconOrSupplier_iconNull() { val state = QSTile.State() val uiState = state.toUiState() assertThat(uiState.icon).isNull() } private fun QSTile.State.toUiState() = toUiState(resources) } Loading
packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/BounceableInfo.kt +2 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.qs.panels.ui.compose import android.processor.immutability.Immutable import com.android.compose.animation.Bounceable import com.android.systemui.qs.panels.shared.model.SizedTile import com.android.systemui.qs.panels.ui.model.GridCell Loading @@ -23,6 +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 data class BounceableInfo( val bounceable: BounceableTileViewModel, val previousTile: Bounceable?, Loading
packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/QuickQuickSettings.kt +15 −11 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect 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 Loading Loading @@ -67,6 +68,7 @@ fun SceneScope.QuickQuickSettings( val it = sizedTiles[spanIndex] val column = cellIndex % columns cellIndex += it.width key(it.tile.spec) { Tile( tile = it.tile, iconOnly = it.isIcon, Loading @@ -74,10 +76,12 @@ fun SceneScope.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, ) } } } }
packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt +6 −4 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.qs.panels.ui.compose.infinitegrid import android.content.Context import android.graphics.drawable.Animatable import android.graphics.drawable.AnimatedVectorDrawable import android.graphics.drawable.Drawable Loading Loading @@ -83,7 +84,7 @@ private const val TEST_TAG_TOGGLE = "qs_tile_toggle_target" fun LargeTileContent( label: String, secondaryLabel: String?, icon: Icon, iconProvider: Context.() -> Icon, sideDrawable: Drawable?, colors: TileColors, squishiness: () -> Float, Loading Loading @@ -129,7 +130,7 @@ fun LargeTileContent( } ) { SmallTileContent( icon = icon, iconProvider = iconProvider, color = colors.icon, size = { CommonTileDefaults.LargeTileIconSize }, modifier = Modifier.align(Alignment.Center), Loading Loading @@ -194,14 +195,15 @@ fun LargeTileLabels( @Composable fun SmallTileContent( modifier: Modifier = Modifier, icon: Icon, iconProvider: Context.() -> Icon, color: Color, size: () -> Dp = { CommonTileDefaults.IconSize }, animateToEnd: Boolean = false, ) { val context = LocalContext.current val icon = iconProvider(context) val animatedColor by animateColorAsState(color, label = "QSTileIconColor") val iconModifier = modifier.size({ size().roundToPx() }, { size().roundToPx() }) val context = LocalContext.current val loadedDrawable = remember(icon, context) { when (icon) { Loading