diff options
2 files changed, 72 insertions, 7 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModel.kt index 3eff0bd63f1a..3c243ac90831 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModel.kt @@ -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 + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt index 6c6d9e1e2311..43103a065e68 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt @@ -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") |