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

Commit ec7974d3 authored by Jan Lanik's avatar Jan Lanik
Browse files

Showing 2 icons for camera and microphone

Showing icons in the privacy indicator feature chip if camera and
microphone are both active.

Bug: 394074664
Test: atest AvControlsChipViewModelTest
Flag: com.android.systemui.expanded_privacy_indicators_on_large_screen
Change-Id: Ie1129cb4dde8b5a3ef0cfc3b12182dea46560fc8
parent b4610425
Loading
Loading
Loading
Loading
+38 −9
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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()
}
+17 −23
Original line number Diff line number Diff line
@@ -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
@@ -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