diff --git a/CHANGELOG.md b/CHANGELOG.md index 299beaf0f3..a921f4d622 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed +- Align tab colors, Show details button, notifications bell figure, and home activity count with iOS #907 + ## [2.2.0] - 2026-04-07 ### Fixed diff --git a/app/src/main/java/to/bitkit/ui/ContentView.kt b/app/src/main/java/to/bitkit/ui/ContentView.kt index 3f333deee7..e190ff9143 100644 --- a/app/src/main/java/to/bitkit/ui/ContentView.kt +++ b/app/src/main/java/to/bitkit/ui/ContentView.kt @@ -450,7 +450,11 @@ fun ContentView( TimedSheetType.NOTIFICATIONS -> { BackgroundPaymentsIntroSheet( - onContinue = { + onLater = { + appViewModel.dismissTimedSheet() + settingsViewModel.setBgPaymentsIntroSeen(true) + }, + onEnable = { appViewModel.dismissTimedSheet() navController.navigateTo(Routes.BackgroundPaymentsSettings) settingsViewModel.setBgPaymentsIntroSeen(true) @@ -1133,9 +1137,10 @@ private fun NavGraphBuilder.generalSettingsSubScreens(navController: NavHostCont composableWithDefaultTransitions { BackgroundPaymentsIntroScreen( onBack = { navController.popBackStack() }, - onContinue = { + onLater = { navController.popBackStack() }, + onEnable = { navController.navigateTo(Routes.BackgroundPaymentsSettings) - } + }, ) } } diff --git a/app/src/main/java/to/bitkit/ui/screens/shop/shopDiscover/ShopDiscoverScreen.kt b/app/src/main/java/to/bitkit/ui/screens/shop/shopDiscover/ShopDiscoverScreen.kt index b9fc346c84..616ed7e7bd 100644 --- a/app/src/main/java/to/bitkit/ui/screens/shop/shopDiscover/ShopDiscoverScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/shop/shopDiscover/ShopDiscoverScreen.kt @@ -3,6 +3,7 @@ package to.bitkit.ui.screens.shop.shopDiscover import android.annotation.SuppressLint import android.view.ViewGroup import android.webkit.WebView +import androidx.annotation.StringRes import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -15,92 +16,74 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon -import androidx.compose.material3.PrimaryTabRow -import androidx.compose.material3.Tab -import androidx.compose.material3.TabRowDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView +import kotlinx.collections.immutable.toImmutableList import to.bitkit.R import to.bitkit.env.Env import to.bitkit.ext.configureForBasicWebContent import to.bitkit.models.BitrefillCategory import to.bitkit.ui.components.BodyM -import to.bitkit.ui.components.CaptionB import to.bitkit.ui.components.SuggestionCard import to.bitkit.ui.components.Text13Up import to.bitkit.ui.components.VerticalSpacer import to.bitkit.ui.scaffold.AppTopBar import to.bitkit.ui.scaffold.DrawerNavIcon import to.bitkit.ui.scaffold.ScreenColumn +import to.bitkit.ui.screens.wallets.activity.components.CustomTabRowWithSpacing +import to.bitkit.ui.screens.wallets.activity.components.TabItem import to.bitkit.ui.shared.modifiers.clickableAlpha -import to.bitkit.ui.shared.util.gradientBackground import to.bitkit.ui.theme.AppThemeSurface import to.bitkit.ui.theme.Colors import to.bitkit.ui.theme.Shapes -@OptIn(ExperimentalMaterial3Api::class) +private enum class ShopDiscoverTab(@StringRes private val titleRes: Int) : TabItem { + Shop(R.string.other__shop__discover__tabs__shop), + Map(R.string.other__shop__discover__tabs__map); + + override val uiText @Composable get() = stringResource(titleRes) +} + @Composable fun ShopDiscoverScreen( onBack: () -> Unit, navigateWebView: (String, String) -> Unit, // Page, Title + modifier: Modifier = Modifier, ) { - var selectedTabIndex by remember { mutableIntStateOf(0) } - val tabTitles = listOf( - stringResource(R.string.other__shop__discover__tabs__shop), - stringResource(R.string.other__shop__discover__tabs__map), - ) + val tabs = remember { ShopDiscoverTab.entries.toImmutableList() } + var selectedTab by remember { mutableStateOf(ShopDiscoverTab.Shop) } - ScreenColumn( - modifier = Modifier.gradientBackground(), - ) { + ScreenColumn(modifier = modifier) { AppTopBar( titleText = stringResource(R.string.other__shop__discover__nav_title), onBackClick = onBack, actions = { DrawerNavIcon() }, ) - PrimaryTabRow( - selectedTabIndex = selectedTabIndex, - containerColor = Color.Transparent, - indicator = { - TabRowDefaults.PrimaryIndicator( - modifier = Modifier.tabIndicatorOffset(selectedTabIndex), - color = Colors.Yellow, - width = Dp.Unspecified, - ) - }, - modifier = Modifier.padding(horizontal = 16.dp), - ) { - tabTitles.forEachIndexed { index, title -> - Tab( - selected = selectedTabIndex == index, - onClick = { selectedTabIndex = index }, - unselectedContentColor = Colors.White64, - text = { CaptionB(title) }, - ) - } - } + CustomTabRowWithSpacing( + tabs = tabs, + currentTabIndex = tabs.indexOf(selectedTab), + selectedColor = Colors.White, + onTabChange = { selectedTab = it }, + modifier = Modifier.padding(horizontal = 16.dp) + ) - when (selectedTabIndex) { - 0 -> ShopTabContent(navigateWebView = navigateWebView) - 1 -> MapTabContent() + when (selectedTab) { + ShopDiscoverTab.Shop -> ShopTabContent(navigateWebView = navigateWebView) + ShopDiscoverTab.Map -> MapTabContent() } } } @@ -108,9 +91,10 @@ fun ShopDiscoverScreen( @Composable private fun ShopTabContent( navigateWebView: (String, String) -> Unit, + modifier: Modifier = Modifier, ) { LazyColumn( - modifier = Modifier.padding(horizontal = 16.dp), + modifier = modifier.padding(horizontal = 16.dp) ) { item { VerticalSpacer(16.dp) @@ -120,31 +104,29 @@ private fun ShopTabContent( ) { val title = stringResource(R.string.other__shop__discover__gift_cards__title) SuggestionCard( - modifier = Modifier.weight(1f), gradientColor = Colors.Green24, title = title, description = stringResource(R.string.other__shop__discover__gift_cards__description), icon = R.drawable.gift, captionColor = Colors.Gray1, - disableGlow = true, onClick = { navigateWebView("gift-cards", title) }, + modifier = Modifier.weight(1f) ) val title2 = stringResource(R.string.other__shop__discover__esims__title) SuggestionCard( - modifier = Modifier.weight(1f), gradientColor = Colors.Yellow24, title = title2, description = stringResource(R.string.other__shop__discover__esims__description), icon = R.drawable.globe, captionColor = Colors.Gray1, - disableGlow = true, onClick = { navigateWebView("esims", title2) }, + modifier = Modifier.weight(1f) ) } @@ -155,31 +137,29 @@ private fun ShopTabContent( ) { val title = stringResource(R.string.other__shop__discover__refill__title) SuggestionCard( - modifier = Modifier.weight(1f), gradientColor = Colors.Purple24, title = title, description = stringResource(R.string.other__shop__discover__refill__description), icon = R.drawable.phone, captionColor = Colors.Gray1, - disableGlow = true, onClick = { navigateWebView("refill", title) }, + modifier = Modifier.weight(1f) ) val title2 = stringResource(R.string.other__shop__discover__travel__title) SuggestionCard( - modifier = Modifier.weight(1f), gradientColor = Colors.Red24, title = title2, description = stringResource(R.string.other__shop__discover__travel__description), icon = R.drawable.rocket_2, - disableGlow = true, captionColor = Colors.Gray1, onClick = { navigateWebView("buy/travel", title2) }, + modifier = Modifier.weight(1f) ) } @@ -193,38 +173,38 @@ private fun ShopTabContent( items(items = BitrefillCategory.entries.toList(), key = { it.name }) { item -> Column { Row( + verticalAlignment = Alignment.CenterVertically, modifier = Modifier .clickableAlpha { navigateWebView(item.route, item.title) } - .padding(top = 8.5.dp, bottom = 10.5.dp), - verticalAlignment = Alignment.CenterVertically, + .padding(top = 8.5.dp, bottom = 10.5.dp) ) { Box( + contentAlignment = Alignment.Center, modifier = Modifier .clip(CircleShape) .size(32.dp) - .background(Colors.White10), - contentAlignment = Alignment.Center, + .background(Colors.White10) ) { Icon( imageVector = item.icon, contentDescription = null, tint = Colors.White64, - modifier = Modifier.size(16.dp), + modifier = Modifier.size(16.dp) ) } BodyM( text = item.title, modifier = Modifier .weight(1f) - .padding(horizontal = 8.dp), + .padding(horizontal = 8.dp) ) Icon( painter = painterResource(R.drawable.ic_chevron_right), contentDescription = null, tint = Colors.White64, - modifier = Modifier.size(24.dp), + modifier = Modifier.size(24.dp) ) } HorizontalDivider() @@ -235,7 +215,9 @@ private fun ShopTabContent( @SuppressLint("SetJavaScriptEnabled") @Composable -private fun MapTabContent() { +private fun MapTabContent( + modifier: Modifier = Modifier, +) { var isLoading by remember { mutableStateOf(true) } val webViewClient = remember { @@ -245,13 +227,12 @@ private fun MapTabContent() { } Box( - modifier = Modifier - .padding(top = 16.dp, start = 16.dp, end = 16.dp) - .clip(Shapes.medium), contentAlignment = Alignment.Center, + modifier = modifier + .padding(top = 16.dp, start = 16.dp, end = 16.dp) + .clip(Shapes.medium) ) { AndroidView( - modifier = Modifier.fillMaxWidth(), factory = { context -> WebView(context).apply { layoutParams = ViewGroup.LayoutParams( @@ -264,6 +245,7 @@ private fun MapTabContent() { loadUrl(Env.BTC_MAP_URL) } }, + modifier = Modifier.fillMaxWidth() ) if (isLoading) { 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 6b6dd21cbc..8eeac28a5a 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 @@ -151,8 +151,8 @@ import to.bitkit.viewmodels.SettingsViewModel import to.bitkit.viewmodels.WalletViewModel private const val SMALL_SCREEN_HEIGHT_DP = 700 -private const val SMALL_SCREEN_ACTIVITY_COUNT = 2 -private const val LARGE_SCREEN_ACTIVITY_COUNT = 3 +private const val SMALL_SCREEN_SLOT_CAPACITY = 3 +private const val LARGE_SCREEN_SLOT_CAPACITY = 4 private val BOTTOM_SPACER_HEIGHT = (TAB_BAR_HEIGHT + TAB_BAR_PADDING_BOTTOM + 36).dp @Suppress("CyclomaticComplexMethod") @@ -370,11 +370,13 @@ private fun Content( val density = LocalDensity.current val screenHeightDp = with(density) { LocalWindowInfo.current.containerSize.height.toDp().value.toInt() } - val activityCount = if (screenHeightDp < SMALL_SCREEN_HEIGHT_DP) { - SMALL_SCREEN_ACTIVITY_COUNT + val slotCapacity = if (screenHeightDp < SMALL_SCREEN_HEIGHT_DP) { + SMALL_SCREEN_SLOT_CAPACITY } else { - LARGE_SCREEN_ACTIVITY_COUNT + LARGE_SCREEN_SLOT_CAPACITY } + val nonItemSlots = countNonItemSlots(homeUiState) + val activityCount = (slotCapacity - nonItemSlots).coerceAtLeast(0) val paginatedActivities = remember(latestActivities, activityCount) { latestActivities?.take(activityCount)?.toImmutableList() @@ -439,6 +441,12 @@ private fun Content( } } +private fun countNonItemSlots(homeUiState: HomeUiState): Int { + val bannerSlot = if (homeUiState.banners.isNotEmpty()) 1 else 0 + val widgetsHintSlot = if (homeUiState.showWidgetsOnboardingHint) 1 else 0 + return bannerSlot + widgetsHintSlot +} + @Suppress("MagicNumber") @OptIn(ExperimentalMaterial3Api::class) @Composable 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 630aefc703..6d660fea09 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 @@ -2,6 +2,7 @@ package to.bitkit.ui.screens.wallets.receive import android.graphics.Bitmap import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.Crossfade import androidx.compose.foundation.background import androidx.compose.foundation.gestures.snapping.SnapPosition import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior @@ -66,6 +67,7 @@ import to.bitkit.ui.components.Caption13Up import to.bitkit.ui.components.Display import to.bitkit.ui.components.PrimaryButton import to.bitkit.ui.components.QrCodeImage +import to.bitkit.ui.components.TertiaryButton import to.bitkit.ui.components.Tooltip import to.bitkit.ui.components.VerticalSpacer import to.bitkit.ui.scaffold.SheetTopBar @@ -115,7 +117,7 @@ fun ReceiveQrScreen( walletState.bolt11, walletState.onchainAddress, cjitInvoice, - lightningState.nodeLifecycleState + lightningState.nodeLifecycleState, ) { visibleTabs.associateWith { tab -> getInvoiceForTab( @@ -124,7 +126,7 @@ fun ReceiveQrScreen( bolt11 = walletState.bolt11, cjitInvoice = cjitInvoice, isNodeRunning = lightningState.nodeLifecycleState.isRunning(), - onchainAddress = walletState.onchainAddress + onchainAddress = walletState.onchainAddress, ) } } @@ -135,7 +137,7 @@ fun ReceiveQrScreen( val snapBehavior = rememberSnapFlingBehavior( lazyListState = lazyListState, - snapPosition = SnapPosition.Center + snapPosition = SnapPosition.Center, ) // Calculate current tab based on scroll position for smooth indicator and color updates @@ -203,11 +205,7 @@ fun ReceiveQrScreen( CustomTabRowWithSpacing( tabs = visibleTabs, currentTabIndex = visibleTabs.indexOf(selectedTab), - selectedColor = when (selectedTab) { - ReceiveTab.SAVINGS -> Colors.Brand - ReceiveTab.AUTO -> Colors.White - ReceiveTab.SPENDING -> Colors.Purple - }, + selectedColor = Colors.White, onTabChange = { tab -> haptic.performHapticFeedback(HapticFeedbackType.TextHandleMove) val newIndex = visibleTabs.indexOf(tab) @@ -292,43 +290,62 @@ fun ReceiveQrScreen( AnimatedVisibility(visible = lightningState.nodeLifecycleState.isRunning()) { val showCjitButton = showingCjitOnboarding && selectedTab == ReceiveTab.SPENDING - PrimaryButton( - text = stringResource( - when { - showCjitButton -> R.string.wallet__receive__cjit - showDetails -> R.string.wallet__receive_show_qr - else -> R.string.wallet__receive_show_details - } - ), - icon = { - if (showCjitButton) { - Icon( - painter = painterResource(R.drawable.ic_lightning_alt), - tint = Colors.Purple, - contentDescription = null + val buttonVariant = when { + showCjitButton -> BottomButtonVariant.CJIT + showDetails -> BottomButtonVariant.SHOW_QR + else -> BottomButtonVariant.SHOW_DETAILS + } + Crossfade( + targetState = buttonVariant, + label = "ReceiveBottomButtonCrossfade", + ) { variant -> + when (variant) { + BottomButtonVariant.CJIT -> PrimaryButton( + text = stringResource(R.string.wallet__receive__cjit), + icon = { + Icon( + painter = painterResource(R.drawable.ic_lightning_alt), + tint = Colors.Purple, + contentDescription = null, + ) + }, + onClick = { + onClickReceiveCjit() + showDetails = false + }, + fullWidth = true, + modifier = Modifier + .padding(horizontal = 16.dp) + .testTag("ShowDetails") + ) - ) - } - }, - onClick = { - if (showCjitButton) { - onClickReceiveCjit() - showDetails = false - } else { - showDetails = !showDetails - } - }, - fullWidth = true, - modifier = Modifier - .padding(horizontal = 16.dp) - .testTag( - if (showDetails) { - "QRCode" - } else { - "ShowDetails" - } + BottomButtonVariant.SHOW_QR -> PrimaryButton( + text = stringResource(R.string.wallet__receive_show_qr), + icon = { + Icon( + painter = painterResource(R.drawable.ic_qr_purple), + tint = Colors.White, + contentDescription = null, + modifier = Modifier.size(16.dp) + ) + }, + onClick = { showDetails = false }, + fullWidth = true, + modifier = Modifier + .padding(horizontal = 16.dp) + .testTag("QRCode") ) - ) + + BottomButtonVariant.SHOW_DETAILS -> TertiaryButton( + text = stringResource(R.string.wallet__receive_show_details), + onClick = { showDetails = true }, + fullWidth = true, + modifier = Modifier + .padding(horizontal = 16.dp) + .testTag("ShowDetails") + ) + } + } } VerticalSpacer(16.dp) @@ -390,7 +407,7 @@ private fun ReceiveQrView( Box(modifier = Modifier.weight(1f)) { Tooltip( text = stringResource(R.string.wallet__receive_copied), - tooltipState = qrButtonTooltipState + tooltipState = qrButtonTooltipState, ) { PrimaryButton( text = stringResource(R.string.common__copy), @@ -440,11 +457,11 @@ private fun ReceiveQrView( @Composable fun CjitOnBoardingView(modifier: Modifier = Modifier) { Column( + horizontalAlignment = Alignment.CenterHorizontally, modifier = modifier .clip(AppShapes.small) .background(color = Colors.Black) - .padding(32.dp), - horizontalAlignment = Alignment.CenterHorizontally + .padding(32.dp) ) { Display(stringResource(R.string.wallet__receive_onboarding_title).withAccent(accentColor = Colors.Purple)) VerticalSpacer(8.dp) @@ -553,6 +570,8 @@ private fun ReceiveDetailsView( } } +private enum class BottomButtonVariant { CJIT, SHOW_QR, SHOW_DETAILS } + enum class CopyAddressType { ONCHAIN, LIGHTNING } @OptIn(ExperimentalMaterial3Api::class) @@ -714,8 +733,8 @@ private fun PreviewAutoMode() { cltvExpiryDelta = 0u, maxDustHtlcExposure = org.lightningdevkit.ldknode.MaxDustHtlcExposure.FeeRateMultiplier(0uL), forceCloseAvoidanceMaxFeeSatoshis = 0uL, - acceptUnderpayingHtlcs = false - ) + acceptUnderpayingHtlcs = false, + ), ) AppThemeSurface { @@ -785,8 +804,8 @@ private fun PreviewSpendingMode() { cltvExpiryDelta = 0u, maxDustHtlcExposure = org.lightningdevkit.ldknode.MaxDustHtlcExposure.FeeRateMultiplier(0uL), forceCloseAvoidanceMaxFeeSatoshis = 0uL, - acceptUnderpayingHtlcs = false - ) + acceptUnderpayingHtlcs = false, + ), ) AppThemeSurface { diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt index f5dde27c45..5da3886c0e 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt @@ -335,7 +335,7 @@ private fun ContentRunning( } if (!isLnurlPay) { - VerticalSpacer(16.dp) + FillHeight(min = 16.dp) PrimaryButton( text = stringResource( @@ -361,15 +361,17 @@ private fun ContentRunning( ) }, fullWidth = false, - color = Colors.White06, + color = Colors.Gray65, enableGradient = false, modifier = Modifier .align(Alignment.CenterHorizontally) .testTag("SendConfirmToggleDetails") ) - } - FillHeight(min = 16.dp) + VerticalSpacer(62.dp) + } else { + FillHeight(min = 16.dp) + } SwipeToConfirm( text = stringResource(R.string.wallet__send_swipe), diff --git a/app/src/main/java/to/bitkit/ui/settings/backgroundPayments/BackgroundPaymentsIntroScreen.kt b/app/src/main/java/to/bitkit/ui/settings/backgroundPayments/BackgroundPaymentsIntroScreen.kt index 73c8a8457f..8a20acf46a 100644 --- a/app/src/main/java/to/bitkit/ui/settings/backgroundPayments/BackgroundPaymentsIntroScreen.kt +++ b/app/src/main/java/to/bitkit/ui/settings/backgroundPayments/BackgroundPaymentsIntroScreen.kt @@ -1,11 +1,16 @@ package to.bitkit.ui.settings.backgroundPayments 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.fillMaxWidth +import androidx.compose.foundation.layout.heightIn 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.layout.ContentScale import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -16,6 +21,7 @@ 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.components.VerticalSpacer import to.bitkit.ui.scaffold.AppTopBar import to.bitkit.ui.scaffold.DrawerNavIcon @@ -28,7 +34,8 @@ import to.bitkit.viewmodels.SettingsViewModel @Composable fun BackgroundPaymentsIntroScreen( onBack: () -> Unit, - onContinue: () -> Unit, + onLater: () -> Unit, + onEnable: () -> Unit, modifier: Modifier = Modifier, settingsViewModel: SettingsViewModel = hiltViewModel(), ) { @@ -41,17 +48,22 @@ fun BackgroundPaymentsIntroScreen( actions = { DrawerNavIcon() }, ) BackgroundPaymentsIntroContent( - onContinue = { + onLater = { settingsViewModel.setBgPaymentsIntroSeen(true) - onContinue() - } + onLater() + }, + onEnable = { + settingsViewModel.setBgPaymentsIntroSeen(true) + onEnable() + }, ) } } @Composable fun BackgroundPaymentsIntroContent( - onContinue: () -> Unit, + onLater: () -> Unit, + onEnable: () -> Unit, modifier: Modifier = Modifier, ) { Column( @@ -60,23 +72,44 @@ fun BackgroundPaymentsIntroContent( Image( painter = painterResource(R.drawable.bell), contentDescription = null, + contentScale = ContentScale.Fit, modifier = Modifier + .align(Alignment.CenterHorizontally) .fillMaxWidth() .weight(1f) + .heightIn(max = 320.dp) ) - + VerticalSpacer(32.dp) Display( - text = stringResource(R.string.settings__bg__intro_title).withAccent(accentColor = Colors.Blue), + text = stringResource(R.string.settings__bg__intro_title).withAccent(accentColor = Colors.Purple), color = Colors.White, ) - VerticalSpacer(8.dp) + VerticalSpacer(14.dp) BodyM(text = stringResource(R.string.settings__bg__intro_desc), color = Colors.White64) VerticalSpacer(32.dp) - PrimaryButton( - text = stringResource(R.string.common__continue), - onClick = onContinue, - modifier = Modifier.testTag("BackgroundPaymentsIntro-button") - ) + Row( + horizontalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier + .fillMaxWidth() + .testTag("BackgroundPaymentsIntro-buttons") + ) { + SecondaryButton( + text = stringResource(R.string.common__later), + fullWidth = false, + onClick = onLater, + modifier = Modifier + .weight(1f) + .testTag("BackgroundPaymentsIntro-later") + ) + PrimaryButton( + text = stringResource(R.string.settings__bg__intro_button), + fullWidth = false, + onClick = onEnable, + modifier = Modifier + .weight(1f) + .testTag("BackgroundPaymentsIntro-enable") + ) + } VerticalSpacer(16.dp) } } @@ -86,7 +119,8 @@ fun BackgroundPaymentsIntroContent( private fun Preview() { AppThemeSurface { BackgroundPaymentsIntroContent( - onContinue = {} + onLater = {}, + onEnable = {}, ) } } diff --git a/app/src/main/java/to/bitkit/ui/sheets/BackgroundPaymentsIntroSheet.kt b/app/src/main/java/to/bitkit/ui/sheets/BackgroundPaymentsIntroSheet.kt index 7daaf880d1..e0529e0eb3 100644 --- a/app/src/main/java/to/bitkit/ui/sheets/BackgroundPaymentsIntroSheet.kt +++ b/app/src/main/java/to/bitkit/ui/sheets/BackgroundPaymentsIntroSheet.kt @@ -18,7 +18,8 @@ import to.bitkit.ui.theme.AppThemeSurface @Composable fun BackgroundPaymentsIntroSheet( - onContinue: () -> Unit, + onLater: () -> Unit, + onEnable: () -> Unit, modifier: Modifier = Modifier, ) { Column( @@ -30,7 +31,10 @@ fun BackgroundPaymentsIntroSheet( .testTag("background_payments_intro_sheet") ) { SheetTopBar(titleText = stringResource(R.string.settings__bg__title)) - BackgroundPaymentsIntroContent(onContinue = onContinue) + BackgroundPaymentsIntroContent( + onLater = onLater, + onEnable = onEnable, + ) } } @@ -41,7 +45,8 @@ private fun Preview() { Column { BottomSheetPreview { BackgroundPaymentsIntroSheet( - onContinue = {}, + onLater = {}, + onEnable = {}, ) } } diff --git a/app/src/main/java/to/bitkit/ui/theme/Colors.kt b/app/src/main/java/to/bitkit/ui/theme/Colors.kt index c4dd6f7b7f..8019d468b8 100644 --- a/app/src/main/java/to/bitkit/ui/theme/Colors.kt +++ b/app/src/main/java/to/bitkit/ui/theme/Colors.kt @@ -18,6 +18,7 @@ object Colors { // Gray Base val Gray7 = Color(0xFF101010) + val Gray65 = Color(0xFF151515) val Gray6 = Color(0xFF1C1C1C) val Gray5 = Color(0xFF2A2A2A) val Gray4 = Color(0xFF3A3A3A) diff --git a/app/src/main/java/to/bitkit/viewmodels/ActivityListViewModel.kt b/app/src/main/java/to/bitkit/viewmodels/ActivityListViewModel.kt index d474eae277..3623bf0b79 100644 --- a/app/src/main/java/to/bitkit/viewmodels/ActivityListViewModel.kt +++ b/app/src/main/java/to/bitkit/viewmodels/ActivityListViewModel.kt @@ -190,7 +190,7 @@ class ActivityListViewModel @Inject constructor( companion object { private const val TAG = "ActivityListViewModel" - private const val SIZE_LATEST = 3 + private const val SIZE_LATEST = 4 private const val MS_TIMEOUT_SUB = 5000L } } diff --git a/app/src/main/res/drawable-hdpi/bell.webp b/app/src/main/res/drawable-hdpi/bell.webp index c371ed7a52..07acc5057b 100644 Binary files a/app/src/main/res/drawable-hdpi/bell.webp and b/app/src/main/res/drawable-hdpi/bell.webp differ diff --git a/app/src/main/res/drawable-mdpi/bell.webp b/app/src/main/res/drawable-mdpi/bell.webp index 2f7e432edc..43c8dee5e8 100644 Binary files a/app/src/main/res/drawable-mdpi/bell.webp and b/app/src/main/res/drawable-mdpi/bell.webp differ diff --git a/app/src/main/res/drawable-xhdpi/bell.webp b/app/src/main/res/drawable-xhdpi/bell.webp index fcb3b027f6..415fb55481 100644 Binary files a/app/src/main/res/drawable-xhdpi/bell.webp and b/app/src/main/res/drawable-xhdpi/bell.webp differ diff --git a/app/src/main/res/drawable-xxhdpi/bell.webp b/app/src/main/res/drawable-xxhdpi/bell.webp index dfe3823ba1..58926beafe 100644 Binary files a/app/src/main/res/drawable-xxhdpi/bell.webp and b/app/src/main/res/drawable-xxhdpi/bell.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/bell.webp b/app/src/main/res/drawable-xxxhdpi/bell.webp index e984038e62..e2fa18f153 100644 Binary files a/app/src/main/res/drawable-xxxhdpi/bell.webp and b/app/src/main/res/drawable-xxxhdpi/bell.webp differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 20c91cd2bc..b0fc016a58 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -724,6 +724,7 @@ Background payments are disabled, because you have denied notifications. Background payments are enabled. You can receive funds even when the app is closed (if your device is connected to the internet). Include amount in notifications + Enable Turn on notifications to get paid, even when your Bitkit app is closed. GET PAID\n<accent>PASSIVELY</accent> Notifications