Address PR review comments

This commit is contained in:
ganfra
2026-07-08 18:16:13 +02:00
parent d25362dd36
commit fad8dce166
3 changed files with 11 additions and 34 deletions
@@ -22,7 +22,6 @@ import androidx.compose.foundation.text.input.TextFieldState
import androidx.compose.foundation.text.input.clearText import androidx.compose.foundation.text.input.clearText
import androidx.compose.foundation.text.input.maxLength import androidx.compose.foundation.text.input.maxLength
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.minimumInteractiveComponentSize
import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
@@ -121,9 +120,6 @@ private fun EmptyStatusRow(
modifier = Modifier.padding(vertical = 16.dp), modifier = Modifier.padding(vertical = 16.dp),
) )
}, },
trailingContent = ListItemContent.Custom({
Box(modifier = Modifier.minimumInteractiveComponentSize())
}),
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Reaction())), leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Reaction())),
modifier = modifier.clickable(onClick = onClick), modifier = modifier.clickable(onClick = onClick),
) )
@@ -7,13 +7,11 @@
package io.element.android.features.preferences.impl.userstatus package io.element.android.features.preferences.impl.userstatus
import app.cash.molecule.RecompositionMode
import app.cash.molecule.moleculeFlow
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.matrix.api.user.DisplayedStatus import io.element.android.libraries.matrix.api.user.DisplayedStatus
import io.element.android.libraries.matrix.api.user.UserStatus import io.element.android.libraries.matrix.api.user.UserStatus
import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.tests.testutils.test
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Test import org.junit.Test
@@ -23,9 +21,7 @@ class UserStatusPresenterTest {
@Test @Test
fun `initial state - no status set`() = runTest { fun `initial state - no status set`() = runTest {
moleculeFlow(RecompositionMode.Immediate) { createPresenter().test {
createPresenter().present()
}.test {
val state = awaitItem() val state = awaitItem()
assertThat(state.displayedStatus).isNull() assertThat(state.displayedStatus).isNull()
assertThat(state.pickerState).isEqualTo(UserStatusPickerState.Hidden) assertThat(state.pickerState).isEqualTo(UserStatusPickerState.Hidden)
@@ -34,9 +30,7 @@ class UserStatusPresenterTest {
@Test @Test
fun `Open event transitions to ShowingPicker`() = runTest { fun `Open event transitions to ShowingPicker`() = runTest {
moleculeFlow(RecompositionMode.Immediate) { createPresenter().test {
createPresenter().present()
}.test {
val state = awaitItem() val state = awaitItem()
state.eventSink(UserStatusEvent.OpenPicker) state.eventSink(UserStatusEvent.OpenPicker)
assertThat(awaitItem().pickerState).isEqualTo(UserStatusPickerState.ShowingPicker) assertThat(awaitItem().pickerState).isEqualTo(UserStatusPickerState.ShowingPicker)
@@ -45,9 +39,7 @@ class UserStatusPresenterTest {
@Test @Test
fun `Dismiss event from ShowingPicker goes back to Hidden`() = runTest { fun `Dismiss event from ShowingPicker goes back to Hidden`() = runTest {
moleculeFlow(RecompositionMode.Immediate) { createPresenter().test {
createPresenter().present()
}.test {
val state = awaitItem() val state = awaitItem()
state.eventSink(UserStatusEvent.OpenPicker) state.eventSink(UserStatusEvent.OpenPicker)
awaitItem() // ShowingPicker awaitItem() // ShowingPicker
@@ -59,9 +51,7 @@ class UserStatusPresenterTest {
@Test @Test
fun `Set event calls setUserStatus and transitions to Hidden with updated status`() = runTest { fun `Set event calls setUserStatus and transitions to Hidden with updated status`() = runTest {
val client = FakeMatrixClient() val client = FakeMatrixClient()
moleculeFlow(RecompositionMode.Immediate) { createPresenter(client).test {
createPresenter(client).present()
}.test {
val status = UserStatus(emoji = "💬", text = "In a meeting") val status = UserStatus(emoji = "💬", text = "In a meeting")
awaitItem().eventSink(UserStatusEvent.SetStatus(status)) awaitItem().eventSink(UserStatusEvent.SetStatus(status))
val newState = awaitItem() val newState = awaitItem()
@@ -73,9 +63,7 @@ class UserStatusPresenterTest {
@Test @Test
fun `OpenCustomInput with no existing status uses defaults`() = runTest { fun `OpenCustomInput with no existing status uses defaults`() = runTest {
moleculeFlow(RecompositionMode.Immediate) { createPresenter().test {
createPresenter().present()
}.test {
awaitItem().eventSink(UserStatusEvent.OpenCustomInput) awaitItem().eventSink(UserStatusEvent.OpenCustomInput)
val state = awaitItem() val state = awaitItem()
val pickerState = state.pickerState as UserStatusPickerState.CustomInput val pickerState = state.pickerState as UserStatusPickerState.CustomInput
@@ -87,9 +75,7 @@ class UserStatusPresenterTest {
@Test @Test
fun `OpenCustomInput with existing rawStatus pre-fills values`() = runTest { fun `OpenCustomInput with existing rawStatus pre-fills values`() = runTest {
val client = FakeMatrixClient() val client = FakeMatrixClient()
moleculeFlow(RecompositionMode.Immediate) { createPresenter(client).test {
createPresenter(client).present()
}.test {
val status = UserStatus(emoji = "🌴", text = "Away") val status = UserStatus(emoji = "🌴", text = "Away")
awaitItem().eventSink(UserStatusEvent.SetStatus(status)) awaitItem().eventSink(UserStatusEvent.SetStatus(status))
// Single emission: pickerState=Hidden and displayedStatus both set in one recomposition // Single emission: pickerState=Hidden and displayedStatus both set in one recomposition
@@ -103,9 +89,7 @@ class UserStatusPresenterTest {
@Test @Test
fun `UpdateCustomEmoji updates emoji in CustomInput state`() = runTest { fun `UpdateCustomEmoji updates emoji in CustomInput state`() = runTest {
moleculeFlow(RecompositionMode.Immediate) { createPresenter().test {
createPresenter().present()
}.test {
awaitItem().eventSink(UserStatusEvent.OpenCustomInput) awaitItem().eventSink(UserStatusEvent.OpenCustomInput)
awaitItem().eventSink(UserStatusEvent.UpdateCustomEmoji("🚀")) awaitItem().eventSink(UserStatusEvent.UpdateCustomEmoji("🚀"))
val state = awaitItem() val state = awaitItem()
@@ -115,9 +99,7 @@ class UserStatusPresenterTest {
@Test @Test
fun `CancelCustomInput goes back to Hidden`() = runTest { fun `CancelCustomInput goes back to Hidden`() = runTest {
moleculeFlow(RecompositionMode.Immediate) { createPresenter().test {
createPresenter().present()
}.test {
awaitItem().eventSink(UserStatusEvent.OpenCustomInput) awaitItem().eventSink(UserStatusEvent.OpenCustomInput)
awaitItem().eventSink(UserStatusEvent.CancelCustomInput) // CustomInput state, fire Cancel awaitItem().eventSink(UserStatusEvent.CancelCustomInput) // CustomInput state, fire Cancel
assertThat(awaitItem().pickerState).isEqualTo(UserStatusPickerState.Hidden) assertThat(awaitItem().pickerState).isEqualTo(UserStatusPickerState.Hidden)
@@ -127,9 +109,7 @@ class UserStatusPresenterTest {
@Test @Test
fun `Clear event calls clearUserStatus and clears displayed status`() = runTest { fun `Clear event calls clearUserStatus and clears displayed status`() = runTest {
val client = FakeMatrixClient() val client = FakeMatrixClient()
moleculeFlow(RecompositionMode.Immediate) { createPresenter(client).test {
createPresenter(client).present()
}.test {
val status = UserStatus(emoji = "☕", text = "Be right back") val status = UserStatus(emoji = "☕", text = "Be right back")
awaitItem().eventSink(UserStatusEvent.SetStatus(status)) awaitItem().eventSink(UserStatusEvent.SetStatus(status))
// Single emission: pickerState=Hidden and displayedStatus both set in one recomposition // Single emission: pickerState=Hidden and displayedStatus both set in one recomposition
@@ -456,6 +456,7 @@ class RustMatrixClient(
displayedStatus = localUserStatus?.let { DisplayedStatus.UserSet(it) }, displayedStatus = localUserStatus?.let { DisplayedStatus.UserSet(it) },
) )
) )
// Also update our session storage
sessionStore.updateUserProfile( sessionStore.updateUserProfile(
sessionId = sessionId.value, sessionId = sessionId.value,
displayName = matrixUser.displayName, displayName = matrixUser.displayName,