Ensure a Callback and only one is provided in the Plugin. Also reduce boilerplate code in Nodes.

This commit is contained in:
Benoit Marty 2025-10-30 09:14:41 +01:00 committed by Benoit Marty
parent 596b7f00fc
commit 5197154f54
76 changed files with 374 additions and 741 deletions

View file

@ -13,10 +13,10 @@ import androidx.compose.ui.Modifier
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin
import com.bumble.appyx.core.plugin.plugins
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedInject
import io.element.android.annotations.ContributesNode
import io.element.android.libraries.architecture.callback
import io.element.android.libraries.di.RoomScope
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.mediaviewer.impl.gallery.di.LocalMediaItemPresenterFactories
@ -43,28 +43,14 @@ class MediaGalleryNode(
fun forward(eventId: EventId)
}
private fun onBackClick() {
plugins<Callback>().forEach {
it.onBackClick()
}
}
private val callback: Callback = callback()
override fun onViewInTimelineClick(eventId: EventId) {
plugins<Callback>().forEach {
it.viewInTimeline(eventId)
}
callback.viewInTimeline(eventId)
}
override fun onForwardClick(eventId: EventId) {
plugins<Callback>().forEach {
it.forward(eventId)
}
}
private fun onItemClick(item: MediaItem.Event) {
plugins<Callback>().forEach {
it.showItem(item)
}
callback.forward(eventId)
}
@Composable
@ -75,8 +61,8 @@ class MediaGalleryNode(
val state = presenter.present()
MediaGalleryView(
state = state,
onBackClick = ::onBackClick,
onItemClick = ::onItemClick,
onBackClick = callback::onBackClick,
onItemClick = callback::showItem,
modifier = modifier,
)
}

View file

@ -13,13 +13,13 @@ import androidx.compose.ui.Modifier
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin
import com.bumble.appyx.core.plugin.plugins
import com.bumble.appyx.navmodel.backstack.BackStack
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedInject
import io.element.android.annotations.ContributesNode
import io.element.android.libraries.architecture.BackstackWithOverlayBox
import io.element.android.libraries.architecture.BaseFlowNode
import io.element.android.libraries.architecture.callback
import io.element.android.libraries.architecture.createNode
import io.element.android.libraries.architecture.overlay.Overlay
import io.element.android.libraries.architecture.overlay.operation.hide
@ -70,38 +70,22 @@ class MediaGalleryFlowNode(
) : NavTarget
}
private fun onBackClick() {
plugins<MediaGalleryEntryPoint.Callback>().forEach {
it.onBackClick()
}
}
private fun onViewInTimeline(eventId: EventId) {
plugins<MediaGalleryEntryPoint.Callback>().forEach {
it.viewInTimeline(eventId)
}
}
private fun forwardEvent(eventId: EventId) {
plugins<MediaGalleryEntryPoint.Callback>().forEach {
it.forward(eventId)
}
}
private val callback: MediaGalleryEntryPoint.Callback = callback()
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
return when (navTarget) {
NavTarget.Root -> {
val callback = object : MediaGalleryNode.Callback {
override fun onBackClick() {
this@MediaGalleryFlowNode.onBackClick()
callback.onBackClick()
}
override fun viewInTimeline(eventId: EventId) {
this@MediaGalleryFlowNode.onViewInTimeline(eventId)
callback.viewInTimeline(eventId)
}
override fun forward(eventId: EventId) {
forwardEvent(eventId)
callback.forward(eventId)
}
override fun showItem(item: MediaItem.Event) {
@ -132,12 +116,12 @@ class MediaGalleryFlowNode(
}
override fun viewInTimeline(eventId: EventId) {
this@MediaGalleryFlowNode.onViewInTimeline(eventId)
callback.viewInTimeline(eventId)
}
override fun forwardEvent(eventId: EventId) {
// Need to go to the parent because of the overlay
this@MediaGalleryFlowNode.forwardEvent(eventId)
callback.forward(eventId)
}
}
mediaViewerEntryPoint.nodeBuilder(this, buildContext)

View file

@ -15,7 +15,6 @@ import androidx.compose.ui.Modifier
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin
import com.bumble.appyx.core.plugin.plugins
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedInject
import io.element.android.annotations.ContributesNode
@ -23,6 +22,7 @@ import io.element.android.compound.colors.SemanticColorsLightDark
import io.element.android.compound.theme.ForcedDarkElementTheme
import io.element.android.features.enterprise.api.EnterpriseService
import io.element.android.features.viewfolder.api.TextFileViewer
import io.element.android.libraries.architecture.callback
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.audio.api.AudioFocus
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
@ -57,28 +57,19 @@ class MediaViewerNode(
private val enterpriseService: EnterpriseService,
) : Node(buildContext, plugins = plugins),
MediaViewerNavigator {
private val callback: MediaViewerEntryPoint.Callback = callback()
private val inputs = inputs<MediaViewerEntryPoint.Params>()
private fun onDone() {
plugins<MediaViewerEntryPoint.Callback>().forEach {
it.onDone()
}
}
override fun onViewInTimelineClick(eventId: EventId) {
plugins<MediaViewerEntryPoint.Callback>().forEach {
it.viewInTimeline(eventId)
}
callback.viewInTimeline(eventId)
}
override fun onForwardClick(eventId: EventId) {
plugins<MediaViewerEntryPoint.Callback>().forEach {
it.forwardEvent(eventId)
}
callback.forwardEvent(eventId)
}
override fun onItemDeleted() {
onDone()
callback.onDone()
}
private val mediaGallerySource = if (inputs.mode == MediaViewerEntryPoint.MediaViewerMode.SingleMedia) {
@ -153,7 +144,7 @@ class MediaViewerNode(
textFileViewer = textFileViewer,
modifier = modifier,
audioFocus = audioFocus,
onBackClick = ::onDone,
onBackClick = callback::onDone,
)
}
}