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

Commit 33a6fffc authored by Caitlin Shkuratov's avatar Caitlin Shkuratov Committed by Android (Google) Code Review
Browse files

Merge changes I5d6494be,I375dcdba into main

* changes:
  [SB] Update CarrierMergedConnectionRepositoryTest to best practices.
  [SB] Add flag helper class for status_bar_mobile_icon_kairos.
parents cf299f6e 2de83d4d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -81,7 +81,6 @@ import com.android.compose.animation.scene.content.state.TransitionState
import com.android.compose.modifiers.thenIf
import com.android.compose.theme.colorAttr
import com.android.settingslib.Utils
import com.android.systemui.Flags
import com.android.systemui.battery.BatteryMeterView
import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation
@@ -103,6 +102,7 @@ import com.android.systemui.statusbar.core.NewStatusBarIcons
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.pipeline.battery.ui.composable.BatteryWithEstimate
import com.android.systemui.statusbar.pipeline.mobile.StatusBarMobileIconKairos
import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernShadeCarrierGroupMobileView
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModelKairosComposeWrapper
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierGroupMobileIconViewModel
@@ -632,7 +632,7 @@ private fun BatteryIconLegacy(
@OptIn(ExperimentalKairosApi::class)
@Composable
private fun ShadeCarrierGroup(viewModel: ShadeHeaderViewModel, modifier: Modifier = Modifier) {
    if (Flags.statusBarMobileIconKairos()) {
    if (StatusBarMobileIconKairos.isEnabled) {
        ShadeCarrierGroupKairos(viewModel, modifier)
        return
    }
+7 −7
Original line number Diff line number Diff line
@@ -22,16 +22,17 @@ import com.android.systemui.activated
import com.android.systemui.kairos.ExperimentalKairosApi
import com.android.systemui.kairos.launchKairosNetwork
import com.android.systemui.kairos.stateOf
import com.android.systemui.kosmos.testScope
import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrierConfig
import com.android.systemui.statusbar.pipeline.mobile.data.model.testCarrierConfig
import kotlinx.coroutines.ExperimentalCoroutinesApi
import com.android.systemui.statusbar.pipeline.wifi.data.repository.fake
import com.android.systemui.statusbar.pipeline.wifi.data.repository.wifiRepository
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.coroutines.test.runCurrent
import org.junit.runner.RunWith
import org.mockito.Mockito

@OptIn(ExperimentalKairosApi::class, ExperimentalCoroutinesApi::class)
@OptIn(ExperimentalKairosApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
@android.platform.test.annotations.EnabledOnRavenwood
@@ -39,21 +40,21 @@ class CarrierMergedConnectionRepositoryKairosAdapterTest :
    CarrierMergedConnectionRepositoryTestBase() {

    var job: Job? = null
    val kairosNetwork = testScope.backgroundScope.launchKairosNetwork()
    val kairosNetwork = kosmos.testScope.backgroundScope.launchKairosNetwork()

    override fun recreateRepo(): MobileConnectionRepositoryKairosAdapter {
        lateinit var adapter: MobileConnectionRepositoryKairosAdapter
        job?.cancel()
        Mockito.clearInvocations(telephonyManager)
        job =
            testScope.backgroundScope.launch {
            kosmos.testScope.backgroundScope.launch {
                kairosNetwork.activateSpec {
                    val repo = activated {
                        CarrierMergedConnectionRepositoryKairos(
                            SUB_ID,
                            logger,
                            telephonyManager,
                            wifiRepository,
                            kosmos.wifiRepository.fake,
                            isInEcmMode = stateOf(false),
                        )
                    }
@@ -65,7 +66,6 @@ class CarrierMergedConnectionRepositoryKairosAdapterTest :
                    Unit
                }
            }
        testScope.runCurrent() // ensure the lateinit is set
        return adapter
    }
}
+67 −117
Original line number Diff line number Diff line
@@ -21,26 +21,27 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.kosmos.backgroundCoroutineContext
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.log.table.logcatTableLogBuffer
import com.android.systemui.statusbar.pipeline.mobile.data.model.DataConnectionState
import com.android.systemui.statusbar.pipeline.mobile.data.model.NetworkNameModel
import com.android.systemui.statusbar.pipeline.mobile.data.model.ResolvedNetworkType
import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.fake
import com.android.systemui.statusbar.pipeline.wifi.data.repository.wifiRepository
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import com.android.systemui.util.mockito.whenever
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever

@SmallTest
@RunWith(AndroidJUnit4::class)
@@ -51,180 +52,143 @@ class CarrierMergedConnectionRepositoryTest : CarrierMergedConnectionRepositoryT
            SUB_ID,
            logger,
            telephonyManager,
            testScope.backgroundScope.coroutineContext,
            testScope.backgroundScope,
            wifiRepository,
            bgContext = kosmos.backgroundCoroutineContext,
            scope = kosmos.testScope.backgroundScope,
            kosmos.wifiRepository.fake,
        )
}

abstract class CarrierMergedConnectionRepositoryTestBase : SysuiTestCase() {

    protected lateinit var underTest: MobileConnectionRepository
    protected val kosmos = testKosmos().useUnconfinedTestDispatcher()

    protected lateinit var wifiRepository: FakeWifiRepository
    @Mock protected lateinit var logger: TableLogBuffer
    @Mock protected lateinit var telephonyManager: TelephonyManager
    protected lateinit var underTest: MobileConnectionRepository

    protected val testDispatcher = UnconfinedTestDispatcher()
    protected val testScope = TestScope(testDispatcher)
    protected val logger = logcatTableLogBuffer(kosmos, "CarrierMergedConnectionRepositoryTest")
    protected val telephonyManager = mock<TelephonyManager>()

    abstract fun recreateRepo(): MobileConnectionRepository

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        whenever(telephonyManager.subscriptionId).thenReturn(SUB_ID)
        whenever(telephonyManager.simOperatorName).thenReturn("")

        wifiRepository = FakeWifiRepository()

        underTest = recreateRepo()
    }

    @Test
    fun inactiveWifi_isDefault() =
        testScope.runTest {
            var latestConnState: DataConnectionState? = null
            var latestNetType: ResolvedNetworkType? = null
        kosmos.runTest {
            val latestConnState by collectLastValue(underTest.dataConnectionState)
            val latestNetType by collectLastValue(underTest.resolvedNetworkType)

            val dataJob =
                underTest.dataConnectionState.onEach { latestConnState = it }.launchIn(this)
            val netJob = underTest.resolvedNetworkType.onEach { latestNetType = it }.launchIn(this)

            wifiRepository.setWifiNetwork(WifiNetworkModel.Inactive())
            wifiRepository.fake.setWifiNetwork(WifiNetworkModel.Inactive())

            assertThat(latestConnState).isEqualTo(DataConnectionState.Disconnected)
            assertThat(latestNetType).isNotEqualTo(ResolvedNetworkType.CarrierMergedNetworkType)

            dataJob.cancel()
            netJob.cancel()
        }

    @Test
    fun activeWifi_isDefault() =
        testScope.runTest {
            var latestConnState: DataConnectionState? = null
            var latestNetType: ResolvedNetworkType? = null
        kosmos.runTest {
            val latestConnState by collectLastValue(underTest.dataConnectionState)
            val latestNetType by collectLastValue(underTest.resolvedNetworkType)

            val dataJob =
                underTest.dataConnectionState.onEach { latestConnState = it }.launchIn(this)
            val netJob = underTest.resolvedNetworkType.onEach { latestNetType = it }.launchIn(this)

            wifiRepository.setWifiNetwork(WifiNetworkModel.Active.of(level = 1))
            wifiRepository.fake.setWifiNetwork(WifiNetworkModel.Active.of(level = 1))

            assertThat(latestConnState).isEqualTo(DataConnectionState.Disconnected)
            assertThat(latestNetType).isNotEqualTo(ResolvedNetworkType.CarrierMergedNetworkType)

            dataJob.cancel()
            netJob.cancel()
        }

    @Test
    fun carrierMergedWifi_isValidAndFieldsComeFromWifiNetwork() =
        testScope.runTest {
            var latest: Int? = null
            val job = underTest.primaryLevel.onEach { latest = it }.launchIn(this)
        kosmos.runTest {
            val latest by collectLastValue(underTest.primaryLevel)

            wifiRepository.setIsWifiEnabled(true)
            wifiRepository.setIsWifiDefault(true)
            wifiRepository.fake.setIsWifiEnabled(true)
            wifiRepository.fake.setIsWifiDefault(true)

            wifiRepository.setWifiNetwork(
            wifiRepository.fake.setWifiNetwork(
                WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3)
            )

            assertThat(latest).isEqualTo(3)

            job.cancel()
        }

    @Test
    fun activity_comesFromWifiActivity() =
        testScope.runTest {
            var latest: DataActivityModel? = null
            val job = underTest.dataActivityDirection.onEach { latest = it }.launchIn(this)
        kosmos.runTest {
            val latest by collectLastValue(underTest.dataActivityDirection)

            wifiRepository.setIsWifiEnabled(true)
            wifiRepository.setIsWifiDefault(true)
            wifiRepository.setWifiNetwork(
            wifiRepository.fake.setIsWifiEnabled(true)
            wifiRepository.fake.setIsWifiDefault(true)
            wifiRepository.fake.setWifiNetwork(
                WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3)
            )
            wifiRepository.setWifiActivity(
            wifiRepository.fake.setWifiActivity(
                DataActivityModel(hasActivityIn = true, hasActivityOut = false)
            )

            assertThat(latest!!.hasActivityIn).isTrue()
            assertThat(latest!!.hasActivityOut).isFalse()

            wifiRepository.setWifiActivity(
            wifiRepository.fake.setWifiActivity(
                DataActivityModel(hasActivityIn = false, hasActivityOut = true)
            )

            assertThat(latest!!.hasActivityIn).isFalse()
            assertThat(latest!!.hasActivityOut).isTrue()

            job.cancel()
        }

    @Test
    fun carrierMergedWifi_wrongSubId_isDefault() =
        testScope.runTest {
            var latestLevel: Int? = null
            var latestType: ResolvedNetworkType? = null
            val levelJob = underTest.primaryLevel.onEach { latestLevel = it }.launchIn(this)
            val typeJob = underTest.resolvedNetworkType.onEach { latestType = it }.launchIn(this)
        kosmos.runTest {
            val latestLevel by collectLastValue(underTest.primaryLevel)
            val latestType by collectLastValue(underTest.resolvedNetworkType)

            wifiRepository.setWifiNetwork(
            wifiRepository.fake.setWifiNetwork(
                WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID + 10, level = 3)
            )

            assertThat(latestLevel).isNotEqualTo(3)
            assertThat(latestType).isNotEqualTo(ResolvedNetworkType.CarrierMergedNetworkType)

            levelJob.cancel()
            typeJob.cancel()
        }

    // This scenario likely isn't possible, but write a test for it anyway
    @Test
    fun carrierMergedButNotEnabled_isDefault() =
        testScope.runTest {
            var latest: Int? = null
            val job = underTest.primaryLevel.onEach { latest = it }.launchIn(this)
        kosmos.runTest {
            val latest by collectLastValue(underTest.primaryLevel)

            wifiRepository.setWifiNetwork(
            wifiRepository.fake.setWifiNetwork(
                WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3)
            )
            wifiRepository.setIsWifiEnabled(false)
            wifiRepository.fake.setIsWifiEnabled(false)

            assertThat(latest).isNotEqualTo(3)

            job.cancel()
        }

    // This scenario likely isn't possible, but write a test for it anyway
    @Test
    fun carrierMergedButWifiNotDefault_isDefault() =
        testScope.runTest {
            var latest: Int? = null
            val job = underTest.primaryLevel.onEach { latest = it }.launchIn(this)
        kosmos.runTest {
            val latest by collectLastValue(underTest.primaryLevel)

            wifiRepository.setWifiNetwork(
            wifiRepository.fake.setWifiNetwork(
                WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3)
            )
            wifiRepository.setIsWifiDefault(false)
            wifiRepository.fake.setIsWifiDefault(false)

            assertThat(latest).isNotEqualTo(3)

            job.cancel()
        }

    @Test
    fun numberOfLevels_comesFromCarrierMerged() =
        testScope.runTest {
            var latest: Int? = null
            val job = underTest.numberOfLevels.onEach { latest = it }.launchIn(this)
        kosmos.runTest {
            val latest by collectLastValue(underTest.numberOfLevels)

            wifiRepository.setWifiNetwork(
            wifiRepository.fake.setWifiNetwork(
                WifiNetworkModel.CarrierMerged.of(
                    subscriptionId = SUB_ID,
                    level = 1,
@@ -233,77 +197,63 @@ abstract class CarrierMergedConnectionRepositoryTestBase : SysuiTestCase() {
            )

            assertThat(latest).isEqualTo(6)

            job.cancel()
        }

    @Test
    fun dataEnabled_matchesWifiEnabled() =
        testScope.runTest {
            var latest: Boolean? = null
            val job = underTest.dataEnabled.onEach { latest = it }.launchIn(this)
        kosmos.runTest {
            val latest by collectLastValue(underTest.dataEnabled)

            wifiRepository.setIsWifiEnabled(true)
            wifiRepository.fake.setIsWifiEnabled(true)
            assertThat(latest).isTrue()

            wifiRepository.setIsWifiEnabled(false)
            wifiRepository.fake.setIsWifiEnabled(false)
            assertThat(latest).isFalse()

            job.cancel()
        }

    @Test
    fun cdmaRoaming_alwaysFalse() =
        testScope.runTest {
            var latest: Boolean? = null
            val job = underTest.cdmaRoaming.onEach { latest = it }.launchIn(this)
        kosmos.runTest {
            val latest by collectLastValue(underTest.cdmaRoaming)

            assertThat(latest).isFalse()

            job.cancel()
        }

    @Test
    fun networkName_usesSimOperatorNameAsInitial() =
        testScope.runTest {
        kosmos.runTest {
            whenever(telephonyManager.simOperatorName).thenReturn("Test SIM name")
            underTest = recreateRepo()

            var latest: NetworkNameModel? = null
            val job = underTest.networkName.onEach { latest = it }.launchIn(this)
            val latest by collectLastValue(underTest.networkName)

            assertThat(latest).isEqualTo(NetworkNameModel.SimDerived("Test SIM name"))

            job.cancel()
        }

    @Test
    fun networkName_updatesOnNetworkUpdate() =
        testScope.runTest {
        kosmos.runTest {
            whenever(telephonyManager.simOperatorName).thenReturn("Test SIM name")
            underTest = recreateRepo()

            wifiRepository.setIsWifiEnabled(true)
            wifiRepository.setIsWifiDefault(true)
            wifiRepository.fake.setIsWifiEnabled(true)
            wifiRepository.fake.setIsWifiDefault(true)

            var latest: NetworkNameModel? = null
            val job = underTest.networkName.onEach { latest = it }.launchIn(this)
            val latest by collectLastValue(underTest.networkName)

            assertThat(latest).isEqualTo(NetworkNameModel.SimDerived("Test SIM name"))

            whenever(telephonyManager.simOperatorName).thenReturn("New SIM name")
            wifiRepository.setWifiNetwork(
            wifiRepository.fake.setWifiNetwork(
                WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3)
            )

            assertThat(latest).isEqualTo(NetworkNameModel.SimDerived("New SIM name"))

            job.cancel()
        }

    @Test
    fun isAllowedDuringAirplaneMode_alwaysTrue() =
        testScope.runTest {
        kosmos.runTest {
            val latest by collectLastValue(underTest.isAllowedDuringAirplaneMode)

            assertThat(latest).isTrue()
+3 −3
Original line number Diff line number Diff line
@@ -39,7 +39,6 @@ import androidx.annotation.VisibleForTesting;
import com.android.keyguard.CarrierTextManager;
import com.android.settingslib.AccessibilityContentDescriptions;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.systemui.Flags;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Application;
import com.android.systemui.dagger.qualifiers.Background;
@@ -55,6 +54,7 @@ import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.connectivity.ui.MobileContextProvider;
import com.android.systemui.statusbar.phone.StatusBarLocation;
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags;
import com.android.systemui.statusbar.pipeline.mobile.StatusBarMobileIconKairos;
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter;
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapterKairos;
import com.android.systemui.statusbar.pipeline.mobile.ui.binder.MobileIconsBinder;
@@ -223,7 +223,7 @@ public class ShadeCarrierGroupController {
        mMobileIconsViewModel = mobileUiAdapter.getMobileIconsViewModel();

        if (mStatusBarPipelineFlags.useNewShadeCarrierGroupMobileIcons()) {
            if (Flags.statusBarMobileIconKairos()) {
            if (StatusBarMobileIconKairos.isEnabled()) {
                mobileUiAdapterKairos.get().setShadeCarrierGroupController(this);
            } else {
                mobileUiAdapter.setShadeCarrierGroupController(this);
@@ -275,7 +275,7 @@ public class ShadeCarrierGroupController {

        List<IconData> iconDataList = processSubIdList(subIds);

        if (Flags.statusBarMobileIconKairos()) {
        if (StatusBarMobileIconKairos.isEnabled()) {
            for (Job job : mBindingJobs) {
                job.cancel(new CancellationException());
            }
+3 −3
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import android.widget.LinearLayout;
import androidx.collection.MutableIntObjectMap;

import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.Flags;
import com.android.systemui.demomode.DemoMode;
import com.android.systemui.kairos.ExperimentalKairosApi;
import com.android.systemui.kairos.KairosNetwork;
@@ -39,6 +38,7 @@ import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.StatusIconDisplayable;
import com.android.systemui.statusbar.pipeline.mobile.StatusBarMobileIconKairos;
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapterKairos;
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileViewLogger;
import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernStatusBarMobileView;
@@ -273,7 +273,7 @@ public class DemoStatusIcons extends StatusIconContainer implements DemoMode, Da
            MobileViewLogger mobileViewLogger,
            int subId) {
        Log.d(TAG, "addModernMobileView (subId=" + subId + ")");
        if (Flags.statusBarMobileIconKairos()) {
        if (StatusBarMobileIconKairos.isEnabled()) {
            Pair<ModernStatusBarMobileView, Job> viewAndJob =
                    ModernStatusBarMobileView.constructAndBind(
                            mobileContext,
@@ -349,7 +349,7 @@ public class DemoStatusIcons extends StatusIconContainer implements DemoMode, Da
            ModernStatusBarMobileView mobileView = matchingModernMobileView(
                    (ModernStatusBarMobileView) view);
            if (mobileView != null) {
                if (Flags.statusBarMobileIconKairos()) {
                if (StatusBarMobileIconKairos.isEnabled()) {
                    Job job = mBindingJobs.remove(mobileView.getSubId());
                    if (job != null) {
                        job.cancel(new CancellationException());
Loading