[#799] Fix passing drawer state

* [#799] Fix passing drawer state
This commit is contained in:
Honza Rychnovsky 2023-03-14 07:57:15 +01:00 committed by GitHub
parent 5fc3974129
commit c18160356e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 105 additions and 13 deletions

View File

@ -58,6 +58,7 @@ class HomeTestSetup(
@Composable @Composable
@Suppress("TestFunctionName") @Suppress("TestFunctionName")
fun DefaultContent() { fun DefaultContent() {
val drawerValues = drawerBackHandler()
Home( Home(
walletSnapshot, walletSnapshot,
transactionHistory = persistentListOf(), transactionHistory = persistentListOf(),
@ -84,6 +85,8 @@ class HomeTestSetup(
onSendCount.incrementAndGet() onSendCount.incrementAndGet()
}, },
resetSdk = {}, resetSdk = {},
drawerState = drawerValues.drawerState,
scope = drawerValues.scope
) )
} }

View File

@ -0,0 +1,64 @@
package co.electriccoin.zcash.ui.screen.home.integration
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsNotDisplayed
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performClick
import androidx.test.espresso.Espresso
import androidx.test.filters.MediumTest
import cash.z.ecc.android.sdk.Synchronizer
import cash.z.ecc.android.sdk.model.PercentDecimal
import co.electriccoin.zcash.test.UiTestPrerequisites
import co.electriccoin.zcash.ui.common.UiTestingActivity
import co.electriccoin.zcash.ui.fixture.WalletSnapshotFixture
import co.electriccoin.zcash.ui.screen.home.HomeTag
import co.electriccoin.zcash.ui.screen.home.HomeTestSetup
import co.electriccoin.zcash.ui.screen.home.model.WalletSnapshot
import org.junit.Rule
import org.junit.Test
class HomeActivityTest : UiTestPrerequisites() {
@get:Rule
val composeTestRule = createAndroidComposeRule<UiTestingActivity>()
private fun newTestSetup(walletSnapshot: WalletSnapshot) = HomeTestSetup(
composeTestRule,
walletSnapshot,
isShowFiatConversion = false
)
@Test
@MediumTest
fun open_close_drawer_menu_test() {
val walletSnapshot = WalletSnapshotFixture.new(
status = Synchronizer.Status.DOWNLOADING,
progress = PercentDecimal(0.5f)
)
val testSetup = newTestSetup(walletSnapshot)
testSetup.setDefaultContent()
composeTestRule.onNodeWithTag(HomeTag.DRAWER_MENU).also {
it.assertIsNotDisplayed()
}
composeTestRule.onNodeWithTag(HomeTag.DRAWER_MENU_OPEN_BUTTON).also {
it.assertIsDisplayed()
it.performClick()
}
composeTestRule.waitForIdle()
composeTestRule.onNodeWithTag(HomeTag.DRAWER_MENU).also {
it.assertIsDisplayed()
}
Espresso.pressBack()
composeTestRule.waitForIdle()
composeTestRule.onNodeWithTag(HomeTag.DRAWER_MENU).also {
it.assertIsNotDisplayed()
}
}
}

View File

@ -5,6 +5,7 @@ package co.electriccoin.zcash.ui.screen.home
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.BackHandler import androidx.activity.compose.BackHandler
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.compose.material3.DrawerState
import androidx.compose.material3.DrawerValue import androidx.compose.material3.DrawerValue
import androidx.compose.material3.rememberDrawerState import androidx.compose.material3.rememberDrawerState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -24,6 +25,7 @@ import co.electriccoin.zcash.ui.screen.home.viewmodel.WalletViewModel
import co.electriccoin.zcash.ui.screen.settings.viewmodel.SettingsViewModel import co.electriccoin.zcash.ui.screen.settings.viewmodel.SettingsViewModel
import co.electriccoin.zcash.ui.screen.update.AppUpdateCheckerImp import co.electriccoin.zcash.ui.screen.update.AppUpdateCheckerImp
import co.electriccoin.zcash.ui.screen.update.model.UpdateState import co.electriccoin.zcash.ui.screen.update.model.UpdateState
import kotlinx.coroutines.CoroutineScope
@Composable @Composable
@Suppress("LongParameterList") @Suppress("LongParameterList")
@ -89,13 +91,7 @@ internal fun WrapHome(
val transactionSnapshot = walletViewModel.transactionSnapshot.collectAsStateWithLifecycle().value val transactionSnapshot = walletViewModel.transactionSnapshot.collectAsStateWithLifecycle().value
val drawerState = rememberDrawerState(DrawerValue.Closed) val drawerValues = drawerBackHandler()
val scope = rememberCoroutineScope()
// override Android back navigation action to close drawer, if opened
BackHandler(drawerState.isOpen) {
drawerState.closeDrawerMenu(scope)
}
Home( Home(
walletSnapshot, walletSnapshot,
@ -112,9 +108,31 @@ internal fun WrapHome(
goSend = goSend, goSend = goSend,
resetSdk = { resetSdk = {
walletViewModel.resetSdk() walletViewModel.resetSdk()
} },
drawerState = drawerValues.drawerState,
scope = drawerValues.scope
) )
activity.reportFullyDrawn() activity.reportFullyDrawn()
} }
} }
/**
* Custom Drawer menu composable with back navigation handling feature, which returns its necessary values.
*/
@Composable
internal fun drawerBackHandler(
drawerState: DrawerState = rememberDrawerState(DrawerValue.Closed),
scope: CoroutineScope = rememberCoroutineScope()
): DrawerValuesWrapper {
// Override Android back navigation action to close drawer, if opened
BackHandler(drawerState.isOpen) {
drawerState.closeDrawerMenu(scope)
}
return DrawerValuesWrapper(drawerState, scope)
}
internal data class DrawerValuesWrapper(
val drawerState: DrawerState,
val scope: CoroutineScope
)

View File

@ -8,4 +8,6 @@ object HomeTag {
const val PROGRESS = "progress_bar" const val PROGRESS = "progress_bar"
const val SINGLE_LINE_TEXT = "single_line_text" const val SINGLE_LINE_TEXT = "single_line_text"
const val FIAT_CONVERSION = "fiat_conversion" const val FIAT_CONVERSION = "fiat_conversion"
const val DRAWER_MENU = "drawer_menu"
const val DRAWER_MENU_OPEN_BUTTON = "drawer_menu_open_button"
} }

View File

@ -95,7 +95,9 @@ fun ComposablePreview() {
goAbout = {}, goAbout = {},
goReceive = {}, goReceive = {},
goSend = {}, goSend = {},
resetSdk = {} resetSdk = {},
drawerState = rememberDrawerState(DrawerValue.Closed),
scope = rememberCoroutineScope()
) )
} }
} }
@ -118,8 +120,8 @@ fun Home(
goReceive: () -> Unit, goReceive: () -> Unit,
goSend: () -> Unit, goSend: () -> Unit,
resetSdk: () -> Unit, resetSdk: () -> Unit,
drawerState: DrawerState = rememberDrawerState(DrawerValue.Closed), drawerState: DrawerState,
scope: CoroutineScope = rememberCoroutineScope() scope: CoroutineScope
) { ) {
ModalNavigationDrawer( ModalNavigationDrawer(
drawerState = drawerState, drawerState = drawerState,
@ -166,7 +168,8 @@ private fun HomeTopAppBar(
title = { Text(text = stringResource(id = R.string.app_name)) }, title = { Text(text = stringResource(id = R.string.app_name)) },
navigationIcon = { navigationIcon = {
IconButton( IconButton(
onClick = openDrawer onClick = openDrawer,
modifier = Modifier.testTag(HomeTag.DRAWER_MENU_OPEN_BUTTON)
) { ) {
Icon( Icon(
imageVector = Icons.Filled.Menu, imageVector = Icons.Filled.Menu,
@ -232,7 +235,9 @@ private fun HomeDrawer(
goSupport: () -> Unit, goSupport: () -> Unit,
goAbout: () -> Unit, goAbout: () -> Unit,
) { ) {
ModalDrawerSheet { ModalDrawerSheet(
modifier = Modifier.testTag(HomeTag.DRAWER_MENU)
) {
Spacer(Modifier.height(12.dp)) Spacer(Modifier.height(12.dp))
NavigationDrawerItem( NavigationDrawerItem(
icon = { Icon(Icons.Default.Password, contentDescription = null) }, icon = { Icon(Icons.Default.Password, contentDescription = null) },