[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
This commit is contained in:
Caitlin Shkuratov
2022-08-30 14:52:25 +00:00
parent f1f573f9b2
commit 0ad3c05cbc
2 changed files with 72 additions and 7 deletions

View File

@@ -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
}
}

View File

@@ -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")