Merge "[SB Refactor] Implement the wifi content description in the new pipeline." into tm-qpr-dev

This commit is contained in:
Caitlin Shkuratov
2022-09-09 13:50:35 +00:00
committed by Android (Google) Code Review
2 changed files with 72 additions and 7 deletions

View File

@@ -16,8 +16,15 @@
package com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel package com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel
import android.content.Context
import android.graphics.Color import android.graphics.Color
import androidx.annotation.DrawableRes 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.common.shared.model.Icon
import com.android.systemui.statusbar.connectivity.WifiIcons.WIFI_FULL_ICONS import com.android.systemui.statusbar.connectivity.WifiIcons.WIFI_FULL_ICONS
import com.android.systemui.statusbar.connectivity.WifiIcons.WIFI_NO_INTERNET_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( class WifiViewModel @Inject constructor(
statusBarPipelineFlags: StatusBarPipelineFlags, statusBarPipelineFlags: StatusBarPipelineFlags,
private val constants: WifiConstants, private val constants: WifiConstants,
private val context: Context,
private val logger: ConnectivityPipelineLogger, private val logger: ConnectivityPipelineLogger,
private val interactor: WifiInteractor, 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. * The wifi icon that should be displayed. Null if we shouldn't display any icon.
*/ */
val wifiIcon: Flow<Icon?> = combine( val wifiIcon: Flow<Icon?> = combine(
interactor.isForceHidden, interactor.isForceHidden,
iconResId iconResId,
) { isForceHidden, iconResId -> contentDescription,
) { isForceHidden, iconResId, contentDescription ->
when { when {
isForceHidden || isForceHidden ||
iconResId == null || iconResId == null ||
iconResId <= 0 -> null iconResId <= 0 -> null
// TODO(b/238425913): Implement the content description. else -> Icon.Resource(iconResId, contentDescription)
else -> Icon.Resource(iconResId, /* contentDescription= */ null)
} }
} }
@@ -95,4 +127,10 @@ class WifiViewModel @Inject constructor(
} else { } else {
flowOf(Color.CYAN) 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 package com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel
import androidx.test.filters.SmallTest 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.SysuiTestCase
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon 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_FULL_ICONS
import com.android.systemui.statusbar.connectivity.WifiIcons.WIFI_NO_INTERNET_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.data.repository.FakeWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor 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.shared.WifiConstants
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel.Companion.NO_INTERNET
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -67,6 +71,7 @@ class WifiViewModelTest : SysuiTestCase() {
underTest = WifiViewModel( underTest = WifiViewModel(
statusBarPipelineFlags, statusBarPipelineFlags,
constants, constants,
context,
logger, logger,
interactor interactor
) )
@@ -115,7 +120,12 @@ class WifiViewModelTest : SysuiTestCase() {
.launchIn(this) .launchIn(this)
assertThat(latest).isInstanceOf(Icon.Resource::class.java) 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() job.cancel()
} }
@@ -169,7 +179,12 @@ class WifiViewModelTest : SysuiTestCase() {
.launchIn(this) .launchIn(this)
assertThat(latest).isInstanceOf(Icon.Resource::class.java) 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() job.cancel()
} }
@@ -193,7 +208,12 @@ class WifiViewModelTest : SysuiTestCase() {
.launchIn(this) .launchIn(this)
assertThat(latest).isInstanceOf(Icon.Resource::class.java) 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() job.cancel()
} }
@@ -261,6 +281,13 @@ class WifiViewModelTest : SysuiTestCase() {
job.cancel() job.cancel()
} }
private fun ContentDescription.getAsString(): String? {
return when (this) {
is ContentDescription.Loaded -> this.description
is ContentDescription.Resource -> context.getString(this.res)
}
}
companion object { companion object {
private const val NETWORK_ID = 2 private const val NETWORK_ID = 2
private val ACTIVE_VALID_WIFI_NETWORK = WifiNetworkModel.Active(NETWORK_ID, ssid = "AB") private val ACTIVE_VALID_WIFI_NETWORK = WifiNetworkModel.Active(NETWORK_ID, ssid = "AB")