2022-08-09 12:23:38 -07:00
|
|
|
package co.electriccoin.zcash.ui
|
|
|
|
|
2023-12-06 23:14:16 -08:00
|
|
|
import android.widget.Toast
|
2022-08-09 12:23:38 -07:00
|
|
|
import androidx.compose.runtime.Composable
|
2023-12-06 23:14:16 -08:00
|
|
|
import androidx.compose.ui.platform.LocalContext
|
2022-08-09 12:23:38 -07:00
|
|
|
import androidx.navigation.NavHostController
|
|
|
|
import androidx.navigation.NavOptionsBuilder
|
|
|
|
import androidx.navigation.compose.NavHost
|
|
|
|
import androidx.navigation.compose.composable
|
|
|
|
import androidx.navigation.compose.rememberNavController
|
2023-03-30 00:58:20 -07:00
|
|
|
import co.electriccoin.zcash.ui.NavigationArguments.SEND_AMOUNT
|
|
|
|
import co.electriccoin.zcash.ui.NavigationArguments.SEND_MEMO
|
|
|
|
import co.electriccoin.zcash.ui.NavigationArguments.SEND_RECIPIENT_ADDRESS
|
2022-08-09 12:23:38 -07:00
|
|
|
import co.electriccoin.zcash.ui.NavigationTargets.ABOUT
|
2023-11-13 05:53:16 -08:00
|
|
|
import co.electriccoin.zcash.ui.NavigationTargets.EXPORT_PRIVATE_DATA
|
2023-07-04 04:24:07 -07:00
|
|
|
import co.electriccoin.zcash.ui.NavigationTargets.HISTORY
|
2022-08-09 12:23:38 -07:00
|
|
|
import co.electriccoin.zcash.ui.NavigationTargets.HOME
|
|
|
|
import co.electriccoin.zcash.ui.NavigationTargets.REQUEST
|
|
|
|
import co.electriccoin.zcash.ui.NavigationTargets.SCAN
|
2023-11-23 01:41:59 -08:00
|
|
|
import co.electriccoin.zcash.ui.NavigationTargets.SEED_RECOVERY
|
2022-08-09 12:23:38 -07:00
|
|
|
import co.electriccoin.zcash.ui.NavigationTargets.SETTINGS
|
|
|
|
import co.electriccoin.zcash.ui.NavigationTargets.SUPPORT
|
|
|
|
import co.electriccoin.zcash.ui.NavigationTargets.WALLET_ADDRESS_DETAILS
|
2023-02-20 08:07:26 -08:00
|
|
|
import co.electriccoin.zcash.ui.configuration.ConfigurationEntries
|
|
|
|
import co.electriccoin.zcash.ui.configuration.RemoteConfig
|
2022-08-09 12:23:38 -07:00
|
|
|
import co.electriccoin.zcash.ui.screen.about.WrapAbout
|
|
|
|
import co.electriccoin.zcash.ui.screen.address.WrapWalletAddresses
|
2023-11-13 05:53:16 -08:00
|
|
|
import co.electriccoin.zcash.ui.screen.exportdata.WrapExportPrivateData
|
2023-07-04 04:24:07 -07:00
|
|
|
import co.electriccoin.zcash.ui.screen.history.WrapHistory
|
2023-12-18 05:31:25 -08:00
|
|
|
import co.electriccoin.zcash.ui.screen.home.WrapHome
|
2022-08-09 12:23:38 -07:00
|
|
|
import co.electriccoin.zcash.ui.screen.request.WrapRequest
|
|
|
|
import co.electriccoin.zcash.ui.screen.scan.WrapScanValidator
|
2023-11-23 01:41:59 -08:00
|
|
|
import co.electriccoin.zcash.ui.screen.seedrecovery.WrapSeedRecovery
|
2023-03-30 00:58:20 -07:00
|
|
|
import co.electriccoin.zcash.ui.screen.send.model.SendArgumentsWrapper
|
2022-08-09 12:23:38 -07:00
|
|
|
import co.electriccoin.zcash.ui.screen.settings.WrapSettings
|
|
|
|
import co.electriccoin.zcash.ui.screen.support.WrapSupport
|
|
|
|
import co.electriccoin.zcash.ui.screen.update.WrapCheckForUpdate
|
|
|
|
|
|
|
|
@Composable
|
|
|
|
@Suppress("LongMethod")
|
|
|
|
internal fun MainActivity.Navigation() {
|
2023-12-06 23:14:16 -08:00
|
|
|
val context = LocalContext.current
|
2023-12-11 01:20:32 -08:00
|
|
|
val navController =
|
|
|
|
rememberNavController().also {
|
|
|
|
navControllerForTesting = it
|
|
|
|
}
|
2022-08-09 12:23:38 -07:00
|
|
|
|
|
|
|
NavHost(navController = navController, startDestination = HOME) {
|
2023-12-18 05:31:25 -08:00
|
|
|
composable(HOME) { backStackEntry ->
|
|
|
|
WrapHome(
|
|
|
|
onPageChange = {
|
|
|
|
homeViewModel.screenIndex.value = it
|
|
|
|
},
|
|
|
|
goAddressDetails = { navController.navigateJustOnce(WALLET_ADDRESS_DETAILS) },
|
|
|
|
goBack = { finish() },
|
2023-11-13 05:53:16 -08:00
|
|
|
goHistory = { navController.navigateJustOnce(HISTORY) },
|
|
|
|
goSettings = { navController.navigateJustOnce(SETTINGS) },
|
2023-12-18 05:31:25 -08:00
|
|
|
goScan = { navController.navigateJustOnce(SCAN) },
|
|
|
|
sendArgumentsWrapper =
|
|
|
|
SendArgumentsWrapper(
|
|
|
|
recipientAddress = backStackEntry.savedStateHandle[SEND_RECIPIENT_ADDRESS],
|
|
|
|
amount = backStackEntry.savedStateHandle[SEND_AMOUNT],
|
|
|
|
memo = backStackEntry.savedStateHandle[SEND_MEMO]
|
|
|
|
),
|
2022-08-09 12:23:38 -07:00
|
|
|
)
|
2023-12-18 05:31:25 -08:00
|
|
|
// Remove used Send screen parameters passed from the Scan screen if some exist
|
|
|
|
backStackEntry.savedStateHandle.remove<String>(SEND_RECIPIENT_ADDRESS)
|
|
|
|
backStackEntry.savedStateHandle.remove<String>(SEND_AMOUNT)
|
|
|
|
backStackEntry.savedStateHandle.remove<String>(SEND_MEMO)
|
2022-08-09 12:23:38 -07:00
|
|
|
|
2023-02-20 08:07:26 -08:00
|
|
|
if (ConfigurationEntries.IS_APP_UPDATE_CHECK_ENABLED.getValue(RemoteConfig.current)) {
|
|
|
|
WrapCheckForUpdate()
|
|
|
|
}
|
2022-08-09 12:23:38 -07:00
|
|
|
}
|
|
|
|
composable(WALLET_ADDRESS_DETAILS) {
|
|
|
|
WrapWalletAddresses(
|
|
|
|
goBack = {
|
|
|
|
navController.popBackStackJustOnce(WALLET_ADDRESS_DETAILS)
|
|
|
|
}
|
|
|
|
)
|
|
|
|
}
|
|
|
|
composable(SETTINGS) {
|
|
|
|
WrapSettings(
|
2023-11-13 05:53:16 -08:00
|
|
|
goAbout = {
|
|
|
|
navController.navigateJustOnce(ABOUT)
|
|
|
|
},
|
2022-08-09 12:23:38 -07:00
|
|
|
goBack = {
|
|
|
|
navController.popBackStackJustOnce(SETTINGS)
|
2023-10-17 06:56:04 -07:00
|
|
|
},
|
2023-12-04 06:45:30 -08:00
|
|
|
goDocumentation = {
|
|
|
|
// TODO [#1084]: Documentation screen
|
|
|
|
// TODO [#1084]: https://github.com/Electric-Coin-Company/zashi-android/issues/1084
|
2023-12-06 23:14:16 -08:00
|
|
|
Toast.makeText(context, context.getString(R.string.not_implemented_yet), Toast.LENGTH_SHORT).show()
|
2023-12-04 06:45:30 -08:00
|
|
|
},
|
2023-11-13 05:53:16 -08:00
|
|
|
goExportPrivateData = {
|
|
|
|
navController.navigateJustOnce(EXPORT_PRIVATE_DATA)
|
2023-11-23 01:41:59 -08:00
|
|
|
},
|
2023-12-04 06:45:30 -08:00
|
|
|
goFeedback = {
|
|
|
|
navController.navigateJustOnce(SUPPORT)
|
|
|
|
},
|
|
|
|
goPrivacyPolicy = {
|
|
|
|
// TODO [#1083]: Privacy Policy screen
|
|
|
|
// TODO [#1083]: https://github.com/Electric-Coin-Company/zashi-android/issues/1083
|
2023-12-06 23:14:16 -08:00
|
|
|
Toast.makeText(context, context.getString(R.string.not_implemented_yet), Toast.LENGTH_SHORT).show()
|
2023-12-04 06:45:30 -08:00
|
|
|
},
|
2023-11-23 01:41:59 -08:00
|
|
|
goSeedRecovery = {
|
|
|
|
navController.navigateJustOnce(SEED_RECOVERY)
|
2022-08-09 12:23:38 -07:00
|
|
|
}
|
|
|
|
)
|
|
|
|
}
|
2023-11-23 01:41:59 -08:00
|
|
|
composable(SEED_RECOVERY) {
|
|
|
|
WrapSeedRecovery(
|
2022-08-09 12:23:38 -07:00
|
|
|
goBack = {
|
2023-11-23 01:41:59 -08:00
|
|
|
navController.popBackStackJustOnce(SEED_RECOVERY)
|
|
|
|
},
|
|
|
|
onDone = {
|
|
|
|
navController.popBackStackJustOnce(SEED_RECOVERY)
|
2022-08-09 12:23:38 -07:00
|
|
|
}
|
|
|
|
)
|
|
|
|
}
|
|
|
|
composable(REQUEST) {
|
|
|
|
WrapRequest(goBack = { navController.popBackStackJustOnce(REQUEST) })
|
|
|
|
}
|
|
|
|
composable(SUPPORT) {
|
|
|
|
// Pop back stack won't be right if we deep link into support
|
|
|
|
WrapSupport(goBack = { navController.popBackStackJustOnce(SUPPORT) })
|
|
|
|
}
|
|
|
|
composable(ABOUT) {
|
|
|
|
WrapAbout(goBack = { navController.popBackStackJustOnce(ABOUT) })
|
|
|
|
}
|
|
|
|
composable(SCAN) {
|
|
|
|
WrapScanValidator(
|
2023-03-30 00:58:20 -07:00
|
|
|
onScanValid = { result ->
|
|
|
|
// At this point we only pass recipient address
|
|
|
|
navController.previousBackStackEntry?.savedStateHandle?.apply {
|
|
|
|
set(SEND_RECIPIENT_ADDRESS, result)
|
|
|
|
set(SEND_AMOUNT, null)
|
|
|
|
set(SEND_MEMO, null)
|
2022-08-09 12:23:38 -07:00
|
|
|
}
|
2023-03-30 00:58:20 -07:00
|
|
|
navController.popBackStackJustOnce(SCAN)
|
2022-08-09 12:23:38 -07:00
|
|
|
},
|
|
|
|
goBack = { navController.popBackStackJustOnce(SCAN) }
|
|
|
|
)
|
|
|
|
}
|
2023-11-13 05:53:16 -08:00
|
|
|
composable(EXPORT_PRIVATE_DATA) {
|
|
|
|
WrapExportPrivateData(
|
|
|
|
goBack = { navController.popBackStackJustOnce(EXPORT_PRIVATE_DATA) },
|
|
|
|
onConfirm = { navController.popBackStackJustOnce(EXPORT_PRIVATE_DATA) }
|
|
|
|
)
|
|
|
|
}
|
2023-07-04 04:24:07 -07:00
|
|
|
composable(HISTORY) {
|
|
|
|
WrapHistory(goBack = { navController.navigateUp() })
|
|
|
|
}
|
2022-08-09 12:23:38 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun NavHostController.navigateJustOnce(
|
|
|
|
route: String,
|
|
|
|
navOptionsBuilder: (NavOptionsBuilder.() -> Unit)? = null
|
|
|
|
) {
|
|
|
|
if (currentDestination?.route == route) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if (navOptionsBuilder != null) {
|
|
|
|
navigate(route, navOptionsBuilder)
|
|
|
|
} else {
|
|
|
|
navigate(route)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Pops up the current screen from the back stack. Parameter currentRouteToBePopped is meant to be
|
|
|
|
* set only to the current screen so we can easily debounce multiple screen popping from the back stack.
|
|
|
|
*
|
|
|
|
* @param currentRouteToBePopped current screen which should be popped up.
|
|
|
|
*/
|
|
|
|
private fun NavHostController.popBackStackJustOnce(currentRouteToBePopped: String) {
|
|
|
|
if (currentDestination?.route != currentRouteToBePopped) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
popBackStack()
|
|
|
|
}
|
|
|
|
|
2023-03-30 00:58:20 -07:00
|
|
|
object NavigationArguments {
|
|
|
|
const val SEND_RECIPIENT_ADDRESS = "send_recipient_address"
|
|
|
|
const val SEND_AMOUNT = "send_amount"
|
|
|
|
const val SEND_MEMO = "send_memo"
|
|
|
|
}
|
|
|
|
|
2022-08-09 12:23:38 -07:00
|
|
|
object NavigationTargets {
|
2023-11-13 05:53:16 -08:00
|
|
|
const val ABOUT = "about"
|
2023-12-18 05:31:25 -08:00
|
|
|
const val ACCOUNT = "account"
|
2023-11-13 05:53:16 -08:00
|
|
|
const val EXPORT_PRIVATE_DATA = "export_private_data"
|
|
|
|
const val HISTORY = "history"
|
2022-08-09 12:23:38 -07:00
|
|
|
const val HOME = "home"
|
2023-02-28 05:54:07 -08:00
|
|
|
const val RECEIVE = "receive"
|
2022-08-09 12:23:38 -07:00
|
|
|
const val REQUEST = "request"
|
2023-11-13 05:53:16 -08:00
|
|
|
const val SCAN = "scan"
|
2023-11-23 01:41:59 -08:00
|
|
|
const val SEED_RECOVERY = "seed_recovery"
|
2022-08-09 12:23:38 -07:00
|
|
|
const val SEND = "send"
|
2023-11-13 05:53:16 -08:00
|
|
|
const val SETTINGS = "settings"
|
2022-08-09 12:23:38 -07:00
|
|
|
const val SUPPORT = "support"
|
2023-11-13 05:53:16 -08:00
|
|
|
const val WALLET_ADDRESS_DETAILS = "wallet_address_details"
|
2022-08-09 12:23:38 -07:00
|
|
|
}
|