From 5e63ed6c3cf8ca31e09084e78ebc2d6d0a0054ab Mon Sep 17 00:00:00 2001 From: Joao Victor Sena Date: Tue, 17 Jun 2025 15:14:18 -0300 Subject: [PATCH 01/14] feat:storing bitcoin url --- app/src/main/java/to/bitkit/env/Env.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/to/bitkit/env/Env.kt b/app/src/main/java/to/bitkit/env/Env.kt index 69e3fff3d..b92ab59cc 100644 --- a/app/src/main/java/to/bitkit/env/Env.kt +++ b/app/src/main/java/to/bitkit/env/Env.kt @@ -135,6 +135,6 @@ internal object Env { const val BITKIT_TELEGRAM = "https://t.me/bitkitchat" const val BITKIT_GITHUB = "https://github.com/synonymdev" const val BITKIT_HELP_CENTER = "https://help.bitkit.to" - const val TERMS_OF_USE_URL = "https://bitkit.to/terms-of-use" + const val STORING_BITCOINS_URL = "https://en.bitcoin.it/wiki/Storing_bitcoins" } From 61c341daac7aba82b6be10c43e115cc78ab56405 Mon Sep 17 00:00:00 2001 From: Joao Victor Sena Date: Wed, 18 Jun 2025 07:36:37 -0300 Subject: [PATCH 02/14] feat: HighBalanceWarningSheet.kt --- .../wallets/sheets/HighBalanceWarningSheet.kt | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 app/src/main/java/to/bitkit/ui/screens/wallets/sheets/HighBalanceWarningSheet.kt diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/sheets/HighBalanceWarningSheet.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/sheets/HighBalanceWarningSheet.kt new file mode 100644 index 000000000..e9aa102a0 --- /dev/null +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/sheets/HighBalanceWarningSheet.kt @@ -0,0 +1,125 @@ +package to.bitkit.ui.screens.wallets.sheets + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import to.bitkit.R +import to.bitkit.ui.components.BodyM +import to.bitkit.ui.components.Display +import to.bitkit.ui.components.PrimaryButton +import to.bitkit.ui.components.SecondaryButton +import to.bitkit.ui.scaffold.ScreenColumn +import to.bitkit.ui.scaffold.SheetTopBar +import to.bitkit.ui.shared.util.gradientBackground +import to.bitkit.ui.theme.AppThemeSurface +import to.bitkit.ui.theme.Colors +import to.bitkit.ui.theme.InterFontFamily +import to.bitkit.ui.utils.withAccent + +@Composable +fun HighBalanceWarningSheet( + understoodClick: () -> Unit, + learnMoreClick: () -> Unit, + modifier: Modifier = Modifier +) { + ScreenColumn( + modifier = modifier + .gradientBackground() + .testTag("high_balance_intro_screen") + ) { + SheetTopBar(stringResource(R.string.other__high_balance__nav_title)) + + Column( + modifier = Modifier.padding(horizontal = 16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Image( + painter = painterResource(R.drawable.exclamation_mark), + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .weight(1f) + .testTag("high_balance_image") + ) + + Display( + text = stringResource(R.string.other__high_balance__title).withAccent(accentColor = Colors.Yellow), + color = Colors.White, + modifier = Modifier + .fillMaxWidth() + .testTag("high_balance_title") + ) + Spacer(Modifier.height(8.dp)) + BodyM( + text = + stringResource(R.string.other__high_balance__text).withAccent( + defaultColor = Colors.White64, + accentStyle = SpanStyle( + fontWeight = FontWeight.Bold, + fontSize = 17.sp, + letterSpacing = 0.4.sp, + fontFamily = InterFontFamily, + color = Colors.White, + ) + ), + color = Colors.White64, + modifier = Modifier + .testTag("high_balance_description") + ) + Spacer(Modifier.height(32.dp)) + Row( + modifier = Modifier + .fillMaxWidth() + .testTag("buttons_row"), + horizontalArrangement = Arrangement.spacedBy(16.dp) + ) { + SecondaryButton( + text = stringResource(R.string.other__high_balance__cancel), + fullWidth = false, + onClick = learnMoreClick, + modifier = Modifier + .weight(1f) + .testTag("learn_more_button"), + ) + + PrimaryButton( + text = stringResource(R.string.other__high_balance__continue), + fullWidth = false, + onClick = understoodClick, + modifier = Modifier + .weight(1f) + .testTag("understood_button"), + ) + } + Spacer(Modifier.height(16.dp)) + } + } +} + + +@Preview(showBackground = true) +@Composable +private fun Preview() { + AppThemeSurface { + HighBalanceWarningSheet( + understoodClick = {}, + learnMoreClick = {} + ) + } +} From 76e2d1ebf992ca2bbde8ec817e9fc423a75cc122 Mon Sep 17 00:00:00 2001 From: Joao Victor Sena Date: Wed, 18 Jun 2025 07:54:38 -0300 Subject: [PATCH 03/14] feat: navigation --- app/src/main/java/to/bitkit/ui/ContentView.kt | 11 +++++++++++ .../main/java/to/bitkit/ui/components/SheetHost.kt | 1 + .../java/to/bitkit/ui/screens/wallets/HomeScreen.kt | 3 --- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/ContentView.kt b/app/src/main/java/to/bitkit/ui/ContentView.kt index fd170cd18..f91f10a06 100644 --- a/app/src/main/java/to/bitkit/ui/ContentView.kt +++ b/app/src/main/java/to/bitkit/ui/ContentView.kt @@ -71,6 +71,7 @@ import to.bitkit.ui.screens.wallets.activity.DateRangeSelectorSheet import to.bitkit.ui.screens.wallets.activity.TagSelectorSheet import to.bitkit.ui.screens.wallets.receive.ReceiveQrSheet import to.bitkit.ui.screens.wallets.send.SendOptionsView +import to.bitkit.ui.screens.wallets.sheets.HighBalanceWarningSheet import to.bitkit.ui.screens.wallets.suggestion.BuyIntroScreen import to.bitkit.ui.screens.widgets.AddWidgetsScreen import to.bitkit.ui.screens.widgets.WidgetsIntroScreen @@ -371,6 +372,16 @@ fun ContentView( onDismiss = { appViewModel.hideSheet() }, ) + BottomSheetType.HighBalanceWarning -> { + HighBalanceWarningSheet( + understoodClick = { + + }, + learnMoreClick = { + + }, + ) + } null -> Unit } } diff --git a/app/src/main/java/to/bitkit/ui/components/SheetHost.kt b/app/src/main/java/to/bitkit/ui/components/SheetHost.kt index c98704dd0..a2c7ed4e0 100644 --- a/app/src/main/java/to/bitkit/ui/components/SheetHost.kt +++ b/app/src/main/java/to/bitkit/ui/components/SheetHost.kt @@ -45,6 +45,7 @@ sealed class BottomSheetType { data object BackupNavigation : BottomSheetType() data object ActivityDateRangeSelector : BottomSheetType() data object ActivityTagSelector : BottomSheetType() + data object HighBalanceWarning : BottomSheetType() } @OptIn(ExperimentalMaterial3Api::class) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt index 792f0b4e8..58e2f6ee7 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt @@ -336,9 +336,6 @@ fun HomeScreen( .systemBarsPadding() ) - - // Drawer overlay and content - moved from AppScaffold to here - // Semi-transparent overlay when drawer is open AnimatedVisibility( visible = drawerState.currentValue == DrawerValue.Open, modifier = Modifier From 54c27d4ad0285e5fe470f35a650628e4d4f33402 Mon Sep 17 00:00:00 2001 From: Joao Victor Sena Date: Wed, 18 Jun 2025 08:55:46 -0300 Subject: [PATCH 04/14] feat: sheet visibility rules WIP --- .../ui/screens/wallets/HomeViewModel.kt | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt index 1563f8aca..96ec6f06b 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt @@ -11,6 +11,8 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import kotlinx.datetime.Clock +import kotlinx.datetime.Instant import to.bitkit.data.SettingsStore import to.bitkit.models.Suggestion import to.bitkit.models.WidgetType @@ -41,6 +43,7 @@ class HomeViewModel @Inject constructor( setupStateObservation() setupArticleRotation() setupFactRotation() + checkHighBalance() } private fun setupStateObservation() { @@ -124,6 +127,26 @@ class HomeViewModel @Inject constructor( _currentFact.value = null } + private fun checkHighBalance() { + viewModelScope.launch { + delay(CHECK_DELAY_MILLISECONDS) + val lastTimeAskedMock = + Clock.System.now().toEpochMilliseconds() + ASK_INTERVAL_MILLISECONDS + 1L //TODO GET FROM PERSISTENCE + val currentWarningsMock = 2 //TODO GET FROM PERSISTENCE + + val thresholdReached = + walletRepo.balanceState.value.totalOnchainSats > BALANCE_THRESHOLD_SATS //TODO GET BALANCE USD + val isTimeOutOver = lastTimeAskedMock - ASK_INTERVAL_MILLISECONDS > ASK_INTERVAL_MILLISECONDS + val belowMaxWarnings = currentWarningsMock < MAX_WARNINGS + + if (thresholdReached && isTimeOutOver && belowMaxWarnings) { + //TODO PERSIST LAST TIME ASKED + // TODO INCREASE currentWarning + // TODO SEND EFFECT NAVIGATION + } + } + } + fun removeSuggestion(suggestion: Suggestion) { viewModelScope.launch { settingsStore.addDismissedSuggestion(suggestion) @@ -240,4 +263,19 @@ class HomeViewModel @Inject constructor( val dismissedList = settings.dismissedSuggestions.mapNotNull { it.toSuggestionOrNull() } baseSuggestions.filterNot { it in dismissedList } } + + companion object { + /**How high the balance must be to show this warning to the user (in USD)*/ + private const val BALANCE_THRESHOLD_USD = 500 + + /**how high the balance must be to show this warning to the user (in Sats)*/ + private const val BALANCE_THRESHOLD_SATS = 700000uL + private const val MAX_WARNINGS = 3 + + /** 1 day - how long this prompt will be hidden if user taps Later*/ + private const val ASK_INTERVAL_MILLISECONDS = 1000 * 60 * 60 * 24 + + /**How long user needs to stay on the home screen before he will see this prompt*/ + private const val CHECK_DELAY_MILLISECONDS = 2500L + } } From baf423eab6856dcdac2419a9685952b3ea0ed98a Mon Sep 17 00:00:00 2001 From: Joao Victor Sena Date: Wed, 18 Jun 2025 09:15:44 -0300 Subject: [PATCH 05/14] feat: display sheet --- .../bitkit/ui/screens/wallets/HomeScreen.kt | 21 +++++++++++++++++++ .../ui/screens/wallets/HomeViewModel.kt | 13 +++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt index 58e2f6ee7..cbbbfa209 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt @@ -101,6 +101,7 @@ import to.bitkit.ui.scaffold.AppAlertDialog import to.bitkit.ui.scaffold.AppScaffold import to.bitkit.ui.screens.wallets.activity.AllActivityScreen import to.bitkit.ui.screens.wallets.activity.components.ActivityListSimple +import to.bitkit.ui.screens.wallets.sheets.HighBalanceWarningSheet import to.bitkit.ui.screens.widgets.DragAndDropWidget import to.bitkit.ui.screens.widgets.DragDropColumn import to.bitkit.ui.screens.widgets.blocks.BlockCard @@ -145,6 +146,13 @@ fun HomeScreen( navController = walletNavController, startDestination = HomeRoutes.Home, ) { + composable { + HighBalanceWarningSheet( + understoodClick = {}, + learnMoreClick = {} + ) + } + composable { val context = LocalContext.current val hasSeenTransferIntro by settingsViewModel.hasSeenTransferIntro.collectAsStateWithLifecycle() @@ -152,6 +160,16 @@ fun HomeScreen( val hasSeenProfileIntro by settingsViewModel.hasSeenProfileIntro.collectAsStateWithLifecycle() val quickPayIntroSeen by settingsViewModel.quickPayIntroSeen.collectAsStateWithLifecycle() + LaunchedEffect(Unit) { + homeViewModel.homeEffect.collect { effect -> + when(effect) { + HomeViewModel.HomeEffects.DisplayHighBalanceSheet -> { + walletNavController.navigate(HomeRoutes.HighBalanceWarning) + } + } + } + } + HomeContentView( mainUiState = uiState, homeUiState = homeUiState, @@ -822,6 +840,9 @@ object HomeRoutes { @Serializable data object AllActivity + + @Serializable + data object HighBalanceWarning } @Preview(showBackground = true, showSystemUi = true) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt index 96ec6f06b..e8c25a889 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt @@ -4,8 +4,10 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map @@ -23,6 +25,7 @@ import to.bitkit.models.widget.toBlockModel import to.bitkit.repositories.WalletRepo import to.bitkit.repositories.WidgetsRepo import to.bitkit.ui.screens.widgets.blocks.toWeatherModel +import to.bitkit.viewmodels.MainScreenEffect import javax.inject.Inject import kotlin.time.Duration.Companion.seconds @@ -46,6 +49,10 @@ class HomeViewModel @Inject constructor( checkHighBalance() } + private val _homeEffect = MutableSharedFlow(extraBufferCapacity = 1) + val homeEffect = _homeEffect.asSharedFlow() + private fun homeEffect(effect: HomeEffects) = viewModelScope.launch { _homeEffect.emit(effect) } + private fun setupStateObservation() { viewModelScope.launch { combine( @@ -142,7 +149,7 @@ class HomeViewModel @Inject constructor( if (thresholdReached && isTimeOutOver && belowMaxWarnings) { //TODO PERSIST LAST TIME ASKED // TODO INCREASE currentWarning - // TODO SEND EFFECT NAVIGATION + homeEffect(HomeEffects.DisplayHighBalanceSheet) } } } @@ -264,6 +271,10 @@ class HomeViewModel @Inject constructor( baseSuggestions.filterNot { it in dismissedList } } + sealed interface HomeEffects { + data object DisplayHighBalanceSheet : HomeEffects + } + companion object { /**How high the balance must be to show this warning to the user (in USD)*/ private const val BALANCE_THRESHOLD_USD = 500 From 827bff008f212ce1ecf2dd5553a7f128dffe44ca Mon Sep 17 00:00:00 2001 From: Joao Victor Sena Date: Wed, 18 Jun 2025 09:48:43 -0300 Subject: [PATCH 06/14] feat: migrate code to modal bottom sheet --- app/src/main/java/to/bitkit/ui/ContentView.kt | 12 ----- .../java/to/bitkit/ui/components/SheetHost.kt | 1 - .../bitkit/ui/screens/wallets/HomeScreen.kt | 33 +++++------- .../bitkit/ui/screens/wallets/HomeUiState.kt | 1 + .../ui/screens/wallets/HomeViewModel.kt | 15 ++---- .../wallets/sheets/HighBalanceWarningSheet.kt | 53 ++++++++++++++++--- 6 files changed, 63 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/ContentView.kt b/app/src/main/java/to/bitkit/ui/ContentView.kt index f91f10a06..3b01d141d 100644 --- a/app/src/main/java/to/bitkit/ui/ContentView.kt +++ b/app/src/main/java/to/bitkit/ui/ContentView.kt @@ -71,7 +71,6 @@ import to.bitkit.ui.screens.wallets.activity.DateRangeSelectorSheet import to.bitkit.ui.screens.wallets.activity.TagSelectorSheet import to.bitkit.ui.screens.wallets.receive.ReceiveQrSheet import to.bitkit.ui.screens.wallets.send.SendOptionsView -import to.bitkit.ui.screens.wallets.sheets.HighBalanceWarningSheet import to.bitkit.ui.screens.wallets.suggestion.BuyIntroScreen import to.bitkit.ui.screens.widgets.AddWidgetsScreen import to.bitkit.ui.screens.widgets.WidgetsIntroScreen @@ -371,17 +370,6 @@ fun ContentView( BottomSheetType.BackupNavigation -> BackupNavigationSheet( onDismiss = { appViewModel.hideSheet() }, ) - - BottomSheetType.HighBalanceWarning -> { - HighBalanceWarningSheet( - understoodClick = { - - }, - learnMoreClick = { - - }, - ) - } null -> Unit } } diff --git a/app/src/main/java/to/bitkit/ui/components/SheetHost.kt b/app/src/main/java/to/bitkit/ui/components/SheetHost.kt index a2c7ed4e0..c98704dd0 100644 --- a/app/src/main/java/to/bitkit/ui/components/SheetHost.kt +++ b/app/src/main/java/to/bitkit/ui/components/SheetHost.kt @@ -45,7 +45,6 @@ sealed class BottomSheetType { data object BackupNavigation : BottomSheetType() data object ActivityDateRangeSelector : BottomSheetType() data object ActivityTagSelector : BottomSheetType() - data object HighBalanceWarning : BottomSheetType() } @OptIn(ExperimentalMaterial3Api::class) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt index cbbbfa209..d3f47c518 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt @@ -146,13 +146,6 @@ fun HomeScreen( navController = walletNavController, startDestination = HomeRoutes.Home, ) { - composable { - HighBalanceWarningSheet( - understoodClick = {}, - learnMoreClick = {} - ) - } - composable { val context = LocalContext.current val hasSeenTransferIntro by settingsViewModel.hasSeenTransferIntro.collectAsStateWithLifecycle() @@ -160,16 +153,6 @@ fun HomeScreen( val hasSeenProfileIntro by settingsViewModel.hasSeenProfileIntro.collectAsStateWithLifecycle() val quickPayIntroSeen by settingsViewModel.quickPayIntroSeen.collectAsStateWithLifecycle() - LaunchedEffect(Unit) { - homeViewModel.homeEffect.collect { effect -> - when(effect) { - HomeViewModel.HomeEffects.DisplayHighBalanceSheet -> { - walletNavController.navigate(HomeRoutes.HighBalanceWarning) - } - } - } - } - HomeContentView( mainUiState = uiState, homeUiState = homeUiState, @@ -272,7 +255,8 @@ fun HomeScreen( }, onMoveWidget = { fromIndex, toIndex -> homeViewModel.moveWidget(fromIndex, toIndex) - } + }, + onDismissHighBalanceSheet = { homeViewModel.dismissHighBalanceSheet() }, ) } composable( @@ -513,6 +497,7 @@ private fun HomeContentView( walletNavController: NavController, drawerState: DrawerState, onRefresh: () -> Unit, + onDismissHighBalanceSheet: () -> Unit, ) { val scope = rememberCoroutineScope() @@ -804,6 +789,14 @@ private fun HomeContentView( state = pullRefreshState, modifier = Modifier.align(Alignment.TopCenter) ) + + if (homeUiState.highBalanceSheetVisible) { + HighBalanceWarningSheet( + onDismiss = onDismissHighBalanceSheet, + understoodClick = onDismissHighBalanceSheet, + learnMoreClick = {} //TODO NAVIGATE INTENT + ) + } } } } @@ -840,9 +833,6 @@ object HomeRoutes { @Serializable data object AllActivity - - @Serializable - data object HighBalanceWarning } @Preview(showBackground = true, showSystemUi = true) @@ -863,6 +853,7 @@ private fun HomeContentViewPreview() { onClickEnableEdit = {}, onClickEditWidget = {}, onClickDeleteWidget = {}, + onDismissHighBalanceSheet = {}, onMoveWidget = { _, _ -> }, ) } diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeUiState.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeUiState.kt index 3ba0aab6b..682b671eb 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeUiState.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeUiState.kt @@ -33,4 +33,5 @@ data class HomeUiState( val currentPrice: PriceDTO? = null, val isEditingWidgets: Boolean = false, val deleteWidgetAlert: WidgetType? = null, + val highBalanceSheetVisible: Boolean = false, ) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt index e8c25a889..1c783fc00 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt @@ -48,11 +48,6 @@ class HomeViewModel @Inject constructor( setupFactRotation() checkHighBalance() } - - private val _homeEffect = MutableSharedFlow(extraBufferCapacity = 1) - val homeEffect = _homeEffect.asSharedFlow() - private fun homeEffect(effect: HomeEffects) = viewModelScope.launch { _homeEffect.emit(effect) } - private fun setupStateObservation() { viewModelScope.launch { combine( @@ -149,11 +144,15 @@ class HomeViewModel @Inject constructor( if (thresholdReached && isTimeOutOver && belowMaxWarnings) { //TODO PERSIST LAST TIME ASKED // TODO INCREASE currentWarning - homeEffect(HomeEffects.DisplayHighBalanceSheet) + _uiState.update { it.copy(highBalanceSheetVisible = true) } } } } + fun dismissHighBalanceSheet() { + _uiState.update { it.copy(highBalanceSheetVisible = false) } + } + fun removeSuggestion(suggestion: Suggestion) { viewModelScope.launch { settingsStore.addDismissedSuggestion(suggestion) @@ -271,10 +270,6 @@ class HomeViewModel @Inject constructor( baseSuggestions.filterNot { it in dismissedList } } - sealed interface HomeEffects { - data object DisplayHighBalanceSheet : HomeEffects - } - companion object { /**How high the balance must be to show this warning to the user (in USD)*/ private const val BALANCE_THRESHOLD_USD = 500 diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/sheets/HighBalanceWarningSheet.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/sheets/HighBalanceWarningSheet.kt index e9aa102a0..5b92b4c5e 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/sheets/HighBalanceWarningSheet.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/sheets/HighBalanceWarningSheet.kt @@ -4,10 +4,13 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.SheetState +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -22,21 +25,54 @@ import androidx.compose.ui.unit.sp import to.bitkit.R import to.bitkit.ui.components.BodyM import to.bitkit.ui.components.Display +import to.bitkit.ui.components.ModalBottomSheetHandle import to.bitkit.ui.components.PrimaryButton import to.bitkit.ui.components.SecondaryButton +import to.bitkit.ui.components.VerticalSpacer import to.bitkit.ui.scaffold.ScreenColumn import to.bitkit.ui.scaffold.SheetTopBar import to.bitkit.ui.shared.util.gradientBackground +import to.bitkit.ui.theme.AppShapes import to.bitkit.ui.theme.AppThemeSurface import to.bitkit.ui.theme.Colors import to.bitkit.ui.theme.InterFontFamily +import to.bitkit.ui.theme.ModalSheetTopPadding import to.bitkit.ui.utils.withAccent +@OptIn(ExperimentalMaterial3Api::class) @Composable fun HighBalanceWarningSheet( + onDismiss: () -> Unit, understoodClick: () -> Unit, learnMoreClick: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, +) { + val sheetState: SheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + + + ModalBottomSheet( + onDismissRequest = onDismiss, + sheetState = sheetState, + shape = AppShapes.sheet, + containerColor = Colors.Black, + dragHandle = { ModalBottomSheetHandle() }, + modifier = Modifier + .fillMaxSize() + .padding(top = ModalSheetTopPadding) + ) { + HighBalanceWarningContent( + understoodClick = understoodClick, + learnMoreClick = learnMoreClick, + modifier = modifier + ) + } +} + +@Composable +fun HighBalanceWarningContent( + understoodClick: () -> Unit, + learnMoreClick: () -> Unit, + modifier: Modifier = Modifier, ) { ScreenColumn( modifier = modifier @@ -65,7 +101,7 @@ fun HighBalanceWarningSheet( .fillMaxWidth() .testTag("high_balance_title") ) - Spacer(Modifier.height(8.dp)) + VerticalSpacer(8.dp) BodyM( text = stringResource(R.string.other__high_balance__text).withAccent( @@ -82,7 +118,7 @@ fun HighBalanceWarningSheet( modifier = Modifier .testTag("high_balance_description") ) - Spacer(Modifier.height(32.dp)) + VerticalSpacer(32.dp) Row( modifier = Modifier .fillMaxWidth() @@ -107,19 +143,20 @@ fun HighBalanceWarningSheet( .testTag("understood_button"), ) } - Spacer(Modifier.height(16.dp)) + VerticalSpacer(16.dp) } } } +@OptIn(ExperimentalMaterial3Api::class) @Preview(showBackground = true) @Composable private fun Preview() { AppThemeSurface { - HighBalanceWarningSheet( + HighBalanceWarningContent( understoodClick = {}, - learnMoreClick = {} + learnMoreClick = {}, ) } } From 3a73d7b39b79f3140ea76b0c895cac9fb3e82410 Mon Sep 17 00:00:00 2001 From: Joao Victor Sena Date: Wed, 18 Jun 2025 10:43:36 -0300 Subject: [PATCH 07/14] fex: remove ScreenColumn to fix padding bg color --- .../ui/screens/wallets/sheets/HighBalanceWarningSheet.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/sheets/HighBalanceWarningSheet.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/sheets/HighBalanceWarningSheet.kt index 5b92b4c5e..e012326f4 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/sheets/HighBalanceWarningSheet.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/sheets/HighBalanceWarningSheet.kt @@ -49,7 +49,6 @@ fun HighBalanceWarningSheet( ) { val sheetState: SheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) - ModalBottomSheet( onDismissRequest = onDismiss, sheetState = sheetState, @@ -74,8 +73,9 @@ fun HighBalanceWarningContent( learnMoreClick: () -> Unit, modifier: Modifier = Modifier, ) { - ScreenColumn( + Column( modifier = modifier + .fillMaxWidth() .gradientBackground() .testTag("high_balance_intro_screen") ) { From bbad0e28ec2575c78d92aeaf6259fc8f6851f4d2 Mon Sep 17 00:00:00 2001 From: Joao Victor Sena Date: Wed, 18 Jun 2025 11:08:05 -0300 Subject: [PATCH 08/14] feat: conversion mock --- .../to/bitkit/ui/screens/wallets/HomeViewModel.kt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt index 1c783fc00..c09a0d102 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt @@ -27,6 +27,7 @@ import to.bitkit.repositories.WidgetsRepo import to.bitkit.ui.screens.widgets.blocks.toWeatherModel import to.bitkit.viewmodels.MainScreenEffect import javax.inject.Inject +import kotlin.math.roundToLong import kotlin.time.Duration.Companion.seconds @HiltViewModel @@ -136,8 +137,9 @@ class HomeViewModel @Inject constructor( Clock.System.now().toEpochMilliseconds() + ASK_INTERVAL_MILLISECONDS + 1L //TODO GET FROM PERSISTENCE val currentWarningsMock = 2 //TODO GET FROM PERSISTENCE - val thresholdReached = - walletRepo.balanceState.value.totalOnchainSats > BALANCE_THRESHOLD_SATS //TODO GET BALANCE USD + val balanceUsdLong = satsToUsdLong(walletRepo.balanceState.value.totalOnchainSats) + + val thresholdReached = balanceUsdLong > BALANCE_THRESHOLD_SATS val isTimeOutOver = lastTimeAskedMock - ASK_INTERVAL_MILLISECONDS > ASK_INTERVAL_MILLISECONDS val belowMaxWarnings = currentWarningsMock < MAX_WARNINGS @@ -148,6 +150,9 @@ class HomeViewModel @Inject constructor( } } } + private fun satsToUsdLong(sats: ULong): ULong { + return(sats.toDouble() * 0.00105).toULong() //todo IMPLEMENT + } fun dismissHighBalanceSheet() { _uiState.update { it.copy(highBalanceSheetVisible = false) } @@ -275,11 +280,11 @@ class HomeViewModel @Inject constructor( private const val BALANCE_THRESHOLD_USD = 500 /**how high the balance must be to show this warning to the user (in Sats)*/ - private const val BALANCE_THRESHOLD_SATS = 700000uL + private const val BALANCE_THRESHOLD_SATS = 100uL private const val MAX_WARNINGS = 3 /** 1 day - how long this prompt will be hidden if user taps Later*/ - private const val ASK_INTERVAL_MILLISECONDS = 1000 * 60 * 60 * 24 + private const val ASK_INTERVAL_MILLISECONDS = 1000 * 10 /**How long user needs to stay on the home screen before he will see this prompt*/ private const val CHECK_DELAY_MILLISECONDS = 2500L From 34a655ec1dc40802b1964d19beba2640d2d7c662 Mon Sep 17 00:00:00 2001 From: Joao Victor Sena Date: Wed, 18 Jun 2025 11:35:44 -0300 Subject: [PATCH 09/14] feat: persist values --- .../main/java/to/bitkit/data/SettingsStore.kt | 2 + .../ui/screens/wallets/HomeViewModel.kt | 45 +++++++++---------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/to/bitkit/data/SettingsStore.kt b/app/src/main/java/to/bitkit/data/SettingsStore.kt index 99a39b719..0c60c11ae 100644 --- a/app/src/main/java/to/bitkit/data/SettingsStore.kt +++ b/app/src/main/java/to/bitkit/data/SettingsStore.kt @@ -91,4 +91,6 @@ data class SettingsData( val enableSendAmountWarning: Boolean = false, val backupVerified: Boolean = false, val dismissedSuggestions: List = emptyList(), + val lastTimeAskedBalanceWarningMillis: Long = 0, + val balanceWarningTimes: Int = 0, ) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt index c09a0d102..48e0be714 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt @@ -4,17 +4,15 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.datetime.Clock -import kotlinx.datetime.Instant import to.bitkit.data.SettingsStore import to.bitkit.models.Suggestion import to.bitkit.models.WidgetType @@ -25,9 +23,7 @@ import to.bitkit.models.widget.toBlockModel import to.bitkit.repositories.WalletRepo import to.bitkit.repositories.WidgetsRepo import to.bitkit.ui.screens.widgets.blocks.toWeatherModel -import to.bitkit.viewmodels.MainScreenEffect import javax.inject.Inject -import kotlin.math.roundToLong import kotlin.time.Duration.Companion.seconds @HiltViewModel @@ -49,6 +45,7 @@ class HomeViewModel @Inject constructor( setupFactRotation() checkHighBalance() } + private fun setupStateObservation() { viewModelScope.launch { combine( @@ -133,25 +130,29 @@ class HomeViewModel @Inject constructor( private fun checkHighBalance() { viewModelScope.launch { delay(CHECK_DELAY_MILLISECONDS) - val lastTimeAskedMock = - Clock.System.now().toEpochMilliseconds() + ASK_INTERVAL_MILLISECONDS + 1L //TODO GET FROM PERSISTENCE - val currentWarningsMock = 2 //TODO GET FROM PERSISTENCE - val balanceUsdLong = satsToUsdLong(walletRepo.balanceState.value.totalOnchainSats) + val settings = settingsStore.data.first() - val thresholdReached = balanceUsdLong > BALANCE_THRESHOLD_SATS - val isTimeOutOver = lastTimeAskedMock - ASK_INTERVAL_MILLISECONDS > ASK_INTERVAL_MILLISECONDS - val belowMaxWarnings = currentWarningsMock < MAX_WARNINGS + val totalOnChainSats = walletRepo.balanceState.value.totalOnchainSats + val balanceUsdLong = satsToUsdLong(totalOnChainSats) + val thresholdReached = totalOnChainSats > BALANCE_THRESHOLD_SATS || balanceUsdLong > BALANCE_THRESHOLD_USD + val isTimeOutOver = settings.lastTimeAskedBalanceWarningMillis - ASK_INTERVAL_MILLIS > ASK_INTERVAL_MILLIS + val belowMaxWarnings = settings.balanceWarningTimes < MAX_WARNINGS - if (thresholdReached && isTimeOutOver && belowMaxWarnings) { - //TODO PERSIST LAST TIME ASKED - // TODO INCREASE currentWarning + if (thresholdReached && isTimeOutOver && belowMaxWarnings && !_uiState.value.highBalanceSheetVisible) { + settingsStore.update { + it.copy( + balanceWarningTimes = it.balanceWarningTimes + 1, + lastTimeAskedBalanceWarningMillis = Clock.System.now().toEpochMilliseconds() + ) + } _uiState.update { it.copy(highBalanceSheetVisible = true) } } } } + private fun satsToUsdLong(sats: ULong): ULong { - return(sats.toDouble() * 0.00105).toULong() //todo IMPLEMENT + return (sats.toDouble() * 0.00105).toULong() //todo IMPLEMENT } fun dismissHighBalanceSheet() { @@ -170,12 +171,6 @@ class HomeViewModel @Inject constructor( } } - fun refreshSpecificWidget(widgetType: WidgetType) { - viewModelScope.launch { - widgetsRepo.refreshWidget(widgetType) - } - } - fun enableEditMode() { _uiState.update { it.copy(isEditingWidgets = true) } } @@ -277,14 +272,14 @@ class HomeViewModel @Inject constructor( companion object { /**How high the balance must be to show this warning to the user (in USD)*/ - private const val BALANCE_THRESHOLD_USD = 500 + private const val BALANCE_THRESHOLD_USD = 500U /**how high the balance must be to show this warning to the user (in Sats)*/ - private const val BALANCE_THRESHOLD_SATS = 100uL + private const val BALANCE_THRESHOLD_SATS = 700000U private const val MAX_WARNINGS = 3 /** 1 day - how long this prompt will be hidden if user taps Later*/ - private const val ASK_INTERVAL_MILLISECONDS = 1000 * 10 + private const val ASK_INTERVAL_MILLIS = 1000 * 60 * 60 * 24 /**How long user needs to stay on the home screen before he will see this prompt*/ private const val CHECK_DELAY_MILLISECONDS = 2500L From 5ab7736d0439c42b9949418040153e218cf290bd Mon Sep 17 00:00:00 2001 From: Joao Victor Sena Date: Thu, 19 Jun 2025 07:01:38 -0300 Subject: [PATCH 10/14] feat: implement usd conversion --- .../to/bitkit/ui/screens/wallets/HomeViewModel.kt | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt index 48e0be714..b87326061 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt @@ -20,9 +20,11 @@ import to.bitkit.models.toSuggestionOrNull import to.bitkit.models.widget.ArticleModel import to.bitkit.models.widget.toArticleModel import to.bitkit.models.widget.toBlockModel +import to.bitkit.repositories.CurrencyRepo import to.bitkit.repositories.WalletRepo import to.bitkit.repositories.WidgetsRepo import to.bitkit.ui.screens.widgets.blocks.toWeatherModel +import java.math.BigDecimal import javax.inject.Inject import kotlin.time.Duration.Companion.seconds @@ -31,6 +33,7 @@ class HomeViewModel @Inject constructor( private val walletRepo: WalletRepo, private val widgetsRepo: WidgetsRepo, private val settingsStore: SettingsStore, + private val currencyRepo: CurrencyRepo ) : ViewModel() { private val _uiState = MutableStateFlow(HomeUiState()) @@ -134,8 +137,9 @@ class HomeViewModel @Inject constructor( val settings = settingsStore.data.first() val totalOnChainSats = walletRepo.balanceState.value.totalOnchainSats - val balanceUsdLong = satsToUsdLong(totalOnChainSats) - val thresholdReached = totalOnChainSats > BALANCE_THRESHOLD_SATS || balanceUsdLong > BALANCE_THRESHOLD_USD + val balanceUsd = satsToUsd(totalOnChainSats) ?: return@launch + val thresholdReached = + totalOnChainSats > BALANCE_THRESHOLD_SATS || balanceUsd > BigDecimal(BALANCE_THRESHOLD_USD) val isTimeOutOver = settings.lastTimeAskedBalanceWarningMillis - ASK_INTERVAL_MILLIS > ASK_INTERVAL_MILLIS val belowMaxWarnings = settings.balanceWarningTimes < MAX_WARNINGS @@ -151,8 +155,9 @@ class HomeViewModel @Inject constructor( } } - private fun satsToUsdLong(sats: ULong): ULong { - return (sats.toDouble() * 0.00105).toULong() //todo IMPLEMENT + private fun satsToUsd(sats: ULong): BigDecimal? { + val converted = currencyRepo.convertSatsToFiat(sats = sats.toLong(), currency = "USD") + return converted?.value } fun dismissHighBalanceSheet() { @@ -272,7 +277,7 @@ class HomeViewModel @Inject constructor( companion object { /**How high the balance must be to show this warning to the user (in USD)*/ - private const val BALANCE_THRESHOLD_USD = 500U + private const val BALANCE_THRESHOLD_USD = 500L /**how high the balance must be to show this warning to the user (in Sats)*/ private const val BALANCE_THRESHOLD_SATS = 700000U From d605e0b9b4230479aa75ed90b18a11536c291242 Mon Sep 17 00:00:00 2001 From: Joao Victor Sena Date: Thu, 19 Jun 2025 07:04:35 -0300 Subject: [PATCH 11/14] feat: navigate to STORING_BITCOINS_URL --- .../main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt index d3f47c518..b4f9a7660 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeScreen.kt @@ -1,6 +1,7 @@ package to.bitkit.ui.screens.wallets import android.Manifest +import android.content.Intent import android.os.Build import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts @@ -60,6 +61,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex +import androidx.core.net.toUri import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavController @@ -791,10 +793,15 @@ private fun HomeContentView( ) if (homeUiState.highBalanceSheetVisible) { + val context = LocalContext.current HighBalanceWarningSheet( onDismiss = onDismissHighBalanceSheet, understoodClick = onDismissHighBalanceSheet, - learnMoreClick = {} //TODO NAVIGATE INTENT + learnMoreClick = { + val intent = Intent(Intent.ACTION_VIEW, Env.STORING_BITCOINS_URL.toUri()) + context.startActivity(intent) + onDismissHighBalanceSheet() + } ) } } From 0cb79976ed14570143ca5cf909744281d6ddd91e Mon Sep 17 00:00:00 2001 From: Joao Victor Sena Date: Thu, 19 Jun 2025 07:09:07 -0300 Subject: [PATCH 12/14] feat: reset thresholdReached --- .../java/to/bitkit/ui/screens/wallets/HomeViewModel.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt index b87326061..2400fffe9 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt @@ -152,6 +152,14 @@ class HomeViewModel @Inject constructor( } _uiState.update { it.copy(highBalanceSheetVisible = true) } } + + if (!thresholdReached) { + settingsStore.update { + it.copy( + balanceWarningTimes = 0, + ) + } + } } } From 3e7e16b78b49e07661dc4d88b34106876e0a01ea Mon Sep 17 00:00:00 2001 From: Joao Victor Sena Date: Thu, 19 Jun 2025 07:11:13 -0300 Subject: [PATCH 13/14] feat: remove sats threshold --- .../main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt index 2400fffe9..97781efb4 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt @@ -138,8 +138,7 @@ class HomeViewModel @Inject constructor( val totalOnChainSats = walletRepo.balanceState.value.totalOnchainSats val balanceUsd = satsToUsd(totalOnChainSats) ?: return@launch - val thresholdReached = - totalOnChainSats > BALANCE_THRESHOLD_SATS || balanceUsd > BigDecimal(BALANCE_THRESHOLD_USD) + val thresholdReached = balanceUsd > BigDecimal(BALANCE_THRESHOLD_USD) val isTimeOutOver = settings.lastTimeAskedBalanceWarningMillis - ASK_INTERVAL_MILLIS > ASK_INTERVAL_MILLIS val belowMaxWarnings = settings.balanceWarningTimes < MAX_WARNINGS @@ -286,9 +285,6 @@ class HomeViewModel @Inject constructor( companion object { /**How high the balance must be to show this warning to the user (in USD)*/ private const val BALANCE_THRESHOLD_USD = 500L - - /**how high the balance must be to show this warning to the user (in Sats)*/ - private const val BALANCE_THRESHOLD_SATS = 700000U private const val MAX_WARNINGS = 3 /** 1 day - how long this prompt will be hidden if user taps Later*/ From f4c0e8e82aaccf087254c59220f1172890460708 Mon Sep 17 00:00:00 2001 From: Joao Victor Sena Date: Thu, 19 Jun 2025 07:16:04 -0300 Subject: [PATCH 14/14] feat: use total sats instead of only onChain --- app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt index 97781efb4..7e71fffb3 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/HomeViewModel.kt @@ -136,7 +136,7 @@ class HomeViewModel @Inject constructor( val settings = settingsStore.data.first() - val totalOnChainSats = walletRepo.balanceState.value.totalOnchainSats + val totalOnChainSats = walletRepo.balanceState.value.totalSats val balanceUsd = satsToUsd(totalOnChainSats) ?: return@launch val thresholdReached = balanceUsd > BigDecimal(BALANCE_THRESHOLD_USD) val isTimeOutOver = settings.lastTimeAskedBalanceWarningMillis - ASK_INTERVAL_MILLIS > ASK_INTERVAL_MILLIS