From f05a00b9b3da95b7e7cfcf8eecf84b1e3fe4004e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 21 Nov 2025 15:13:23 +0100 Subject: [PATCH] Avoid using navigateUp. --- .../preferences/impl/PreferencesFlowNode.kt | 4 +++- .../user/editprofile/EditUserProfileNode.kt | 8 ++++---- .../architecture/navigation/BaseCallback.kt | 17 +++++++++++++++++ .../architecture/navigation/BaseNavigator.kt | 3 +++ 4 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/navigation/BaseCallback.kt diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt index bd43736cbd..5d4e55e888 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt @@ -40,6 +40,7 @@ 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.architecture.navigation.BaseCallback import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId @@ -267,7 +268,8 @@ class PreferencesFlowNode( } is NavTarget.UserProfile -> { val inputs = EditUserProfileNode.Inputs(navTarget.matrixUser) - createNode(buildContext, listOf(inputs)) + val callback = BaseCallback { backstack.pop() } + createNode(buildContext, listOf(inputs, callback)) } NavTarget.LockScreenSettings -> { lockScreenEntryPoint.createNode( diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileNode.kt index 3d939cfbd4..dcbdc14031 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileNode.kt @@ -17,7 +17,9 @@ import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.inputs +import io.element.android.libraries.architecture.navigation.BaseCallback import io.element.android.libraries.architecture.navigation.BaseNavigator import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.user.MatrixUser @@ -35,6 +37,7 @@ class EditUserProfileNode( ) : NodeInputs val matrixUser = inputs().matrixUser + val callback: BaseCallback = callback() val presenter = presenterFactory.create( matrixUser = matrixUser, navigator = this, @@ -50,8 +53,5 @@ class EditUserProfileNode( ) } - override fun close() { - // TODO Invoke callback - navigateUp() - } + override fun close() = callback.onDone() } diff --git a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/navigation/BaseCallback.kt b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/navigation/BaseCallback.kt new file mode 100644 index 0000000000..13b102b46d --- /dev/null +++ b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/navigation/BaseCallback.kt @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2025 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.libraries.architecture.navigation + +import com.bumble.appyx.core.plugin.Plugin + +/** + * Base callback interface to be implemented by callers to handle results from nodes. + */ +fun interface BaseCallback : Plugin { + fun onDone() +} diff --git a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/navigation/BaseNavigator.kt b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/navigation/BaseNavigator.kt index 5cc61166fe..e5dec55c89 100644 --- a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/navigation/BaseNavigator.kt +++ b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/navigation/BaseNavigator.kt @@ -7,6 +7,9 @@ package io.element.android.libraries.architecture.navigation +/** + * Base navigator interface to be implemented by nodes to handle navigation actions from presenters. + */ fun interface BaseNavigator { fun close() }