[#416] Robo test blank screens

* [#416] Robo test blank screens
- Solve also debouncing issue on screens navigation
- Implemented with navigateJustOnce ext function on NavHostController, which compares actual and final destinations
- Add popBackStackJustOnce as an extension function to our navigation too
This commit is contained in:
Honza Rychnovsky 2022-06-15 08:53:54 +02:00 committed by GitHub
parent a88dc36804
commit 59b8ed5798
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 49 additions and 22 deletions

View File

@ -18,6 +18,7 @@ import androidx.compose.ui.Modifier
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavHostController
import androidx.navigation.NavOptionsBuilder
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
@ -152,73 +153,71 @@ class MainActivity : ComponentActivity() {
NavHost(navController = navController, startDestination = NAV_HOME) {
composable(NAV_HOME) {
WrapHome(
goScan = { navController.navigate(NAV_SCAN) },
goProfile = { navController.navigate(NAV_PROFILE) },
goSend = { navController.navigate(NAV_SEND) },
goRequest = { navController.navigate(NAV_REQUEST) }
goScan = { navController.navigateJustOnce(NAV_SCAN) },
goProfile = { navController.navigateJustOnce(NAV_PROFILE) },
goSend = { navController.navigateJustOnce(NAV_SEND) },
goRequest = { navController.navigateJustOnce(NAV_REQUEST) }
)
WrapCheckForUpdate()
}
composable(NAV_PROFILE) {
WrapProfile(
onBack = { navController.popBackStack() },
onAddressDetails = { navController.navigate(NAV_WALLET_ADDRESS_DETAILS) },
onBack = { navController.popBackStackJustOnce(NAV_PROFILE) },
onAddressDetails = { navController.navigateJustOnce(NAV_WALLET_ADDRESS_DETAILS) },
onAddressBook = { },
onSettings = { navController.navigate(NAV_SETTINGS) },
onSettings = { navController.navigateJustOnce(NAV_SETTINGS) },
onCoinholderVote = { },
onSupport = { navController.navigate(NAV_SUPPORT) },
onAbout = { navController.navigate(NAV_ABOUT) }
onSupport = { navController.navigateJustOnce(NAV_SUPPORT) },
onAbout = { navController.navigateJustOnce(NAV_ABOUT) }
)
}
composable(NAV_WALLET_ADDRESS_DETAILS) {
WrapWalletAddresses(
goBack = {
navController.popBackStack()
navController.popBackStackJustOnce(NAV_WALLET_ADDRESS_DETAILS)
}
)
}
composable(NAV_SETTINGS) {
WrapSettings(
goBack = {
navController.popBackStack()
navController.popBackStackJustOnce(NAV_SETTINGS)
},
goWalletBackup = {
navController.navigate(NAV_SEED)
navController.navigateJustOnce(NAV_SEED)
}
)
}
composable(NAV_SEED) {
WrapSeed(
goBack = {
navController.popBackStack()
navController.popBackStackJustOnce(NAV_SEED)
}
)
}
composable(NAV_REQUEST) {
WrapRequest(goBack = { navController.popBackStack() })
WrapRequest(goBack = { navController.popBackStackJustOnce(NAV_REQUEST) })
}
composable(NAV_SEND) {
WrapSend(goBack = { navController.popBackStack() })
WrapSend(goBack = { navController.popBackStackJustOnce(NAV_SEND) })
}
composable(NAV_SUPPORT) {
// Pop back stack won't be right if we deep link into support
WrapSupport(goBack = { navController.popBackStack() })
WrapSupport(goBack = { navController.popBackStackJustOnce(NAV_SUPPORT) })
}
composable(NAV_ABOUT) {
WrapAbout(goBack = { navController.popBackStack() })
WrapAbout(goBack = { navController.popBackStackJustOnce(NAV_ABOUT) })
}
composable(NAV_SCAN) {
WrapScanValidator(
onScanValid = {
// TODO [#449] https://github.com/zcash/secant-android-wallet/issues/449
if (navController.currentDestination?.route == NAV_SCAN) {
navController.navigate(NAV_SEND) {
popUpTo(NAV_HOME) { inclusive = false }
}
navController.navigateJustOnce(NAV_SEND) {
popUpTo(NAV_HOME) { inclusive = false }
}
},
goBack = { navController.popBackStack() }
goBack = { navController.popBackStackJustOnce(NAV_SCAN) }
)
}
}
@ -392,3 +391,31 @@ private fun ZecRequest.newShareIntent(context: Context) = runBlocking {
type = "text/plain"
}
}
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()
}