From d40289c3ff0a9e9da4e38a393e896f005b0d5263 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Mon, 30 Mar 2026 14:48:53 -0300 Subject: [PATCH 1/5] fix: update selectedTab when visibleTabs change --- .../to/bitkit/ui/screens/wallets/receive/ReceiveQrScreen.kt | 6 ++++++ 1 file changed, 6 insertions(+) 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() From 13c633f63b8ff37aea5a0a19bf8d7d60e8b3db55 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Mon, 30 Mar 2026 14:49:46 -0300 Subject: [PATCH 2/5] fix: add defensive check to CustomTabRowWithSpacing tab index calc --- .../wallets/activity/components/CustomTabRowWithSpacing.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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) From 46f53275360029bb41fecff93cb0899e2173bb25 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Mon, 30 Mar 2026 14:52:28 -0300 Subject: [PATCH 3/5] chore: add changelog entry for foreground crash fix Co-Authored-By: Claude Opus 4.6 (1M context) --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 358ebc984..0d1942963 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,4 +7,7 @@ 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 + [Unreleased]: https://github.com/synonymdev/bitkit-android/compare/v2.1.2...HEAD From 46178345c74d193d87146f065bdd54df3011e9ec Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Mon, 30 Mar 2026 14:58:08 -0300 Subject: [PATCH 4/5] fix: show loading on spending tab when node not running Co-Authored-By: Claude Opus 4.6 (1M context) --- CHANGELOG.md | 1 + .../wallets/receive/ReceiveInvoiceUtils.kt | 4 ++-- .../receive/ReceiveInvoiceUtilsTest.kt | 20 +++++++++++++++++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d1942963..8b075ad6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,5 +9,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fix crash when returning app to foreground on Receive screen +- Show loading state on Spending tab when node is not running [Unreleased]: https://github.com/synonymdev/bitkit-android/compare/v2.1.2...HEAD 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/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 From e52ec6af7de91ebb04d5a8a7dd98a241f2e4aa18 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Mon, 30 Mar 2026 15:04:46 -0300 Subject: [PATCH 5/5] chore: backfill changelog pr number Co-Authored-By: Claude Opus 4.6 (1M context) --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b075ad6f..1dc5531d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ 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 -- Show loading state on Spending tab when node is not running +- 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