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

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

Merge changes I8b478317,I140ddc35,I7188b0d8,Icf537d0d,I8eb41612, ... into main

* changes:
  [SB] Update EthernetInteractorTest to use Kosmos.
  [SB] Update ethernet icon datasource to be EthernetInteractor.
  [SB] Mark SignalCallback & SignalControllers as deprecated.
  [SB] Update StatusBarSignalPolicyTest with more Kosmos usage.
  [SB] Remove SignalCallback#setCallIndicator & associated methods.
  [SB] Format SignalCallback.kt
parents 0f1d0cc6 35431aa2
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -456,6 +456,13 @@ flag {
   bug: "264539100"
}

flag {
   name: "status_bar_signal_policy_refactor_ethernet"
   namespace: "systemui"
   description: "Use recommended architecture for ethernet icon in status bar"
   bug: "291321279"
}

flag {
    name: "status_bar_swipe_over_chip"
    namespace: "systemui"
+120 −43
Original line number Diff line number Diff line
@@ -25,104 +25,97 @@ import com.android.settingslib.mobile.TelephonyIcons
import com.android.systemui.Flags.FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR
import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.testCase
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.statusbar.connectivity.IconState
import com.android.systemui.statusbar.connectivity.NetworkController
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy_Factory
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.airplaneModeInteractor
import com.android.systemui.statusbar.pipeline.ethernet.domain.ethernetInteractor
import com.android.systemui.statusbar.pipeline.ethernet.shared.StatusBarSignalPolicyRefactorEthernet
import com.android.systemui.statusbar.pipeline.shared.data.repository.connectivityRepository
import com.android.systemui.statusbar.pipeline.shared.data.repository.fake
import com.android.systemui.statusbar.policy.SecurityController
import com.android.systemui.tuner.TunerService
import com.android.systemui.util.CarrierConfigTracker
import com.android.systemui.testKosmos
import com.android.systemui.tuner.tunerService
import com.android.systemui.util.kotlin.JavaAdapter
import com.android.systemui.util.mockito.mock
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import kotlin.test.Test
import org.junit.Before
import org.junit.runner.RunWith
import org.mockito.Mockito.verify
import org.mockito.kotlin.clearInvocations
import org.mockito.kotlin.mock
import org.mockito.kotlin.verifyNoMoreInteractions
import kotlin.test.Test

@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
class StatusBarSignalPolicyTest : SysuiTestCase() {
    private val kosmos = Kosmos().also { it.testCase = this }

    private lateinit var underTest: StatusBarSignalPolicy

    private val testScope = TestScope()

    private val javaAdapter = JavaAdapter(testScope.backgroundScope)
    private val airplaneModeInteractor = kosmos.airplaneModeInteractor
    private val kosmos = testKosmos().useUnconfinedTestDispatcher()

    private val javaAdapter = JavaAdapter(kosmos.testScope.backgroundScope)
    private val securityController = mock<SecurityController>()
    private val tunerService = mock<TunerService>()
    private val statusBarIconController = mock<StatusBarIconController>()
    private val networkController = mock<NetworkController>()
    private val carrierConfigTracker = mock<CarrierConfigTracker>()

    private var slotAirplane: String? = null

    @Before
    fun setup() {
        underTest =
            StatusBarSignalPolicy_Factory.newInstance(
    private val Kosmos.underTest by
        Kosmos.Fixture {
            StatusBarSignalPolicy(
                mContext,
                statusBarIconController,
                carrierConfigTracker,
                networkController,
                securityController,
                tunerService,
                javaAdapter,
                airplaneModeInteractor,
                ethernetInteractor,
            )
        }

    private lateinit var slotAirplane: String
    private lateinit var slotEthernet: String

    @Before
    fun setup() {
        slotAirplane = mContext.getString(R.string.status_bar_airplane)
        slotEthernet = mContext.getString(R.string.status_bar_ethernet)
    }

    @Test
    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    fun airplaneModeViaInteractor_statusBarSignalPolicyRefactorFlagEnabled_iconUpdated() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            clearInvocations(statusBarIconController)

            airplaneModeInteractor.setIsAirplaneMode(true)
            runCurrent()
            verify(statusBarIconController).setIconVisibility(slotAirplane, true)

            airplaneModeInteractor.setIsAirplaneMode(false)
            runCurrent()
            verify(statusBarIconController).setIconVisibility(slotAirplane, false)
        }

    @Test
    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    fun airplaneModeViaSignalCallback_statusBarSignalPolicyRefactorFlagEnabled_iconNotUpdated() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            runCurrent()
            clearInvocations(statusBarIconController)

            // Make sure the legacy code path does not change airplane mode when the refactor
            // flag is enabled.
            underTest.setIsAirplaneMode(IconState(true, TelephonyIcons.FLIGHT_MODE_ICON, ""))
            runCurrent()
            verifyNoMoreInteractions(statusBarIconController)

            underTest.setIsAirplaneMode(IconState(false, TelephonyIcons.FLIGHT_MODE_ICON, ""))
            runCurrent()
            verifyNoMoreInteractions(statusBarIconController)
        }

    @Test
    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    fun statusBarSignalPolicyInitialization_statusBarSignalPolicyRefactorFlagEnabled_initNoOp() =
        testScope.runTest {
        kosmos.runTest {
            // Make sure StatusBarSignalPolicy.init does no initialization when
            // the refactor flag is disabled.
            underTest.init()
@@ -132,42 +125,126 @@ class StatusBarSignalPolicyTest : SysuiTestCase() {
    @Test
    @DisableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    fun airplaneModeViaSignalCallback_statusBarSignalPolicyRefactorFlagDisabled_iconUpdated() =
        testScope.runTest {
        kosmos.runTest {
            underTest.init()

            underTest.setIsAirplaneMode(IconState(true, TelephonyIcons.FLIGHT_MODE_ICON, ""))
            runCurrent()
            verify(statusBarIconController).setIconVisibility(slotAirplane, true)

            underTest.setIsAirplaneMode(IconState(false, TelephonyIcons.FLIGHT_MODE_ICON, ""))
            runCurrent()
            verify(statusBarIconController).setIconVisibility(slotAirplane, false)
        }

    @Test
    @DisableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    fun airplaneModeViaInteractor_statusBarSignalPolicyRefactorFlagDisabled_iconNotUpdated() =
        testScope.runTest {
        kosmos.runTest {
            underTest.init()

            // Make sure changing airplane mode from airplaneModeRepository does nothing
            // if the StatusBarSignalPolicyRefactor is not enabled.
            airplaneModeInteractor.setIsAirplaneMode(true)
            runCurrent()
            verifyNoMoreInteractions(statusBarIconController)

            airplaneModeInteractor.setIsAirplaneMode(false)
            runCurrent()
            verifyNoMoreInteractions(statusBarIconController)
        }

    @Test
    @DisableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    fun statusBarSignalPolicyInitialization_statusBarSignalPolicyRefactorFlagDisabled_startNoOp() =
        testScope.runTest {
        kosmos.runTest {
            // Make sure StatusBarSignalPolicy.start does no initialization when
            // the refactor flag is disabled.
            underTest.start()
            verifyNoMoreInteractions(securityController, networkController, tunerService)
        }

    @Test
    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    @DisableFlags(StatusBarSignalPolicyRefactorEthernet.FLAG_NAME)
    fun ethernetIconViaSignalCallback_refactorFlagDisabled_iconUpdated() =
        kosmos.runTest {
            underTest.start()
            clearInvocations(statusBarIconController)

            underTest.setEthernetIndicators(
                IconState(/* visible= */ true, /* icon= */ 1, /* contentDescription= */ "Ethernet")
            )
            verify(statusBarIconController).setIconVisibility(slotEthernet, true)

            underTest.setEthernetIndicators(
                IconState(
                    /* visible= */ false,
                    /* icon= */ 0,
                    /* contentDescription= */ "No ethernet",
                )
            )
            verify(statusBarIconController).setIconVisibility(slotEthernet, false)
        }

    @Test
    @EnableFlags(
        FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR,
        StatusBarSignalPolicyRefactorEthernet.FLAG_NAME,
    )
    fun ethernetIconViaSignalCallback_refactorFlagEnabled_iconNotUpdated() =
        kosmos.runTest {
            underTest.start()
            clearInvocations(statusBarIconController)

            underTest.setEthernetIndicators(
                IconState(/* visible= */ true, /* icon= */ 1, /* contentDescription= */ "Ethernet")
            )
            verifyNoMoreInteractions(statusBarIconController)

            underTest.setEthernetIndicators(
                IconState(
                    /* visible= */ false,
                    /* icon= */ 0,
                    /* contentDescription= */ "No ethernet",
                )
            )
            verifyNoMoreInteractions(statusBarIconController)
        }

    @Test
    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    @DisableFlags(StatusBarSignalPolicyRefactorEthernet.FLAG_NAME)
    fun ethernetIconViaInteractor_refactorFlagDisabled_iconNotUpdated() =
        kosmos.runTest {
            underTest.start()
            clearInvocations(statusBarIconController)

            connectivityRepository.fake.setEthernetConnected(default = true, validated = true)
            verifyNoMoreInteractions(statusBarIconController)

            connectivityRepository.fake.setEthernetConnected(default = false, validated = false)
            verifyNoMoreInteractions(statusBarIconController)

            connectivityRepository.fake.setEthernetConnected(default = true, validated = false)
            verifyNoMoreInteractions(statusBarIconController)
        }

    @Test
    @EnableFlags(
        FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR,
        StatusBarSignalPolicyRefactorEthernet.FLAG_NAME,
    )
    fun ethernetIconViaInteractor_refactorFlagEnabled_iconUpdated() =
        kosmos.runTest {
            underTest.start()
            clearInvocations(statusBarIconController)

            connectivityRepository.fake.setEthernetConnected(default = true, validated = true)
            verify(statusBarIconController).setIconVisibility(slotEthernet, true)

            connectivityRepository.fake.setEthernetConnected(default = false, validated = false)
            verify(statusBarIconController).setIconVisibility(slotEthernet, false)

            clearInvocations(statusBarIconController)

            connectivityRepository.fake.setEthernetConnected(default = true, validated = false)
            verify(statusBarIconController).setIconVisibility(slotEthernet, true)
        }
}
+0 −8
Original line number Diff line number Diff line
@@ -676,14 +676,6 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
        }
    }

    protected void verifyLastCallStrength(int icon) {
        ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
        verify(mCallbackHandler, Mockito.atLeastOnce()).setCallIndicator(
                iconArg.capture(),
                anyInt());
        assertEquals("Call strength, in status bar", icon, (int) iconArg.getValue().icon);
    }

    protected void assertNetworkNameEquals(String expected) {
        assertEquals("Network name", expected, mMobileSignalController.getState().networkName);
    }
+20 −19
Original line number Diff line number Diff line
@@ -19,39 +19,40 @@ package com.android.systemui.statusbar.pipeline.ethernet.domain
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.settingslib.AccessibilityContentDescriptions
import com.android.systemui.res.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.res.R
import com.android.systemui.statusbar.pipeline.shared.data.repository.connectivityRepository
import com.android.systemui.statusbar.pipeline.shared.data.repository.fake
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith

@SmallTest
@RunWith(AndroidJUnit4::class)
class EthernetInteractorTest : SysuiTestCase() {
    private val connectivityRepository = FakeConnectivityRepository()
    private val underTest = EthernetInteractor(connectivityRepository)

    private val testScope = TestScope()
    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
    private val Kosmos.underTest by Kosmos.Fixture { ethernetInteractor }

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

            connectivityRepository.setEthernetConnected(default = true, validated = true)
            connectivityRepository.fake.setEthernetConnected(default = true, validated = true)

            val expected =
                Icon.Resource(
                    R.drawable.stat_sys_ethernet_fully,
                    ContentDescription.Resource(
                        AccessibilityContentDescriptions.ETHERNET_CONNECTION_VALUES[1]
                    )
                    ),
                )

            assertThat(latest).isEqualTo(expected)
@@ -59,17 +60,17 @@ class EthernetInteractorTest : SysuiTestCase() {

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

            connectivityRepository.setEthernetConnected(default = true, validated = false)
            connectivityRepository.fake.setEthernetConnected(default = true, validated = false)

            val expected =
                Icon.Resource(
                    R.drawable.stat_sys_ethernet,
                    ContentDescription.Resource(
                        AccessibilityContentDescriptions.ETHERNET_CONNECTION_VALUES[0]
                    )
                    ),
                )

            assertThat(latest).isEqualTo(expected)
@@ -77,20 +78,20 @@ class EthernetInteractorTest : SysuiTestCase() {

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

            connectivityRepository.setEthernetConnected(default = false, validated = true)
            connectivityRepository.fake.setEthernetConnected(default = false, validated = true)

            assertThat(latest).isNull()
        }

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

            connectivityRepository.setEthernetConnected(default = false, validated = false)
            connectivityRepository.fake.setEthernetConnected(default = false, validated = false)

            assertThat(latest).isNull()
        }
+3 −6
Original line number Diff line number Diff line
@@ -24,13 +24,9 @@ import android.content.Context
 * be a [reference][ContentDescription.Resource] to a resource.
 */
sealed class ContentDescription {
    data class Loaded(
        val description: String?,
    ) : ContentDescription()
    data class Loaded(val description: String?) : ContentDescription()

    data class Resource(
        @StringRes val res: Int,
    ) : ContentDescription()
    data class Resource(@StringRes val res: Int) : ContentDescription()

    companion object {
        /**
@@ -39,6 +35,7 @@ sealed class ContentDescription {
         * Prefer [com.android.systemui.common.ui.binder.ContentDescriptionViewBinder.bind] over
         * this method. This should only be used for testing or concatenation purposes.
         */
        @JvmStatic
        fun ContentDescription?.loadContentDescription(context: Context): String? {
            return when (this) {
                null -> null
Loading