"Mark as unread" navigate back to the room list.

#6398
This commit is contained in:
Benoit Marty 2026-05-19 18:37:32 +02:00
parent 1261d0ddee
commit afe958601f
7 changed files with 49 additions and 4 deletions

View file

@ -382,6 +382,10 @@ class LoggedInFlowNode(
} }
is NavTarget.Room -> { is NavTarget.Room -> {
val joinedRoomCallback = object : JoinedRoomLoadedFlowNode.Callback { val joinedRoomCallback = object : JoinedRoomLoadedFlowNode.Callback {
override fun onDone() {
backstack.pop()
}
override fun navigateToRoom(roomId: RoomId, serverNames: List<String>, clearBackStack: Boolean) { override fun navigateToRoom(roomId: RoomId, serverNames: List<String>, clearBackStack: Boolean) {
lifecycleScope.launch { lifecycleScope.launch {
attachRoom(roomIdOrAlias = roomId.toRoomIdOrAlias(), serverNames = serverNames, clearBackstack = clearBackStack) attachRoom(roomIdOrAlias = roomId.toRoomIdOrAlias(), serverNames = serverNames, clearBackstack = clearBackStack)

View file

@ -82,6 +82,7 @@ class JoinedRoomLoadedFlowNode(
plugins = plugins, plugins = plugins,
), DependencyInjectionGraphOwner { ), DependencyInjectionGraphOwner {
interface Callback : Plugin { interface Callback : Plugin {
fun onDone()
fun navigateToRoom(roomId: RoomId, serverNames: List<String>, clearBackStack: Boolean = false) fun navigateToRoom(roomId: RoomId, serverNames: List<String>, clearBackStack: Boolean = false)
fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean)
fun navigateToGlobalNotificationSettings() fun navigateToGlobalNotificationSettings()
@ -142,6 +143,10 @@ class JoinedRoomLoadedFlowNode(
private fun createRoomDetailsNode(buildContext: BuildContext, initialTarget: RoomDetailsEntryPoint.InitialTarget): Node { private fun createRoomDetailsNode(buildContext: BuildContext, initialTarget: RoomDetailsEntryPoint.InitialTarget): Node {
val callback = object : RoomDetailsEntryPoint.Callback { val callback = object : RoomDetailsEntryPoint.Callback {
override fun onDone() {
callback.onDone()
}
override fun navigateToGlobalNotificationSettings() { override fun navigateToGlobalNotificationSettings() {
callback.navigateToGlobalNotificationSettings() callback.navigateToGlobalNotificationSettings()
} }

View file

@ -38,6 +38,7 @@ interface RoomDetailsEntryPoint : FeatureEntryPoint {
data class Params(val initialElement: InitialTarget) : NodeInputs data class Params(val initialElement: InitialTarget) : NodeInputs
interface Callback : Plugin { interface Callback : Plugin {
fun onDone()
fun navigateToGlobalNotificationSettings() fun navigateToGlobalNotificationSettings()
fun navigateToDeveloperSettings() fun navigateToDeveloperSettings()
fun navigateToRoom(roomId: RoomId, serverNames: List<String>, clearBackStack: Boolean = false) fun navigateToRoom(roomId: RoomId, serverNames: List<String>, clearBackStack: Boolean = false)

View file

@ -176,6 +176,10 @@ class RoomDetailsFlowNode(
return when (navTarget) { return when (navTarget) {
NavTarget.RoomDetails -> { NavTarget.RoomDetails -> {
val roomDetailsCallback = object : RoomDetailsNode.Callback { val roomDetailsCallback = object : RoomDetailsNode.Callback {
override fun navigateBack() {
callback.onDone()
}
override fun navigateToRoomMemberList() { override fun navigateToRoomMemberList() {
backstack.push(NavTarget.RoomMemberList) backstack.push(NavTarget.RoomMemberList)
} }

View file

@ -0,0 +1,12 @@
/*
* Copyright (c) 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.roomdetails.impl
interface RoomDetailsNavigator {
fun onDone()
}

View file

@ -42,12 +42,13 @@ import io.element.android.libraries.androidutils.R as AndroidUtilsR
class RoomDetailsNode( class RoomDetailsNode(
@Assisted buildContext: BuildContext, @Assisted buildContext: BuildContext,
@Assisted plugins: List<Plugin>, @Assisted plugins: List<Plugin>,
private val presenter: RoomDetailsPresenter, presenterFactory: RoomDetailsPresenter.Factory,
private val room: BaseRoom, private val room: BaseRoom,
private val analyticsService: AnalyticsService, private val analyticsService: AnalyticsService,
private val leaveRoomRenderer: LeaveRoomRenderer, private val leaveRoomRenderer: LeaveRoomRenderer,
) : Node(buildContext, plugins = plugins) { ) : Node(buildContext, plugins = plugins), RoomDetailsNavigator {
interface Callback : Plugin { interface Callback : Plugin {
fun navigateBack()
fun navigateToRoomMemberList() fun navigateToRoomMemberList()
fun navigateToInviteMembers() fun navigateToInviteMembers()
fun navigateToRoomDetailsEdit() fun navigateToRoomDetailsEdit()
@ -65,6 +66,7 @@ class RoomDetailsNode(
fun navigateToSelectNewOwnersWhenLeaving() fun navigateToSelectNewOwnersWhenLeaving()
} }
private val presenter = presenterFactory.create(this)
private val callback: Callback = callback() private val callback: Callback = callback()
init { init {
@ -144,4 +146,8 @@ class RoomDetailsNode(
} }
) )
} }
override fun onDone() {
callback.navigateBack()
}
} }

View file

@ -17,7 +17,9 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.produceState import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import dev.zacsweers.metro.Inject import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedFactory
import dev.zacsweers.metro.AssistedInject
import im.vector.app.features.analytics.plan.Interaction import im.vector.app.features.analytics.plan.Interaction
import io.element.android.features.knockrequests.api.KnockRequestPermissions import io.element.android.features.knockrequests.api.KnockRequestPermissions
import io.element.android.features.knockrequests.api.knockRequestPermissions import io.element.android.features.knockrequests.api.knockRequestPermissions
@ -59,8 +61,9 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@Inject @AssistedInject
class RoomDetailsPresenter( class RoomDetailsPresenter(
@Assisted private val navigator: RoomDetailsNavigator,
private val client: MatrixClient, private val client: MatrixClient,
private val room: JoinedRoom, private val room: JoinedRoom,
private val notificationSettingsService: NotificationSettingsService, private val notificationSettingsService: NotificationSettingsService,
@ -74,6 +77,13 @@ class RoomDetailsPresenter(
private val sessionPreferencesStore: SessionPreferencesStore, private val sessionPreferencesStore: SessionPreferencesStore,
private val notificationCleaner: NotificationCleaner, private val notificationCleaner: NotificationCleaner,
) : Presenter<RoomDetailsState> { ) : Presenter<RoomDetailsState> {
@AssistedFactory
interface Factory {
fun create(
navigator: RoomDetailsNavigator,
): RoomDetailsPresenter
}
@Composable @Composable
override fun present(): RoomDetailsState { override fun present(): RoomDetailsState {
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
@ -278,5 +288,8 @@ class RoomDetailsPresenter(
.onSuccess { .onSuccess {
analyticsService.captureInteraction(name = Interaction.Name.MobileRoomListRoomContextMenuUnreadToggle) analyticsService.captureInteraction(name = Interaction.Name.MobileRoomListRoomContextMenuUnreadToggle)
} }
.onSuccess {
navigator.onDone()
}
} }
} }