From 1b796a1e8ad6507f2a9e4e864adb589eaa3fbbb7 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Thu, 2 Apr 2026 14:09:25 -0300 Subject: [PATCH 1/5] feat: add transfer from savings button on empty spending screen --- app/src/main/java/to/bitkit/ui/ContentView.kt | 8 ++++ .../screens/wallets/SpendingWalletScreen.kt | 46 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/app/src/main/java/to/bitkit/ui/ContentView.kt b/app/src/main/java/to/bitkit/ui/ContentView.kt index 073fb1767..11d9ab25c 100644 --- a/app/src/main/java/to/bitkit/ui/ContentView.kt +++ b/app/src/main/java/to/bitkit/ui/ContentView.kt @@ -815,6 +815,7 @@ private fun NavGraphBuilder.home( } composableWithDefaultTransitions { val hasSeenSavingsIntro by settingsViewModel.hasSeenSavingsIntro.collectAsStateWithLifecycle() + val hasSeenSpendingIntro by settingsViewModel.hasSeenSpendingIntro.collectAsStateWithLifecycle() val lightningState by walletViewModel.lightningState.collectAsStateWithLifecycle() val lightningActivities by activityListViewModel.lightningActivities.collectAsStateWithLifecycle() @@ -831,6 +832,13 @@ private fun NavGraphBuilder.home( navController.navigateToTransferSavingsAvailability() } }, + onTransferFromSavingsClick = { + if (!hasSeenSpendingIntro) { + navController.navigateToTransferSpendingIntro() + } else { + navController.navigateToTransferSpendingAmount() + } + }, onBackClick = { navController.popBackStack() }, ) } diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt index b10954e85..05d946078 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt @@ -56,6 +56,7 @@ fun SpendingWalletScreen( onActivityItemClick: (String) -> Unit, onEmptyActivityRowClick: () -> Unit, onTransferToSavingsClick: () -> Unit, + onTransferFromSavingsClick: () -> Unit, onBackClick: () -> Unit, balances: BalanceState = LocalBalances.current, ) { @@ -69,6 +70,9 @@ fun SpendingWalletScreen( val hasChannels = channels.isNotEmpty() mutableStateOf(hasLnBalance && hasChannels) } + val canTransferFromSavings by remember(showEmptyState, balances.totalOnchainSats) { + mutableStateOf(showEmptyState && balances.totalOnchainSats > 0uL) + } Box( modifier = Modifier @@ -112,6 +116,23 @@ fun SpendingWalletScreen( ) } + if (canTransferFromSavings) { + Spacer(modifier = Modifier.height(32.dp)) + + SecondaryButton( + onClick = onTransferFromSavingsClick, + text = stringResource(R.string.lightning__funding__button1), + icon = { + Icon( + painter = painterResource(R.drawable.ic_transfer), + contentDescription = null, + modifier = Modifier.size(16.dp), + ) + }, + modifier = Modifier.testTag("TransferFromSavings") + ) + } + if (!showEmptyState) { Spacer(modifier = Modifier.height(32.dp)) @@ -163,6 +184,7 @@ private fun Preview() { onActivityItemClick = {}, onEmptyActivityRowClick = {}, onTransferToSavingsClick = {}, + onTransferFromSavingsClick = {}, onBackClick = {}, balances = BalanceState(totalLightningSats = 50_000u), ) @@ -183,6 +205,7 @@ private fun PreviewTransfer() { onActivityItemClick = {}, onEmptyActivityRowClick = {}, onTransferToSavingsClick = {}, + onTransferFromSavingsClick = {}, onBackClick = {}, balances = BalanceState( totalLightningSats = 50_000u, @@ -206,6 +229,7 @@ private fun PreviewNoActivity() { onActivityItemClick = {}, onEmptyActivityRowClick = {}, onTransferToSavingsClick = {}, + onTransferFromSavingsClick = {}, onBackClick = {}, balances = BalanceState(totalLightningSats = 50_000u), ) @@ -226,7 +250,29 @@ private fun PreviewEmpty() { onActivityItemClick = {}, onEmptyActivityRowClick = {}, onTransferToSavingsClick = {}, + onTransferFromSavingsClick = {}, + onBackClick = {}, + ) + TabBar() + } + } +} + +@Preview(showSystemUi = true) +@Composable +private fun PreviewEmptyWithSavings() { + AppThemeSurface { + Box { + SpendingWalletScreen( + channels = persistentListOf(), + lightningActivities = persistentListOf(), + onAllActivityButtonClick = {}, + onActivityItemClick = {}, + onEmptyActivityRowClick = {}, + onTransferToSavingsClick = {}, + onTransferFromSavingsClick = {}, onBackClick = {}, + balances = BalanceState(totalOnchainSats = 100_000u), ) TabBar() } From 3f35635cb09e60edf2a9334c67af06d55998f002 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Thu, 2 Apr 2026 14:11:08 -0300 Subject: [PATCH 2/5] doc: add changelog entry Co-Authored-By: Claude Opus 4.6 (1M context) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a8286507..2b547d43f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Show loading state on Spending tab when node is not running #875 ### Added +- Transfer from Savings button on empty Spending screen when savings balance exists - Connection issues overlay with connectivity fixes across Send, Receive, and Transfer flows #878 - Lightning Connections empty state with onboarding screen #857 - Unified PIN management screen (enable/disable/change in one place) #857 From 7942b5289abc9548b79bb13d6c21a2f2e85354c1 Mon Sep 17 00:00:00 2001 From: jvsena42 Date: Thu, 2 Apr 2026 14:11:48 -0300 Subject: [PATCH 3/5] chore: backfill changelog pr number Co-Authored-By: Claude Opus 4.6 (1M context) --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b547d43f..970270691 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Show loading state on Spending tab when node is not running #875 ### Added -- Transfer from Savings button on empty Spending screen when savings balance exists +- Transfer from Savings button on empty Spending screen when savings balance exists #882 - Connection issues overlay with connectivity fixes across Send, Receive, and Transfer flows #878 - Lightning Connections empty state with onboarding screen #857 - Unified PIN management screen (enable/disable/change in one place) #857 From 99cf1231193e2e60e9f5ee4b076a21f8b4dfa82a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Sena?= Date: Thu, 2 Apr 2026 14:42:19 -0300 Subject: [PATCH 4/5] Update app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> --- .../java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt index 05d946078..d3054b3e3 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt @@ -126,7 +126,7 @@ fun SpendingWalletScreen( Icon( painter = painterResource(R.drawable.ic_transfer), contentDescription = null, - modifier = Modifier.size(16.dp), + modifier = Modifier.size(16.dp) ) }, modifier = Modifier.testTag("TransferFromSavings") From e0b12fd3cc0a2916e02dc1ba7a424a61634e9d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Sena?= Date: Thu, 2 Apr 2026 14:42:32 -0300 Subject: [PATCH 5/5] Update app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> --- .../java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt index d3054b3e3..65e42a606 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt @@ -117,7 +117,7 @@ fun SpendingWalletScreen( } if (canTransferFromSavings) { - Spacer(modifier = Modifier.height(32.dp)) + VerticalSpacer(32.dp) SecondaryButton( onClick = onTransferFromSavingsClick,