Loading packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModel.kt +42 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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, ) { Loading @@ -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) } } Loading @@ -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 } } packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt +30 −3 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -67,6 +71,7 @@ class WifiViewModelTest : SysuiTestCase() { underTest = WifiViewModel( statusBarPipelineFlags, constants, context, logger, interactor ) Loading Loading @@ -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() } Loading Loading @@ -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() } Loading @@ -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() } Loading Loading @@ -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") Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModel.kt +42 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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, ) { Loading @@ -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) } } Loading @@ -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 } }
packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt +30 −3 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -67,6 +71,7 @@ class WifiViewModelTest : SysuiTestCase() { underTest = WifiViewModel( statusBarPipelineFlags, constants, context, logger, interactor ) Loading Loading @@ -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() } Loading Loading @@ -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() } Loading @@ -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() } Loading Loading @@ -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") Loading