Loading packages/SystemUI/multivalentTests/src/com/android/systemui/qs/external/ui/viewmodel/TileRequestDialogViewModelTest.kt +18 −11 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.app.iUriGrantsManager import com.android.systemui.SysuiTestCase import com.android.systemui.biometrics.ui.viewmodel.iconProvider import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.runCurrent import com.android.systemui.kosmos.runTest Loading @@ -32,6 +33,8 @@ import com.android.systemui.kosmos.testScope import com.android.systemui.lifecycle.activateIn import com.android.systemui.plugins.qs.QSTile import com.android.systemui.qs.external.TileData import com.android.systemui.qs.panels.ui.viewmodel.IconProvider import com.android.systemui.qs.panels.ui.viewmodel.toIconProvider import com.android.systemui.qs.panels.ui.viewmodel.toUiState import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.qs.tileimpl.QSTileImpl.ResourceIcon Loading Loading @@ -80,28 +83,32 @@ class TileRequestDialogViewModelTest : SysuiTestCase() { @Test fun uiState_beforeActivation_hasDefaultIcon_andCorrectData() = kosmos.runTest { val expectedState = baseResultLegacyState.apply { icon = defaultIcon }.toUiState(mainResources) val state = baseResultLegacyState.apply { icon = defaultIcon } val expectedState = state.toUiState(mainResources) val expectedIconProvider = state.toIconProvider() with(underTest.uiState) { expect.that(label).isEqualTo(TEST_LABEL) expect.that(secondaryLabel).isEmpty() expect.that(state).isEqualTo(expectedState.state) expect.that(this.state).isEqualTo(expectedState.state) expect.that(handlesLongClick).isFalse() expect.that(handlesSecondaryClick).isFalse() expect.that(icon).isEqualTo(defaultIcon) expect.that(sideDrawable).isNull() expect.that(accessibilityUiState).isEqualTo(expectedState.accessibilityUiState) } expect.that(underTest.iconProvider).isEqualTo(expectedIconProvider) } @Test fun uiState_afterActivation_hasCorrectIcon_andCorrectData() = kosmos.runTest { val expectedState = baseResultLegacyState .apply { icon = QSTileImpl.DrawableIcon(loadedDrawable) } .toUiState(mainResources) val state = baseResultLegacyState.apply { icon = QSTileImpl.DrawableIcon(loadedDrawable) } val expectedState = state.toUiState(mainResources) val expectedIconProvider = state.toIconProvider() underTest.activateIn(testScope) runCurrent() Loading @@ -109,13 +116,13 @@ class TileRequestDialogViewModelTest : SysuiTestCase() { with(underTest.uiState) { expect.that(label).isEqualTo(TEST_LABEL) expect.that(secondaryLabel).isEmpty() expect.that(state).isEqualTo(expectedState.state) expect.that(this.state).isEqualTo(expectedState.state) expect.that(handlesLongClick).isFalse() expect.that(handlesSecondaryClick).isFalse() expect.that(icon).isEqualTo(QSTileImpl.DrawableIcon(loadedDrawable)) expect.that(sideDrawable).isNull() expect.that(accessibilityUiState).isEqualTo(expectedState.accessibilityUiState) } expect.that(underTest.iconProvider).isEqualTo(expectedIconProvider) } @Test Loading @@ -135,7 +142,7 @@ class TileRequestDialogViewModelTest : SysuiTestCase() { underTest.activateIn(testScope) runCurrent() assertThat(underTest.uiState.icon).isEqualTo(defaultIcon) assertThat(underTest.iconProvider).isEqualTo(IconProvider.ConstantIcon(defaultIcon)) } companion object { Loading packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/IconProviderTest.kt 0 → 100644 +74 −0 Original line number Diff line number Diff line /* * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.qs.panels.ui.viewmodel import android.graphics.drawable.TestStubDrawable 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.google.common.truth.Truth.assertThat import java.util.function.Supplier import org.junit.Test import org.junit.runner.RunWith @SmallTest @RunWith(AndroidJUnit4::class) class IconProviderTest : SysuiTestCase() { @Test fun iconAndSupplier_prefersIcon() { val state = QSTile.State().apply { icon = ResourceIcon.get(R.drawable.android) iconSupplier = Supplier { QSTileImpl.DrawableIcon(TestStubDrawable()) } } val iconProvider = state.toIconProvider() assertThat(iconProvider).isEqualTo(IconProvider.ConstantIcon(state.icon)) } @Test fun iconOnly_hasIcon() { val state = QSTile.State().apply { icon = ResourceIcon.get(R.drawable.android) } val iconProvider = state.toIconProvider() assertThat(iconProvider).isEqualTo(IconProvider.ConstantIcon(state.icon)) } @Test fun supplierOnly_hasIcon() { val state = QSTile.State().apply { iconSupplier = Supplier { ResourceIcon.get(R.drawable.android) } } val iconProvider = state.toIconProvider() assertThat(iconProvider).isEqualTo(IconProvider.IconSupplier(state.iconSupplier)) } @Test fun noIconOrSupplier_iconNull() { val state = QSTile.State() val iconProvider = state.toIconProvider() assertThat(iconProvider).isEqualTo(IconProvider.Empty) } } packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/TileUiStateTest.kt +0 −43 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ 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 @@ -27,12 +26,9 @@ 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 @@ -267,45 +263,6 @@ 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/external/ui/dialog/TileRequestDialogComposeDelegate.kt +1 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,7 @@ constructor( LargeStaticTile( uiState = viewModel.uiState, iconProvider = viewModel.iconProvider, modifier = Modifier.width( dimensionResource( Loading packages/SystemUI/src/com/android/systemui/qs/external/ui/viewmodel/TileRequestDialogViewModel.kt +3 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.lifecycle.ExclusiveActivatable import com.android.systemui.plugins.qs.QSTile import com.android.systemui.qs.external.TileData import com.android.systemui.qs.panels.ui.viewmodel.toIconProvider import com.android.systemui.qs.panels.ui.viewmodel.toUiState import com.android.systemui.qs.tileimpl.QSTileImpl.DrawableIcon import com.android.systemui.qs.tileimpl.QSTileImpl.ResourceIcon Loading Loading @@ -58,6 +59,8 @@ constructor( val uiState by derivedStateOf { state.toUiState(dialogContext.resources) } val iconProvider by derivedStateOf { state.toIconProvider() } override suspend fun onActivated(): Nothing { withContext(backgroundDispatcher) { tileData.icon Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/external/ui/viewmodel/TileRequestDialogViewModelTest.kt +18 −11 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.app.iUriGrantsManager import com.android.systemui.SysuiTestCase import com.android.systemui.biometrics.ui.viewmodel.iconProvider import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.runCurrent import com.android.systemui.kosmos.runTest Loading @@ -32,6 +33,8 @@ import com.android.systemui.kosmos.testScope import com.android.systemui.lifecycle.activateIn import com.android.systemui.plugins.qs.QSTile import com.android.systemui.qs.external.TileData import com.android.systemui.qs.panels.ui.viewmodel.IconProvider import com.android.systemui.qs.panels.ui.viewmodel.toIconProvider import com.android.systemui.qs.panels.ui.viewmodel.toUiState import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.qs.tileimpl.QSTileImpl.ResourceIcon Loading Loading @@ -80,28 +83,32 @@ class TileRequestDialogViewModelTest : SysuiTestCase() { @Test fun uiState_beforeActivation_hasDefaultIcon_andCorrectData() = kosmos.runTest { val expectedState = baseResultLegacyState.apply { icon = defaultIcon }.toUiState(mainResources) val state = baseResultLegacyState.apply { icon = defaultIcon } val expectedState = state.toUiState(mainResources) val expectedIconProvider = state.toIconProvider() with(underTest.uiState) { expect.that(label).isEqualTo(TEST_LABEL) expect.that(secondaryLabel).isEmpty() expect.that(state).isEqualTo(expectedState.state) expect.that(this.state).isEqualTo(expectedState.state) expect.that(handlesLongClick).isFalse() expect.that(handlesSecondaryClick).isFalse() expect.that(icon).isEqualTo(defaultIcon) expect.that(sideDrawable).isNull() expect.that(accessibilityUiState).isEqualTo(expectedState.accessibilityUiState) } expect.that(underTest.iconProvider).isEqualTo(expectedIconProvider) } @Test fun uiState_afterActivation_hasCorrectIcon_andCorrectData() = kosmos.runTest { val expectedState = baseResultLegacyState .apply { icon = QSTileImpl.DrawableIcon(loadedDrawable) } .toUiState(mainResources) val state = baseResultLegacyState.apply { icon = QSTileImpl.DrawableIcon(loadedDrawable) } val expectedState = state.toUiState(mainResources) val expectedIconProvider = state.toIconProvider() underTest.activateIn(testScope) runCurrent() Loading @@ -109,13 +116,13 @@ class TileRequestDialogViewModelTest : SysuiTestCase() { with(underTest.uiState) { expect.that(label).isEqualTo(TEST_LABEL) expect.that(secondaryLabel).isEmpty() expect.that(state).isEqualTo(expectedState.state) expect.that(this.state).isEqualTo(expectedState.state) expect.that(handlesLongClick).isFalse() expect.that(handlesSecondaryClick).isFalse() expect.that(icon).isEqualTo(QSTileImpl.DrawableIcon(loadedDrawable)) expect.that(sideDrawable).isNull() expect.that(accessibilityUiState).isEqualTo(expectedState.accessibilityUiState) } expect.that(underTest.iconProvider).isEqualTo(expectedIconProvider) } @Test Loading @@ -135,7 +142,7 @@ class TileRequestDialogViewModelTest : SysuiTestCase() { underTest.activateIn(testScope) runCurrent() assertThat(underTest.uiState.icon).isEqualTo(defaultIcon) assertThat(underTest.iconProvider).isEqualTo(IconProvider.ConstantIcon(defaultIcon)) } companion object { Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/IconProviderTest.kt 0 → 100644 +74 −0 Original line number Diff line number Diff line /* * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.qs.panels.ui.viewmodel import android.graphics.drawable.TestStubDrawable 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.google.common.truth.Truth.assertThat import java.util.function.Supplier import org.junit.Test import org.junit.runner.RunWith @SmallTest @RunWith(AndroidJUnit4::class) class IconProviderTest : SysuiTestCase() { @Test fun iconAndSupplier_prefersIcon() { val state = QSTile.State().apply { icon = ResourceIcon.get(R.drawable.android) iconSupplier = Supplier { QSTileImpl.DrawableIcon(TestStubDrawable()) } } val iconProvider = state.toIconProvider() assertThat(iconProvider).isEqualTo(IconProvider.ConstantIcon(state.icon)) } @Test fun iconOnly_hasIcon() { val state = QSTile.State().apply { icon = ResourceIcon.get(R.drawable.android) } val iconProvider = state.toIconProvider() assertThat(iconProvider).isEqualTo(IconProvider.ConstantIcon(state.icon)) } @Test fun supplierOnly_hasIcon() { val state = QSTile.State().apply { iconSupplier = Supplier { ResourceIcon.get(R.drawable.android) } } val iconProvider = state.toIconProvider() assertThat(iconProvider).isEqualTo(IconProvider.IconSupplier(state.iconSupplier)) } @Test fun noIconOrSupplier_iconNull() { val state = QSTile.State() val iconProvider = state.toIconProvider() assertThat(iconProvider).isEqualTo(IconProvider.Empty) } }
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/TileUiStateTest.kt +0 −43 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ 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 @@ -27,12 +26,9 @@ 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 @@ -267,45 +263,6 @@ 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/external/ui/dialog/TileRequestDialogComposeDelegate.kt +1 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,7 @@ constructor( LargeStaticTile( uiState = viewModel.uiState, iconProvider = viewModel.iconProvider, modifier = Modifier.width( dimensionResource( Loading
packages/SystemUI/src/com/android/systemui/qs/external/ui/viewmodel/TileRequestDialogViewModel.kt +3 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.lifecycle.ExclusiveActivatable import com.android.systemui.plugins.qs.QSTile import com.android.systemui.qs.external.TileData import com.android.systemui.qs.panels.ui.viewmodel.toIconProvider import com.android.systemui.qs.panels.ui.viewmodel.toUiState import com.android.systemui.qs.tileimpl.QSTileImpl.DrawableIcon import com.android.systemui.qs.tileimpl.QSTileImpl.ResourceIcon Loading Loading @@ -58,6 +59,8 @@ constructor( val uiState by derivedStateOf { state.toUiState(dialogContext.resources) } val iconProvider by derivedStateOf { state.toIconProvider() } override suspend fun onActivated(): Nothing { withContext(backgroundDispatcher) { tileData.icon Loading