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