Loading packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt +4 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 */ Loading Loading @@ -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()) { Loading packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt +6 −4 Original line number Diff line number Diff line Loading @@ -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 } } } Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractorTest.kt +10 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -48,6 +50,9 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { ) private val repo = FakeDeviceBasedSatelliteRepository() private val deviceProvisionedRepository = FakeDeviceProvisioningRepository() private val deviceProvisioningInteractor = DeviceProvisioningInteractor(deviceProvisionedRepository) @Before fun setUp() { Loading @@ -55,6 +60,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { DeviceBasedSatelliteInteractor( repo, iconsInteractor, deviceProvisioningInteractor, testScope.backgroundScope, ) } Loading Loading @@ -96,6 +102,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { DeviceBasedSatelliteInteractor( repo, iconsInteractor, deviceProvisioningInteractor, testScope.backgroundScope, ) Loading Loading @@ -142,6 +149,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { DeviceBasedSatelliteInteractor( repo, iconsInteractor, deviceProvisioningInteractor, testScope.backgroundScope, ) Loading Loading @@ -196,6 +204,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { DeviceBasedSatelliteInteractor( repo, iconsInteractor, deviceProvisioningInteractor, testScope.backgroundScope, ) Loading Loading @@ -327,6 +336,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { DeviceBasedSatelliteInteractor( repo, iconsInteractor, deviceProvisioningInteractor, testScope.backgroundScope, ) Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModelTest.kt +39 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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() Loading @@ -57,6 +62,7 @@ class DeviceBasedSatelliteViewModelTest : SysuiTestCase() { DeviceBasedSatelliteInteractor( repo, mobileIconsInteractor, deviceProvisioningInteractor, testScope.backgroundScope, ) Loading Loading @@ -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) } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt +4 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 */ Loading Loading @@ -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()) { Loading
packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt +6 −4 Original line number Diff line number Diff line Loading @@ -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 } } } Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractorTest.kt +10 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -48,6 +50,9 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { ) private val repo = FakeDeviceBasedSatelliteRepository() private val deviceProvisionedRepository = FakeDeviceProvisioningRepository() private val deviceProvisioningInteractor = DeviceProvisioningInteractor(deviceProvisionedRepository) @Before fun setUp() { Loading @@ -55,6 +60,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { DeviceBasedSatelliteInteractor( repo, iconsInteractor, deviceProvisioningInteractor, testScope.backgroundScope, ) } Loading Loading @@ -96,6 +102,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { DeviceBasedSatelliteInteractor( repo, iconsInteractor, deviceProvisioningInteractor, testScope.backgroundScope, ) Loading Loading @@ -142,6 +149,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { DeviceBasedSatelliteInteractor( repo, iconsInteractor, deviceProvisioningInteractor, testScope.backgroundScope, ) Loading Loading @@ -196,6 +204,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { DeviceBasedSatelliteInteractor( repo, iconsInteractor, deviceProvisioningInteractor, testScope.backgroundScope, ) Loading Loading @@ -327,6 +336,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { DeviceBasedSatelliteInteractor( repo, iconsInteractor, deviceProvisioningInteractor, testScope.backgroundScope, ) Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModelTest.kt +39 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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() Loading @@ -57,6 +62,7 @@ class DeviceBasedSatelliteViewModelTest : SysuiTestCase() { DeviceBasedSatelliteInteractor( repo, mobileIconsInteractor, deviceProvisioningInteractor, testScope.backgroundScope, ) Loading Loading @@ -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) } }