From 2cb0addd3e01b00c21e2bb7b8447a5ab4e1e262e Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 25 Oct 2023 11:27:19 +0200 Subject: [PATCH] PIN: add callback on LockScreenEntryPoint --- .../features/ftue/impl/FtueFlowNode.kt | 6 +++++ .../lockscreen/api/LockScreenEntryPoint.kt | 6 +++++ .../impl/DefaultLockScreenEntryPoint.kt | 10 +++++++- .../lockscreen/impl/LockScreenFlowNode.kt | 25 +++++++++++++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt index a8206ed927..ab5d163e60 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt @@ -145,7 +145,13 @@ class FtueFlowNode @AssistedInject constructor( analyticsEntryPoint.createNode(this, buildContext) } NavTarget.LockScreenSetup -> { + val callback = object : LockScreenEntryPoint.Callback { + override fun onSetupCompleted() { + lifecycleScope.launch { moveToNextStep() } + } + } lockScreenEntryPoint.nodeBuilder(this, buildContext) + .callback(callback) .target(LockScreenEntryPoint.Target.Setup) .build() } diff --git a/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt b/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt index fce3706dce..f63757717e 100644 --- a/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt +++ b/features/lockscreen/api/src/main/kotlin/io/element/android/features/lockscreen/api/LockScreenEntryPoint.kt @@ -18,6 +18,7 @@ package io.element.android.features.lockscreen.api import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin import io.element.android.libraries.architecture.FeatureEntryPoint interface LockScreenEntryPoint : FeatureEntryPoint { @@ -25,10 +26,15 @@ interface LockScreenEntryPoint : FeatureEntryPoint { fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder interface NodeBuilder { + fun callback(callback: Callback): NodeBuilder fun target(target: Target): NodeBuilder fun build(): Node } + interface Callback: Plugin { + fun onSetupCompleted() + } + enum class Target { Settings, Setup, diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt index 289f11113a..67182e4fff 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenEntryPoint.kt @@ -30,8 +30,15 @@ class DefaultLockScreenEntryPoint @Inject constructor() : LockScreenEntryPoint { override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): LockScreenEntryPoint.NodeBuilder { var innerTarget: LockScreenEntryPoint.Target = LockScreenEntryPoint.Target.Unlock + val callbacks = mutableListOf() return object : LockScreenEntryPoint.NodeBuilder { + + override fun callback(callback: LockScreenEntryPoint.Callback): LockScreenEntryPoint.NodeBuilder { + callbacks += callback + return this + } + override fun target(target: LockScreenEntryPoint.Target): LockScreenEntryPoint.NodeBuilder { innerTarget = target return this @@ -45,7 +52,8 @@ class DefaultLockScreenEntryPoint @Inject constructor() : LockScreenEntryPoint { LockScreenEntryPoint.Target.Settings -> LockScreenFlowNode.NavTarget.Settings } ) - return parentNode.createNode(buildContext, listOf(inputs)) + val plugins = listOf(inputs) + callbacks + return parentNode.createNode(buildContext, plugins) } } } diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/LockScreenFlowNode.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/LockScreenFlowNode.kt index 31a11d06d7..e10ca406fb 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/LockScreenFlowNode.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/LockScreenFlowNode.kt @@ -20,13 +20,17 @@ import android.os.Parcelable import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.bumble.appyx.core.composable.Children +import com.bumble.appyx.core.lifecycle.subscribe 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 dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode +import io.element.android.features.lockscreen.api.LockScreenEntryPoint +import io.element.android.features.lockscreen.impl.pin.PinCodeManager import io.element.android.features.lockscreen.impl.settings.LockScreenSettingsFlowNode import io.element.android.features.lockscreen.impl.setup.SetupPinNode import io.element.android.features.lockscreen.impl.unlock.PinUnlockNode @@ -41,6 +45,7 @@ import kotlinx.parcelize.Parcelize class LockScreenFlowNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, + private val pinCodeManager: PinCodeManager, ) : BackstackNode( backstack = BackStack( initialElement = plugins.filterIsInstance(Inputs::class.java).first().initialNavTarget, @@ -65,6 +70,26 @@ class LockScreenFlowNode @AssistedInject constructor( data object Settings : NavTarget } + private val pinCodeManagerCallback = object : PinCodeManager.Callback { + override fun onPinCodeCreated() { + plugins().forEach { + it.onSetupCompleted() + } + } + } + + override fun onBuilt() { + super.onBuilt() + lifecycle.subscribe( + onCreate = { + pinCodeManager.addCallback(pinCodeManagerCallback) + }, + onDestroy = { + pinCodeManager.removeCallback(pinCodeManagerCallback) + } + ) + } + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { NavTarget.Unlock -> {