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

Commit 9ffc1189 authored by Olivier St-Onge's avatar Olivier St-Onge Committed by Cherrypicker Worker
Browse files

Check if the device is provisioned before showing the satellite icon

Test: DeviceBasedSatelliteViewModelTest
Flag: none
Fixes: 331628184
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:5bc50b6c49559b0481e26260e36a778484de2537)
Merged-In: I2ba8422871042390e257704f4ac7671a8f6f89e3
Change-Id: I2ba8422871042390e257704f4ac7671a8f6f89e3
parent 8ff457cd
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
import com.android.systemui.statusbar.pipeline.satellite.data.DeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.shared.model.SatelliteConnectionState
import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -39,6 +40,7 @@ class DeviceBasedSatelliteInteractor
constructor(
    val repo: DeviceBasedSatelliteRepository,
    iconsInteractor: MobileIconsInteractor,
    deviceProvisioningInteractor: DeviceProvisioningInteractor,
    @Application scope: CoroutineScope,
) {
    /** Must be observed by any UI showing Satellite iconography */
@@ -69,6 +71,8 @@ constructor(
            }
            .stateIn(scope, SharingStarted.WhileSubscribed(), 0)

    val isDeviceProvisioned: Flow<Boolean> = deviceProvisioningInteractor.isDeviceProvisioned

    /** When all connections are considered OOS, satellite connectivity is potentially valid */
    val areAllConnectionsOutOfService =
        if (Flags.oemEnabledSatelliteFlag()) {
+6 −4
Original line number Diff line number Diff line
@@ -56,10 +56,12 @@ constructor(
            if (!allOos) {
                flowOf(false)
            } else {
                combine(interactor.isSatelliteAllowed, airplaneModeRepository.isAirplaneMode) {
                    isSatelliteAllowed,
                    isAirplaneMode ->
                    isSatelliteAllowed && !isAirplaneMode
                combine(
                    interactor.isSatelliteAllowed,
                    interactor.isDeviceProvisioned,
                    airplaneModeRepository.isAirplaneMode
                ) { isSatelliteAllowed, isDeviceProvisioned, isAirplaneMode ->
                    isSatelliteAllowed && isDeviceProvisioned && !isAirplaneMode
                }
            }
        }
+10 −0
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobi
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.satellite.data.prod.FakeDeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.shared.model.SatelliteConnectionState
import com.android.systemui.statusbar.policy.data.repository.FakeDeviceProvisioningRepository
import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat
import kotlin.test.Test
@@ -48,6 +50,9 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() {
        )

    private val repo = FakeDeviceBasedSatelliteRepository()
    private val deviceProvisionedRepository = FakeDeviceProvisioningRepository()
    private val deviceProvisioningInteractor =
        DeviceProvisioningInteractor(deviceProvisionedRepository)

    @Before
    fun setUp() {
@@ -55,6 +60,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() {
            DeviceBasedSatelliteInteractor(
                repo,
                iconsInteractor,
                deviceProvisioningInteractor,
                testScope.backgroundScope,
            )
    }
@@ -96,6 +102,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() {
                DeviceBasedSatelliteInteractor(
                    repo,
                    iconsInteractor,
                    deviceProvisioningInteractor,
                    testScope.backgroundScope,
                )

@@ -142,6 +149,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() {
                DeviceBasedSatelliteInteractor(
                    repo,
                    iconsInteractor,
                    deviceProvisioningInteractor,
                    testScope.backgroundScope,
                )

@@ -196,6 +204,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() {
                DeviceBasedSatelliteInteractor(
                    repo,
                    iconsInteractor,
                    deviceProvisioningInteractor,
                    testScope.backgroundScope,
                )

@@ -327,6 +336,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() {
                DeviceBasedSatelliteInteractor(
                    repo,
                    iconsInteractor,
                    deviceProvisioningInteractor,
                    testScope.backgroundScope,
                )

+39 −0
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobi
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.satellite.data.prod.FakeDeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.domain.interactor.DeviceBasedSatelliteInteractor
import com.android.systemui.statusbar.policy.data.repository.FakeDeviceProvisioningRepository
import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat
import kotlin.test.Test
@@ -45,6 +47,9 @@ class DeviceBasedSatelliteViewModelTest : SysuiTestCase() {

    private val repo = FakeDeviceBasedSatelliteRepository()
    private val mobileIconsInteractor = FakeMobileIconsInteractor(FakeMobileMappingsProxy(), mock())
    private val deviceProvisionedRepository = FakeDeviceProvisioningRepository()
    private val deviceProvisioningInteractor =
        DeviceProvisioningInteractor(deviceProvisionedRepository)

    private val testScope = TestScope()

@@ -57,6 +62,7 @@ class DeviceBasedSatelliteViewModelTest : SysuiTestCase() {
            DeviceBasedSatelliteInteractor(
                repo,
                mobileIconsInteractor,
                deviceProvisioningInteractor,
                testScope.backgroundScope,
            )

@@ -214,4 +220,37 @@ class DeviceBasedSatelliteViewModelTest : SysuiTestCase() {
            // THEN icon is null immediately
            assertThat(latest).isNull()
        }

    @OptIn(ExperimentalCoroutinesApi::class)
    @Test
    fun icon_deviceIsProvisioned() =
        testScope.runTest {
            val latest by collectLastValue(underTest.icon)

            // GIVEN satellite is allowed
            repo.isSatelliteAllowedForCurrentLocation.value = true

            // GIVEN all icons are OOS
            val i1 = mobileIconsInteractor.getMobileConnectionInteractorForSubId(1)
            i1.isInService.value = false
            i1.isEmergencyOnly.value = false

            // GIVEN apm is disabled
            airplaneModeRepository.setIsAirplaneMode(false)

            // GIVEN device is not provisioned
            deviceProvisionedRepository.setDeviceProvisioned(false)

            // THEN icon is null because the device is not provisioned
            assertThat(latest).isNull()

            // GIVEN device becomes provisioned
            deviceProvisionedRepository.setDeviceProvisioned(true)

            // Wait for delay to be completed
            advanceTimeBy(10.seconds)

            // THEN icon is null because the device is not provisioned
            assertThat(latest).isInstanceOf(Icon::class.java)
        }
}