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() + } + } +}