Provide serverNames when available and fix issue around analytics

This commit is contained in:
Benoit Marty 2024-05-14 11:36:29 +02:00
parent 231f323cb0
commit 22329b9678
42 changed files with 542 additions and 103 deletions

View file

@ -28,7 +28,7 @@ import io.element.android.anvilannotations.ContributesNode
import io.element.android.features.roomaliasesolver.api.RoomAliasResolverEntryPoint
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias
@ContributesNode(SessionScope::class)
class RoomAliasResolverNode @AssistedInject constructor(
@ -42,8 +42,8 @@ class RoomAliasResolverNode @AssistedInject constructor(
inputs.roomAlias
)
private fun onAliasResolved(roomId: RoomId) {
plugins<RoomAliasResolverEntryPoint.Callback>().forEach { it.onAliasResolved(roomId) }
private fun onAliasResolved(data: ResolvedRoomAlias) {
plugins<RoomAliasResolverEntryPoint.Callback>().forEach { it.onAliasResolved(data) }
}
@Composable

View file

@ -29,7 +29,7 @@ import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.architecture.runCatchingUpdatingState
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomAlias
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
@ -46,7 +46,7 @@ class RoomAliasResolverPresenter @AssistedInject constructor(
@Composable
override fun present(): RoomAliasResolverState {
val coroutineScope = rememberCoroutineScope()
val resolveState: MutableState<AsyncData<RoomId>> = remember { mutableStateOf(AsyncData.Uninitialized) }
val resolveState: MutableState<AsyncData<ResolvedRoomAlias>> = remember { mutableStateOf(AsyncData.Uninitialized) }
LaunchedEffect(Unit) {
resolveAlias(resolveState)
}
@ -64,7 +64,7 @@ class RoomAliasResolverPresenter @AssistedInject constructor(
)
}
private fun CoroutineScope.resolveAlias(resolveState: MutableState<AsyncData<RoomId>>) = launch {
private fun CoroutineScope.resolveAlias(resolveState: MutableState<AsyncData<ResolvedRoomAlias>>) = launch {
suspend {
matrixClient.resolveRoomAlias(roomAlias).getOrThrow()
}.runCatchingUpdatingState(resolveState)

View file

@ -19,11 +19,11 @@ package io.element.android.features.roomaliasresolver.impl
import androidx.compose.runtime.Immutable
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.matrix.api.core.RoomAlias
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias
@Immutable
data class RoomAliasResolverState(
val roomAlias: RoomAlias,
val resolveState: AsyncData<RoomId>,
val resolveState: AsyncData<ResolvedRoomAlias>,
val eventSink: (RoomAliasResolverEvents) -> Unit
)

View file

@ -19,7 +19,7 @@ package io.element.android.features.roomaliasresolver.impl
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.matrix.api.core.RoomAlias
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias
open class RoomAliasResolverStateProvider : PreviewParameterProvider<RoomAliasResolverState> {
override val values: Sequence<RoomAliasResolverState>
@ -36,7 +36,7 @@ open class RoomAliasResolverStateProvider : PreviewParameterProvider<RoomAliasRe
fun aRoomAliasResolverState(
roomAlias: RoomAlias = A_ROOM_ALIAS,
resolveState: AsyncData<RoomId> = AsyncData.Uninitialized,
resolveState: AsyncData<ResolvedRoomAlias> = AsyncData.Uninitialized,
eventSink: (RoomAliasResolverEvents) -> Unit = {}
) = RoomAliasResolverState(
roomAlias = roomAlias,

View file

@ -49,14 +49,14 @@ import io.element.android.libraries.designsystem.theme.components.ButtonSize
import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias
import io.element.android.libraries.ui.strings.CommonStrings
@Composable
fun RoomAliasResolverView(
state: RoomAliasResolverState,
onBackPressed: () -> Unit,
onAliasResolved: (RoomId) -> Unit,
onAliasResolved: (ResolvedRoomAlias) -> Unit,
modifier: Modifier = Modifier,
) {
val latestOnAliasResolved by rememberUpdatedState(onAliasResolved)

View file

@ -22,9 +22,12 @@ import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomAlias
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias
import io.element.android.libraries.matrix.test.AN_EXCEPTION
import io.element.android.libraries.matrix.test.A_ROOM_ALIAS
import io.element.android.libraries.matrix.test.A_ROOM_ID
import io.element.android.libraries.matrix.test.A_SERVER_LIST
import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.tests.testutils.WarmUpRule
import kotlinx.coroutines.test.runTest
@ -48,8 +51,9 @@ class RoomAliasResolverPresenterTest {
@Test
fun `present - resolve alias to roomId`() = runTest {
val result = aResolvedRoomAlias()
val client = FakeMatrixClient(
resolveRoomAliasResult = { Result.success(A_ROOM_ID) }
resolveRoomAliasResult = { Result.success(result) }
)
val presenter = createPresenter(matrixClient = client)
moleculeFlow(RecompositionMode.Immediate) {
@ -59,7 +63,7 @@ class RoomAliasResolverPresenterTest {
assertThat(awaitItem().resolveState.isLoading()).isTrue()
val resultState = awaitItem()
assertThat(resultState.roomAlias).isEqualTo(A_ROOM_ALIAS)
assertThat(resultState.resolveState.dataOrNull()).isEqualTo(A_ROOM_ID)
assertThat(resultState.resolveState.dataOrNull()).isEqualTo(result)
}
}
@ -92,3 +96,11 @@ class RoomAliasResolverPresenterTest {
matrixClient = matrixClient,
)
}
internal fun aResolvedRoomAlias(
roomId: RoomId = A_ROOM_ID,
servers: List<String> = A_SERVER_LIST,
) = ResolvedRoomAlias(
roomId = roomId,
servers = servers,
)

View file

@ -21,8 +21,7 @@ import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.test.A_ROOM_ID
import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.tests.testutils.EnsureNeverCalled
import io.element.android.tests.testutils.EnsureNeverCalledWithParam
@ -69,11 +68,12 @@ class RoomAliasResolverViewTest {
@Test
fun `success state invokes the expected Callback`() {
val result = aResolvedRoomAlias()
val eventsRecorder = EventsRecorder<RoomAliasResolverEvents>(expectEvents = false)
ensureCalledOnceWithParam(A_ROOM_ID) {
ensureCalledOnceWithParam(result) {
rule.setRoomAliasResolverView(
aRoomAliasResolverState(
resolveState = AsyncData.Success(A_ROOM_ID),
resolveState = AsyncData.Success(result),
eventSink = eventsRecorder,
),
onAliasResolved = it,
@ -85,7 +85,7 @@ class RoomAliasResolverViewTest {
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setRoomAliasResolverView(
state: RoomAliasResolverState,
onBackPressed: () -> Unit = EnsureNeverCalled(),
onAliasResolved: (RoomId) -> Unit = EnsureNeverCalledWithParam(),
onAliasResolved: (ResolvedRoomAlias) -> Unit = EnsureNeverCalledWithParam(),
) {
setContent {
RoomAliasResolverView(