Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/featurepods/vc/ui/viewmodel/AvControlsChipViewModelTest.kt +38 −9 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.Flags.FLAG_EXPANDED_PRIVACY_INDICATORS_ON_LARGE_SCREEN import com.android.systemui.SysuiTestCase import com.android.systemui.common.shared.model.Icon import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useUnconfinedTestDispatcher Loading @@ -29,6 +30,8 @@ import com.android.systemui.privacy.PrivacyApplication import com.android.systemui.privacy.PrivacyItem import com.android.systemui.privacy.PrivacyType import com.android.systemui.shade.data.repository.fakePrivacyChipRepository import com.android.systemui.statusbar.featurepods.av.ui.viewmodel.AvControlsChipViewModel import com.android.systemui.statusbar.featurepods.popups.ui.model.ChipIcon import com.android.systemui.statusbar.featurepods.popups.ui.model.PopupChipId import com.android.systemui.statusbar.featurepods.popups.ui.model.PopupChipModel import com.android.systemui.statusbar.featurepods.vc.domain.interactor.avControlsChipInteractor Loading Loading @@ -64,7 +67,7 @@ class AvControlsChipViewModelTest() : SysuiTestCase() { fun avControlsChip_showingCamera_chipVisible() = kosmos.runTest { fakePrivacyChipRepository.setPrivacyItems(listOf(cameraItem)) underTest.chip.verifyShown().verifyHasText("Camera") underTest.chip.verifyShown().verifyIsCameraOnlyChip() } @Test Loading @@ -72,7 +75,7 @@ class AvControlsChipViewModelTest() : SysuiTestCase() { fun avControlsChip_showingMicrophone_chipVisible() = kosmos.runTest { fakePrivacyChipRepository.setPrivacyItems(listOf(microphoneItem)) underTest.chip.verifyShown().verifyHasText("Microphone") underTest.chip.verifyShown().verifyIsMicrophoneOnlyChip() } @Test Loading @@ -80,7 +83,7 @@ class AvControlsChipViewModelTest() : SysuiTestCase() { fun avControlsChip_showingCameraAndMicrophone_chipVisible() = kosmos.runTest { fakePrivacyChipRepository.setPrivacyItems(listOf(cameraItem, microphoneItem)) underTest.chip.verifyShown().verifyHasText("Cam & Mic") underTest.chip.verifyShown().verifyIsCameraAndMicrophoneChip() } @Test Loading @@ -90,16 +93,16 @@ class AvControlsChipViewModelTest() : SysuiTestCase() { underTest.chip.verifyHidden() fakePrivacyChipRepository.setPrivacyItems(listOf(cameraItem)) underTest.chip.verifyShown().verifyHasText("Camera") underTest.chip.verifyShown().verifyIsCameraOnlyChip() fakePrivacyChipRepository.setPrivacyItems(listOf()) underTest.chip.verifyHidden() fakePrivacyChipRepository.setPrivacyItems(listOf(microphoneItem)) underTest.chip.verifyShown().verifyHasText("Microphone") underTest.chip.verifyShown().verifyIsMicrophoneOnlyChip() fakePrivacyChipRepository.setPrivacyItems(listOf(microphoneItem, cameraItem)) underTest.chip.verifyShown().verifyHasText("Cam & Mic") underTest.chip.verifyShown().verifyIsCameraAndMicrophoneChip() } @Test Loading Loading @@ -133,7 +136,33 @@ private fun PopupChipModel.verifyShown(): PopupChipModel.Shown { return this as PopupChipModel.Shown } private fun PopupChipModel.Shown.verifyHasText(text: String?): PopupChipModel.Shown { assertThat(this.chipText).isEqualTo(text) return this private fun PopupChipModel.Shown.verifyHasNoText() { assertThat(this.chipText).isEqualTo("") } private fun PopupChipModel.Shown.verifyHasIcon(res: Int) { assertThat(this.icons).contains(ChipIcon(Icon.Resource(res = res, contentDescription = null))) } private fun PopupChipModel.Shown.verifyNumberOfIcons(num: Int) { assertThat(this.icons.size).isEqualTo(num) } private fun PopupChipModel.Shown.verifyIsCameraOnlyChip() { verifyNumberOfIcons(1) verifyHasIcon(AvControlsChipViewModel.CAMERA_DRAWABLE) verifyHasNoText() } private fun PopupChipModel.Shown.verifyIsMicrophoneOnlyChip() { verifyNumberOfIcons(1) verifyHasIcon(AvControlsChipViewModel.MICROPHONE_DRAWABLE) verifyHasNoText() } private fun PopupChipModel.Shown.verifyIsCameraAndMicrophoneChip() { verifyNumberOfIcons(2) verifyHasIcon(AvControlsChipViewModel.CAMERA_DRAWABLE) verifyHasIcon(AvControlsChipViewModel.MICROPHONE_DRAWABLE) verifyHasNoText() } packages/SystemUI/src/com/android/systemui/statusbar/featurepods/av/ui/viewmodel/AvControlsChipViewModel.kt +17 −23 Original line number Diff line number Diff line Loading @@ -36,6 +36,11 @@ class AvControlsChipViewModel @AssistedInject constructor(avControlsChipInteractor: AvControlsChipInteractor) : StatusBarPopupChipViewModel, ExclusiveActivatable() { companion object { val CAMERA_DRAWABLE: Int = com.android.internal.R.drawable.perm_group_camera val MICROPHONE_DRAWABLE: Int = com.android.internal.R.drawable.perm_group_microphone } private val hydrator: Hydrator = Hydrator("AvControlsChipViewModel.hydrator") override val chip: PopupChipModel by Loading @@ -58,33 +63,22 @@ constructor(avControlsChipInteractor: AvControlsChipInteractor) : PopupChipModel.Shown( // TODO: Pass in color when the api supports it chipId = chipId, icons = listOf(ChipIcon(icon(sensorActivityModel = sensorActivityModel))), chipText = chipText(sensorActivityModel = sensorActivityModel), icons = icons(sensorActivityModel = sensorActivityModel), // TODO(405903665): Remove text after api change chipText = "", ) } } private fun icon(sensorActivityModel: SensorActivityModel.Active): Icon { val imageRes = private fun icons(sensorActivityModel: SensorActivityModel.Active): List<ChipIcon> = when (sensorActivityModel.sensors) { SensorActivityModel.Active.Sensors.CAMERA -> com.android.internal.R.drawable.perm_group_camera SensorActivityModel.Active.Sensors.MICROPHONE -> com.android.internal.R.drawable.perm_group_microphone // TODO(405903665): Pass both camera and microphone icons when it is supported. SensorActivityModel.Active.Sensors.CAMERA -> listOf(CAMERA_DRAWABLE) SensorActivityModel.Active.Sensors.MICROPHONE -> listOf(MICROPHONE_DRAWABLE) SensorActivityModel.Active.Sensors.CAMERA_AND_MICROPHONE -> com.android.internal.R.drawable.perm_group_camera } return Icon.Resource(res = imageRes, contentDescription = null) } // TODO(405903665): Remove text after api change private fun chipText(sensorActivityModel: SensorActivityModel.Active): String { return when (sensorActivityModel.sensors) { SensorActivityModel.Active.Sensors.CAMERA_AND_MICROPHONE -> "Cam & Mic" SensorActivityModel.Active.Sensors.CAMERA -> "Camera" SensorActivityModel.Active.Sensors.MICROPHONE -> "Microphone" } listOf(CAMERA_DRAWABLE, MICROPHONE_DRAWABLE) }.map { // TODO(b/414566470): Add content description for accessibility. ChipIcon(Icon.Resource(res = it, contentDescription = null)) } @AssistedFactory Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/featurepods/vc/ui/viewmodel/AvControlsChipViewModelTest.kt +38 −9 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.Flags.FLAG_EXPANDED_PRIVACY_INDICATORS_ON_LARGE_SCREEN import com.android.systemui.SysuiTestCase import com.android.systemui.common.shared.model.Icon import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useUnconfinedTestDispatcher Loading @@ -29,6 +30,8 @@ import com.android.systemui.privacy.PrivacyApplication import com.android.systemui.privacy.PrivacyItem import com.android.systemui.privacy.PrivacyType import com.android.systemui.shade.data.repository.fakePrivacyChipRepository import com.android.systemui.statusbar.featurepods.av.ui.viewmodel.AvControlsChipViewModel import com.android.systemui.statusbar.featurepods.popups.ui.model.ChipIcon import com.android.systemui.statusbar.featurepods.popups.ui.model.PopupChipId import com.android.systemui.statusbar.featurepods.popups.ui.model.PopupChipModel import com.android.systemui.statusbar.featurepods.vc.domain.interactor.avControlsChipInteractor Loading Loading @@ -64,7 +67,7 @@ class AvControlsChipViewModelTest() : SysuiTestCase() { fun avControlsChip_showingCamera_chipVisible() = kosmos.runTest { fakePrivacyChipRepository.setPrivacyItems(listOf(cameraItem)) underTest.chip.verifyShown().verifyHasText("Camera") underTest.chip.verifyShown().verifyIsCameraOnlyChip() } @Test Loading @@ -72,7 +75,7 @@ class AvControlsChipViewModelTest() : SysuiTestCase() { fun avControlsChip_showingMicrophone_chipVisible() = kosmos.runTest { fakePrivacyChipRepository.setPrivacyItems(listOf(microphoneItem)) underTest.chip.verifyShown().verifyHasText("Microphone") underTest.chip.verifyShown().verifyIsMicrophoneOnlyChip() } @Test Loading @@ -80,7 +83,7 @@ class AvControlsChipViewModelTest() : SysuiTestCase() { fun avControlsChip_showingCameraAndMicrophone_chipVisible() = kosmos.runTest { fakePrivacyChipRepository.setPrivacyItems(listOf(cameraItem, microphoneItem)) underTest.chip.verifyShown().verifyHasText("Cam & Mic") underTest.chip.verifyShown().verifyIsCameraAndMicrophoneChip() } @Test Loading @@ -90,16 +93,16 @@ class AvControlsChipViewModelTest() : SysuiTestCase() { underTest.chip.verifyHidden() fakePrivacyChipRepository.setPrivacyItems(listOf(cameraItem)) underTest.chip.verifyShown().verifyHasText("Camera") underTest.chip.verifyShown().verifyIsCameraOnlyChip() fakePrivacyChipRepository.setPrivacyItems(listOf()) underTest.chip.verifyHidden() fakePrivacyChipRepository.setPrivacyItems(listOf(microphoneItem)) underTest.chip.verifyShown().verifyHasText("Microphone") underTest.chip.verifyShown().verifyIsMicrophoneOnlyChip() fakePrivacyChipRepository.setPrivacyItems(listOf(microphoneItem, cameraItem)) underTest.chip.verifyShown().verifyHasText("Cam & Mic") underTest.chip.verifyShown().verifyIsCameraAndMicrophoneChip() } @Test Loading Loading @@ -133,7 +136,33 @@ private fun PopupChipModel.verifyShown(): PopupChipModel.Shown { return this as PopupChipModel.Shown } private fun PopupChipModel.Shown.verifyHasText(text: String?): PopupChipModel.Shown { assertThat(this.chipText).isEqualTo(text) return this private fun PopupChipModel.Shown.verifyHasNoText() { assertThat(this.chipText).isEqualTo("") } private fun PopupChipModel.Shown.verifyHasIcon(res: Int) { assertThat(this.icons).contains(ChipIcon(Icon.Resource(res = res, contentDescription = null))) } private fun PopupChipModel.Shown.verifyNumberOfIcons(num: Int) { assertThat(this.icons.size).isEqualTo(num) } private fun PopupChipModel.Shown.verifyIsCameraOnlyChip() { verifyNumberOfIcons(1) verifyHasIcon(AvControlsChipViewModel.CAMERA_DRAWABLE) verifyHasNoText() } private fun PopupChipModel.Shown.verifyIsMicrophoneOnlyChip() { verifyNumberOfIcons(1) verifyHasIcon(AvControlsChipViewModel.MICROPHONE_DRAWABLE) verifyHasNoText() } private fun PopupChipModel.Shown.verifyIsCameraAndMicrophoneChip() { verifyNumberOfIcons(2) verifyHasIcon(AvControlsChipViewModel.CAMERA_DRAWABLE) verifyHasIcon(AvControlsChipViewModel.MICROPHONE_DRAWABLE) verifyHasNoText() }
packages/SystemUI/src/com/android/systemui/statusbar/featurepods/av/ui/viewmodel/AvControlsChipViewModel.kt +17 −23 Original line number Diff line number Diff line Loading @@ -36,6 +36,11 @@ class AvControlsChipViewModel @AssistedInject constructor(avControlsChipInteractor: AvControlsChipInteractor) : StatusBarPopupChipViewModel, ExclusiveActivatable() { companion object { val CAMERA_DRAWABLE: Int = com.android.internal.R.drawable.perm_group_camera val MICROPHONE_DRAWABLE: Int = com.android.internal.R.drawable.perm_group_microphone } private val hydrator: Hydrator = Hydrator("AvControlsChipViewModel.hydrator") override val chip: PopupChipModel by Loading @@ -58,33 +63,22 @@ constructor(avControlsChipInteractor: AvControlsChipInteractor) : PopupChipModel.Shown( // TODO: Pass in color when the api supports it chipId = chipId, icons = listOf(ChipIcon(icon(sensorActivityModel = sensorActivityModel))), chipText = chipText(sensorActivityModel = sensorActivityModel), icons = icons(sensorActivityModel = sensorActivityModel), // TODO(405903665): Remove text after api change chipText = "", ) } } private fun icon(sensorActivityModel: SensorActivityModel.Active): Icon { val imageRes = private fun icons(sensorActivityModel: SensorActivityModel.Active): List<ChipIcon> = when (sensorActivityModel.sensors) { SensorActivityModel.Active.Sensors.CAMERA -> com.android.internal.R.drawable.perm_group_camera SensorActivityModel.Active.Sensors.MICROPHONE -> com.android.internal.R.drawable.perm_group_microphone // TODO(405903665): Pass both camera and microphone icons when it is supported. SensorActivityModel.Active.Sensors.CAMERA -> listOf(CAMERA_DRAWABLE) SensorActivityModel.Active.Sensors.MICROPHONE -> listOf(MICROPHONE_DRAWABLE) SensorActivityModel.Active.Sensors.CAMERA_AND_MICROPHONE -> com.android.internal.R.drawable.perm_group_camera } return Icon.Resource(res = imageRes, contentDescription = null) } // TODO(405903665): Remove text after api change private fun chipText(sensorActivityModel: SensorActivityModel.Active): String { return when (sensorActivityModel.sensors) { SensorActivityModel.Active.Sensors.CAMERA_AND_MICROPHONE -> "Cam & Mic" SensorActivityModel.Active.Sensors.CAMERA -> "Camera" SensorActivityModel.Active.Sensors.MICROPHONE -> "Microphone" } listOf(CAMERA_DRAWABLE, MICROPHONE_DRAWABLE) }.map { // TODO(b/414566470): Add content description for accessibility. ChipIcon(Icon.Resource(res = it, contentDescription = null)) } @AssistedFactory Loading