diff --git a/CHANGELOG.md b/CHANGELOG.md index 358ebc984..1dc5531d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,4 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed +- Fix crash when returning app to foreground on Receive screen #875 +- Show loading state on Spending tab when node is not running #875 + [Unreleased]: https://github.com/synonymdev/bitkit-android/compare/v2.1.2...HEAD diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/CustomTabRowWithSpacing.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/CustomTabRowWithSpacing.kt index 1c20627a0..7c0568f58 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/CustomTabRowWithSpacing.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/CustomTabRowWithSpacing.kt @@ -40,8 +40,9 @@ fun CustomTabRowWithSpacing( horizontalArrangement = Arrangement.SpaceEvenly, modifier = Modifier.fillMaxWidth() ) { + val safeIndex = currentTabIndex.coerceIn(0, tabs.lastIndex) tabs.forEachIndexed { index, tab -> - val isSelected = tabs[currentTabIndex] == tab + val isSelected = tabs[safeIndex] == tab Column( modifier = Modifier.weight(1f) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveInvoiceUtils.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveInvoiceUtils.kt index a6ddf4bae..5c520fef6 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveInvoiceUtils.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveInvoiceUtils.kt @@ -32,9 +32,9 @@ fun getInvoiceForTab( } ReceiveTab.SPENDING -> { - // Lightning only: prefer CJIT > bolt11 + // Lightning only: prefer CJIT > bolt11, empty when node is not running cjitInvoice?.takeIf { it.isNotEmpty() && isNodeRunning } - ?: bolt11 + ?: bolt11.takeIf { isNodeRunning }.orEmpty() } } } diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveQrScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveQrScreen.kt index c837168e6..76d7ffb8a 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveQrScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveQrScreen.kt @@ -145,6 +145,12 @@ fun ReceiveQrScreen( mutableStateOf(initialTab ?: ReceiveTab.SAVINGS) } + LaunchedEffect(visibleTabs) { + if (selectedTab !in visibleTabs) { + selectedTab = visibleTabs.first() + } + } + LaunchedEffect(lazyListState, visibleTabs.size) { snapshotFlow { lazyListState.firstVisibleItemIndex } .distinctUntilChanged() diff --git a/app/src/test/java/to/bitkit/ui/screens/wallets/receive/ReceiveInvoiceUtilsTest.kt b/app/src/test/java/to/bitkit/ui/screens/wallets/receive/ReceiveInvoiceUtilsTest.kt index 543ba1774..7905b5427 100644 --- a/app/src/test/java/to/bitkit/ui/screens/wallets/receive/ReceiveInvoiceUtilsTest.kt +++ b/app/src/test/java/to/bitkit/ui/screens/wallets/receive/ReceiveInvoiceUtilsTest.kt @@ -200,7 +200,7 @@ class ReceiveInvoiceUtilsTest { } @Test - fun `getInvoiceForTab SPENDING returns bolt11 when node not running even with CJIT`() { + fun `getInvoiceForTab SPENDING returns empty when node not running even with CJIT`() { val bip21 = "bitcoin:$testAddress?lightning=$testBolt11" val result = getInvoiceForTab( @@ -212,7 +212,23 @@ class ReceiveInvoiceUtilsTest { onchainAddress = testAddress ) - assertEquals(testBolt11, result) + assertEquals("", result) + } + + @Test + fun `getInvoiceForTab SPENDING returns empty when node not running and no CJIT`() { + val bip21 = "bitcoin:$testAddress?lightning=$testBolt11" + + val result = getInvoiceForTab( + tab = ReceiveTab.SPENDING, + bip21 = bip21, + bolt11 = testBolt11, + cjitInvoice = null, + isNodeRunning = false, + onchainAddress = testAddress + ) + + assertEquals("", result) } @Test