Skip to content

Commit 8bf3bd4

Browse files
Merge pull request #121 from soramitsu/rc/1.0.0
Rc/1.0.0
2 parents 4f66a6e + fc6bb9d commit 8bf3bd4

File tree

256 files changed

+5514
-2761
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

256 files changed

+5514
-2761
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@
5151
android:resource="@xml/provider_paths" />
5252
</provider>
5353

54+
<receiver
55+
android:name="jp.co.soramitsu.feature_account_impl.presentation.exporting.json.confirm.ShareCompletedReceiver"
56+
android:enabled="true"
57+
android:exported="false" />
58+
5459
</application>
5560

5661
</manifest>

app/src/main/java/jp/co/soramitsu/app/root/navigation/Navigator.kt

Lines changed: 81 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,23 @@ package jp.co.soramitsu.app.root.navigation
22

33
import androidx.navigation.NavController
44
import jp.co.soramitsu.app.R
5-
import jp.co.soramitsu.feature_account_api.domain.model.CryptoType
5+
import jp.co.soramitsu.app.root.presentation.RootRouter
6+
import jp.co.soramitsu.common.utils.postToUiThread
67
import jp.co.soramitsu.feature_account_api.domain.model.Node
78
import jp.co.soramitsu.feature_account_impl.presentation.AccountRouter
89
import jp.co.soramitsu.feature_account_impl.presentation.account.details.AccountDetailsFragment
10+
import jp.co.soramitsu.feature_account_impl.presentation.exporting.json.confirm.ExportJsonConfirmFragment
11+
import jp.co.soramitsu.feature_account_impl.presentation.exporting.json.confirm.ExportJsonConfirmPayload
12+
import jp.co.soramitsu.feature_account_impl.presentation.exporting.json.password.ExportJsonPasswordFragment
13+
import jp.co.soramitsu.feature_account_impl.presentation.exporting.mnemonic.ExportMnemonicFragment
14+
import jp.co.soramitsu.feature_account_impl.presentation.exporting.seed.ExportSeedFragment
915
import jp.co.soramitsu.feature_account_impl.presentation.importing.ImportAccountFragment
1016
import jp.co.soramitsu.feature_account_impl.presentation.mnemonic.backup.BackupMnemonicFragment
1117
import jp.co.soramitsu.feature_account_impl.presentation.mnemonic.confirm.ConfirmMnemonicFragment
18+
import jp.co.soramitsu.feature_account_impl.presentation.mnemonic.confirm.ConfirmMnemonicPayload
1219
import jp.co.soramitsu.feature_account_impl.presentation.node.details.NodeDetailsFragment
20+
import jp.co.soramitsu.feature_account_impl.presentation.pincode.PinCodeAction
21+
import jp.co.soramitsu.feature_account_impl.presentation.pincode.PincodeFragment
1322
import jp.co.soramitsu.feature_onboarding_impl.OnboardingRouter
1423
import jp.co.soramitsu.feature_onboarding_impl.presentation.create.CreateAccountFragment
1524
import jp.co.soramitsu.feature_onboarding_impl.presentation.welcome.WelcomeFragment
@@ -23,7 +32,7 @@ import jp.co.soramitsu.feature_wallet_impl.presentation.send.confirm.ConfirmTran
2332
import jp.co.soramitsu.feature_wallet_impl.presentation.transaction.detail.TransactionDetailFragment
2433
import jp.co.soramitsu.splash.SplashRouter
2534

26-
class Navigator : SplashRouter, OnboardingRouter, AccountRouter, WalletRouter {
35+
class Navigator : SplashRouter, OnboardingRouter, AccountRouter, WalletRouter, RootRouter {
2736

2837
private var navController: NavController? = null
2938

@@ -35,8 +44,16 @@ class Navigator : SplashRouter, OnboardingRouter, AccountRouter, WalletRouter {
3544
navController?.navigate(R.id.action_splash_to_onboarding, WelcomeFragment.getBundle(false))
3645
}
3746

38-
override fun openPin() {
39-
navController?.navigate(R.id.action_splash_to_pin)
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)
51+
}
52+
53+
override fun openCheckPin() {
54+
val action = PinCodeAction.Check(R.id.action_open_main)
55+
val bundle = PincodeFragment.getPinCodeBundle(action)
56+
navController?.navigate(R.id.action_splash_to_pin, bundle)
4057
}
4158

4259
override fun openMainScreen() {
@@ -55,27 +72,22 @@ class Navigator : SplashRouter, OnboardingRouter, AccountRouter, WalletRouter {
5572
navController?.navigate(R.id.action_open_main)
5673
}
5774

75+
override fun openDestination(destination: Int) {
76+
navController?.navigate(destination)
77+
}
78+
5879
override fun openCreatePincode() {
80+
val action = PinCodeAction.Create(R.id.action_open_main)
81+
val bundle = PincodeFragment.getPinCodeBundle(action)
5982
when (navController?.currentDestination?.id) {
60-
R.id.importAccountFragment -> navController?.navigate(R.id.action_importAccountFragment_to_pincodeFragment)
61-
R.id.confirmMnemonicFragment -> navController?.navigate(R.id.action_confirmMnemonicFragment_to_pincodeFragment)
83+
R.id.importAccountFragment -> navController?.navigate(R.id.action_importAccountFragment_to_pincodeFragment, bundle)
84+
R.id.confirmMnemonicFragment -> navController?.navigate(R.id.action_confirmMnemonicFragment_to_pincodeFragment, bundle)
6285
}
6386
}
6487

65-
override fun openConfirmMnemonicScreen(
66-
accountName: String,
67-
mnemonic: List<String>,
68-
cryptoType: CryptoType,
69-
node: Node,
70-
derivationPath: String
71-
) {
72-
val bundle = ConfirmMnemonicFragment.getBundle(
73-
accountName,
74-
mnemonic,
75-
cryptoType,
76-
node,
77-
derivationPath
78-
)
88+
override fun openConfirmMnemonicOnCreate(confirmMnemonicPayload: ConfirmMnemonicPayload) {
89+
val bundle = ConfirmMnemonicFragment.getBundle(confirmMnemonicPayload)
90+
7991
navController?.navigate(
8092
R.id.action_backupMnemonicFragment_to_confirmMnemonicFragment,
8193
bundle
@@ -171,6 +183,13 @@ class Navigator : SplashRouter, OnboardingRouter, AccountRouter, WalletRouter {
171183
navController?.navigate(R.id.action_open_receive)
172184
}
173185

186+
override fun returnToMain() {
187+
// to achieve smooth animation
188+
postToUiThread {
189+
navController?.navigate(R.id.action_return_to_wallet)
190+
}
191+
}
192+
174193
override fun openAccountDetails(address: String) {
175194
val extras = AccountDetailsFragment.getBundle(address)
176195

@@ -185,8 +204,8 @@ class Navigator : SplashRouter, OnboardingRouter, AccountRouter, WalletRouter {
185204
navController?.navigate(R.id.action_editAccountsFragment_to_mainFragment)
186205
}
187206

188-
override fun openNodeDetails(nodeId: Int) {
189-
navController?.navigate(R.id.action_nodesFragment_to_nodeDetailsFragment, NodeDetailsFragment.getBundle(nodeId))
207+
override fun openNodeDetails(nodeId: Int, isSelected: Boolean) {
208+
navController?.navigate(R.id.action_nodesFragment_to_nodeDetailsFragment, NodeDetailsFragment.getBundle(nodeId, isSelected))
190209
}
191210

192211
override fun openAssetDetails(token: Asset.Token) {
@@ -202,4 +221,44 @@ class Navigator : SplashRouter, OnboardingRouter, AccountRouter, WalletRouter {
202221
override fun createAccountForNetworkType(networkType: Node.NetworkType) {
203222
navController?.navigate(R.id.action_nodes_to_onboarding, WelcomeFragment.getBundleWithNetworkType(true, networkType))
204223
}
224+
225+
override fun openExportMnemonic(accountAddress: String) {
226+
val extras = ExportMnemonicFragment.getBundle(accountAddress)
227+
228+
navController?.navigate(R.id.action_accountDetailsFragment_to_exportMnemonicFragment, extras)
229+
}
230+
231+
override fun openExportSeed(accountAddress: String) {
232+
val extras = ExportSeedFragment.getBundle(accountAddress)
233+
234+
navController?.navigate(R.id.action_accountDetailsFragment_to_exportSeedFragment, extras)
235+
}
236+
237+
override fun openConfirmMnemonicOnExport(mnemonic: List<String>) {
238+
val extras = ConfirmMnemonicFragment.getBundle(ConfirmMnemonicPayload(mnemonic, null))
239+
240+
navController?.navigate(R.id.action_exportMnemonicFragment_to_confirmExportMnemonicFragment, extras)
241+
}
242+
243+
override fun openExportJsonPassword(accountAddress: String) {
244+
val extras = ExportJsonPasswordFragment.getBundle(accountAddress)
245+
246+
navController?.navigate(R.id.action_accountDetailsFragment_to_exportJsonPasswordFragment, extras)
247+
}
248+
249+
override fun openExportJsonConfirm(payload: ExportJsonConfirmPayload) {
250+
val extras = ExportJsonConfirmFragment.getBundle(payload)
251+
252+
navController?.navigate(R.id.action_exportJsonPasswordFragment_to_exportJsonConfirmFragment, extras)
253+
}
254+
255+
override fun finishExportFlow() {
256+
navController?.navigate(R.id.finish_export_flow)
257+
}
258+
259+
override fun openChangePinCode() {
260+
val action = PinCodeAction.Change
261+
val bundle = PincodeFragment.getPinCodeBundle(action)
262+
navController?.navigate(R.id.action_mainFragment_to_pinCodeFragment, bundle)
263+
}
205264
}

app/src/main/java/jp/co/soramitsu/app/root/presentation/RootActivity.kt

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package jp.co.soramitsu.app.root.presentation
22

3-
import android.content.Context
4-
import android.content.Intent
53
import android.os.Bundle
6-
import android.view.View
74
import androidx.lifecycle.Observer
85
import androidx.navigation.NavController
96
import androidx.navigation.fragment.NavHostFragment
@@ -13,28 +10,16 @@ import jp.co.soramitsu.app.root.di.RootComponent
1310
import jp.co.soramitsu.app.root.navigation.Navigator
1411
import jp.co.soramitsu.common.base.BaseActivity
1512
import jp.co.soramitsu.common.di.FeatureUtils
13+
import jp.co.soramitsu.common.utils.setVisible
1614
import jp.co.soramitsu.common.utils.updatePadding
1715
import jp.co.soramitsu.splash.presentation.SplashBackgroundHolder
18-
import jp.co.soramitsu.splash.presentation.SplashFragment
1916
import kotlinx.android.synthetic.main.activity_root.mainView
2017
import kotlinx.android.synthetic.main.activity_root.navHost
2118
import kotlinx.android.synthetic.main.activity_root.rootNetworkBar
2219
import javax.inject.Inject
2320

2421
class RootActivity : BaseActivity<RootViewModel>(), SplashBackgroundHolder {
2522

26-
companion object {
27-
private const val ACTION_CHANGE_LANGUAGE = "jp.co.soramitsu.app.root.presentation.ACTION_CHANGE_LANGUAGE"
28-
29-
fun restartAfterLanguageChange(context: Context) {
30-
val intent = Intent(context, RootActivity::class.java).apply {
31-
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
32-
action = ACTION_CHANGE_LANGUAGE
33-
}
34-
context.startActivity(intent)
35-
}
36-
}
37-
3823
@Inject
3924
lateinit var navigator: Navigator
4025

@@ -45,11 +30,18 @@ class RootActivity : BaseActivity<RootViewModel>(), SplashBackgroundHolder {
4530
.inject(this)
4631
}
4732

33+
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
34+
super.onRestoreInstanceState(savedInstanceState)
35+
36+
removeSplashBackground()
37+
38+
viewModel.restoredAfterConfigChange()
39+
}
40+
4841
override fun onCreate(savedInstanceState: Bundle?) {
4942
super.onCreate(savedInstanceState)
5043

51-
val languageChanged = ACTION_CHANGE_LANGUAGE == intent.action
52-
navController.setGraph(R.navigation.root_nav_graph, SplashFragment.getBundle(languageChanged))
44+
navController.setGraph(R.navigation.root_nav_graph)
5345
navigator.attachNavController(navController)
5446

5547
rootNetworkBar.setOnApplyWindowInsetsListener { view, insets ->
@@ -68,11 +60,21 @@ class RootActivity : BaseActivity<RootViewModel>(), SplashBackgroundHolder {
6860
override fun initViews() {
6961
}
7062

63+
override fun onStop() {
64+
super.onStop()
65+
66+
viewModel.noticeInBackground()
67+
}
68+
69+
override fun onStart() {
70+
super.onStart()
71+
72+
viewModel.noticeInForeground()
73+
}
74+
7175
override fun subscribe(viewModel: RootViewModel) {
7276
viewModel.showConnectingBarLiveData.observe(this, Observer { show ->
73-
val visibility = if (show) View.VISIBLE else View.GONE
74-
75-
rootNetworkBar.visibility = visibility
77+
rootNetworkBar.setVisible(show)
7678
})
7779
}
7880

@@ -83,7 +85,9 @@ class RootActivity : BaseActivity<RootViewModel>(), SplashBackgroundHolder {
8385
override fun changeLanguage() {
8486
viewModel.noticeLanguageLanguage()
8587

86-
restartAfterLanguageChange(this)
88+
recreate()
89+
90+
// restartAfterLanguageChange(this)
8791
}
8892

8993
// private fun processJsonOpenIntent() {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package jp.co.soramitsu.app.root.presentation
2+
3+
interface RootRouter {
4+
fun returnToMain()
5+
}

app/src/main/java/jp/co/soramitsu/app/root/presentation/RootViewModel.kt

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ import io.reactivex.schedulers.Schedulers
66
import jp.co.soramitsu.app.root.domain.RootInteractor
77
import jp.co.soramitsu.common.base.BaseViewModel
88
import jp.co.soramitsu.common.data.network.rpc.ConnectionManager
9+
import jp.co.soramitsu.common.data.network.rpc.LifecycleCondition
910
import jp.co.soramitsu.common.mixin.api.NetworkStateMixin
1011
import jp.co.soramitsu.common.mixin.api.NetworkStateUi
1112
import jp.co.soramitsu.common.utils.plusAssign
1213

1314
class RootViewModel(
1415
private val interactor: RootInteractor,
16+
private val rootRouter: RootRouter,
1517
private val connectionManager: ConnectionManager,
1618
private val networkStateMixin: NetworkStateMixin
1719
) : BaseViewModel(), NetworkStateUi by networkStateMixin {
@@ -26,10 +28,10 @@ class RootViewModel(
2628
}
2729

2830
private fun observeAllowedToConnect() {
29-
disposables += connectionManager.observeAllowedToConnect()
31+
disposables += connectionManager.observeLifecycleCondition()
3032
.distinctUntilChanged()
31-
.subscribe { allowed ->
32-
if (allowed) {
33+
.subscribe { lifecycleCondition ->
34+
if (lifecycleCondition == LifecycleCondition.ALLOWED) {
3335
bindConnectionToNode()
3436
} else {
3537
unbindConnection()
@@ -65,12 +67,30 @@ class RootViewModel(
6567
override fun onCleared() {
6668
super.onCleared()
6769

70+
connectionManager.setLifecycleCondition(LifecycleCondition.FORBIDDEN)
71+
}
72+
73+
fun noticeInBackground() {
6874
if (!willBeClearedForLanguageChange) {
69-
connectionManager.setAllowedToConnect(false)
75+
connectionManager.setLifecycleCondition(LifecycleCondition.STOPPED)
76+
}
77+
}
78+
79+
fun noticeInForeground() {
80+
if (connectionManager.getLifecycleCondition() == LifecycleCondition.STOPPED) {
81+
connectionManager.setLifecycleCondition(LifecycleCondition.ALLOWED)
7082
}
7183
}
7284

7385
fun noticeLanguageLanguage() {
7486
willBeClearedForLanguageChange = true
7587
}
88+
89+
fun restoredAfterConfigChange() {
90+
if (willBeClearedForLanguageChange) {
91+
rootRouter.returnToMain()
92+
93+
willBeClearedForLanguageChange = false
94+
}
95+
}
7696
}

app/src/main/java/jp/co/soramitsu/app/root/presentation/di/RootActivityModule.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import dagger.Module
77
import dagger.Provides
88
import dagger.multibindings.IntoMap
99
import jp.co.soramitsu.app.root.domain.RootInteractor
10+
import jp.co.soramitsu.app.root.navigation.Navigator
11+
import jp.co.soramitsu.app.root.presentation.RootRouter
1012
import jp.co.soramitsu.app.root.presentation.RootViewModel
1113
import jp.co.soramitsu.common.data.network.rpc.ConnectionManager
1214
import jp.co.soramitsu.common.di.viewmodel.ViewModelKey
@@ -20,16 +22,21 @@ import jp.co.soramitsu.common.mixin.api.NetworkStateMixin
2022
)
2123
class RootActivityModule {
2224

25+
@Provides
26+
fun provideRootRouter(navigator: Navigator): RootRouter = navigator
27+
2328
@Provides
2429
@IntoMap
2530
@ViewModelKey(RootViewModel::class)
2631
fun provideViewModel(
2732
interactor: RootInteractor,
33+
rootRouter: RootRouter,
2834
connectionManager: ConnectionManager,
2935
networkStateMixin: NetworkStateMixin
3036
): ViewModel {
3137
return RootViewModel(
3238
interactor,
39+
rootRouter,
3340
connectionManager,
3441
networkStateMixin
3542
)

app/src/main/java/jp/co/soramitsu/app/root/presentation/main/MainFragment.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ class MainFragment : BaseFragment<MainViewModel>() {
3737
backCallback.isEnabled = false
3838
}
3939

40+
override fun onViewStateRestored(savedInstanceState: Bundle?) {
41+
super.onViewStateRestored(savedInstanceState)
42+
43+
navController!!.restoreState(savedInstanceState)
44+
}
45+
4046
override fun initViews() {
4147
val nestedNavHostFragment =
4248
childFragmentManager.findFragmentById(R.id.bottomNavHost) as NavHostFragment
@@ -59,7 +65,7 @@ class MainFragment : BaseFragment<MainViewModel>() {
5965
override fun inject() {
6066
FeatureUtils.getFeature<RootComponent>(this, RootApi::class.java)
6167
.mainFragmentComponentFactory()
62-
.create(this)
68+
.create(requireActivity())
6369
.inject(this)
6470
}
6571

0 commit comments

Comments
 (0)