[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:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user