11package jp.co.soramitsu.app.root.navigation
22
3+ import android.os.Bundle
4+ import androidx.appcompat.app.AppCompatActivity
35import androidx.navigation.NavController
6+ import androidx.navigation.NavOptions
47import jp.co.soramitsu.app.R
58import jp.co.soramitsu.app.root.presentation.RootRouter
9+ import jp.co.soramitsu.common.navigation.DelayedNavigation
610import jp.co.soramitsu.common.utils.postToUiThread
711import jp.co.soramitsu.feature_account_api.domain.model.Node
812import jp.co.soramitsu.feature_account_impl.presentation.AccountRouter
@@ -19,6 +23,7 @@ import jp.co.soramitsu.feature_account_impl.presentation.mnemonic.confirm.Confir
1923import jp.co.soramitsu.feature_account_impl.presentation.node.details.NodeDetailsFragment
2024import jp.co.soramitsu.feature_account_impl.presentation.pincode.PinCodeAction
2125import jp.co.soramitsu.feature_account_impl.presentation.pincode.PincodeFragment
26+ import jp.co.soramitsu.feature_account_impl.presentation.pincode.ToolbarConfiguration
2227import jp.co.soramitsu.feature_onboarding_impl.OnboardingRouter
2328import jp.co.soramitsu.feature_onboarding_impl.presentation.create.CreateAccountFragment
2429import jp.co.soramitsu.feature_onboarding_impl.presentation.welcome.WelcomeFragment
@@ -31,35 +36,36 @@ import jp.co.soramitsu.feature_wallet_impl.presentation.send.amount.ChooseAmount
3136import jp.co.soramitsu.feature_wallet_impl.presentation.send.confirm.ConfirmTransferFragment
3237import jp.co.soramitsu.feature_wallet_impl.presentation.transaction.detail.TransactionDetailFragment
3338import jp.co.soramitsu.splash.SplashRouter
39+ import kotlinx.android.parcel.Parcelize
40+
41+ @Parcelize
42+ class NavComponentDelayedNavigation (val globalActionId : Int , val extras : Bundle ? = null ) : DelayedNavigation
3443
3544class Navigator : SplashRouter , OnboardingRouter , AccountRouter , WalletRouter , RootRouter {
3645
3746 private var navController: NavController ? = null
47+ private var activity: AppCompatActivity ? = null
3848
39- fun attachNavController (navController : NavController ) {
49+ fun attach (navController : NavController , activity : AppCompatActivity ) {
4050 this .navController = navController
51+ this .activity = activity
4152 }
4253
43- override fun openAddFirstAccount () {
44- navController?.navigate(R .id.action_splash_to_onboarding, WelcomeFragment .getBundle(false ))
54+ fun detach () {
55+ navController = null
56+ activity = null
4557 }
4658
47- override fun openCreatePin () {
48- val action = PinCodeAction .Create (R .id.action_open_main)
49- val bundle = PincodeFragment .getPinCodeBundle(action)
50- navController?.navigate(R .id.action_splash_to_pin, bundle)
59+ override fun openAddFirstAccount () {
60+ navController?.navigate(R .id.action_splash_to_onboarding, WelcomeFragment .getBundle(false ))
5161 }
5262
53- override fun openCheckPin () {
54- val action = PinCodeAction .Check (R .id.action_open_main)
63+ override fun openInitialCheckPincode () {
64+ val action = PinCodeAction .Check (NavComponentDelayedNavigation ( R .id.action_open_main), ToolbarConfiguration () )
5565 val bundle = PincodeFragment .getPinCodeBundle(action)
5666 navController?.navigate(R .id.action_splash_to_pin, bundle)
5767 }
5868
59- override fun openMainScreen () {
60- navController?.navigate(R .id.action_splash_to_main)
61- }
62-
6369 override fun openCreateAccount (selectedNetworkType : Node .NetworkType ? ) {
6470 navController?.navigate(R .id.action_welcomeFragment_to_createAccountFragment, CreateAccountFragment .getBundle(selectedNetworkType))
6571 }
@@ -72,14 +78,25 @@ class Navigator : SplashRouter, OnboardingRouter, AccountRouter, WalletRouter, R
7278 navController?.navigate(R .id.action_open_main)
7379 }
7480
75- override fun openDestination (destination : Int ) {
76- navController?.navigate(destination)
81+ override fun openAfterPinCode (delayedNavigation : DelayedNavigation ) {
82+ require(delayedNavigation is NavComponentDelayedNavigation )
83+
84+ val navOptions = NavOptions .Builder ()
85+ .setPopUpTo(R .id.pincodeFragment, true )
86+ .setEnterAnim(R .anim.fragment_open_enter)
87+ .setExitAnim(R .anim.fragment_open_exit)
88+ .setPopEnterAnim(R .anim.fragment_close_enter)
89+ .setPopExitAnim(R .anim.fragment_close_exit)
90+ .build()
91+
92+ navController?.navigate(delayedNavigation.globalActionId, delayedNavigation.extras, navOptions)
7793 }
7894
7995 override fun openCreatePincode () {
80- val action = PinCodeAction . Create ( R .id.action_open_main )
81- val bundle = PincodeFragment .getPinCodeBundle(action)
96+ val bundle = buildCreatePinBundle( )
97+
8298 when (navController?.currentDestination?.id) {
99+ R .id.splashFragment -> navController?.navigate(R .id.action_splash_to_pin, bundle)
83100 R .id.importAccountFragment -> navController?.navigate(R .id.action_importAccountFragment_to_pincodeFragment, bundle)
84101 R .id.confirmMnemonicFragment -> navController?.navigate(R .id.action_confirmMnemonicFragment_to_pincodeFragment, bundle)
85102 }
@@ -128,7 +145,11 @@ class Navigator : SplashRouter, OnboardingRouter, AccountRouter, WalletRouter, R
128145 }
129146
130147 override fun back () {
131- navController?.navigateUp()
148+ val popped = navController!! .popBackStack()
149+
150+ if (! popped) {
151+ activity!! .finish()
152+ }
132153 }
133154
134155 override fun openChooseRecipient () {
@@ -222,16 +243,16 @@ class Navigator : SplashRouter, OnboardingRouter, AccountRouter, WalletRouter, R
222243 navController?.navigate(R .id.action_nodes_to_onboarding, WelcomeFragment .getBundleWithNetworkType(true , networkType))
223244 }
224245
225- override fun openExportMnemonic (accountAddress : String ) {
246+ override fun openExportMnemonic (accountAddress : String ): DelayedNavigation {
226247 val extras = ExportMnemonicFragment .getBundle(accountAddress)
227248
228- navController?.navigate (R .id.action_accountDetailsFragment_to_exportMnemonicFragment , extras)
249+ return NavComponentDelayedNavigation (R .id.action_export_mnemonic , extras)
229250 }
230251
231- override fun openExportSeed (accountAddress : String ) {
252+ override fun openExportSeed (accountAddress : String ): DelayedNavigation {
232253 val extras = ExportSeedFragment .getBundle(accountAddress)
233254
234- navController?.navigate (R .id.action_accountDetailsFragment_to_exportSeedFragment , extras)
255+ return NavComponentDelayedNavigation (R .id.action_export_seed , extras)
235256 }
236257
237258 override fun openConfirmMnemonicOnExport (mnemonic : List <String >) {
@@ -240,10 +261,10 @@ class Navigator : SplashRouter, OnboardingRouter, AccountRouter, WalletRouter, R
240261 navController?.navigate(R .id.action_exportMnemonicFragment_to_confirmExportMnemonicFragment, extras)
241262 }
242263
243- override fun openExportJsonPassword (accountAddress : String ) {
264+ override fun openExportJsonPassword (accountAddress : String ): DelayedNavigation {
244265 val extras = ExportJsonPasswordFragment .getBundle(accountAddress)
245266
246- navController?.navigate (R .id.action_accountDetailsFragment_to_exportJsonPasswordFragment , extras)
267+ return NavComponentDelayedNavigation (R .id.action_export_json , extras)
247268 }
248269
249270 override fun openExportJsonConfirm (payload : ExportJsonConfirmPayload ) {
@@ -261,4 +282,26 @@ class Navigator : SplashRouter, OnboardingRouter, AccountRouter, WalletRouter, R
261282 val bundle = PincodeFragment .getPinCodeBundle(action)
262283 navController?.navigate(R .id.action_mainFragment_to_pinCodeFragment, bundle)
263284 }
264- }
285+
286+ override fun withPinCodeCheckRequired (
287+ delayedNavigation : DelayedNavigation ,
288+ createMode : Boolean ,
289+ pinCodeTitleRes : Int?
290+ ) {
291+ val action = if (createMode) {
292+ PinCodeAction .Create (delayedNavigation)
293+ } else {
294+ PinCodeAction .Check (delayedNavigation, ToolbarConfiguration (pinCodeTitleRes, true ))
295+ }
296+
297+ val extras = PincodeFragment .getPinCodeBundle(action)
298+
299+ navController?.navigate(R .id.open_pincode_check, extras)
300+ }
301+
302+ private fun buildCreatePinBundle (): Bundle {
303+ val delayedNavigation = NavComponentDelayedNavigation (R .id.action_open_main)
304+ val action = PinCodeAction .Create (delayedNavigation)
305+ return PincodeFragment .getPinCodeBundle(action)
306+ }
307+ }
0 commit comments