diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/userstatus/UserStatusView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/userstatus/UserStatusView.kt index dfc68ff446..7169aaec66 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/userstatus/UserStatusView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/userstatus/UserStatusView.kt @@ -22,7 +22,6 @@ import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.foundation.text.input.clearText import androidx.compose.foundation.text.input.maxLength import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.minimumInteractiveComponentSize import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -121,9 +120,6 @@ private fun EmptyStatusRow( modifier = Modifier.padding(vertical = 16.dp), ) }, - trailingContent = ListItemContent.Custom({ - Box(modifier = Modifier.minimumInteractiveComponentSize()) - }), leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Reaction())), modifier = modifier.clickable(onClick = onClick), ) diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/userstatus/UserStatusPresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/userstatus/UserStatusPresenterTest.kt index 4a03a22607..3f78843b74 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/userstatus/UserStatusPresenterTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/userstatus/UserStatusPresenterTest.kt @@ -7,13 +7,11 @@ 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 io.element.android.libraries.matrix.api.user.DisplayedStatus import io.element.android.libraries.matrix.api.user.UserStatus import io.element.android.libraries.matrix.test.FakeMatrixClient +import io.element.android.tests.testutils.test import kotlinx.coroutines.test.runTest import org.junit.Test @@ -23,9 +21,7 @@ class UserStatusPresenterTest { @Test fun `initial state - no status set`() = runTest { - moleculeFlow(RecompositionMode.Immediate) { - createPresenter().present() - }.test { + createPresenter().test { val state = awaitItem() assertThat(state.displayedStatus).isNull() assertThat(state.pickerState).isEqualTo(UserStatusPickerState.Hidden) @@ -34,9 +30,7 @@ class UserStatusPresenterTest { @Test fun `Open event transitions to ShowingPicker`() = runTest { - moleculeFlow(RecompositionMode.Immediate) { - createPresenter().present() - }.test { + createPresenter().test { val state = awaitItem() state.eventSink(UserStatusEvent.OpenPicker) assertThat(awaitItem().pickerState).isEqualTo(UserStatusPickerState.ShowingPicker) @@ -45,9 +39,7 @@ class UserStatusPresenterTest { @Test fun `Dismiss event from ShowingPicker goes back to Hidden`() = runTest { - moleculeFlow(RecompositionMode.Immediate) { - createPresenter().present() - }.test { + createPresenter().test { val state = awaitItem() state.eventSink(UserStatusEvent.OpenPicker) awaitItem() // ShowingPicker @@ -59,9 +51,7 @@ class UserStatusPresenterTest { @Test fun `Set event calls setUserStatus and transitions to Hidden with updated status`() = runTest { val client = FakeMatrixClient() - moleculeFlow(RecompositionMode.Immediate) { - createPresenter(client).present() - }.test { + createPresenter(client).test { val status = UserStatus(emoji = "💬", text = "In a meeting") awaitItem().eventSink(UserStatusEvent.SetStatus(status)) val newState = awaitItem() @@ -73,9 +63,7 @@ class UserStatusPresenterTest { @Test fun `OpenCustomInput with no existing status uses defaults`() = runTest { - moleculeFlow(RecompositionMode.Immediate) { - createPresenter().present() - }.test { + createPresenter().test { awaitItem().eventSink(UserStatusEvent.OpenCustomInput) val state = awaitItem() val pickerState = state.pickerState as UserStatusPickerState.CustomInput @@ -87,9 +75,7 @@ class UserStatusPresenterTest { @Test fun `OpenCustomInput with existing rawStatus pre-fills values`() = runTest { val client = FakeMatrixClient() - moleculeFlow(RecompositionMode.Immediate) { - createPresenter(client).present() - }.test { + createPresenter(client).test { val status = UserStatus(emoji = "🌴", text = "Away") awaitItem().eventSink(UserStatusEvent.SetStatus(status)) // Single emission: pickerState=Hidden and displayedStatus both set in one recomposition @@ -103,9 +89,7 @@ class UserStatusPresenterTest { @Test fun `UpdateCustomEmoji updates emoji in CustomInput state`() = runTest { - moleculeFlow(RecompositionMode.Immediate) { - createPresenter().present() - }.test { + createPresenter().test { awaitItem().eventSink(UserStatusEvent.OpenCustomInput) awaitItem().eventSink(UserStatusEvent.UpdateCustomEmoji("🚀")) val state = awaitItem() @@ -115,9 +99,7 @@ class UserStatusPresenterTest { @Test fun `CancelCustomInput goes back to Hidden`() = runTest { - moleculeFlow(RecompositionMode.Immediate) { - createPresenter().present() - }.test { + createPresenter().test { awaitItem().eventSink(UserStatusEvent.OpenCustomInput) awaitItem().eventSink(UserStatusEvent.CancelCustomInput) // CustomInput state, fire Cancel assertThat(awaitItem().pickerState).isEqualTo(UserStatusPickerState.Hidden) @@ -127,9 +109,7 @@ class UserStatusPresenterTest { @Test fun `Clear event calls clearUserStatus and clears displayed status`() = runTest { val client = FakeMatrixClient() - moleculeFlow(RecompositionMode.Immediate) { - createPresenter(client).present() - }.test { + createPresenter(client).test { val status = UserStatus(emoji = "☕", text = "Be right back") awaitItem().eventSink(UserStatusEvent.SetStatus(status)) // Single emission: pickerState=Hidden and displayedStatus both set in one recomposition diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index af6762d421..6ddca47bff 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -456,6 +456,7 @@ class RustMatrixClient( displayedStatus = localUserStatus?.let { DisplayedStatus.UserSet(it) }, ) ) + // Also update our session storage sessionStore.updateUserProfile( sessionId = sessionId.value, displayName = matrixUser.displayName,