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

Commit 0ad3c05c authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[SB Refactor] Implement the wifi content description in the new

pipeline.

This is a re-implementation of the logic in:
 - WifiSignalController#notifyListenersForNonCarrierWifi
 - SignalController#getContentDescription

Bug: 238425913
Test: WifiViewModelTest
Test: manual: Logged content description and verified it matched old
system in variety of circumstances (full wifi, not full wifi, full wifi
that isn't connected yet, wifi off)

Change-Id: I4a730d117f497f4c608c73983122bc50f7065839
parent f1f573f9
Loading
Loading
Loading
Loading
+42 −4
Original line number Diff line number Diff line
@@ -16,8 +16,15 @@

package com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel

import android.content.Context
import android.graphics.Color
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.annotation.VisibleForTesting
import com.android.settingslib.AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH
import com.android.settingslib.AccessibilityContentDescriptions.WIFI_NO_CONNECTION
import com.android.systemui.R
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.statusbar.connectivity.WifiIcons.WIFI_FULL_ICONS
import com.android.systemui.statusbar.connectivity.WifiIcons.WIFI_NO_INTERNET_ICONS
@@ -41,6 +48,7 @@ import kotlinx.coroutines.flow.map
class WifiViewModel @Inject constructor(
    statusBarPipelineFlags: StatusBarPipelineFlags,
    private val constants: WifiConstants,
    private val context: Context,
    private val logger: ConnectivityPipelineLogger,
    private val interactor: WifiInteractor,
) {
@@ -61,19 +69,43 @@ class WifiViewModel @Inject constructor(
        }
    }

    /** The content description for the wifi icon. */
    private val contentDescription: Flow<ContentDescription?> = interactor.wifiNetwork.map {
        when (it) {
            is WifiNetworkModel.CarrierMerged -> null
            is WifiNetworkModel.Inactive ->
                ContentDescription.Loaded(
                    "${context.getString(WIFI_NO_CONNECTION)},${context.getString(NO_INTERNET)}"
                )
            is WifiNetworkModel.Active ->
                when (it.level) {
                    null -> null
                    else -> {
                        val levelDesc = context.getString(WIFI_CONNECTION_STRENGTH[it.level])
                        when {
                            it.isValidated -> ContentDescription.Loaded(levelDesc)
                            else -> ContentDescription.Loaded(
                                "$levelDesc,${context.getString(NO_INTERNET)}"
                            )
                        }
                    }
                }
        }
    }

    /**
     * The wifi icon that should be displayed. Null if we shouldn't display any icon.
     */
    val wifiIcon: Flow<Icon?> = combine(
            interactor.isForceHidden,
            iconResId
        ) { isForceHidden, iconResId ->
            iconResId,
            contentDescription,
        ) { isForceHidden, iconResId, contentDescription ->
            when {
                isForceHidden ||
                    iconResId == null ||
                    iconResId <= 0 -> null
                // TODO(b/238425913): Implement the content description.
                else -> Icon.Resource(iconResId, /* contentDescription= */ null)
                else -> Icon.Resource(iconResId, contentDescription)
            }
        }

@@ -95,4 +127,10 @@ class WifiViewModel @Inject constructor(
    } else {
        flowOf(Color.CYAN)
    }

    companion object {
        @StringRes
        @VisibleForTesting
        internal val NO_INTERNET = R.string.data_connection_no_internet
    }
}
+30 −3
Original line number Diff line number Diff line
@@ -17,7 +17,10 @@
package com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel

import androidx.test.filters.SmallTest
import com.android.settingslib.AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH
import com.android.settingslib.AccessibilityContentDescriptions.WIFI_NO_CONNECTION
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.statusbar.connectivity.WifiIcons.WIFI_FULL_ICONS
import com.android.systemui.statusbar.connectivity.WifiIcons.WIFI_NO_INTERNET_ICONS
@@ -31,6 +34,7 @@ import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor
import com.android.systemui.statusbar.pipeline.wifi.shared.WifiConstants
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel.Companion.NO_INTERNET
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -67,6 +71,7 @@ class WifiViewModelTest : SysuiTestCase() {
        underTest = WifiViewModel(
            statusBarPipelineFlags,
            constants,
            context,
            logger,
            interactor
        )
@@ -115,7 +120,12 @@ class WifiViewModelTest : SysuiTestCase() {
                .launchIn(this)

        assertThat(latest).isInstanceOf(Icon.Resource::class.java)
        assertThat((latest as Icon.Resource).res).isEqualTo(WIFI_NO_NETWORK)
        val icon = latest as Icon.Resource
        assertThat(icon.res).isEqualTo(WIFI_NO_NETWORK)
        assertThat(icon.contentDescription?.getAsString())
            .contains(context.getString(WIFI_NO_CONNECTION))
        assertThat(icon.contentDescription?.getAsString())
            .contains(context.getString(NO_INTERNET))

        job.cancel()
    }
@@ -169,7 +179,12 @@ class WifiViewModelTest : SysuiTestCase() {
            .launchIn(this)

        assertThat(latest).isInstanceOf(Icon.Resource::class.java)
        assertThat((latest as Icon.Resource).res).isEqualTo(WIFI_FULL_ICONS[level])
        val icon = latest as Icon.Resource
        assertThat(icon.res).isEqualTo(WIFI_FULL_ICONS[level])
        assertThat(icon.contentDescription?.getAsString())
            .contains(context.getString(WIFI_CONNECTION_STRENGTH[level]))
        assertThat(icon.contentDescription?.getAsString())
            .doesNotContain(context.getString(NO_INTERNET))

        job.cancel()
    }
@@ -193,7 +208,12 @@ class WifiViewModelTest : SysuiTestCase() {
            .launchIn(this)

        assertThat(latest).isInstanceOf(Icon.Resource::class.java)
        assertThat((latest as Icon.Resource).res).isEqualTo(WIFI_NO_INTERNET_ICONS[level])
        val icon = latest as Icon.Resource
        assertThat(icon.res).isEqualTo(WIFI_NO_INTERNET_ICONS[level])
        assertThat(icon.contentDescription?.getAsString())
            .contains(context.getString(WIFI_CONNECTION_STRENGTH[level]))
        assertThat(icon.contentDescription?.getAsString())
            .contains(context.getString(NO_INTERNET))

        job.cancel()
    }
@@ -261,6 +281,13 @@ class WifiViewModelTest : SysuiTestCase() {
        job.cancel()
    }

    private fun ContentDescription.getAsString(): String? {
        return when (this) {
            is ContentDescription.Loaded -> this.description
            is ContentDescription.Resource -> context.getString(this.res)
        }
    }

    companion object {
        private const val NETWORK_ID = 2
        private val ACTIVE_VALID_WIFI_NETWORK = WifiNetworkModel.Active(NETWORK_ID, ssid = "AB")