Merge pull request #5614 from element-hq/feature/fga/space_flow_inject_room

Misc : space flow inject room
This commit is contained in:
ganfra 2025-10-28 10:05:04 +01:00 committed by GitHub
commit 83d8151012
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
29 changed files with 163 additions and 74 deletions

View file

@ -31,12 +31,12 @@ import io.element.android.libraries.architecture.BaseFlowNode
import io.element.android.libraries.architecture.createNode
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.di.DependencyInjectionGraphOwner
import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.di.RoomScope
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.spaces.SpaceService
import kotlinx.parcelize.Parcelize
@ContributesNode(SessionScope::class)
@ContributesNode(RoomScope::class)
@AssistedInject
class SpaceFlowNode(
@Assisted val buildContext: BuildContext,
@ -84,6 +84,10 @@ class SpaceFlowNode(
callback.onOpenRoom(roomId, viaParameters)
}
override fun onOpenDetails() {
callback.onOpenDetails()
}
override fun onLeaveSpace() {
backstack.push(NavTarget.Leave)
}

View file

@ -11,12 +11,12 @@ import dev.zacsweers.metro.ContributesTo
import dev.zacsweers.metro.GraphExtension
import dev.zacsweers.metro.Provides
import io.element.android.libraries.architecture.NodeFactoriesBindings
import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.di.RoomScope
import io.element.android.libraries.matrix.api.spaces.SpaceRoomList
@GraphExtension(SpaceFlowScope::class)
interface SpaceFlowGraph : NodeFactoriesBindings {
@ContributesTo(SessionScope::class)
@ContributesTo(RoomScope::class)
@GraphExtension.Factory
interface Factory {
fun create(@Provides spaceRoomList: SpaceRoomList): SpaceFlowGraph

View file

@ -41,6 +41,7 @@ class SpaceNode(
) : Node(buildContext, plugins = plugins) {
interface Callback : Plugin {
fun onOpenRoom(roomId: RoomId, viaParameters: List<String>)
fun onOpenDetails()
fun onLeaveSpace()
}
@ -76,6 +77,9 @@ class SpaceNode(
onRoomClick = { spaceRoom ->
callback.onOpenRoom(spaceRoom.roomId, spaceRoom.via)
},
onDetailsClick = {
callback.onOpenDetails()
},
onShareSpace = {
onShareRoom(context)
},

View file

@ -7,6 +7,7 @@
package io.element.android.features.space.impl.root
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
@ -15,6 +16,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -25,6 +27,7 @@ import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.heading
import androidx.compose.ui.semantics.semantics
@ -74,6 +77,7 @@ fun SpaceView(
onRoomClick: (spaceRoom: SpaceRoom) -> Unit,
onShareSpace: () -> Unit,
onLeaveSpaceClick: () -> Unit,
onDetailsClick: () -> Unit,
modifier: Modifier = Modifier,
acceptDeclineInviteView: @Composable () -> Unit,
) {
@ -85,6 +89,7 @@ fun SpaceView(
onBackClick = onBackClick,
onLeaveSpaceClick = onLeaveSpaceClick,
onShareSpace = onShareSpace,
onDetailsClick = onDetailsClick
)
},
content = { padding ->
@ -249,6 +254,7 @@ private fun SpaceViewTopBar(
currentSpace: SpaceRoom?,
onBackClick: () -> Unit,
onLeaveSpaceClick: () -> Unit,
onDetailsClick: () -> Unit,
onShareSpace: () -> Unit,
modifier: Modifier = Modifier,
) {
@ -259,9 +265,14 @@ private fun SpaceViewTopBar(
},
title = {
if (currentSpace != null) {
val roundedCornerShape = RoundedCornerShape(8.dp)
SpaceAvatarAndNameRow(
name = currentSpace.displayName,
avatarData = currentSpace.getAvatarData(AvatarSize.TimelineRoom),
modifier = Modifier
.clip(roundedCornerShape)
// TODO enable when screen ready for space
.clickable(enabled = false, onClick = onDetailsClick)
)
}
},
@ -391,6 +402,7 @@ internal fun SpaceViewPreview(
onShareSpace = {},
onLeaveSpaceClick = {},
acceptDeclineInviteView = {},
onDetailsClick = {},
onBackClick = {},
)
}

View file

@ -45,6 +45,7 @@ class DefaultSpaceEntryPointTest {
}
val callback = object : SpaceEntryPoint.Callback {
override fun onOpenRoom(roomId: RoomId, viaParameters: List<String>) = lambdaError()
override fun onOpenDetails() = lambdaError()
}
val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null))
.inputs(nodeInputs)

View file

@ -139,6 +139,7 @@ private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setSpace
onRoomClick: (SpaceRoom) -> Unit = EnsureNeverCalledWithParam(),
onShareSpace: () -> Unit = EnsureNeverCalled(),
onLeaveSpaceClick: () -> Unit = EnsureNeverCalled(),
onDetailsClick: () -> Unit = EnsureNeverCalled(),
acceptDeclineInviteView: @Composable () -> Unit = {},
) {
setContent {
@ -148,6 +149,7 @@ private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setSpace
onRoomClick = onRoomClick,
onShareSpace = onShareSpace,
onLeaveSpaceClick = onLeaveSpaceClick,
onDetailsClick = onDetailsClick,
acceptDeclineInviteView = acceptDeclineInviteView,
)
}