Merge "Fixes bug where the indication text is not padded." into tm-qpr-dev

This commit is contained in:
Ale Nijamkin
2022-09-08 22:23:28 +00:00
committed by Android (Google) Code Review
3 changed files with 27 additions and 2 deletions

View File

@@ -32,6 +32,7 @@ import javax.inject.Inject
import kotlin.reflect.KClass
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.onStart
@SysUISingleton
class KeyguardQuickAffordanceInteractor
@@ -88,7 +89,15 @@ constructor(
position: KeyguardQuickAffordancePosition
): Flow<KeyguardQuickAffordanceModel> {
val configs = registry.getAll(position)
return combine(configs.map { config -> config.state }) { states ->
return combine(
configs.map { config ->
// We emit an initial "Hidden" value to make sure that there's always an initial
// value and avoid subtle bugs where the downstream isn't receiving any values
// because one config implementation is not emitting an initial value. For example,
// see b/244296596.
config.state.onStart { emit(KeyguardQuickAffordanceConfig.State.Hidden) }
}
) { states ->
val index = states.indexOfFirst { it is KeyguardQuickAffordanceConfig.State.Visible }
if (index != -1) {
val visibleState = states[index] as KeyguardQuickAffordanceConfig.State.Visible

View File

@@ -36,6 +36,7 @@ import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.test.runBlockingTest
import kotlinx.coroutines.yield
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -110,6 +111,10 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() {
.quickAffordance(KeyguardQuickAffordancePosition.BOTTOM_START)
.onEach { latest = it }
.launchIn(this)
// The interactor has an onStart { emit(Hidden) } to cover for upstream configs that don't
// produce an initial value. We yield to give the coroutine time to emit the first real
// value from our config.
yield()
assertThat(latest).isInstanceOf(KeyguardQuickAffordanceModel.Visible::class.java)
val visibleModel = latest as KeyguardQuickAffordanceModel.Visible
@@ -136,6 +141,10 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() {
.quickAffordance(KeyguardQuickAffordancePosition.BOTTOM_END)
.onEach { latest = it }
.launchIn(this)
// The interactor has an onStart { emit(Hidden) } to cover for upstream configs that don't
// produce an initial value. We yield to give the coroutine time to emit the first real
// value from our config.
yield()
assertThat(latest).isInstanceOf(KeyguardQuickAffordanceModel.Visible::class.java)
val visibleModel = latest as KeyguardQuickAffordanceModel.Visible

View File

@@ -224,7 +224,10 @@ class KeyguardBottomAreaViewModelTest : SysuiTestCase() {
repository.setAnimateDozingTransitions(false)
yield()
assertThat(values).isEqualTo(listOf(false, true, false))
// Note the extra false value in the beginning. This is to cover for the initial value
// inserted by the quick affordance interactor which it does to cover for config
// implementations that don't emit an initial value.
assertThat(values).isEqualTo(listOf(false, false, true, false))
job.cancel()
}
@@ -372,6 +375,10 @@ class KeyguardBottomAreaViewModelTest : SysuiTestCase() {
var latest: KeyguardQuickAffordanceViewModel? = null
val job = underTest.startButton.onEach { latest = it }.launchIn(this)
// The interactor has an onStart { emit(Hidden) } to cover for upstream configs that don't
// produce an initial value. We yield to give the coroutine time to emit the first real
// value from our config.
yield()
assertQuickAffordanceViewModel(
viewModel = latest,