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,7 +13,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 com.bumble.appyx.navmodel.backstack.BackStack
import com.bumble.appyx.navmodel.backstack.operation.pop
import com.bumble.appyx.navmodel.backstack.operation.push
@@ -29,6 +28,7 @@ import io.element.android.features.securebackup.impl.setup.SecureBackupSetupNode
import io.element.android.libraries.architecture.BackstackView
import io.element.android.libraries.architecture.BaseFlowNode
import io.element.android.libraries.architecture.appyx.canPop
import io.element.android.libraries.architecture.callback
import io.element.android.libraries.architecture.createNode
import io.element.android.libraries.di.SessionScope
import kotlinx.parcelize.Parcelize
@@ -71,7 +71,7 @@ class SecureBackupFlowNode(
data object ResetIdentity : NavTarget
}
private val callbacks = plugins<SecureBackupEntryPoint.Callback>()
private val callback: SecureBackupEntryPoint.Callback = callback()
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
return when (navTarget) {
@@ -116,7 +116,7 @@ class SecureBackupFlowNode(
if (backstack.canPop()) {
backstack.pop()
} else {
callbacks.forEach { it.onDone() }
callback.onDone()
}
}
}
@@ -125,7 +125,7 @@ class SecureBackupFlowNode(
is NavTarget.ResetIdentity -> {
val callback = object : ResetIdentityFlowNode.Callback {
override fun onDone() {
callbacks.forEach { it.onDone() }
callback.onDone()
}
}
createNode<ResetIdentityFlowNode>(buildContext, listOf(callback))

View File

@@ -12,10 +12,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.SessionScope
@ContributesNode(SessionScope::class)
@@ -29,7 +29,7 @@ class SecureBackupEnterRecoveryKeyNode(
fun onEnterRecoveryKeySuccess()
}
private val callback = plugins<Callback>().first()
private val callback: Callback = callback()
@Composable
override fun View(modifier: Modifier) {

View File

@@ -20,7 +20,6 @@ import androidx.lifecycle.LifecycleOwner
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 com.bumble.appyx.navmodel.backstack.operation.push
import dev.zacsweers.metro.Assisted
@@ -33,6 +32,7 @@ import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTa
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.architecture.BackstackView
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.designsystem.components.ProgressDialog
import io.element.android.libraries.di.SessionScope
@@ -63,6 +63,8 @@ class ResetIdentityFlowNode(
fun onDone()
}
private val callback: Callback = callback()
sealed interface NavTarget : Parcelable {
@Parcelize
data object Root : NavTarget
@@ -86,7 +88,7 @@ class ResetIdentityFlowNode(
cancelResetJob()
resetIdentityFlowManager.whenResetIsDone {
plugins<Callback>().forEach { it.onDone() }
callback.onDone()
}
}
}

View File

@@ -15,6 +15,7 @@ import com.bumble.appyx.core.plugin.Plugin
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.SessionScope
@ContributesNode(SessionScope::class)
@@ -27,8 +28,8 @@ class ResetIdentityRootNode(
fun onContinue()
}
private val callback: Callback = callback()
private val presenter = ResetIdentityRootPresenter()
private val callback: Callback = plugins.filterIsInstance<Callback>().first()
@Composable
override fun View(modifier: Modifier) {

View File

@@ -14,11 +14,11 @@ import androidx.compose.ui.platform.UriHandler
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.appconfig.LearnMoreConfig
import io.element.android.libraries.architecture.callback
import io.element.android.libraries.di.SessionScope
@ContributesNode(SessionScope::class)
@@ -38,21 +38,7 @@ class SecureBackupRootNode(
fun navigateToEnterRecoveryKey()
}
private fun onSetupClick() {
plugins<Callback>().forEach { it.navigateToSetup() }
}
private fun onChangeClick() {
plugins<Callback>().forEach { it.navigateToChange() }
}
private fun onDisableClick() {
plugins<Callback>().forEach { it.navigateToDisable() }
}
private fun onConfirmRecoveryKeyClick() {
plugins<Callback>().forEach { it.navigateToEnterRecoveryKey() }
}
private val callback: Callback = callback()
private fun onLearnMoreClick(uriHandler: UriHandler) {
uriHandler.openUri(LearnMoreConfig.SECURE_BACKUP_URL)
@@ -65,10 +51,10 @@ class SecureBackupRootNode(
SecureBackupRootView(
state = state,
onBackClick = ::navigateUp,
onSetupClick = ::onSetupClick,
onChangeClick = ::onChangeClick,
onDisableClick = ::onDisableClick,
onConfirmRecoveryKeyClick = ::onConfirmRecoveryKeyClick,
onSetupClick = callback::navigateToSetup,
onChangeClick = callback::navigateToChange,
onDisableClick = callback::navigateToDisable,
onConfirmRecoveryKeyClick = callback::navigateToEnterRecoveryKey,
onLearnMoreClick = { onLearnMoreClick(uriHandler) },
modifier = modifier,
)