Merge changes from topic "wifi-data-activity-model" into tm-qpr-dev
* changes: [Sb refactor] Move WifiActivityModel to shared [Status bar refactor] Add Roaming to the mobile pipeline
This commit is contained in:
@@ -41,6 +41,7 @@ import com.android.systemui.statusbar.pipeline.mobile.data.model.DataConnectionS
|
|||||||
data class MobileConnectionModel(
|
data class MobileConnectionModel(
|
||||||
/** From [ServiceStateListener.onServiceStateChanged] */
|
/** From [ServiceStateListener.onServiceStateChanged] */
|
||||||
val isEmergencyOnly: Boolean = false,
|
val isEmergencyOnly: Boolean = false,
|
||||||
|
val isRoaming: Boolean = false,
|
||||||
|
|
||||||
/** From [SignalStrengthsListener.onSignalStrengthsChanged] */
|
/** From [SignalStrengthsListener.onSignalStrengthsChanged] */
|
||||||
val isGsm: Boolean = false,
|
val isGsm: Boolean = false,
|
||||||
|
|||||||
@@ -50,4 +50,12 @@ interface MobileConnectionRepository {
|
|||||||
* [SubscriptionManager.getDefaultDataSubscriptionId]
|
* [SubscriptionManager.getDefaultDataSubscriptionId]
|
||||||
*/
|
*/
|
||||||
val isDefaultDataSubscription: StateFlow<Boolean>
|
val isDefaultDataSubscription: StateFlow<Boolean>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See [TelephonyManager.getCdmaEnhancedRoamingIndicatorDisplayNumber]. This bit only matters if
|
||||||
|
* the connection type is CDMA.
|
||||||
|
*
|
||||||
|
* True if the Enhanced Roaming Indicator (ERI) display number is not [TelephonyManager.ERI_OFF]
|
||||||
|
*/
|
||||||
|
val cdmaRoaming: StateFlow<Boolean>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -186,6 +186,7 @@ constructor(
|
|||||||
connection.dataEnabled.value = true
|
connection.dataEnabled.value = true
|
||||||
connection.isDefaultDataSubscription.value = state.dataType != null
|
connection.isDefaultDataSubscription.value = state.dataType != null
|
||||||
|
|
||||||
|
connection.cdmaRoaming.value = state.roaming
|
||||||
connection.connectionInfo.value = state.toMobileConnectionModel()
|
connection.connectionInfo.value = state.toMobileConnectionModel()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,6 +230,7 @@ constructor(
|
|||||||
private fun Mobile.toMobileConnectionModel(): MobileConnectionModel {
|
private fun Mobile.toMobileConnectionModel(): MobileConnectionModel {
|
||||||
return MobileConnectionModel(
|
return MobileConnectionModel(
|
||||||
isEmergencyOnly = false, // TODO(b/261029387): not yet supported
|
isEmergencyOnly = false, // TODO(b/261029387): not yet supported
|
||||||
|
isRoaming = roaming,
|
||||||
isGsm = false, // TODO(b/261029387): not yet supported
|
isGsm = false, // TODO(b/261029387): not yet supported
|
||||||
cdmaLevel = level ?: 0,
|
cdmaLevel = level ?: 0,
|
||||||
primaryLevel = level ?: 0,
|
primaryLevel = level ?: 0,
|
||||||
@@ -260,4 +262,6 @@ class DemoMobileConnectionRepository(override val subId: Int) : MobileConnection
|
|||||||
override val dataEnabled = MutableStateFlow(true)
|
override val dataEnabled = MutableStateFlow(true)
|
||||||
|
|
||||||
override val isDefaultDataSubscription = MutableStateFlow(true)
|
override val isDefaultDataSubscription = MutableStateFlow(true)
|
||||||
|
|
||||||
|
override val cdmaRoaming = MutableStateFlow(false)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ constructor(
|
|||||||
val inflateStrength = getString("inflate")?.toBoolean()
|
val inflateStrength = getString("inflate")?.toBoolean()
|
||||||
val activity = getString("activity")?.toActivity()
|
val activity = getString("activity")?.toActivity()
|
||||||
val carrierNetworkChange = getString("carriernetworkchange") == "show"
|
val carrierNetworkChange = getString("carriernetworkchange") == "show"
|
||||||
|
val roaming = getString("roam") == "show"
|
||||||
|
|
||||||
return Mobile(
|
return Mobile(
|
||||||
level = level,
|
level = level,
|
||||||
@@ -107,6 +108,7 @@ constructor(
|
|||||||
inflateStrength = inflateStrength,
|
inflateStrength = inflateStrength,
|
||||||
activity = activity,
|
activity = activity,
|
||||||
carrierNetworkChange = carrierNetworkChange,
|
carrierNetworkChange = carrierNetworkChange,
|
||||||
|
roaming = roaming,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ sealed interface FakeNetworkEventModel {
|
|||||||
val inflateStrength: Boolean?,
|
val inflateStrength: Boolean?,
|
||||||
@DataActivityType val activity: Int?,
|
@DataActivityType val activity: Int?,
|
||||||
val carrierNetworkChange: Boolean,
|
val carrierNetworkChange: Boolean,
|
||||||
|
val roaming: Boolean,
|
||||||
) : FakeNetworkEventModel
|
) : FakeNetworkEventModel
|
||||||
|
|
||||||
data class MobileDisabled(
|
data class MobileDisabled(
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import android.telephony.TelephonyCallback
|
|||||||
import android.telephony.TelephonyDisplayInfo
|
import android.telephony.TelephonyDisplayInfo
|
||||||
import android.telephony.TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE
|
import android.telephony.TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE
|
||||||
import android.telephony.TelephonyManager
|
import android.telephony.TelephonyManager
|
||||||
|
import android.telephony.TelephonyManager.ERI_OFF
|
||||||
import android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN
|
import android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN
|
||||||
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
|
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
|
||||||
import com.android.systemui.dagger.qualifiers.Application
|
import com.android.systemui.dagger.qualifiers.Application
|
||||||
@@ -95,7 +96,11 @@ class MobileConnectionRepositoryImpl(
|
|||||||
TelephonyCallback.CarrierNetworkListener,
|
TelephonyCallback.CarrierNetworkListener,
|
||||||
TelephonyCallback.DisplayInfoListener {
|
TelephonyCallback.DisplayInfoListener {
|
||||||
override fun onServiceStateChanged(serviceState: ServiceState) {
|
override fun onServiceStateChanged(serviceState: ServiceState) {
|
||||||
state = state.copy(isEmergencyOnly = serviceState.isEmergencyOnly)
|
state =
|
||||||
|
state.copy(
|
||||||
|
isEmergencyOnly = serviceState.isEmergencyOnly,
|
||||||
|
isRoaming = serviceState.roaming,
|
||||||
|
)
|
||||||
trySend(state)
|
trySend(state)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,6 +213,11 @@ class MobileConnectionRepositoryImpl(
|
|||||||
globalMobileDataSettingChangedEvent,
|
globalMobileDataSettingChangedEvent,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
override val cdmaRoaming: StateFlow<Boolean> =
|
||||||
|
telephonyPollingEvent
|
||||||
|
.mapLatest { telephonyManager.cdmaEnhancedRoamingIndicatorDisplayNumber != ERI_OFF }
|
||||||
|
.stateIn(scope, SharingStarted.WhileSubscribed(), false)
|
||||||
|
|
||||||
override val dataEnabled: StateFlow<Boolean> =
|
override val dataEnabled: StateFlow<Boolean> =
|
||||||
telephonyPollingEvent
|
telephonyPollingEvent
|
||||||
.mapLatest { dataConnectionAllowed() }
|
.mapLatest { dataConnectionAllowed() }
|
||||||
|
|||||||
@@ -54,6 +54,13 @@ interface MobileIconInteractor {
|
|||||||
/** True if this line of service is emergency-only */
|
/** True if this line of service is emergency-only */
|
||||||
val isEmergencyOnly: StateFlow<Boolean>
|
val isEmergencyOnly: StateFlow<Boolean>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* True if this connection is considered roaming. The roaming bit can come from [ServiceState],
|
||||||
|
* or directly from the telephony manager's CDMA ERI number value. Note that we don't consider a
|
||||||
|
* connection to be roaming while carrier network change is active
|
||||||
|
*/
|
||||||
|
val isRoaming: StateFlow<Boolean>
|
||||||
|
|
||||||
/** Int describing the connection strength. 0-4 OR 1-5. See [numberOfLevels] */
|
/** Int describing the connection strength. 0-4 OR 1-5. See [numberOfLevels] */
|
||||||
val level: StateFlow<Int>
|
val level: StateFlow<Int>
|
||||||
|
|
||||||
@@ -95,6 +102,18 @@ class MobileIconInteractorImpl(
|
|||||||
.mapLatest { it.isEmergencyOnly }
|
.mapLatest { it.isEmergencyOnly }
|
||||||
.stateIn(scope, SharingStarted.WhileSubscribed(), false)
|
.stateIn(scope, SharingStarted.WhileSubscribed(), false)
|
||||||
|
|
||||||
|
override val isRoaming: StateFlow<Boolean> =
|
||||||
|
combine(connectionInfo, connectionRepository.cdmaRoaming) { connection, cdmaRoaming ->
|
||||||
|
if (connection.carrierNetworkChangeActive) {
|
||||||
|
false
|
||||||
|
} else if (connection.isGsm) {
|
||||||
|
connection.isRoaming
|
||||||
|
} else {
|
||||||
|
cdmaRoaming
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.stateIn(scope, SharingStarted.WhileSubscribed(), false)
|
||||||
|
|
||||||
override val level: StateFlow<Int> =
|
override val level: StateFlow<Int> =
|
||||||
connectionInfo
|
connectionInfo
|
||||||
.mapLatest { connection ->
|
.mapLatest { connection ->
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import android.view.View.GONE
|
|||||||
import android.view.View.VISIBLE
|
import android.view.View.VISIBLE
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
|
import android.widget.Space
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.lifecycle.Lifecycle
|
import androidx.lifecycle.Lifecycle
|
||||||
import androidx.lifecycle.repeatOnLifecycle
|
import androidx.lifecycle.repeatOnLifecycle
|
||||||
@@ -29,7 +30,6 @@ import com.android.systemui.R
|
|||||||
import com.android.systemui.common.ui.binder.IconViewBinder
|
import com.android.systemui.common.ui.binder.IconViewBinder
|
||||||
import com.android.systemui.lifecycle.repeatWhenAttached
|
import com.android.systemui.lifecycle.repeatWhenAttached
|
||||||
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconViewModel
|
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconViewModel
|
||||||
import kotlinx.coroutines.flow.collect
|
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
@@ -43,6 +43,8 @@ object MobileIconBinder {
|
|||||||
val networkTypeView = view.requireViewById<ImageView>(R.id.mobile_type)
|
val networkTypeView = view.requireViewById<ImageView>(R.id.mobile_type)
|
||||||
val iconView = view.requireViewById<ImageView>(R.id.mobile_signal)
|
val iconView = view.requireViewById<ImageView>(R.id.mobile_signal)
|
||||||
val mobileDrawable = SignalDrawable(view.context).also { iconView.setImageDrawable(it) }
|
val mobileDrawable = SignalDrawable(view.context).also { iconView.setImageDrawable(it) }
|
||||||
|
val roamingView = view.requireViewById<ImageView>(R.id.mobile_roaming)
|
||||||
|
val roamingSpace = view.requireViewById<Space>(R.id.mobile_roaming_space)
|
||||||
|
|
||||||
view.isVisible = true
|
view.isVisible = true
|
||||||
iconView.isVisible = true
|
iconView.isVisible = true
|
||||||
@@ -64,12 +66,21 @@ object MobileIconBinder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the roaming indicator
|
||||||
|
launch {
|
||||||
|
viewModel.roaming.distinctUntilChanged().collect { isRoaming ->
|
||||||
|
roamingView.isVisible = isRoaming
|
||||||
|
roamingSpace.isVisible = isRoaming
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Set the tint
|
// Set the tint
|
||||||
launch {
|
launch {
|
||||||
viewModel.tint.collect { tint ->
|
viewModel.tint.collect { tint ->
|
||||||
val tintList = ColorStateList.valueOf(tint)
|
val tintList = ColorStateList.valueOf(tint)
|
||||||
iconView.imageTintList = tintList
|
iconView.imageTintList = tintList
|
||||||
networkTypeView.imageTintList = tintList
|
networkTypeView.imageTintList = tintList
|
||||||
|
roamingView.imageTintList = tintList
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,5 +87,7 @@ constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val roaming: Flow<Boolean> = iconInteractor.isRoaming
|
||||||
|
|
||||||
val tint: Flow<Int> = flowOf(Color.CYAN)
|
val tint: Flow<Int> = flowOf(Color.CYAN)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,20 +14,19 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.android.systemui.statusbar.pipeline.wifi.shared.model
|
package com.android.systemui.statusbar.pipeline.shared.data.model
|
||||||
|
|
||||||
import com.android.systemui.log.table.Diffable
|
import com.android.systemui.log.table.Diffable
|
||||||
import com.android.systemui.log.table.TableRowLogger
|
import com.android.systemui.log.table.TableRowLogger
|
||||||
|
|
||||||
/** Provides information on the current wifi activity. */
|
/** Provides information about the current data activity direction */
|
||||||
data class WifiActivityModel(
|
data class DataActivityModel(
|
||||||
/** True if the wifi has activity in (download). */
|
/** True if the connection has activity in (download). */
|
||||||
val hasActivityIn: Boolean,
|
val hasActivityIn: Boolean,
|
||||||
/** True if the wifi has activity out (upload). */
|
/** True if the connection has activity out (upload). */
|
||||||
val hasActivityOut: Boolean,
|
val hasActivityOut: Boolean,
|
||||||
) : Diffable<WifiActivityModel> {
|
) : Diffable<DataActivityModel> {
|
||||||
|
override fun logDiffs(prevVal: DataActivityModel, row: TableRowLogger) {
|
||||||
override fun logDiffs(prevVal: WifiActivityModel, row: TableRowLogger) {
|
|
||||||
if (prevVal.hasActivityIn != hasActivityIn) {
|
if (prevVal.hasActivityIn != hasActivityIn) {
|
||||||
row.logChange(COL_ACTIVITY_IN, hasActivityIn)
|
row.logChange(COL_ACTIVITY_IN, hasActivityIn)
|
||||||
}
|
}
|
||||||
@@ -42,6 +41,6 @@ data class WifiActivityModel(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const val ACTIVITY_PREFIX = "wifiActivity"
|
const val ACTIVITY_PREFIX = "dataActivity"
|
||||||
private const val COL_ACTIVITY_IN = "in"
|
private const val COL_ACTIVITY_IN = "in"
|
||||||
private const val COL_ACTIVITY_OUT = "out"
|
private const val COL_ACTIVITY_OUT = "out"
|
||||||
@@ -42,9 +42,8 @@ import com.android.systemui.statusbar.pipeline.dagger.WifiTableLog
|
|||||||
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
|
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
|
||||||
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.SB_LOGGING_TAG
|
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.SB_LOGGING_TAG
|
||||||
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.logInputChange
|
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.logInputChange
|
||||||
|
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
|
import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.shared.model.ACTIVITY_PREFIX
|
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiActivityModel
|
|
||||||
import java.util.concurrent.Executor
|
import java.util.concurrent.Executor
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@@ -74,7 +73,7 @@ interface WifiRepository {
|
|||||||
val wifiNetwork: StateFlow<WifiNetworkModel>
|
val wifiNetwork: StateFlow<WifiNetworkModel>
|
||||||
|
|
||||||
/** Observable for the current wifi network activity. */
|
/** Observable for the current wifi network activity. */
|
||||||
val wifiActivity: StateFlow<WifiActivityModel>
|
val wifiActivity: StateFlow<DataActivityModel>
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Real implementation of [WifiRepository]. */
|
/** Real implementation of [WifiRepository]. */
|
||||||
@@ -230,7 +229,7 @@ class WifiRepositoryImpl @Inject constructor(
|
|||||||
initialValue = WIFI_NETWORK_DEFAULT
|
initialValue = WIFI_NETWORK_DEFAULT
|
||||||
)
|
)
|
||||||
|
|
||||||
override val wifiActivity: StateFlow<WifiActivityModel> =
|
override val wifiActivity: StateFlow<DataActivityModel> =
|
||||||
if (wifiManager == null) {
|
if (wifiManager == null) {
|
||||||
Log.w(SB_LOGGING_TAG, "Null WifiManager; skipping activity callback")
|
Log.w(SB_LOGGING_TAG, "Null WifiManager; skipping activity callback")
|
||||||
flowOf(ACTIVITY_DEFAULT)
|
flowOf(ACTIVITY_DEFAULT)
|
||||||
@@ -238,7 +237,7 @@ class WifiRepositoryImpl @Inject constructor(
|
|||||||
conflatedCallbackFlow {
|
conflatedCallbackFlow {
|
||||||
val callback = TrafficStateCallback { state ->
|
val callback = TrafficStateCallback { state ->
|
||||||
logger.logInputChange("onTrafficStateChange", prettyPrintActivity(state))
|
logger.logInputChange("onTrafficStateChange", prettyPrintActivity(state))
|
||||||
trySend(trafficStateToWifiActivityModel(state))
|
trySend(trafficStateToDataActivityModel(state))
|
||||||
}
|
}
|
||||||
wifiManager.registerTrafficStateCallback(mainExecutor, callback)
|
wifiManager.registerTrafficStateCallback(mainExecutor, callback)
|
||||||
awaitClose { wifiManager.unregisterTrafficStateCallback(callback) }
|
awaitClose { wifiManager.unregisterTrafficStateCallback(callback) }
|
||||||
@@ -256,7 +255,9 @@ class WifiRepositoryImpl @Inject constructor(
|
|||||||
)
|
)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val ACTIVITY_DEFAULT = WifiActivityModel(hasActivityIn = false, hasActivityOut = false)
|
private const val ACTIVITY_PREFIX = "wifiActivity"
|
||||||
|
|
||||||
|
val ACTIVITY_DEFAULT = DataActivityModel(hasActivityIn = false, hasActivityOut = false)
|
||||||
// Start out with no known wifi network.
|
// Start out with no known wifi network.
|
||||||
// Note: [WifiStatusTracker] (the old implementation of connectivity logic) does do an
|
// Note: [WifiStatusTracker] (the old implementation of connectivity logic) does do an
|
||||||
// initial fetch to get a starting wifi network. But, it uses a deprecated API
|
// initial fetch to get a starting wifi network. But, it uses a deprecated API
|
||||||
@@ -265,8 +266,8 @@ class WifiRepositoryImpl @Inject constructor(
|
|||||||
// NetworkCallback inside [wifiNetwork] for our wifi network information.
|
// NetworkCallback inside [wifiNetwork] for our wifi network information.
|
||||||
val WIFI_NETWORK_DEFAULT = WifiNetworkModel.Inactive
|
val WIFI_NETWORK_DEFAULT = WifiNetworkModel.Inactive
|
||||||
|
|
||||||
private fun trafficStateToWifiActivityModel(state: Int): WifiActivityModel {
|
private fun trafficStateToDataActivityModel(state: Int): DataActivityModel {
|
||||||
return WifiActivityModel(
|
return DataActivityModel(
|
||||||
hasActivityIn = state == TrafficStateCallback.DATA_ACTIVITY_IN ||
|
hasActivityIn = state == TrafficStateCallback.DATA_ACTIVITY_IN ||
|
||||||
state == TrafficStateCallback.DATA_ACTIVITY_INOUT,
|
state == TrafficStateCallback.DATA_ACTIVITY_INOUT,
|
||||||
hasActivityOut = state == TrafficStateCallback.DATA_ACTIVITY_OUT ||
|
hasActivityOut = state == TrafficStateCallback.DATA_ACTIVITY_OUT ||
|
||||||
|
|||||||
@@ -19,10 +19,10 @@ package com.android.systemui.statusbar.pipeline.wifi.domain.interactor
|
|||||||
import android.net.wifi.WifiManager
|
import android.net.wifi.WifiManager
|
||||||
import com.android.systemui.dagger.SysUISingleton
|
import com.android.systemui.dagger.SysUISingleton
|
||||||
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
|
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
|
||||||
|
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
|
||||||
import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository
|
import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
|
import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository
|
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiActivityModel
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
@@ -50,8 +50,8 @@ interface WifiInteractor {
|
|||||||
/** Our current wifi network. See [WifiNetworkModel]. */
|
/** Our current wifi network. See [WifiNetworkModel]. */
|
||||||
val wifiNetwork: Flow<WifiNetworkModel>
|
val wifiNetwork: Flow<WifiNetworkModel>
|
||||||
|
|
||||||
/** Our current wifi activity. See [WifiActivityModel]. */
|
/** Our current wifi activity. See [DataActivityModel]. */
|
||||||
val activity: StateFlow<WifiActivityModel>
|
val activity: StateFlow<DataActivityModel>
|
||||||
|
|
||||||
/** True if we're configured to force-hide the wifi icon and false otherwise. */
|
/** True if we're configured to force-hide the wifi icon and false otherwise. */
|
||||||
val isForceHidden: Flow<Boolean>
|
val isForceHidden: Flow<Boolean>
|
||||||
@@ -82,7 +82,7 @@ class WifiInteractorImpl @Inject constructor(
|
|||||||
|
|
||||||
override val wifiNetwork: Flow<WifiNetworkModel> = wifiRepository.wifiNetwork
|
override val wifiNetwork: Flow<WifiNetworkModel> = wifiRepository.wifiNetwork
|
||||||
|
|
||||||
override val activity: StateFlow<WifiActivityModel> = wifiRepository.wifiActivity
|
override val activity: StateFlow<DataActivityModel> = wifiRepository.wifiActivity
|
||||||
|
|
||||||
override val isForceHidden: Flow<Boolean> = connectivityRepository.forceHiddenSlots.map {
|
override val isForceHidden: Flow<Boolean> = connectivityRepository.forceHiddenSlots.map {
|
||||||
it.contains(ConnectivitySlot.WIFI)
|
it.contains(ConnectivitySlot.WIFI)
|
||||||
|
|||||||
@@ -37,10 +37,10 @@ import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneMod
|
|||||||
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
|
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
|
||||||
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
|
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
|
||||||
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.logOutputChange
|
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.logOutputChange
|
||||||
|
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
|
import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
|
||||||
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.shared.model.WifiActivityModel
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
@@ -147,7 +147,7 @@ constructor(
|
|||||||
)
|
)
|
||||||
|
|
||||||
/** The wifi activity status. Null if we shouldn't display the activity status. */
|
/** The wifi activity status. Null if we shouldn't display the activity status. */
|
||||||
private val activity: Flow<WifiActivityModel?> =
|
private val activity: Flow<DataActivityModel?> =
|
||||||
if (!wifiConstants.shouldShowActivityConfig) {
|
if (!wifiConstants.shouldShowActivityConfig) {
|
||||||
flowOf(null)
|
flowOf(null)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ class FakeMobileConnectionRepository(override val subId: Int) : MobileConnection
|
|||||||
private val _isDefaultDataSubscription = MutableStateFlow(true)
|
private val _isDefaultDataSubscription = MutableStateFlow(true)
|
||||||
override val isDefaultDataSubscription = _isDefaultDataSubscription
|
override val isDefaultDataSubscription = _isDefaultDataSubscription
|
||||||
|
|
||||||
|
override val cdmaRoaming = MutableStateFlow(false)
|
||||||
|
|
||||||
fun setConnectionInfo(model: MobileConnectionModel) {
|
fun setConnectionInfo(model: MobileConnectionModel) {
|
||||||
_connectionInfo.value = model
|
_connectionInfo.value = model
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ internal class DemoMobileConnectionParameterizedTest(private val testCase: TestC
|
|||||||
inflateStrength = testCase.inflateStrength,
|
inflateStrength = testCase.inflateStrength,
|
||||||
activity = testCase.activity,
|
activity = testCase.activity,
|
||||||
carrierNetworkChange = testCase.carrierNetworkChange,
|
carrierNetworkChange = testCase.carrierNetworkChange,
|
||||||
|
roaming = testCase.roaming,
|
||||||
)
|
)
|
||||||
|
|
||||||
fakeNetworkEventFlow.value = networkModel
|
fakeNetworkEventFlow.value = networkModel
|
||||||
@@ -116,6 +117,7 @@ internal class DemoMobileConnectionParameterizedTest(private val testCase: TestC
|
|||||||
assertThat(connectionInfo.dataActivityDirection).isEqualTo(model.activity)
|
assertThat(connectionInfo.dataActivityDirection).isEqualTo(model.activity)
|
||||||
assertThat(connectionInfo.carrierNetworkChangeActive)
|
assertThat(connectionInfo.carrierNetworkChangeActive)
|
||||||
.isEqualTo(model.carrierNetworkChange)
|
.isEqualTo(model.carrierNetworkChange)
|
||||||
|
assertThat(connectionInfo.isRoaming).isEqualTo(model.roaming)
|
||||||
|
|
||||||
// TODO(b/261029387): check these once we start handling them
|
// TODO(b/261029387): check these once we start handling them
|
||||||
assertThat(connectionInfo.isEmergencyOnly).isFalse()
|
assertThat(connectionInfo.isEmergencyOnly).isFalse()
|
||||||
@@ -138,6 +140,7 @@ internal class DemoMobileConnectionParameterizedTest(private val testCase: TestC
|
|||||||
val inflateStrength: Boolean,
|
val inflateStrength: Boolean,
|
||||||
@Annotation.DataActivityType val activity: Int,
|
@Annotation.DataActivityType val activity: Int,
|
||||||
val carrierNetworkChange: Boolean,
|
val carrierNetworkChange: Boolean,
|
||||||
|
val roaming: Boolean,
|
||||||
) {
|
) {
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
return "INPUT(level=$level, " +
|
return "INPUT(level=$level, " +
|
||||||
@@ -146,7 +149,8 @@ internal class DemoMobileConnectionParameterizedTest(private val testCase: TestC
|
|||||||
"carrierId=$carrierId, " +
|
"carrierId=$carrierId, " +
|
||||||
"inflateStrength=$inflateStrength, " +
|
"inflateStrength=$inflateStrength, " +
|
||||||
"activity=$activity, " +
|
"activity=$activity, " +
|
||||||
"carrierNetworkChange=$carrierNetworkChange)"
|
"carrierNetworkChange=$carrierNetworkChange, " +
|
||||||
|
"roaming=$roaming)"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convenience for iterating test data and creating new cases
|
// Convenience for iterating test data and creating new cases
|
||||||
@@ -158,6 +162,7 @@ internal class DemoMobileConnectionParameterizedTest(private val testCase: TestC
|
|||||||
inflateStrength: Boolean? = null,
|
inflateStrength: Boolean? = null,
|
||||||
@Annotation.DataActivityType activity: Int? = null,
|
@Annotation.DataActivityType activity: Int? = null,
|
||||||
carrierNetworkChange: Boolean? = null,
|
carrierNetworkChange: Boolean? = null,
|
||||||
|
roaming: Boolean? = null,
|
||||||
): TestCase =
|
): TestCase =
|
||||||
TestCase(
|
TestCase(
|
||||||
level = level ?: this.level,
|
level = level ?: this.level,
|
||||||
@@ -166,7 +171,8 @@ internal class DemoMobileConnectionParameterizedTest(private val testCase: TestC
|
|||||||
carrierId = carrierId ?: this.carrierId,
|
carrierId = carrierId ?: this.carrierId,
|
||||||
inflateStrength = inflateStrength ?: this.inflateStrength,
|
inflateStrength = inflateStrength ?: this.inflateStrength,
|
||||||
activity = activity ?: this.activity,
|
activity = activity ?: this.activity,
|
||||||
carrierNetworkChange = carrierNetworkChange ?: this.carrierNetworkChange
|
carrierNetworkChange = carrierNetworkChange ?: this.carrierNetworkChange,
|
||||||
|
roaming = roaming ?: this.roaming,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,6 +199,8 @@ internal class DemoMobileConnectionParameterizedTest(private val testCase: TestC
|
|||||||
TelephonyManager.DATA_ACTIVITY_INOUT
|
TelephonyManager.DATA_ACTIVITY_INOUT
|
||||||
)
|
)
|
||||||
private val carrierNetworkChange = booleanList
|
private val carrierNetworkChange = booleanList
|
||||||
|
// false first so the base case doesn't have roaming set (more common)
|
||||||
|
private val roaming = listOf(false, true)
|
||||||
|
|
||||||
@Parameters(name = "{0}") @JvmStatic fun data() = testData()
|
@Parameters(name = "{0}") @JvmStatic fun data() = testData()
|
||||||
|
|
||||||
@@ -226,7 +234,8 @@ internal class DemoMobileConnectionParameterizedTest(private val testCase: TestC
|
|||||||
carrierIds.first(),
|
carrierIds.first(),
|
||||||
inflateStrength.first(),
|
inflateStrength.first(),
|
||||||
activity.first(),
|
activity.first(),
|
||||||
carrierNetworkChange.first()
|
carrierNetworkChange.first(),
|
||||||
|
roaming.first(),
|
||||||
)
|
)
|
||||||
|
|
||||||
val tail =
|
val tail =
|
||||||
@@ -237,6 +246,7 @@ internal class DemoMobileConnectionParameterizedTest(private val testCase: TestC
|
|||||||
inflateStrength.map { baseCase.modifiedBy(inflateStrength = it) },
|
inflateStrength.map { baseCase.modifiedBy(inflateStrength = it) },
|
||||||
activity.map { baseCase.modifiedBy(activity = it) },
|
activity.map { baseCase.modifiedBy(activity = it) },
|
||||||
carrierNetworkChange.map { baseCase.modifiedBy(carrierNetworkChange = it) },
|
carrierNetworkChange.map { baseCase.modifiedBy(carrierNetworkChange = it) },
|
||||||
|
roaming.map { baseCase.modifiedBy(roaming = it) }
|
||||||
)
|
)
|
||||||
.flatten()
|
.flatten()
|
||||||
|
|
||||||
|
|||||||
@@ -292,6 +292,7 @@ class DemoMobileConnectionsRepositoryTest : SysuiTestCase() {
|
|||||||
assertThat(connectionInfo.dataActivityDirection).isEqualTo(model.activity)
|
assertThat(connectionInfo.dataActivityDirection).isEqualTo(model.activity)
|
||||||
assertThat(connectionInfo.carrierNetworkChangeActive)
|
assertThat(connectionInfo.carrierNetworkChangeActive)
|
||||||
.isEqualTo(model.carrierNetworkChange)
|
.isEqualTo(model.carrierNetworkChange)
|
||||||
|
assertThat(connectionInfo.isRoaming).isEqualTo(model.roaming)
|
||||||
|
|
||||||
// TODO(b/261029387) check these once we start handling them
|
// TODO(b/261029387) check these once we start handling them
|
||||||
assertThat(connectionInfo.isEmergencyOnly).isFalse()
|
assertThat(connectionInfo.isEmergencyOnly).isFalse()
|
||||||
@@ -313,6 +314,7 @@ fun validMobileEvent(
|
|||||||
inflateStrength: Boolean? = false,
|
inflateStrength: Boolean? = false,
|
||||||
activity: Int? = null,
|
activity: Int? = null,
|
||||||
carrierNetworkChange: Boolean = false,
|
carrierNetworkChange: Boolean = false,
|
||||||
|
roaming: Boolean = false,
|
||||||
): FakeNetworkEventModel =
|
): FakeNetworkEventModel =
|
||||||
FakeNetworkEventModel.Mobile(
|
FakeNetworkEventModel.Mobile(
|
||||||
level = level,
|
level = level,
|
||||||
@@ -322,4 +324,5 @@ fun validMobileEvent(
|
|||||||
inflateStrength = inflateStrength,
|
inflateStrength = inflateStrength,
|
||||||
activity = activity,
|
activity = activity,
|
||||||
carrierNetworkChange = carrierNetworkChange,
|
carrierNetworkChange = carrierNetworkChange,
|
||||||
|
roaming = roaming,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ import android.telephony.TelephonyManager.DATA_CONNECTING
|
|||||||
import android.telephony.TelephonyManager.DATA_DISCONNECTED
|
import android.telephony.TelephonyManager.DATA_DISCONNECTED
|
||||||
import android.telephony.TelephonyManager.DATA_DISCONNECTING
|
import android.telephony.TelephonyManager.DATA_DISCONNECTING
|
||||||
import android.telephony.TelephonyManager.DATA_UNKNOWN
|
import android.telephony.TelephonyManager.DATA_UNKNOWN
|
||||||
|
import android.telephony.TelephonyManager.ERI_OFF
|
||||||
|
import android.telephony.TelephonyManager.ERI_ON
|
||||||
import android.telephony.TelephonyManager.NETWORK_TYPE_LTE
|
import android.telephony.TelephonyManager.NETWORK_TYPE_LTE
|
||||||
import android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN
|
import android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
@@ -402,6 +404,61 @@ class MobileConnectionRepositoryTest : SysuiTestCase() {
|
|||||||
job.cancel()
|
job.cancel()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `roaming - cdma - queries telephony manager`() =
|
||||||
|
runBlocking(IMMEDIATE) {
|
||||||
|
var latest: Boolean? = null
|
||||||
|
// Start the telephony collection job so that cdmaRoaming starts updating
|
||||||
|
val telephonyJob = underTest.connectionInfo.launchIn(this)
|
||||||
|
val job = underTest.cdmaRoaming.onEach { latest = it }.launchIn(this)
|
||||||
|
|
||||||
|
val cb = getTelephonyCallbackForType<ServiceStateListener>()
|
||||||
|
|
||||||
|
val serviceState = ServiceState()
|
||||||
|
serviceState.roaming = false
|
||||||
|
|
||||||
|
// CDMA roaming is off, GSM roaming is off
|
||||||
|
whenever(telephonyManager.cdmaEnhancedRoamingIndicatorDisplayNumber).thenReturn(ERI_OFF)
|
||||||
|
cb.onServiceStateChanged(serviceState)
|
||||||
|
|
||||||
|
assertThat(latest).isFalse()
|
||||||
|
|
||||||
|
// CDMA roaming is off, GSM roaming is on
|
||||||
|
whenever(telephonyManager.cdmaEnhancedRoamingIndicatorDisplayNumber).thenReturn(ERI_ON)
|
||||||
|
cb.onServiceStateChanged(serviceState)
|
||||||
|
|
||||||
|
assertThat(latest).isTrue()
|
||||||
|
|
||||||
|
telephonyJob.cancel()
|
||||||
|
job.cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `roaming - gsm - queries service state`() =
|
||||||
|
runBlocking(IMMEDIATE) {
|
||||||
|
var latest: Boolean? = null
|
||||||
|
val job = underTest.connectionInfo.onEach { latest = it.isRoaming }.launchIn(this)
|
||||||
|
|
||||||
|
val serviceState = ServiceState()
|
||||||
|
serviceState.roaming = false
|
||||||
|
|
||||||
|
val cb = getTelephonyCallbackForType<ServiceStateListener>()
|
||||||
|
|
||||||
|
// CDMA roaming is off, GSM roaming is off
|
||||||
|
whenever(telephonyManager.cdmaEnhancedRoamingIndicatorDisplayNumber).thenReturn(ERI_OFF)
|
||||||
|
cb.onServiceStateChanged(serviceState)
|
||||||
|
|
||||||
|
assertThat(latest).isFalse()
|
||||||
|
|
||||||
|
// CDMA roaming is off, GSM roaming is on
|
||||||
|
serviceState.roaming = true
|
||||||
|
cb.onServiceStateChanged(serviceState)
|
||||||
|
|
||||||
|
assertThat(latest).isTrue()
|
||||||
|
|
||||||
|
job.cancel()
|
||||||
|
}
|
||||||
|
|
||||||
private fun getTelephonyCallbacks(): List<TelephonyCallback> {
|
private fun getTelephonyCallbacks(): List<TelephonyCallback> {
|
||||||
val callbackCaptor = argumentCaptor<TelephonyCallback>()
|
val callbackCaptor = argumentCaptor<TelephonyCallback>()
|
||||||
Mockito.verify(telephonyManager).registerTelephonyCallback(any(), callbackCaptor.capture())
|
Mockito.verify(telephonyManager).registerTelephonyCallback(any(), callbackCaptor.capture())
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ class FakeMobileIconInteractor : MobileIconInteractor {
|
|||||||
private val _isEmergencyOnly = MutableStateFlow(false)
|
private val _isEmergencyOnly = MutableStateFlow(false)
|
||||||
override val isEmergencyOnly = _isEmergencyOnly
|
override val isEmergencyOnly = _isEmergencyOnly
|
||||||
|
|
||||||
|
override val isRoaming = MutableStateFlow(false)
|
||||||
|
|
||||||
private val _isFailedConnection = MutableStateFlow(false)
|
private val _isFailedConnection = MutableStateFlow(false)
|
||||||
override val isDefaultConnectionFailed = _isFailedConnection
|
override val isDefaultConnectionFailed = _isFailedConnection
|
||||||
|
|
||||||
|
|||||||
@@ -298,6 +298,100 @@ class MobileIconInteractorTest : SysuiTestCase() {
|
|||||||
job.cancel()
|
job.cancel()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `roaming - is gsm - uses connection model`() =
|
||||||
|
runBlocking(IMMEDIATE) {
|
||||||
|
var latest: Boolean? = null
|
||||||
|
val job = underTest.isRoaming.onEach { latest = it }.launchIn(this)
|
||||||
|
|
||||||
|
connectionRepository.cdmaRoaming.value = true
|
||||||
|
connectionRepository.setConnectionInfo(
|
||||||
|
MobileConnectionModel(
|
||||||
|
isGsm = true,
|
||||||
|
isRoaming = false,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
yield()
|
||||||
|
|
||||||
|
assertThat(latest).isFalse()
|
||||||
|
|
||||||
|
connectionRepository.setConnectionInfo(
|
||||||
|
MobileConnectionModel(
|
||||||
|
isGsm = true,
|
||||||
|
isRoaming = true,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
yield()
|
||||||
|
|
||||||
|
assertThat(latest).isTrue()
|
||||||
|
|
||||||
|
job.cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `roaming - is cdma - uses cdma roaming bit`() =
|
||||||
|
runBlocking(IMMEDIATE) {
|
||||||
|
var latest: Boolean? = null
|
||||||
|
val job = underTest.isRoaming.onEach { latest = it }.launchIn(this)
|
||||||
|
|
||||||
|
connectionRepository.cdmaRoaming.value = false
|
||||||
|
connectionRepository.setConnectionInfo(
|
||||||
|
MobileConnectionModel(
|
||||||
|
isGsm = false,
|
||||||
|
isRoaming = true,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
yield()
|
||||||
|
|
||||||
|
assertThat(latest).isFalse()
|
||||||
|
|
||||||
|
connectionRepository.cdmaRoaming.value = true
|
||||||
|
connectionRepository.setConnectionInfo(
|
||||||
|
MobileConnectionModel(
|
||||||
|
isGsm = false,
|
||||||
|
isRoaming = false,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
yield()
|
||||||
|
|
||||||
|
assertThat(latest).isTrue()
|
||||||
|
|
||||||
|
job.cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `roaming - false while carrierNetworkChangeActive`() =
|
||||||
|
runBlocking(IMMEDIATE) {
|
||||||
|
var latest: Boolean? = null
|
||||||
|
val job = underTest.isRoaming.onEach { latest = it }.launchIn(this)
|
||||||
|
|
||||||
|
connectionRepository.cdmaRoaming.value = true
|
||||||
|
connectionRepository.setConnectionInfo(
|
||||||
|
MobileConnectionModel(
|
||||||
|
isGsm = false,
|
||||||
|
isRoaming = true,
|
||||||
|
carrierNetworkChangeActive = true,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
yield()
|
||||||
|
|
||||||
|
assertThat(latest).isFalse()
|
||||||
|
|
||||||
|
connectionRepository.cdmaRoaming.value = true
|
||||||
|
connectionRepository.setConnectionInfo(
|
||||||
|
MobileConnectionModel(
|
||||||
|
isGsm = true,
|
||||||
|
isRoaming = true,
|
||||||
|
carrierNetworkChangeActive = true,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
yield()
|
||||||
|
|
||||||
|
assertThat(latest).isFalse()
|
||||||
|
|
||||||
|
job.cancel()
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val IMMEDIATE = Dispatchers.Main.immediate
|
private val IMMEDIATE = Dispatchers.Main.immediate
|
||||||
|
|
||||||
|
|||||||
@@ -234,6 +234,22 @@ class MobileIconViewModelTest : SysuiTestCase() {
|
|||||||
job.cancel()
|
job.cancel()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun roaming() =
|
||||||
|
runBlocking(IMMEDIATE) {
|
||||||
|
interactor.isRoaming.value = true
|
||||||
|
var latest: Boolean? = null
|
||||||
|
val job = underTest.roaming.onEach { latest = it }.launchIn(this)
|
||||||
|
|
||||||
|
assertThat(latest).isTrue()
|
||||||
|
|
||||||
|
interactor.isRoaming.value = false
|
||||||
|
|
||||||
|
assertThat(latest).isFalse()
|
||||||
|
|
||||||
|
job.cancel()
|
||||||
|
}
|
||||||
|
|
||||||
/** Convenience constructor for these tests */
|
/** Convenience constructor for these tests */
|
||||||
private fun defaultSignal(
|
private fun defaultSignal(
|
||||||
level: Int = 1,
|
level: Int = 1,
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
|
|
||||||
package com.android.systemui.statusbar.pipeline.wifi.data.repository
|
package com.android.systemui.statusbar.pipeline.wifi.data.repository
|
||||||
|
|
||||||
|
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
|
import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryImpl.Companion.ACTIVITY_DEFAULT
|
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryImpl.Companion.ACTIVITY_DEFAULT
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiActivityModel
|
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ class FakeWifiRepository : WifiRepository {
|
|||||||
override val wifiNetwork: StateFlow<WifiNetworkModel> = _wifiNetwork
|
override val wifiNetwork: StateFlow<WifiNetworkModel> = _wifiNetwork
|
||||||
|
|
||||||
private val _wifiActivity = MutableStateFlow(ACTIVITY_DEFAULT)
|
private val _wifiActivity = MutableStateFlow(ACTIVITY_DEFAULT)
|
||||||
override val wifiActivity: StateFlow<WifiActivityModel> = _wifiActivity
|
override val wifiActivity: StateFlow<DataActivityModel> = _wifiActivity
|
||||||
|
|
||||||
fun setIsWifiEnabled(enabled: Boolean) {
|
fun setIsWifiEnabled(enabled: Boolean) {
|
||||||
_isWifiEnabled.value = enabled
|
_isWifiEnabled.value = enabled
|
||||||
@@ -49,7 +49,7 @@ class FakeWifiRepository : WifiRepository {
|
|||||||
_wifiNetwork.value = wifiNetworkModel
|
_wifiNetwork.value = wifiNetworkModel
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setWifiActivity(activity: WifiActivityModel) {
|
fun setWifiActivity(activity: DataActivityModel) {
|
||||||
_wifiActivity.value = activity
|
_wifiActivity.value = activity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,10 +31,10 @@ import com.android.systemui.SysuiTestCase
|
|||||||
import com.android.systemui.broadcast.BroadcastDispatcher
|
import com.android.systemui.broadcast.BroadcastDispatcher
|
||||||
import com.android.systemui.log.table.TableLogBuffer
|
import com.android.systemui.log.table.TableLogBuffer
|
||||||
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
|
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
|
||||||
|
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
|
import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryImpl.Companion.ACTIVITY_DEFAULT
|
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryImpl.Companion.ACTIVITY_DEFAULT
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryImpl.Companion.WIFI_NETWORK_DEFAULT
|
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryImpl.Companion.WIFI_NETWORK_DEFAULT
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiActivityModel
|
|
||||||
import com.android.systemui.util.concurrency.FakeExecutor
|
import com.android.systemui.util.concurrency.FakeExecutor
|
||||||
import com.android.systemui.util.mockito.any
|
import com.android.systemui.util.mockito.any
|
||||||
import com.android.systemui.util.mockito.argumentCaptor
|
import com.android.systemui.util.mockito.argumentCaptor
|
||||||
@@ -724,7 +724,7 @@ class WifiRepositoryImplTest : SysuiTestCase() {
|
|||||||
fun wifiActivity_nullWifiManager_receivesDefault() = runBlocking(IMMEDIATE) {
|
fun wifiActivity_nullWifiManager_receivesDefault() = runBlocking(IMMEDIATE) {
|
||||||
underTest = createRepo(wifiManagerToUse = null)
|
underTest = createRepo(wifiManagerToUse = null)
|
||||||
|
|
||||||
var latest: WifiActivityModel? = null
|
var latest: DataActivityModel? = null
|
||||||
val job = underTest
|
val job = underTest
|
||||||
.wifiActivity
|
.wifiActivity
|
||||||
.onEach { latest = it }
|
.onEach { latest = it }
|
||||||
@@ -737,7 +737,7 @@ class WifiRepositoryImplTest : SysuiTestCase() {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun wifiActivity_callbackGivesNone_activityFlowHasNone() = runBlocking(IMMEDIATE) {
|
fun wifiActivity_callbackGivesNone_activityFlowHasNone() = runBlocking(IMMEDIATE) {
|
||||||
var latest: WifiActivityModel? = null
|
var latest: DataActivityModel? = null
|
||||||
val job = underTest
|
val job = underTest
|
||||||
.wifiActivity
|
.wifiActivity
|
||||||
.onEach { latest = it }
|
.onEach { latest = it }
|
||||||
@@ -746,7 +746,7 @@ class WifiRepositoryImplTest : SysuiTestCase() {
|
|||||||
getTrafficStateCallback().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_NONE)
|
getTrafficStateCallback().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_NONE)
|
||||||
|
|
||||||
assertThat(latest).isEqualTo(
|
assertThat(latest).isEqualTo(
|
||||||
WifiActivityModel(hasActivityIn = false, hasActivityOut = false)
|
DataActivityModel(hasActivityIn = false, hasActivityOut = false)
|
||||||
)
|
)
|
||||||
|
|
||||||
job.cancel()
|
job.cancel()
|
||||||
@@ -754,7 +754,7 @@ class WifiRepositoryImplTest : SysuiTestCase() {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun wifiActivity_callbackGivesIn_activityFlowHasIn() = runBlocking(IMMEDIATE) {
|
fun wifiActivity_callbackGivesIn_activityFlowHasIn() = runBlocking(IMMEDIATE) {
|
||||||
var latest: WifiActivityModel? = null
|
var latest: DataActivityModel? = null
|
||||||
val job = underTest
|
val job = underTest
|
||||||
.wifiActivity
|
.wifiActivity
|
||||||
.onEach { latest = it }
|
.onEach { latest = it }
|
||||||
@@ -763,7 +763,7 @@ class WifiRepositoryImplTest : SysuiTestCase() {
|
|||||||
getTrafficStateCallback().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_IN)
|
getTrafficStateCallback().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_IN)
|
||||||
|
|
||||||
assertThat(latest).isEqualTo(
|
assertThat(latest).isEqualTo(
|
||||||
WifiActivityModel(hasActivityIn = true, hasActivityOut = false)
|
DataActivityModel(hasActivityIn = true, hasActivityOut = false)
|
||||||
)
|
)
|
||||||
|
|
||||||
job.cancel()
|
job.cancel()
|
||||||
@@ -771,7 +771,7 @@ class WifiRepositoryImplTest : SysuiTestCase() {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun wifiActivity_callbackGivesOut_activityFlowHasOut() = runBlocking(IMMEDIATE) {
|
fun wifiActivity_callbackGivesOut_activityFlowHasOut() = runBlocking(IMMEDIATE) {
|
||||||
var latest: WifiActivityModel? = null
|
var latest: DataActivityModel? = null
|
||||||
val job = underTest
|
val job = underTest
|
||||||
.wifiActivity
|
.wifiActivity
|
||||||
.onEach { latest = it }
|
.onEach { latest = it }
|
||||||
@@ -780,7 +780,7 @@ class WifiRepositoryImplTest : SysuiTestCase() {
|
|||||||
getTrafficStateCallback().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_OUT)
|
getTrafficStateCallback().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_OUT)
|
||||||
|
|
||||||
assertThat(latest).isEqualTo(
|
assertThat(latest).isEqualTo(
|
||||||
WifiActivityModel(hasActivityIn = false, hasActivityOut = true)
|
DataActivityModel(hasActivityIn = false, hasActivityOut = true)
|
||||||
)
|
)
|
||||||
|
|
||||||
job.cancel()
|
job.cancel()
|
||||||
@@ -788,7 +788,7 @@ class WifiRepositoryImplTest : SysuiTestCase() {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun wifiActivity_callbackGivesInout_activityFlowHasInAndOut() = runBlocking(IMMEDIATE) {
|
fun wifiActivity_callbackGivesInout_activityFlowHasInAndOut() = runBlocking(IMMEDIATE) {
|
||||||
var latest: WifiActivityModel? = null
|
var latest: DataActivityModel? = null
|
||||||
val job = underTest
|
val job = underTest
|
||||||
.wifiActivity
|
.wifiActivity
|
||||||
.onEach { latest = it }
|
.onEach { latest = it }
|
||||||
@@ -796,7 +796,7 @@ class WifiRepositoryImplTest : SysuiTestCase() {
|
|||||||
|
|
||||||
getTrafficStateCallback().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_INOUT)
|
getTrafficStateCallback().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_INOUT)
|
||||||
|
|
||||||
assertThat(latest).isEqualTo(WifiActivityModel(hasActivityIn = true, hasActivityOut = true))
|
assertThat(latest).isEqualTo(DataActivityModel(hasActivityIn = true, hasActivityOut = true))
|
||||||
|
|
||||||
job.cancel()
|
job.cancel()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,10 +20,10 @@ import android.net.wifi.WifiManager
|
|||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
|
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
|
||||||
|
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
|
||||||
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
|
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
|
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.shared.model.WifiActivityModel
|
|
||||||
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
|
||||||
@@ -225,23 +225,23 @@ class WifiInteractorImplTest : SysuiTestCase() {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun activity_matchesRepoWifiActivity() = runBlocking(IMMEDIATE) {
|
fun activity_matchesRepoWifiActivity() = runBlocking(IMMEDIATE) {
|
||||||
var latest: WifiActivityModel? = null
|
var latest: DataActivityModel? = null
|
||||||
val job = underTest
|
val job = underTest
|
||||||
.activity
|
.activity
|
||||||
.onEach { latest = it }
|
.onEach { latest = it }
|
||||||
.launchIn(this)
|
.launchIn(this)
|
||||||
|
|
||||||
val activity1 = WifiActivityModel(hasActivityIn = true, hasActivityOut = true)
|
val activity1 = DataActivityModel(hasActivityIn = true, hasActivityOut = true)
|
||||||
wifiRepository.setWifiActivity(activity1)
|
wifiRepository.setWifiActivity(activity1)
|
||||||
yield()
|
yield()
|
||||||
assertThat(latest).isEqualTo(activity1)
|
assertThat(latest).isEqualTo(activity1)
|
||||||
|
|
||||||
val activity2 = WifiActivityModel(hasActivityIn = false, hasActivityOut = false)
|
val activity2 = DataActivityModel(hasActivityIn = false, hasActivityOut = false)
|
||||||
wifiRepository.setWifiActivity(activity2)
|
wifiRepository.setWifiActivity(activity2)
|
||||||
yield()
|
yield()
|
||||||
assertThat(latest).isEqualTo(activity2)
|
assertThat(latest).isEqualTo(activity2)
|
||||||
|
|
||||||
val activity3 = WifiActivityModel(hasActivityIn = true, hasActivityOut = false)
|
val activity3 = DataActivityModel(hasActivityIn = true, hasActivityOut = false)
|
||||||
wifiRepository.setWifiActivity(activity3)
|
wifiRepository.setWifiActivity(activity3)
|
||||||
yield()
|
yield()
|
||||||
assertThat(latest).isEqualTo(activity3)
|
assertThat(latest).isEqualTo(activity3)
|
||||||
|
|||||||
@@ -27,13 +27,13 @@ import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneMod
|
|||||||
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
|
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
|
||||||
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
|
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
|
||||||
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
|
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
|
||||||
|
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
|
||||||
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
|
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
|
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.domain.interactor.WifiInteractorImpl
|
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractorImpl
|
||||||
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.shared.model.WifiActivityModel
|
|
||||||
import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon
|
import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@@ -209,7 +209,7 @@ class WifiViewModelTest : SysuiTestCase() {
|
|||||||
.launchIn(this)
|
.launchIn(this)
|
||||||
|
|
||||||
// WHEN we update the repo to have activity
|
// WHEN we update the repo to have activity
|
||||||
val activity = WifiActivityModel(hasActivityIn = true, hasActivityOut = true)
|
val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = true)
|
||||||
wifiRepository.setWifiActivity(activity)
|
wifiRepository.setWifiActivity(activity)
|
||||||
yield()
|
yield()
|
||||||
|
|
||||||
@@ -252,7 +252,7 @@ class WifiViewModelTest : SysuiTestCase() {
|
|||||||
.launchIn(this)
|
.launchIn(this)
|
||||||
|
|
||||||
// WHEN we update the repo to have activity
|
// WHEN we update the repo to have activity
|
||||||
val activity = WifiActivityModel(hasActivityIn = true, hasActivityOut = true)
|
val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = true)
|
||||||
wifiRepository.setWifiActivity(activity)
|
wifiRepository.setWifiActivity(activity)
|
||||||
yield()
|
yield()
|
||||||
|
|
||||||
@@ -293,7 +293,7 @@ class WifiViewModelTest : SysuiTestCase() {
|
|||||||
.onEach { latestQs = it }
|
.onEach { latestQs = it }
|
||||||
.launchIn(this)
|
.launchIn(this)
|
||||||
|
|
||||||
val activity = WifiActivityModel(hasActivityIn = true, hasActivityOut = true)
|
val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = true)
|
||||||
wifiRepository.setWifiActivity(activity)
|
wifiRepository.setWifiActivity(activity)
|
||||||
yield()
|
yield()
|
||||||
|
|
||||||
@@ -319,7 +319,7 @@ class WifiViewModelTest : SysuiTestCase() {
|
|||||||
.onEach { latest = it }
|
.onEach { latest = it }
|
||||||
.launchIn(this)
|
.launchIn(this)
|
||||||
|
|
||||||
val activity = WifiActivityModel(hasActivityIn = true, hasActivityOut = false)
|
val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = false)
|
||||||
wifiRepository.setWifiActivity(activity)
|
wifiRepository.setWifiActivity(activity)
|
||||||
yield()
|
yield()
|
||||||
|
|
||||||
@@ -341,7 +341,7 @@ class WifiViewModelTest : SysuiTestCase() {
|
|||||||
.onEach { latest = it }
|
.onEach { latest = it }
|
||||||
.launchIn(this)
|
.launchIn(this)
|
||||||
|
|
||||||
val activity = WifiActivityModel(hasActivityIn = false, hasActivityOut = true)
|
val activity = DataActivityModel(hasActivityIn = false, hasActivityOut = true)
|
||||||
wifiRepository.setWifiActivity(activity)
|
wifiRepository.setWifiActivity(activity)
|
||||||
yield()
|
yield()
|
||||||
|
|
||||||
@@ -363,7 +363,7 @@ class WifiViewModelTest : SysuiTestCase() {
|
|||||||
.onEach { latest = it }
|
.onEach { latest = it }
|
||||||
.launchIn(this)
|
.launchIn(this)
|
||||||
|
|
||||||
val activity = WifiActivityModel(hasActivityIn = false, hasActivityOut = true)
|
val activity = DataActivityModel(hasActivityIn = false, hasActivityOut = true)
|
||||||
wifiRepository.setWifiActivity(activity)
|
wifiRepository.setWifiActivity(activity)
|
||||||
yield()
|
yield()
|
||||||
|
|
||||||
@@ -385,7 +385,7 @@ class WifiViewModelTest : SysuiTestCase() {
|
|||||||
.onEach { latest = it }
|
.onEach { latest = it }
|
||||||
.launchIn(this)
|
.launchIn(this)
|
||||||
|
|
||||||
val activity = WifiActivityModel(hasActivityIn = true, hasActivityOut = false)
|
val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = false)
|
||||||
wifiRepository.setWifiActivity(activity)
|
wifiRepository.setWifiActivity(activity)
|
||||||
yield()
|
yield()
|
||||||
|
|
||||||
@@ -407,7 +407,7 @@ class WifiViewModelTest : SysuiTestCase() {
|
|||||||
.onEach { latest = it }
|
.onEach { latest = it }
|
||||||
.launchIn(this)
|
.launchIn(this)
|
||||||
|
|
||||||
val activity = WifiActivityModel(hasActivityIn = true, hasActivityOut = false)
|
val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = false)
|
||||||
wifiRepository.setWifiActivity(activity)
|
wifiRepository.setWifiActivity(activity)
|
||||||
yield()
|
yield()
|
||||||
|
|
||||||
@@ -429,7 +429,7 @@ class WifiViewModelTest : SysuiTestCase() {
|
|||||||
.onEach { latest = it }
|
.onEach { latest = it }
|
||||||
.launchIn(this)
|
.launchIn(this)
|
||||||
|
|
||||||
val activity = WifiActivityModel(hasActivityIn = false, hasActivityOut = true)
|
val activity = DataActivityModel(hasActivityIn = false, hasActivityOut = true)
|
||||||
wifiRepository.setWifiActivity(activity)
|
wifiRepository.setWifiActivity(activity)
|
||||||
yield()
|
yield()
|
||||||
|
|
||||||
@@ -451,7 +451,7 @@ class WifiViewModelTest : SysuiTestCase() {
|
|||||||
.onEach { latest = it }
|
.onEach { latest = it }
|
||||||
.launchIn(this)
|
.launchIn(this)
|
||||||
|
|
||||||
val activity = WifiActivityModel(hasActivityIn = true, hasActivityOut = true)
|
val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = true)
|
||||||
wifiRepository.setWifiActivity(activity)
|
wifiRepository.setWifiActivity(activity)
|
||||||
yield()
|
yield()
|
||||||
|
|
||||||
@@ -473,7 +473,7 @@ class WifiViewModelTest : SysuiTestCase() {
|
|||||||
.onEach { latest = it }
|
.onEach { latest = it }
|
||||||
.launchIn(this)
|
.launchIn(this)
|
||||||
|
|
||||||
val activity = WifiActivityModel(hasActivityIn = false, hasActivityOut = false)
|
val activity = DataActivityModel(hasActivityIn = false, hasActivityOut = false)
|
||||||
wifiRepository.setWifiActivity(activity)
|
wifiRepository.setWifiActivity(activity)
|
||||||
yield()
|
yield()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user