diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 64aeb9f7..a2374a66 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -15,6 +15,7 @@
+
diff --git a/app/src/main/java/com/brainwallet/constants/BWConstants.kt b/app/src/main/java/com/brainwallet/constants/BWConstants.kt
index c6e68745..c7f5dda4 100644
--- a/app/src/main/java/com/brainwallet/constants/BWConstants.kt
+++ b/app/src/main/java/com/brainwallet/constants/BWConstants.kt
@@ -107,6 +107,8 @@ object BWConstants {
const val TOS_LINK: String = "https://www.brainwallet.co/privacypolicy"
const val LINKTREE_URL: String = "https://linktr.ee/brainwallet"
+ const val BITREFILL_URL: String = "https://www.bitrefill.com/?ref=bAshL935"
+
/**
* API Hosts
*/
diff --git a/app/src/main/java/com/brainwallet/navigation/MainNavigationHost.kt b/app/src/main/java/com/brainwallet/navigation/MainNavigationHost.kt
index 6331403f..ef6f005c 100644
--- a/app/src/main/java/com/brainwallet/navigation/MainNavigationHost.kt
+++ b/app/src/main/java/com/brainwallet/navigation/MainNavigationHost.kt
@@ -7,10 +7,12 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.toRoute
+import com.brainwallet.constants.BWConstants
import com.brainwallet.ui.screens.buyreceive.BuyReceiveScreen
import com.brainwallet.ui.screens.gamehub.GameHubScreen
import com.brainwallet.ui.screens.home.MainScreen
import com.brainwallet.ui.bentosections.buyreceivebento.receive.ReceiveDialog
+import com.brainwallet.ui.screens.main.WebModalScreen
import com.brainwallet.ui.screens.restore.RestoreScreen
import com.brainwallet.ui.screens.ready.ReadyScreen
import com.brainwallet.ui.screens.send.SendScreen
@@ -132,8 +134,24 @@ fun NavGraphBuilder.mainNavGraph(
val route: Route.GameHub = navBackStackEntry.toRoute()
GameHubScreen(onNavigate = onNavigate)
}
- composable { navBackStackEntry ->
+ composable { navBackStackEntry ->
val route: Route.GameHub = navBackStackEntry.toRoute()
BuyReceiveScreen(onNavigate = onNavigate)
}
+
+ composable { navBackStackEntry ->
+ val route: Route.LinktreeWeb = navBackStackEntry.toRoute()
+ WebModalScreen(
+ onNavigate = onNavigate,
+ url = BWConstants.LINKTREE_URL
+ )
+ }
+
+ composable { navBackStackEntry ->
+ val route: Route.LinktreeWeb = navBackStackEntry.toRoute()
+ WebModalScreen(
+ onNavigate = onNavigate,
+ url = BWConstants.BITREFILL_URL
+ )
+ }
}
diff --git a/app/src/main/java/com/brainwallet/navigation/Route.kt b/app/src/main/java/com/brainwallet/navigation/Route.kt
index 59b916f7..f17cdf26 100644
--- a/app/src/main/java/com/brainwallet/navigation/Route.kt
+++ b/app/src/main/java/com/brainwallet/navigation/Route.kt
@@ -62,5 +62,11 @@ sealed class Route : JavaSerializable {
object GameHub : Route()
@Serializable
- object MoonPayWeb : Route()
+ object MoonPayBuy : Route()
+
+ @Serializable
+ object BitrefillWeb : Route()
+
+ @Serializable
+ object LinktreeWeb : Route()
}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/favouritesbento/FavouritesBentoScreen.kt b/app/src/main/java/com/brainwallet/ui/bentosections/favouritesbento/FavouritesBentoScreen.kt
deleted file mode 100644
index d77da2e0..00000000
--- a/app/src/main/java/com/brainwallet/ui/bentosections/favouritesbento/FavouritesBentoScreen.kt
+++ /dev/null
@@ -1,156 +0,0 @@
-package com.brainwallet.ui.bentosections.favouritesbento
-
-import androidx.compose.runtime.getValue
-import androidx.compose.ui.Alignment
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
-import com.brainwallet.ui.screens.main.MainViewModel
-import androidx.compose.foundation.background
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.fillMaxHeight
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.offset
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.shape.CircleShape
-import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.Add
-import androidx.compose.material3.Icon
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.res.stringResource
-import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.tooling.preview.PreviewLightDark
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.sp
-import com.brainwallet.constants.favouriteSize
-import com.brainwallet.ui.theme.DesignTheme
-import com.brainwallet.ui.theme.IBMPlexSans
-import com.brainwallet.ui.theme.mainBentoSurface
-import org.koin.compose.viewmodel.koinViewModel
-
-@Composable
-fun FavouritesBentoScreen(
- modifier: Modifier = Modifier,
- onClick: () -> Unit = {},
- viewModel: MainViewModel = koinViewModel()
-) {
- var resizedAsOfFontSize by remember { mutableStateOf(12.sp) }
- val context = LocalContext.current
- val appSetting by viewModel.appSetting.collectAsStateWithLifecycle()
- val isDarkMode = appSetting.isDarkMode
- val favouriteArray = intArrayOf(1, 2, 3, 4)
- val opacityFactor = 0.3f
-
- Box(
- modifier = Modifier
- .fillMaxSize()
- .mainBentoSurface(isDarkMode)
- ) {
- Column(
- modifier = Modifier
- .padding(10.dp)
- .fillMaxHeight(),
- verticalArrangement = Arrangement.Top,
- horizontalAlignment = Alignment.Start
- ) {
- Text(
- text = stringResource(com.brainwallet.R.string.favourites_label).uppercase(),
- color = if (isDarkMode) Color.White else Color.Black,
- style = TextStyle(
- fontFamily = IBMPlexSans,
- fontWeight = FontWeight.Normal,
- fontSize = 10.sp
- ),
- modifier = Modifier
- .padding(start = 1.dp, end = 1.dp)
- .background(
- color = Color.White.copy(alpha = 0.2f),
- shape = RoundedCornerShape(6.dp)
- )
- .padding(horizontal = 6.dp, vertical = 2.dp)
- )
- Spacer(modifier = Modifier.weight(1f))
- Row(modifier = Modifier.padding(top = 4.dp)) {
- Box {
- Column(
- modifier = Modifier
- .size(favouriteSize)
- .offset(x = 0.dp)
- .background(
- color = DesignTheme.colors.affirm.copy(alpha = opacityFactor),
- shape = CircleShape
- )
- ) {
- }
- Column(
- modifier = Modifier
- .size(favouriteSize)
- .offset(x = 25.dp)
- .background(
- color = DesignTheme.colors.info.copy(alpha = opacityFactor),
- shape = CircleShape
- )
-
- ) {
- }
- Column(
- modifier = Modifier
- .size(favouriteSize)
- .offset(x = 50.dp)
- .background(
- color = DesignTheme.colors.warn.copy(alpha = opacityFactor),
- shape = CircleShape
- )
-
- ) {
- }
- Column(
- modifier = Modifier
- .size(favouriteSize)
- .offset(x = 75.dp)
- .background(
- color = DesignTheme.colors.error.copy(opacityFactor),
- shape = CircleShape
- ),
- verticalArrangement = Arrangement.Center,
- horizontalAlignment = Alignment.CenterHorizontally
-
- ) {
- Icon(
- Icons.Default.Add,
- contentDescription = "Plus",
- tint = if (isDarkMode) {
- Color.White.copy(0.1f)
- } else {
- Color.Black.copy(0.1f)
- }
- )
- }
- }
- Spacer(modifier = Modifier.weight(1f))
- }
- Spacer(modifier = Modifier.weight(1f))
- }
- }
-}
-
-@PreviewLightDark
-@Composable
-private fun FavouritesBentoScreenPreview() {
- Box(modifier = Modifier.height(120.dp)) {
- FavouritesBentoScreen()
- }
-}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/GiftCardsComposable.kt b/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/GiftCardsComposable.kt
new file mode 100644
index 00000000..e09efb5d
--- /dev/null
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/GiftCardsComposable.kt
@@ -0,0 +1,102 @@
+package com.brainwallet.ui.bentosections.shopbento
+
+import androidx.compose.animation.core.animateFloatAsState
+import androidx.compose.animation.core.tween
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.offset
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.brainwallet.ui.bentosections.shopbento.cards.CardAmazonComposable
+import com.brainwallet.ui.bentosections.shopbento.cards.CardJustEatComposable
+import com.brainwallet.ui.bentosections.shopbento.cards.CardVisaComposable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.setValue
+
+@Composable
+fun GiftCardsComposable(
+ state: ShopBentoState,
+ cardData: String,
+ modifier: Modifier = Modifier,
+) {
+ val cornerRadius = 4.dp
+ var appeared by remember { mutableStateOf(false) }
+
+ LaunchedEffect(Unit) {
+ appeared = true
+ }
+
+ val offsetVisa by animateFloatAsState(
+ targetValue = if (appeared) -10f else 100f,
+ animationSpec = tween(
+ 500,
+ delayMillis = 200
+ ),
+ label = "visaSlide"
+ )
+
+ val offsetJE by animateFloatAsState(
+ targetValue = if (appeared) 30f else 100f,
+ animationSpec = tween(
+ 600,
+ delayMillis = 200
+ ),
+ label = "jeSlide"
+ )
+
+ val offsetAmazon by animateFloatAsState(
+ targetValue = if (appeared) -12f else 50f,
+ animationSpec = tween(
+ 400,
+ delayMillis = 200
+ ),
+ label = "amazonSlide"
+ )
+
+ Box(
+ modifier = Modifier
+ .fillMaxSize()
+
+ ) {
+ Column(
+ modifier = Modifier
+ .fillMaxHeight()
+ .offset(x = offsetVisa.dp, y = 5.dp)
+ ) {
+ CardVisaComposable(rotation = 20f)
+ }
+
+ Column(
+ modifier = Modifier
+ .fillMaxHeight()
+ .offset(x = offsetAmazon.dp, y = -15.dp)
+
+ ) {
+ CardAmazonComposable(rotation = 20f)
+ }
+
+ Column(
+ modifier = Modifier
+ .fillMaxHeight()
+ .offset(x = offsetJE.dp, y = 15.dp)
+
+ ) {
+ CardJustEatComposable(rotation = -30f)
+ }
+ }
+}
+
+@Preview
+@Composable
+private fun GiftCardsComposablePreview() {
+ Box(modifier = Modifier) {
+ GiftCardsComposable(state = ShopBentoState(), cardData = "acr")
+ }
+}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/ShopBentoEvent.kt b/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/ShopBentoEvent.kt
new file mode 100644
index 00000000..fe0a5b02
--- /dev/null
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/ShopBentoEvent.kt
@@ -0,0 +1,6 @@
+package com.brainwallet.ui.bentosections.shopbento
+
+sealed class ShopBentoEvent {
+ data object OnLoad : ShopBentoEvent()
+ data object OnTapShop : ShopBentoEvent()
+}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/ShopBentoScreen.kt b/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/ShopBentoScreen.kt
new file mode 100644
index 00000000..037df567
--- /dev/null
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/ShopBentoScreen.kt
@@ -0,0 +1,137 @@
+package com.brainwallet.ui.bentosections.shopbento
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.getValue
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shadow
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import com.brainwallet.R
+import com.brainwallet.constants.bentoCornerRadius
+import com.brainwallet.ui.theme.IBMPlexSans
+import com.brainwallet.ui.theme.balanceGameBentoSurface
+import org.koin.compose.viewmodel.koinViewModel
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.runtime.collectAsState
+import androidx.compose.ui.tooling.preview.Preview
+
+@Composable
+fun ShopBentoScreen(
+ modifier: Modifier = Modifier,
+ onClick: () -> Unit = {},
+ viewModel: ShopBentoViewModel = koinViewModel(),
+) {
+ val state by viewModel.state.collectAsState()
+ ShopBentoScreen(
+ state = state,
+ modifier = modifier,
+ onClick = onClick,
+ )
+}
+
+@Composable
+private fun ShopBentoScreen(
+ state: ShopBentoState,
+ modifier: Modifier = Modifier,
+ onClick: () -> Unit = {},
+ viewModel: ShopBentoViewModel = koinViewModel()
+) {
+ val storeBackground = R.drawable.store_05
+ val logotypeBlack = R.drawable.logotype_bitrefill_blk
+ val logotypeWhite = R.drawable.logotype_bitrefill_wht
+
+ val logotypeBitrefill = if (state.darkMode) logotypeWhite else logotypeBlack
+ Box(
+ modifier = Modifier
+ .fillMaxSize()
+ .balanceGameBentoSurface(isDarkMode = state.darkMode)
+ .clickable(onClick = onClick)
+ ) {
+ Image(
+ painter = painterResource(storeBackground),
+ contentDescription = "store_background",
+ modifier = Modifier.fillMaxSize()
+ .clip(RoundedCornerShape(bentoCornerRadius)),
+ contentScale = ContentScale.Crop,
+ alpha = if (state.darkMode) 1f else 0.0f
+ )
+
+ Row(modifier = Modifier.fillMaxWidth()) {
+ Column(
+ modifier = Modifier
+ .weight(1f)
+ .fillMaxHeight()
+ ) {
+ Spacer(modifier = Modifier.weight(0.2f))
+
+ Text(
+ text = stringResource(R.string.shop_tagline),
+ color = if (state.darkMode) Color.White else Color.Black,
+ modifier = Modifier
+ .padding(12.dp),
+ style = TextStyle(
+ fontFamily = IBMPlexSans,
+ fontWeight = FontWeight.Normal,
+ fontSize = 11.sp,
+ textAlign = TextAlign.Start,
+ shadow = Shadow(
+ color = Color.Black.copy(alpha = 0.4f),
+ offset = Offset(x = 3f, y = 3f),
+ blurRadius = 3f
+ )
+ ),
+ )
+ Spacer(modifier = Modifier.weight(0.2f))
+ Image(
+ painter = painterResource(logotypeBitrefill),
+ contentDescription = "shop_logotype",
+ modifier = Modifier.fillMaxWidth(0.8f)
+ .padding(12.dp),
+ contentScale = ContentScale.Fit,
+ )
+ }
+ Column(
+ modifier = Modifier
+ .weight(1f)
+ .fillMaxHeight()
+ .clip(RoundedCornerShape(bentoCornerRadius))
+
+ ) {
+ GiftCardsComposable(
+ state = state,
+ modifier =
+ Modifier.fillMaxSize(),
+ cardData = "test-json"
+ )
+ }
+ }
+ }
+}
+
+@Preview
+@Composable
+private fun ShopBentoScreenPreview() {
+ Box(modifier = Modifier) {
+ ShopBentoScreen()
+ }
+}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/ShopBentoState.kt b/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/ShopBentoState.kt
new file mode 100644
index 00000000..cd924d48
--- /dev/null
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/ShopBentoState.kt
@@ -0,0 +1,9 @@
+package com.brainwallet.ui.bentosections.shopbento
+
+data class ShopBentoState(
+ val cardData: String = "",
+ val regionData: String = "",
+ val countryIso: String = "US",
+ val darkMode: Boolean = true,
+ val shouldSlide: Boolean = false
+)
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/ShopBentoViewModel.kt b/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/ShopBentoViewModel.kt
new file mode 100644
index 00000000..b3d6ce44
--- /dev/null
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/ShopBentoViewModel.kt
@@ -0,0 +1,62 @@
+package com.brainwallet.ui.bentosections.shopbento
+
+import android.app.Application
+import android.content.Context
+import androidx.lifecycle.viewModelScope
+import com.brainwallet.ui.BrainwalletViewModel
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.update
+import kotlinx.coroutines.launch
+import org.koin.android.annotation.KoinViewModel
+import java.util.Locale
+import android.telephony.TelephonyManager
+import com.brainwallet.data.repository.SettingRepository
+
+@KoinViewModel
+class ShopBentoViewModel(
+ private val app: Application,
+ private val settingRepository: SettingRepository,
+) : BrainwalletViewModel() {
+
+ private val _state = MutableStateFlow(ShopBentoState())
+ val state: StateFlow = _state.asStateFlow()
+
+ init {
+ viewModelScope.launch {
+ settingRepository.settings.collect { setting ->
+ _state.update {
+ it.copy(
+ darkMode = setting.isDarkMode,
+ countryIso = getCountryIso()
+ )
+ }
+ }
+ }
+ }
+ private fun getCountryIso(): String {
+ val telephonyManager = app.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
+ val simCountry = telephonyManager.simCountryIso
+ val networkCountry = telephonyManager.networkCountryIso
+
+ return when {
+ simCountry.isNotEmpty() -> simCountry.uppercase()
+ networkCountry.isNotEmpty() -> networkCountry.uppercase()
+ else -> Locale.getDefault().country.ifEmpty { "US" }
+ }
+ }
+ override fun onEvent(event: ShopBentoEvent) {
+ when (event) {
+ is ShopBentoEvent.OnLoad -> {
+ }
+ is ShopBentoEvent.OnTapShop -> {
+ _state.update {
+ it.copy(
+ shouldSlide = true
+ )
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/cards/Cards.kt b/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/cards/Cards.kt
new file mode 100644
index 00000000..ba5fe454
--- /dev/null
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/shopbento/cards/Cards.kt
@@ -0,0 +1,165 @@
+package com.brainwallet.ui.bentosections.shopbento.cards
+
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.geometry.CornerRadius
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.drawscope.rotate
+import androidx.compose.ui.unit.dp
+import com.brainwallet.ui.theme.giftCardGradient2
+import com.brainwallet.R
+import androidx.compose.ui.draw.rotate
+import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.tooling.preview.Preview
+import com.brainwallet.ui.theme.giftCardGradient1
+import com.brainwallet.ui.theme.giftCardGradient3
+
+@Composable
+fun CardAmazonComposable(
+ rotation: Float,
+ modifier: Modifier = Modifier,
+) {
+ val cornerRadius = 4.dp
+ Box(modifier = Modifier.fillMaxSize()) {
+ Canvas(
+ modifier = Modifier
+ .fillMaxSize()
+ .offset(x = 30.dp, y = -10.dp)
+ .clip(RoundedCornerShape(cornerRadius))
+ ) {
+ rotate(degrees = 20f) {
+ val cardWidth = size.width * 0.7f
+ val cardHeight = cardWidth / 1.586f
+ drawRoundRect(
+ brush = giftCardGradient2(size),
+ size = Size(cardWidth, cardHeight),
+ topLeft = Offset(
+ x = (size.width - cardWidth) / 2f,
+ y = (size.height - cardHeight) / 2f
+ ),
+ cornerRadius = CornerRadius(cornerRadius.toPx())
+ )
+ }
+ }
+ Image(
+ painter = painterResource(R.drawable.amazon_logo),
+ contentDescription = null,
+ modifier = Modifier
+ .size(50.dp)
+ .align(Alignment.Center)
+ .offset(x = 30.dp, y = -10.dp)
+ .rotate(20f)
+ )
+ }
+}
+
+@Composable
+fun CardVisaComposable(
+ rotation: Float,
+ modifier: Modifier = Modifier,
+) {
+ val cornerRadius = 4.dp
+ Box(modifier = Modifier.fillMaxSize()) {
+ Canvas(
+ modifier = Modifier
+ .fillMaxSize()
+ .clip(RoundedCornerShape(cornerRadius))
+ ) {
+ rotate(degrees = rotation) {
+ val cardWidth = size.width * 0.7f
+ val cardHeight = cardWidth / 1.586f
+ drawRoundRect(
+ brush = giftCardGradient1(size),
+ size = Size(cardWidth, cardHeight),
+ topLeft = Offset(
+ x = (size.width - cardWidth) / 2f,
+ y = (size.height - cardHeight) / 2f
+ ),
+ cornerRadius = CornerRadius(cornerRadius.toPx())
+ )
+ }
+ }
+
+ Image(
+ painter = painterResource(R.drawable.visa_logo),
+ contentDescription = null,
+ modifier = Modifier
+ .size(40.dp)
+ .align(Alignment.Center)
+ .rotate(rotation)
+
+ )
+ }
+}
+
+@Composable
+fun CardJustEatComposable(
+ rotation: Float,
+ modifier: Modifier = Modifier,
+) {
+ val cornerRadius = 4.dp
+
+ Box(modifier = Modifier.fillMaxSize()) {
+ Canvas(
+ modifier = Modifier
+ .fillMaxSize()
+ .clip(RoundedCornerShape(cornerRadius))
+ ) {
+ rotate(degrees = rotation) {
+ val cardWidth = size.width * 0.7f
+ val cardHeight = cardWidth / 1.586f
+ drawRoundRect(
+ brush = giftCardGradient3(size),
+ size = Size(cardWidth, cardHeight),
+ topLeft = Offset(
+ x = (size.width - cardWidth) / 2f,
+ y = (size.height - cardHeight) / 2f
+ ),
+ cornerRadius = CornerRadius(cornerRadius.toPx())
+ )
+ }
+ }
+ Image(
+ painter = painterResource(R.drawable.just_eat_logo),
+ contentDescription = null,
+ modifier = Modifier
+ .size(50.dp)
+ .align(Alignment.Center)
+ .rotate(rotation)
+ )
+ }
+}
+
+@Preview
+@Composable
+private fun CardJustEatComposablePreview() {
+ Box(modifier = Modifier) {
+ CardJustEatComposable(rotation = -30f)
+ }
+}
+
+@Preview
+@Composable
+private fun CardAmazonComposablePreview() {
+ Box(modifier = Modifier) {
+ CardAmazonComposable(rotation = -30f)
+ }
+}
+
+@Preview
+@Composable
+private fun CardVisaComposablePreview() {
+ Box(modifier = Modifier) {
+ CardVisaComposable(rotation = -30f)
+ }
+}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialSendBentoScreen.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialSendBentoScreen.kt
index 3e716352..9b9d51d8 100644
--- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialSendBentoScreen.kt
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialSendBentoScreen.kt
@@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
@@ -31,20 +30,22 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.brainwallet.R
import com.brainwallet.constants.bentoCornerRadius
import com.brainwallet.ui.theme.IBMPlexSans
+import org.koin.compose.viewmodel.koinViewModel
@Composable
fun TutorialSendBentoScreen(
modifier: Modifier = Modifier,
- tutorialBentoState: TutorialBentoState = TutorialBentoState(),
- onClick: () -> Unit = {}
+ onClick: () -> Unit = {},
+ viewModel: TutorialsBentoViewModel = koinViewModel()
) {
- val hubPageCount = 3
- val pagerState = rememberPagerState(pageCount = { hubPageCount })
var resizedDescriptionFontSize by remember { mutableStateOf(12.sp) }
+ val state by viewModel.state.collectAsStateWithLifecycle()
+
Card(
modifier = modifier.fillMaxSize(),
shape = RoundedCornerShape(18.dp),
@@ -73,7 +74,7 @@ fun TutorialSendBentoScreen(
) {
Text(
text = stringResource(com.brainwallet.R.string.send_tutorial_title),
- color = if (tutorialBentoState.darkMode) Color.White else Color.Black,
+ color = if (state.darkMode) Color.White else Color.Black,
modifier = Modifier
.padding(
top = 35.dp,
@@ -91,7 +92,7 @@ fun TutorialSendBentoScreen(
Text(
text = stringResource(com.brainwallet.R.string.send_tutorial_description),
- color = if (tutorialBentoState.darkMode) Color.White else Color.Black,
+ color = if (state.darkMode) Color.White else Color.Black,
modifier = Modifier
.padding(
top = 10.dp,
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialGeneralBentoScreen.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialWalkthroughBentoScreen.kt
similarity index 88%
rename from app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialGeneralBentoScreen.kt
rename to app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialWalkthroughBentoScreen.kt
index fd6dad0f..18ee0aa5 100644
--- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialGeneralBentoScreen.kt
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialWalkthroughBentoScreen.kt
@@ -28,18 +28,21 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.brainwallet.R
import com.brainwallet.ui.theme.IBMPlexSans
+import org.koin.compose.viewmodel.koinViewModel
@Composable
-fun TutorialGeneralBentoScreen(
- tutorialBentoState: TutorialBentoState,
+fun TutorialWalkthroughBentoScreen(
modifier: Modifier = Modifier,
- onClick: () -> Unit = {}
+ onClick: () -> Unit = {},
+ viewModel: TutorialsBentoViewModel = koinViewModel(),
) {
val hubPageCount = 3
val pagerState = rememberPagerState(pageCount = { hubPageCount })
var resizedDescriptionFontSize by remember { mutableStateOf(12.sp) }
+ val state by viewModel.state.collectAsStateWithLifecycle()
Card(
modifier = modifier.fillMaxSize(),
@@ -65,7 +68,7 @@ fun TutorialGeneralBentoScreen(
) {
Text(
text = stringResource(com.brainwallet.R.string.brainwallet_walkthrough_title),
- color = if (tutorialBentoState.darkMode) Color.White else Color.Black,
+ color = if (state.darkMode) Color.White else Color.Black,
modifier = Modifier
.padding(
top = 35.dp,
@@ -83,7 +86,7 @@ fun TutorialGeneralBentoScreen(
Text(
text = stringResource(com.brainwallet.R.string.brainwallet_walkthrough_description),
- color = if (tutorialBentoState.darkMode) Color.White else Color.Black,
+ color = if (state.darkMode) Color.White else Color.Black,
modifier = Modifier
.padding(
top = 10.dp,
@@ -113,9 +116,8 @@ fun TutorialGeneralBentoScreen(
@Composable
private fun TutorialGeneralBentoScreenPreview() {
Box(modifier = Modifier) {
- TutorialGeneralBentoScreen(
- modifier = Modifier,
- tutorialBentoState = TutorialBentoState()
+ TutorialWalkthroughBentoScreen(
+ modifier = Modifier
)
}
}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialsBentoPagerScreen.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialsBentoScreen.kt
similarity index 92%
rename from app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialsBentoPagerScreen.kt
rename to app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialsBentoScreen.kt
index ffebaef0..7312c215 100644
--- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialsBentoPagerScreen.kt
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/TutorialsBentoScreen.kt
@@ -19,12 +19,10 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
-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.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
@@ -40,15 +38,13 @@ import com.brainwallet.ui.theme.mainBentoSurface
import org.koin.compose.viewmodel.koinViewModel
@Composable
-fun TutorialsBentoPagerScreen(
+fun TutorialsBentoScreen(
modifier: Modifier = Modifier,
onClick: (Int) -> Unit = {},
viewModel: MainViewModel = koinViewModel()
) {
val hubPageCount = 2
val pagerState = rememberPagerState(pageCount = { hubPageCount })
- val context = LocalContext.current
- val tutorialBentoState = TutorialBentoState()
val appSetting by viewModel.appSetting.collectAsStateWithLifecycle()
val isDarkMode = appSetting.isDarkMode
@@ -91,8 +87,7 @@ fun TutorialsBentoPagerScreen(
) { page ->
when (page) {
- 0 -> TutorialGeneralBentoScreen(
- tutorialBentoState = tutorialBentoState,
+ 0 -> TutorialWalkthroughBentoScreen(
onClick = {
AnalyticsManager.logCustomAdHocEvent("user_tapped_walkthrough_tutorial")
onClick(page)
@@ -131,8 +126,8 @@ fun TutorialsBentoPagerScreen(
@PreviewLightDark
@Composable
-private fun TutorialsBentoPagerScreenPreview() {
+private fun TutorialsBentoScreenPreview() {
Box(modifier = Modifier) {
- TutorialsBentoPagerScreen()
+ TutorialsBentoScreen()
}
}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage1.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage1.kt
index 8028605c..c6673b57 100644
--- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage1.kt
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage1.kt
@@ -26,6 +26,7 @@ import com.brainwallet.ui.theme.IBMPlexSans
@Composable
fun TutorialSendPage1(
+ darkMode: Boolean,
modifier: Modifier = Modifier
) {
Box(
@@ -39,7 +40,7 @@ fun TutorialSendPage1(
) {
Text(
text = stringResource(com.brainwallet.R.string.send_tutorial_title),
- color = Color.White,
+ color = if (darkMode) Color.White else Color.Black,
modifier = Modifier.fillMaxWidth()
.padding(
top = 30.dp,
@@ -76,6 +77,6 @@ fun TutorialSendPage1(
@Composable
private fun TutorialSendPage1Preview() {
Column {
- TutorialSendPage1()
+ TutorialSendPage1(darkMode = false)
}
}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage2.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage2.kt
index a9c4dedb..bd3bab4d 100644
--- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage2.kt
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage2.kt
@@ -27,6 +27,7 @@ import com.brainwallet.ui.theme.IBMPlexSans
@Composable
fun TutorialSendPage2(
+ darkMode: Boolean,
modifier: Modifier = Modifier
) {
Box(
@@ -40,7 +41,7 @@ fun TutorialSendPage2(
) {
Text(
text = stringResource(com.brainwallet.R.string.send_tutorial_title),
- color = Color.White,
+ color = if (darkMode) Color.White else Color.Black,
modifier = Modifier.fillMaxWidth()
.padding(
top = 30.dp,
@@ -78,6 +79,6 @@ fun TutorialSendPage2(
@Composable
private fun TutorialSendPage2Preview() {
Column {
- TutorialSendPage2()
+ TutorialSendPage2(darkMode = false)
}
}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage3.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage3.kt
index b2046db8..d9e18298 100644
--- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage3.kt
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPage3.kt
@@ -33,6 +33,7 @@ import com.brainwallet.ui.theme.IBMPlexSans
@Composable
fun TutorialSendPage3(
+ darkMode: Boolean,
modifier: Modifier = Modifier
) {
val sendSetupImage = R.drawable.sendsetup
@@ -49,7 +50,7 @@ fun TutorialSendPage3(
) {
Text(
text = stringResource(com.brainwallet.R.string.send_tutorial_title),
- color = Color.White,
+ color = if (darkMode) Color.White else Color.Black,
modifier = Modifier.fillMaxWidth()
.padding(
top = 30.dp,
@@ -119,6 +120,6 @@ fun TutorialSendPage3(
@Composable
private fun TutorialSendPage3Preview() {
Column {
- TutorialSendPage3()
+ TutorialSendPage3(darkMode = false)
}
}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPagerScreen.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPagerScreen.kt
index 8cc45c14..c226e3e0 100644
--- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPagerScreen.kt
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/send/TutorialSendPagerScreen.kt
@@ -21,8 +21,8 @@ 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.platform.LocalContext
import androidx.compose.ui.unit.dp
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.brainwallet.navigation.OnNavigate
import com.brainwallet.ui.theme.DesignTheme
import org.koin.compose.viewmodel.koinViewModel
@@ -36,7 +36,7 @@ fun TutorialSendPagerScreen(
) {
val hubPageCount = 3
val pagerState = rememberPagerState(pageCount = { hubPageCount })
- val context = LocalContext.current
+ val state by viewModel.state.collectAsStateWithLifecycle()
Box(
modifier = Modifier
@@ -49,9 +49,9 @@ fun TutorialSendPagerScreen(
modifier = modifier.fillMaxSize()
) { page ->
when (page) {
- 0 -> TutorialSendPage1()
- 1 -> TutorialSendPage2()
- 2 -> TutorialSendPage3()
+ 0 -> TutorialSendPage1(darkMode = state.darkMode)
+ 1 -> TutorialSendPage2(darkMode = state.darkMode)
+ 2 -> TutorialSendPage3(darkMode = state.darkMode)
}
}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthoughPagerScreen.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthoughPagerScreen.kt
index 2c2e9354..077ecfdf 100644
--- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthoughPagerScreen.kt
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthoughPagerScreen.kt
@@ -1,6 +1,5 @@
package com.brainwallet.ui.bentosections.tutorials.walkthrough
-import com.brainwallet.ui.bentosections.tutorials.TutorialsBentoViewModel
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@@ -15,13 +14,15 @@ import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
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.platform.LocalContext
import androidx.compose.ui.unit.dp
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.brainwallet.navigation.OnNavigate
+import com.brainwallet.ui.bentosections.tutorials.TutorialsBentoViewModel
import com.brainwallet.ui.theme.DesignTheme
import org.koin.compose.viewmodel.koinViewModel
@@ -34,7 +35,7 @@ fun TutorialWalkthroughPagerScreen(
) {
val hubPageCount = 4
val pagerState = rememberPagerState(pageCount = { hubPageCount })
- val context = LocalContext.current
+ val state by viewModel.state.collectAsStateWithLifecycle()
Box(
modifier = Modifier
@@ -47,10 +48,10 @@ fun TutorialWalkthroughPagerScreen(
modifier = modifier.fillMaxSize()
) { page ->
when (page) {
- 0 -> TutorialWalkthroughPage1()
- 1 -> TutorialWalkthroughPage2()
- 2 -> TutorialWalkthroughPage3()
- 3 -> TutorialWalkthroughPage4()
+ 0 -> TutorialWalkthroughPage1(darkMode = state.darkMode)
+ 1 -> TutorialWalkthroughPage2(darkMode = state.darkMode)
+ 2 -> TutorialWalkthroughPage3(darkMode = state.darkMode)
+ 3 -> TutorialWalkthroughPage4(darkMode = state.darkMode)
}
}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage1.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage1.kt
index 15699ec5..93b818b7 100644
--- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage1.kt
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage1.kt
@@ -18,7 +18,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
-import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.brainwallet.ui.composable.CalloutWithPointers
@@ -26,6 +26,7 @@ import com.brainwallet.ui.theme.IBMPlexSans
@Composable
fun TutorialWalkthroughPage1(
+ darkMode: Boolean,
modifier: Modifier = Modifier
) {
Box(
@@ -39,7 +40,7 @@ fun TutorialWalkthroughPage1(
) {
Text(
text = stringResource(com.brainwallet.R.string.brainwallet_walkthrough_title),
- color = Color.White,
+ color = if (darkMode) Color.White else Color.Black,
modifier = Modifier.fillMaxWidth()
.padding(
top = 30.dp,
@@ -72,10 +73,11 @@ fun TutorialWalkthroughPage1(
}
}
-@Preview
+@PreviewLightDark
@Composable
private fun TutorialWalkthroughPage1Preview() {
Column {
- TutorialWalkthroughPage1()
+ TutorialWalkthroughPage1(darkMode = true)
+ TutorialWalkthroughPage1(darkMode = false)
}
}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage2.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage2.kt
index 806cdb6b..40e9da2b 100644
--- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage2.kt
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage2.kt
@@ -26,7 +26,8 @@ import com.brainwallet.ui.theme.IBMPlexSans
@Composable
fun TutorialWalkthroughPage2(
- modifier: Modifier = Modifier
+ darkMode: Boolean,
+ modifier: Modifier = Modifier,
) {
Box(
modifier = Modifier
@@ -39,7 +40,7 @@ fun TutorialWalkthroughPage2(
) {
Text(
text = stringResource(com.brainwallet.R.string.brainwallet_walkthrough_title),
- color = Color.White,
+ color = if (darkMode) Color.White else Color.Black,
modifier = Modifier.fillMaxWidth()
.padding(
top = 30.dp,
@@ -78,6 +79,6 @@ fun TutorialWalkthroughPage2(
@Composable
private fun TutorialWalkthroughPage2Preview() {
Column {
- TutorialWalkthroughPage2()
+ TutorialWalkthroughPage2(darkMode = true)
}
}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage3.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage3.kt
index 3f4df7b8..560f04d9 100644
--- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage3.kt
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage3.kt
@@ -26,6 +26,7 @@ import com.brainwallet.ui.theme.IBMPlexSans
@Composable
fun TutorialWalkthroughPage3(
+ darkMode: Boolean,
modifier: Modifier = Modifier
) {
Box(
@@ -39,7 +40,7 @@ fun TutorialWalkthroughPage3(
) {
Text(
text = stringResource(com.brainwallet.R.string.brainwallet_walkthrough_title),
- color = Color.White,
+ color = if (darkMode) Color.White else Color.Black,
modifier = Modifier.fillMaxWidth()
.padding(
top = 30.dp,
@@ -91,6 +92,6 @@ fun TutorialWalkthroughPage3(
@Composable
private fun TutorialWalkthroughPage3Preview() {
Column {
- TutorialWalkthroughPage3()
+ TutorialWalkthroughPage3(darkMode = true)
}
}
diff --git a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage4.kt b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage4.kt
index 1e1ab326..5acf7603 100644
--- a/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage4.kt
+++ b/app/src/main/java/com/brainwallet/ui/bentosections/tutorials/walkthrough/TutorialWalkthroughPage4.kt
@@ -26,6 +26,7 @@ import com.brainwallet.ui.theme.IBMPlexSans
@Composable
fun TutorialWalkthroughPage4(
+ darkMode: Boolean,
modifier: Modifier = Modifier
) {
Box(
@@ -39,7 +40,7 @@ fun TutorialWalkthroughPage4(
) {
Text(
text = stringResource(com.brainwallet.R.string.brainwallet_walkthrough_title),
- color = Color.White,
+ color = if (darkMode) Color.White else Color.Black,
modifier = Modifier.fillMaxWidth()
.padding(
top = 30.dp,
@@ -80,6 +81,6 @@ fun TutorialWalkthroughPage4(
@Composable
private fun TutorialWalkthroughPage4Preview() {
Column {
- TutorialWalkthroughPage4()
+ TutorialWalkthroughPage4(darkMode = true)
}
}
diff --git a/app/src/main/java/com/brainwallet/ui/composable/BentoBottomNavBar.kt b/app/src/main/java/com/brainwallet/ui/composable/BentoBottomNavBar.kt
index af946a0d..7fd49911 100644
--- a/app/src/main/java/com/brainwallet/ui/composable/BentoBottomNavBar.kt
+++ b/app/src/main/java/com/brainwallet/ui/composable/BentoBottomNavBar.kt
@@ -12,8 +12,6 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
-import androidx.compose.ui.draw.drawBehind
-import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewLightDark
@@ -21,9 +19,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
-import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
-import com.brainwallet.BuildConfig
import com.brainwallet.R
import com.brainwallet.navigation.Route
import com.brainwallet.constants.bentoBottomNavBarHt
@@ -53,21 +49,12 @@ fun BentoBottomNavBar(
) {
val surfaceColor = if (isDarkMode) Color.Black else Color.White
val contentsColor = if (isDarkMode) Color.White else colorMidnite
- val debugLayoutGuideColor: Color = if (BuildConfig.DEBUG) Color.Red else Color.Transparent
Box(
modifier = Modifier
.fillMaxWidth()
.navigationBarsPadding()
.height(bentoBottomNavBarHt)
- .drawBehind {
- drawLine(
- color = debugLayoutGuideColor,
- start = Offset(0f, 0f),
- end = Offset(size.width, 0f),
- strokeWidth = 1.dp.toPx()
- )
- }
) {
NavigationBar(
containerColor = surfaceColor,
diff --git a/app/src/main/java/com/brainwallet/ui/screens/main/MainScreen.kt b/app/src/main/java/com/brainwallet/ui/screens/main/MainScreen.kt
index 7d7221e0..3c37efeb 100644
--- a/app/src/main/java/com/brainwallet/ui/screens/main/MainScreen.kt
+++ b/app/src/main/java/com/brainwallet/ui/screens/main/MainScreen.kt
@@ -1,7 +1,5 @@
package com.brainwallet.ui.screens.home
-import android.net.Uri
-import androidx.browser.customtabs.CustomTabsIntent
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.animation.core.animateFloatAsState
@@ -71,11 +69,11 @@ import com.brainwallet.tools.animation.BRAnimator
import com.brainwallet.tools.manager.AnalyticsManager
import com.brainwallet.ui.bentosections.balancebento.BalanceBentoScreen
import com.brainwallet.ui.bentosections.buyreceivebento.receive.ReceiveDialog
-import com.brainwallet.ui.bentosections.favouritesbento.FavouritesBentoScreen
import com.brainwallet.ui.bentosections.gamehubbento.GameHubBentoPagerScreen
import com.brainwallet.ui.bentosections.ltcpickerbento.LTCPickerBentoScreen
+import com.brainwallet.ui.bentosections.shopbento.ShopBentoScreen
import com.brainwallet.ui.bentosections.transactionbento.TransactionsBentoScreen
-import com.brainwallet.ui.bentosections.tutorials.TutorialsBentoPagerScreen
+import com.brainwallet.ui.bentosections.tutorials.TutorialsBentoScreen
import com.brainwallet.ui.bentosections.tutorials.send.TutorialSendPagerScreen
import com.brainwallet.ui.bentosections.tutorials.walkthrough.TutorialWalkthroughPagerScreen
import com.brainwallet.ui.composable.BentoBottomNavBar
@@ -83,6 +81,7 @@ import com.brainwallet.ui.screens.main.MainScreenEvent
import com.brainwallet.ui.screens.main.MainViewModel
import com.brainwallet.ui.screens.main.SettingsButton
import com.brainwallet.ui.screens.main.ThemeButton
+import com.brainwallet.ui.screens.main.WebModalScreen
import com.brainwallet.ui.screens.send.SendScreen
import com.brainwallet.ui.screens.settings.settingsrows.HomeSettingDrawerSheet
import com.brainwallet.ui.theme.BrainwalletAppTheme
@@ -224,7 +223,7 @@ fun MainScreen(
gameHubHt
val transactionsDetailHeight = availableHeight + gameHubHt + balanceGameBentoHt
val ltcPickerBentoHeight = (availableHeight * 0.7f) - (bentoSpacer / 2)
- val favoritesBentoHeight = (availableHeight * 0.3f) - (bentoSpacer / 2)
+ val storeBentoHeight = (availableHeight * 0.3f) - (bentoSpacer / 2)
val transactionBentoHeight by animateDpAsState(
targetValue = if (showTransactionDetail) transactionsDetailHeight else transactionRowHt,
animationSpec = tween(EXPAND_DURATION),
@@ -289,7 +288,7 @@ fun MainScreen(
shouldShowFiatValues = state.shouldShowFiatValues,
onBentoTap = {
if (noTxItemsPresent) {
- onNavigate.invoke(UiEffect.Navigate(Route.MoonPayWeb))
+ onNavigate.invoke(UiEffect.Navigate(Route.MoonPayBuy))
} else {
viewModel.onEvent(MainScreenEvent.OnToggleTransactionsDetail)
}
@@ -303,7 +302,7 @@ fun MainScreen(
exit = fadeOut(tween(FADE_OUT_DURATION)),
) {
Box(modifier = Modifier.height(availableHeight)) {
- TutorialsBentoPagerScreen(onClick = { page ->
+ TutorialsBentoScreen(onClick = { page ->
when (page) {
0 -> {
modalContentRoute = Route.TutorialWalkthrough
@@ -328,8 +327,11 @@ fun MainScreen(
Box(modifier = Modifier.height(ltcPickerBentoHeight)) {
LTCPickerBentoScreen()
}
- Box(modifier = Modifier.height(favoritesBentoHeight)) {
- FavouritesBentoScreen()
+ Box(modifier = Modifier.height(storeBentoHeight)) {
+ ShopBentoScreen(onClick = {
+ modalContentRoute = Route.BitrefillWeb
+ isSheetOpen = true
+ })
}
}
}
@@ -352,14 +354,8 @@ fun MainScreen(
AnalyticsManager.logCustomEvent("user_did_tap_mp_in_gh")
}
2 -> {
- val builder = CustomTabsIntent.Builder()
- val customTabsIntent = builder.build()
- customTabsIntent.launchUrl(
- context,
- Uri.parse(BWConstants.LINKTREE_URL)
- )
-
- AnalyticsManager.logCustomEvent("user_did_tap_linktree")
+ modalContentRoute = Route.LinktreeWeb
+ isSheetOpen = true
}
}
})
@@ -393,7 +389,9 @@ fun MainScreen(
.wrapContentWidth()
.fillMaxHeight(
if (modalContentRoute == Route.TutorialSend ||
- modalContentRoute == Route.TutorialWalkthrough
+ modalContentRoute == Route.TutorialWalkthrough ||
+ modalContentRoute == Route.BitrefillWeb ||
+ modalContentRoute == Route.LinktreeWeb
) {
1f
} else {
@@ -447,6 +445,18 @@ fun MainScreen(
onNavigate = onNavigate,
onDismissTutorialWalkthroughModal = { isSheetOpen = false }
)
+
+ Route.LinktreeWeb -> WebModalScreen(
+ modifier = Modifier
+ .fillMaxSize(),
+ onNavigate = onNavigate,
+ url = BWConstants.LINKTREE_URL
+ )
+
+ Route.BitrefillWeb -> WebModalScreen(
+ onNavigate = onNavigate,
+ url = BWConstants.BITREFILL_URL
+ )
else -> {}
}
}
diff --git a/app/src/main/java/com/brainwallet/ui/screens/main/WebModalScreen.kt b/app/src/main/java/com/brainwallet/ui/screens/main/WebModalScreen.kt
new file mode 100644
index 00000000..58c091c5
--- /dev/null
+++ b/app/src/main/java/com/brainwallet/ui/screens/main/WebModalScreen.kt
@@ -0,0 +1,52 @@
+package com.brainwallet.ui.screens.main
+
+import android.webkit.WebView
+import android.webkit.WebViewClient
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Card
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.viewinterop.AndroidView
+import com.brainwallet.navigation.OnNavigate
+import com.brainwallet.tools.manager.AnalyticsManager
+import com.brainwallet.ui.theme.bentoDarkSurfaceGradient
+
+@Composable
+fun WebModalScreen(
+ onNavigate: OnNavigate,
+ url: String,
+ modifier: Modifier = Modifier,
+) {
+ val eventString = if (url.contains("bitrefill")) {
+ "user_did_tap_bitrefill"
+ } else {
+ "user_did_tap_linktree"
+ }
+ LaunchedEffect(Unit) {
+ AnalyticsManager.logCustomEvent(eventString)
+ }
+ val context = LocalContext.current
+ Card(
+ modifier = modifier
+ .fillMaxSize()
+ .background(brush = bentoDarkSurfaceGradient),
+ shape = RoundedCornerShape(18.dp),
+ ) {
+ AndroidView(
+ factory = { context ->
+ WebView(context).apply {
+ webViewClient = WebViewClient()
+ loadUrl(url)
+ }
+ },
+ modifier = Modifier.fillMaxSize()
+ )
+ }
+}
diff --git a/app/src/main/java/com/brainwallet/ui/theme/Gradient.kt b/app/src/main/java/com/brainwallet/ui/theme/Gradient.kt
index 4cf1dd32..490fed01 100644
--- a/app/src/main/java/com/brainwallet/ui/theme/Gradient.kt
+++ b/app/src/main/java/com/brainwallet/ui/theme/Gradient.kt
@@ -192,3 +192,39 @@ val bentoModalDarkGradient: Brush
start = Offset(Float.MIN_VALUE, Float.POSITIVE_INFINITY),
end = Offset(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY),
)
+
+fun giftCardGradient1(size: androidx.compose.ui.geometry.Size): Brush {
+ return Brush.radialGradient(
+ colors = listOf(
+ Color(0xFF475A96).copy(alpha = 1f),
+ Color(0xFF1F263F).copy(alpha = 1f)
+ ),
+ center = Offset(size.width / 2.2f, size.height / 2.2f),
+ radius = 500 / 2.0f,
+ tileMode = TileMode.Clamp
+ )
+}
+
+fun giftCardGradient2(size: androidx.compose.ui.geometry.Size): Brush {
+ return Brush.radialGradient(
+ colors = listOf(
+ Color(0xFF575971).copy(alpha = 1f),
+ Color(0xFF1E202D).copy(alpha = 1f)
+ ),
+ Offset(size.width / 2.5f, size.height / 2.5f),
+ radius = 300 / 2.0f,
+ tileMode = TileMode.Clamp
+ )
+}
+
+fun giftCardGradient3(size: androidx.compose.ui.geometry.Size): Brush {
+ return Brush.radialGradient(
+ colors = listOf(
+ Color(0xFFFB6E36).copy(alpha = 1f),
+ Color(0xFFD43603).copy(alpha = 1f)
+ ),
+ Offset(size.width / 1.5f, size.height / 1.5f),
+ radius = 200 / 2.0f,
+ tileMode = TileMode.Clamp
+ )
+}
diff --git a/app/src/main/res/drawable/amazon_logo.png b/app/src/main/res/drawable/amazon_logo.png
new file mode 100644
index 00000000..b5c7a734
Binary files /dev/null and b/app/src/main/res/drawable/amazon_logo.png differ
diff --git a/app/src/main/res/drawable/just_eat_logo.png b/app/src/main/res/drawable/just_eat_logo.png
new file mode 100644
index 00000000..91cac7e5
Binary files /dev/null and b/app/src/main/res/drawable/just_eat_logo.png differ
diff --git a/app/src/main/res/drawable/logotype_bitrefill_blk.png b/app/src/main/res/drawable/logotype_bitrefill_blk.png
new file mode 100644
index 00000000..5396241d
Binary files /dev/null and b/app/src/main/res/drawable/logotype_bitrefill_blk.png differ
diff --git a/app/src/main/res/drawable/logotype_bitrefill_wht.png b/app/src/main/res/drawable/logotype_bitrefill_wht.png
new file mode 100644
index 00000000..05daadde
Binary files /dev/null and b/app/src/main/res/drawable/logotype_bitrefill_wht.png differ
diff --git a/app/src/main/res/drawable/store_05.jpg b/app/src/main/res/drawable/store_05.jpg
new file mode 100644
index 00000000..719463b4
Binary files /dev/null and b/app/src/main/res/drawable/store_05.jpg differ
diff --git a/app/src/main/res/drawable/visa_logo.png b/app/src/main/res/drawable/visa_logo.png
new file mode 100644
index 00000000..80f1b6f7
Binary files /dev/null and b/app/src/main/res/drawable/visa_logo.png differ
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index fcc153a2..a9072767 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -1,8 +1,5 @@
- موقع إلكتروني
- سياسة الخصوصية
- عن
يغلق
خطأ
تم إبطال صلاحية بيانات Brainwallet المشفرة الخاصة بك مؤخرًا بسبب تعطيل شاشة قفل Android.
@@ -285,8 +282,6 @@
سعر LTC
اشترك للحصول على التحديثات والأخبار والمسابقات!
"يرجى قبول إذن إشعاراتنا "
- "معرّف المعاملة: "
- معاملات
كيفية إرسال Litecoin
جولة Brainwallet التعريفية
جرّب جميع ميزات Brainwallet، من إرسال واستقبال العملات المشفرة إلى إدارة مفاتيحك.
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 1ea9915f..930815f2 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -1,10 +1,7 @@
- Blog
- Datenschutzerklärung
- Info
Schließen
Fehler
@@ -415,8 +412,6 @@
LTC-Preis
Melden Sie sich für Updates, Nachrichten und Gewinnspiele an!
"Bitte akzeptieren Sie die Berechtigung für unsere Benachrichtigungen "
- "TX ID: "
- Txns
Wie man Litecoin sendet
Brainwallet Anleitung
Probiere alle Funktionen von Brainwallet aus – vom Senden und Empfangen von Kryptowährungen bis zur Verwaltung deiner Schlüssel.
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index f16181cd..9daa34b9 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -1,11 +1,8 @@
- Blog
- Política de privacidad
- Acerca de nosotros
Cerrar
@@ -490,8 +487,6 @@
Precio LTC
¡Suscríbete a actualizaciones, noticias y concursos!
"Por favor, acepta el permiso para nuestras notificaciones "
- "ID de TX: "
- txns
Cómo enviar Litecoin
Tutorial de Brainwallet
Prueba todas las características de Brainwallet, desde enviar y recibir criptomonedas hasta gestionar tus claves.
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index f93b78db..58af62d4 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -2,15 +2,12 @@
- وبسایت
- سیاست حفظ حریم خصوصی
- درباره
بستن
خطا
@@ -625,9 +622,7 @@
قیمت LTC
برای دریافت بهروزرسانیها، اخبار و مسابقات ثبتنام کنید!
"لطفاً اجازه برای اعلانهای ما را بپذیرید "
- "شناسه تراکنش: "
هنوز چیزی نیست. همین الآن شارژ کنید!
- تراکنشها
نحوه ارسال Litecoin
آموزش Brainwallet
تمامی ویژگیهای Brainwallet را امتحان کنید، از ارسال و دریافت رمزارز تا مدیریت کلیدهای خود.
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 0c51e2e5..911a9499 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -2,14 +2,11 @@
- Blogue
- Politique de confidentialité
- À propos de
Fermer
@@ -641,8 +638,6 @@
Prix LTC
Inscrivez-vous pour recevoir les mises à jour, actualités et concours !
"Veuillez accepter la permission pour nos notifications "
- "ID TX : "
- txns
Comment envoyer du Litecoin
Présentation de Brainwallet
Explorez toutes les fonctionnalités de Brainwallet, de l\'envoi et la réception de crypto à la gestion de vos clés.
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index c2bc5af7..e0f839d5 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -1,8 +1,5 @@
- वेबसाइट
- गोपनीयता नीति
- के बारे में
बंद करना
गलती
आपका ब्रेनवॉलेट एन्क्रिप्टेड डेटा हाल ही में अमान्य कर दिया गया था क्योंकि आपकी एंड्रॉइड लॉक स्क्रीन अक्षम कर दी गई थी।
@@ -285,8 +282,6 @@
LTC मूल्य
अपडेट, समाचार और प्रतियोगिताओं के लिए साइन अप करें!
"कृपया हमारी सूचनाओं के लिए अनुमति स्वीकार करें "
- "TX ID: "
- लेनदेन
Litecoin कैसे भेजें
Brainwallet वॉकथ्रू
Brainwallet की सभी सुविधाओं को आजमाएं, क्रिप्टो भेजने और प्राप्त करने से लेकर अपनी कुंजियों को प्रबंधित करने तक।
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index f5de1c1a..0cd1aece 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -2,14 +2,11 @@
- Situs web
- Kebijakan pribadi
- Tentang
Menutup
@@ -641,8 +638,6 @@
Harga LTC
Daftar untuk mendapatkan update, berita, dan kontes!
"Mohon izinkan notifikasi dari kami "
- "ID TX: "
- txn
Cara mengirim Litecoin
Panduan Brainwallet
Coba semua fitur Brainwallet, dari mengirim dan menerima crypto hingga mengelola kunci Anda.
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 1a1ed883..ccf1ad45 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -2,14 +2,11 @@
- Blog
- Informativa sulla Privacy
- Chi siamo
Chiudi
@@ -641,8 +638,6 @@
Prezzo LTC
Iscriviti per ricevere aggiornamenti, notizie e concorsi!
"Accetta l'autorizzazione per le nostre notifiche "
- "ID TX: "
- txns
Come inviare Litecoin
Brainwallet Walkthrough
Prova tutte le funzionalità di Brainwallet, dall\'invio e ricezione di criptovalute alla gestione delle tue chiavi.
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 06123ab5..da1398a3 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -2,14 +2,11 @@
- ブログ
- プライバシーポリシー
- 概要
閉じる
@@ -641,8 +638,6 @@
LTC 価格
アップデート、ニュース、コンテストの最新情報を受け取ろう!
"通知の許可をお願いします "
- "TX ID: "
- トランザクション
Litecoinの送信方法
Brainwallet チュートリアル
送受信からキー管理まで、Brainwalletのすべての機能をお試しください。
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 31a63b98..0ca33d4c 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -2,14 +2,11 @@
- 블로그
- 개인정보 보호정책
- 관련 사항
닫기
@@ -641,8 +638,6 @@
LTC 가격
업데이트, 뉴스 및 이벤트 소식을 받아보세요!
"알림 권한을 허용해 주세요 "
- "TX ID: "
- 거래
Litecoin을 보내는 방법
Brainwallet 둘러보기
암호화폐 송수신부터 키 관리까지 Brainwallet의 모든 기능을 체험해보세요.
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index e2338533..a97d6571 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -1,8 +1,5 @@
- Website
- Privacybeleid
- Over
Sluiten
Fout
Uw Brainwallet-versleutelde gegevens zijn onlangs ongeldig gemaakt omdat uw Android-vergrendelingsscherm is uitgeschakeld.
@@ -285,8 +282,6 @@
Ontvangen
Verzonden
LTC Prijs
- "TX ID: "
- txns
Hoe u Litecoin verzendt
Brainwallet-rondleiding
Probeer alle functies van Brainwallet uit, van het verzenden en ontvangen van crypto tot het beheren van uw sleutels.
diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml
index 4968ff33..8860f8b3 100644
--- a/app/src/main/res/values-pa/strings.xml
+++ b/app/src/main/res/values-pa/strings.xml
@@ -2,15 +2,12 @@
- ویب سائٹ
- پرائیویسی پالیسی
- متعلق
بند کرو
@@ -651,8 +648,6 @@
LTC ਕੀਮਤ
ਅਪਡੇਟ, ਖ਼ਬਰਾਂ ਅਤੇ ਮੁਕਾਬਲਿਆਂ ਲਈ ਸਾਈਨ ਅਪ ਕਰੋ!
"ਕਿਰਪਾ ਕਰਕੇ ਸਾਡੀਆਂ ਸੂਚਨਾਵਾਂ ਲਈ ਅਨੁਮਤੀ ਦਿਓ "
- "TX ID: "
- ਲੈਣ-ਦੇਣ
Litecoin ਭੇਜਣਾ ਕਿਵੇਂ ਹੈ
Brainwallet ਵਾਕਥਰੂ
Brainwallet ਦੀਆਂ ਸਾਰੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਆਜ਼ਮਾਓ, ਕ੍ਰਿਪਟੋ ਭੇਜਣ ਅਤੇ ਪ੍ਰਾਪਤ ਕਰਨ ਤੋਂ ਲੈ ਕੇ ਆਪਣੀਆਂ ਕੁੰਜੀਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਤੱਕ।
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index dca7e0c9..b034e957 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -2,15 +2,12 @@
- Strona internetowa
- Polityka prywatności
- O
Zamknij
@@ -646,8 +643,6 @@
Cena LTC
Zarejestruj się, aby otrzymywać aktualizacje, wiadomości i informacje o konkursach!
"Proszę wyraź zgodę na nasze powiadomienia "
- "ID transakcji: "
- transakcje
Jak wysłać Litecoin
Przewodnik po Brainwallet
Spróbuj wszystkich funkcji Brainwallet, od wysyłania i otrzymywania kryptowalut po zarządzanie swoimi kluczami.
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 83815989..07c5db4b 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -1,8 +1,5 @@
- Site
- Política de Privacidade
- Sobre
Fechar
Erro
Seus dados criptografados do Brainwallet foram invalidados recentemente porque a tela de bloqueio do Android foi desativada.
@@ -285,8 +282,6 @@
Preço do LTC
Cadastre-se para receber atualizações, notícias e promoções!
"Por favor, aceite a permissão para nossas notificações "
- "ID TX: "
- txns
Como enviar Litecoin
Passo a Passo Brainwallet
Experimente todos os recursos do Brainwallet, desde enviar e receber criptomoedas até gerenciar suas chaves.
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 0aed26ed..08c2779e 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -2,14 +2,11 @@
- Блог
- Политика конфиденциальности
- О нас
Закрыть
@@ -641,8 +638,6 @@
Цена LTC
Подпишитесь на обновления, новости и конкурсы!
"Пожалуйста, разрешите отправку уведомлений "
- "ID транзакции: "
- транзакции
Как отправить Litecoin
Обзор Brainwallet
Попробуйте все возможности Brainwallet: отправку и получение криптовалюты, управление ключами.
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index a4e26f46..efbb0b93 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -1,8 +1,5 @@
- Webbplats
- Sekretesspolicy
- Om
Nära
Fel
Din Brainwallet-krypterade data ogiltigförklarades nyligen eftersom din Android-låsskärm var inaktiverad.
@@ -285,8 +282,6 @@
Mottaget
Skickat
LTC-pris
- "TX-ID: "
- transaktioner
Hur du skickar Litecoin
Brainwallet Genomgång
Prova alla funktioner i Brainwallet, från att skicka och ta emot krypto till att hantera dina nycklar.
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index df5f24a4..858b18f3 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -2,9 +2,6 @@
ส่ง
สร้างกระเป๋าเงินใหม่
- เว็บไซต์
- นโยบายความเป็นส่วนตัว
- เกี่ยวกับ
ปิด
ข้อผิดพลาด
ข้อมูลเข้ารหัส Brainwallet ของคุณถูกยกเลิกเมื่อเร็ว ๆ นี้เนื่องจากปิดใช้งานหน้าจอล็อกของ Android
@@ -285,8 +282,6 @@
รับได้
ส่งแล้ว
ราคา LTC
- "TX ID: "
- รายการทำธุรกรรม
วิธีการส่ง Litecoin
Brainwallet ทำความคุ้นเคย
ลองใช้ฟีเจอร์ทั้งหมดของ Brainwallet ตั้งแต่การส่งและรับคริปโตไปจนถึงการจัดการคีย์ของคุณ
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 0230b22d..866f998c 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -5,11 +5,9 @@
- Gizlilik Politikası
- hakkında
Kapat
@@ -659,8 +657,6 @@
Alınan
Gönderilen
LTC Fiyatı
- "İŞLEM KİMLİĞİ: "
- işlem
Litecoin Nasıl Gönderilir
Brainwallet Rehberi
Brainwallet\'ın tüm özelliklerini deneyin: kripto gönderme ve alma işlemlerinden anahtar yönetimine kadar.
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 33114592..d2ef237a 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -2,15 +2,12 @@
- веб-сайт
- Політика конфіденційності
- Про
Закрити
@@ -643,8 +640,6 @@
Отримано
Відправлено
Ціна LTC
- "ID транзакції: "
- транз.
Як відправити Litecoin
Огляд Brainwallet
Спробуйте всі функції Brainwallet: від відправлення та отримання криптовалюти до управління вашими ключами.
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 6698319e..2d4b4cf8 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -2,14 +2,11 @@
- 博客
- 隐私政策
- 关于
关闭
@@ -641,8 +638,6 @@
已接收
已发送
LTC 价格
- "交易 ID: "
- 笔交易
如何发送 Litecoin
Brainwallet 使用指南
体验 Brainwallet 的所有功能,从发送和接收加密货币到管理您的密钥。
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 8d3d9bc4..1a746ae4 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -4,11 +4,9 @@
- 隱私政策
- 關於
關閉
@@ -570,7 +568,6 @@
主题
应用程序版本:
同步
- 博客
同步時間:>20 分鐘
遊戲 %1$d:
助記詞
@@ -641,8 +638,6 @@
已接收
已傳送
LTC 價格
- "交易 ID:"
- 交易
如何發送Litecoin
Brainwallet 功能導覽
探索Brainwallet的所有功能,從發送和接收加密貨幣到管理您的密鑰。
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b2268658..d094fac8 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -2,16 +2,8 @@
Brainwallet
-
- Website
%1$s
-
- Privacy Policy
-
- Instagram
-
- About
Close
@@ -448,10 +440,10 @@
"Date: "
"Amount: "
"Fees: "
- "TX ID: "
+ "TX ID: "
Nothing yet. Top up now!
TRANSACTION HISTORY
- txns
+ txns
Enter passcode
Recipient:
Send Litecoin
@@ -498,5 +490,7 @@
Do you have some LTC? Change your local figure fiat to figure out how much you can send. Or, calculate in LTC. Go to settings to adjust your preferred network fee
Verify before sending!
Scan or paste the destination address. Double check! Change your local fiat to figure out how much you can send. Add a memo as a handy reminder. Tap Continue.
+ Shop
+ Buy Gift Cards with LTC!
diff --git a/app/src/test/kotlin/com/brainwallet/ui/bentosections/shopbento/ShopBentoViewModelTest.kt b/app/src/test/kotlin/com/brainwallet/ui/bentosections/shopbento/ShopBentoViewModelTest.kt
new file mode 100644
index 00000000..70d5a71a
--- /dev/null
+++ b/app/src/test/kotlin/com/brainwallet/ui/bentosections/shopbento/ShopBentoViewModelTest.kt
@@ -0,0 +1,117 @@
+package com.brainwallet.ui.bentosections.shopbento
+
+import android.app.Application
+import android.content.Context
+import android.telephony.TelephonyManager
+import app.cash.turbine.testIn
+import app.cash.turbine.turbineScope
+import com.brainwallet.data.model.AppSetting
+import com.brainwallet.data.repository.SettingRepository
+import io.mockk.every
+import io.mockk.mockk
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.test.advanceTimeBy
+import kotlinx.coroutines.test.runTest
+import org.junit.Assert.assertEquals
+import org.junit.Before
+import org.junit.Test
+
+class ShopBentoViewModelTest {
+
+ private lateinit var app: Application
+ private lateinit var settingRepository: SettingRepository
+ private lateinit var telephonyManager: TelephonyManager
+ private lateinit var settingsFlow: MutableStateFlow
+
+ private fun buildViewModel() = ShopBentoViewModel(
+ app = app,
+ settingRepository = settingRepository,
+ )
+
+ @Before
+ fun setup() {
+ app = mockk()
+ settingRepository = mockk()
+ telephonyManager = mockk()
+ settingsFlow = MutableStateFlow(AppSetting())
+
+ every { settingRepository.settings } returns settingsFlow
+ every { app.getSystemService(Context.TELEPHONY_SERVICE) } returns telephonyManager
+ every { telephonyManager.simCountryIso } returns "gb"
+ every { telephonyManager.networkCountryIso } returns ""
+ }
+
+ @Test
+ fun `init - uses simCountryIso when available`() = runTest {
+ turbineScope {
+ every { telephonyManager.simCountryIso } returns "us"
+
+ val viewModel = buildViewModel()
+ val turbine = viewModel.state.testIn(backgroundScope)
+
+ settingsFlow.emit(AppSetting())
+ advanceTimeBy(100)
+
+ assertEquals("US", turbine.expectMostRecentItem().countryIso)
+ turbine.cancelAndIgnoreRemainingEvents()
+ }
+ }
+
+ @Test
+ fun `init - falls back to Locale default when both sim and network are empty`() = runTest {
+ turbineScope {
+ every { telephonyManager.simCountryIso } returns ""
+ every { telephonyManager.networkCountryIso } returns ""
+
+ val viewModel = buildViewModel()
+ val turbine = viewModel.state.testIn(backgroundScope)
+
+ settingsFlow.emit(AppSetting())
+ advanceTimeBy(100)
+
+ val countryIso = turbine.expectMostRecentItem().countryIso
+ assert(countryIso.isNotEmpty())
+ turbine.cancelAndIgnoreRemainingEvents()
+ }
+ }
+
+ @Test
+ fun `onEvent OnTapShop - updates shouldSlide to true`() = runTest {
+ turbineScope {
+ val viewModel = buildViewModel()
+ val turbine = viewModel.state.testIn(backgroundScope)
+
+ settingsFlow.emit(AppSetting())
+ advanceTimeBy(200)
+
+ viewModel.onEvent(ShopBentoEvent.OnTapShop)
+ advanceTimeBy(200)
+
+ assertEquals(true, turbine.expectMostRecentItem().shouldSlide)
+ turbine.cancelAndIgnoreRemainingEvents()
+ }
+ }
+
+ @Test
+ fun `onEvent OnLoad - does not change state`() = runTest {
+ turbineScope {
+ val viewModel = buildViewModel()
+ val turbine = viewModel.state.testIn(backgroundScope)
+
+ turbine.awaitItem()
+
+ settingsFlow.emit(AppSetting(isDarkMode = true))
+ advanceTimeBy(100)
+
+ val stateBefore = turbine.awaitItem()
+
+ viewModel.onEvent(ShopBentoEvent.OnLoad)
+ advanceTimeBy(100)
+
+ turbine.expectNoEvents()
+ assertEquals(stateBefore, viewModel.state.value)
+
+ turbine.cancelAndIgnoreRemainingEvents()
+ }
+ }
+}