diff --git a/api/src/main/java/com/getcode/model/Feature.kt b/api/src/main/java/com/getcode/model/Feature.kt index ebcc72bf0..b62461377 100644 --- a/api/src/main/java/com/getcode/model/Feature.kt +++ b/api/src/main/java/com/getcode/model/Feature.kt @@ -17,6 +17,11 @@ data class TipCardFeature( override val available: Boolean = true, // always available ): Feature +data class TipCardOnHomeScreenFeature( + override val enabled: Boolean = BetaOptions.Defaults.tipCardOnHomeScreen, + override val available: Boolean = true, // always available +): Feature + data class TipChatFeature( override val enabled: Boolean = BetaOptions.Defaults.tipsChatEnabled, override val available: Boolean = true, // always available diff --git a/api/src/main/java/com/getcode/model/PrefBool.kt b/api/src/main/java/com/getcode/model/PrefBool.kt index 590c172e8..3c6b41b71 100644 --- a/api/src/main/java/com/getcode/model/PrefBool.kt +++ b/api/src/main/java/com/getcode/model/PrefBool.kt @@ -50,6 +50,7 @@ sealed class PrefsBool(val value: String) { data object BALANCE_CURRENCY_SELECTION_ENABLED: PrefsBool("balance_currency_enabled"), BetaFlag data object KADO_WEBVIEW_ENABLED : PrefsBool("kado_inapp_enabled"), BetaFlag data object SHARE_TWEET_TO_TIP : PrefsBool("share_tweet_to_tip"), BetaFlag + data object TIP_CARD_ON_HOMESCREEN: PrefsBool("tip_card_on_home_screen"), BetaFlag } val APP_SETTINGS: List = listOf(PrefsBool.CAMERA_START_BY_DEFAULT, PrefsBool.REQUIRE_BIOMETRICS) \ No newline at end of file diff --git a/api/src/main/java/com/getcode/network/repository/BetaFlagsRepository.kt b/api/src/main/java/com/getcode/network/repository/BetaFlagsRepository.kt index 5d798f63b..ba9c121ef 100644 --- a/api/src/main/java/com/getcode/network/repository/BetaFlagsRepository.kt +++ b/api/src/main/java/com/getcode/network/repository/BetaFlagsRepository.kt @@ -20,6 +20,7 @@ data class BetaOptions( val balanceCurrencySelectionEnabled: Boolean, val kadoWebViewEnabled: Boolean, val shareTweetToTip: Boolean, + val tipCardOnHomeScreen: Boolean, ) { companion object { // Default states for various beta flags in app. @@ -37,7 +38,8 @@ data class BetaOptions( tipsChatCashEnabled = false, balanceCurrencySelectionEnabled = true, kadoWebViewEnabled = false, - shareTweetToTip = false + shareTweetToTip = false, + tipCardOnHomeScreen = true, ) } } @@ -73,7 +75,8 @@ class BetaFlagsRepository @Inject constructor( observeBetaFlag(PrefsBool.BALANCE_CURRENCY_SELECTION_ENABLED, defaults.balanceCurrencySelectionEnabled), observeBetaFlag(PrefsBool.DISPLAY_ERRORS, default = defaults.displayErrors), observeBetaFlag(PrefsBool.KADO_WEBVIEW_ENABLED, default = defaults.kadoWebViewEnabled), - observeBetaFlag(PrefsBool.SHARE_TWEET_TO_TIP, default = defaults.shareTweetToTip) + observeBetaFlag(PrefsBool.SHARE_TWEET_TO_TIP, default = defaults.shareTweetToTip), + observeBetaFlag(PrefsBool.TIP_CARD_ON_HOMESCREEN, defaults.tipCardOnHomeScreen) ) { BetaOptions( showNetworkDropOff = it[0], @@ -89,7 +92,8 @@ class BetaFlagsRepository @Inject constructor( balanceCurrencySelectionEnabled = it[10], displayErrors = it[11], kadoWebViewEnabled = it[12], - shareTweetToTip = it[13] + shareTweetToTip = it[13], + tipCardOnHomeScreen = it[14] ) } } diff --git a/api/src/main/java/com/getcode/network/repository/FeatureRepository.kt b/api/src/main/java/com/getcode/network/repository/FeatureRepository.kt index f68bd22cb..b6a0e3af7 100644 --- a/api/src/main/java/com/getcode/network/repository/FeatureRepository.kt +++ b/api/src/main/java/com/getcode/network/repository/FeatureRepository.kt @@ -7,6 +7,7 @@ import com.getcode.model.Feature import com.getcode.model.PrefsBool import com.getcode.model.RequestKinFeature import com.getcode.model.TipCardFeature +import com.getcode.model.TipCardOnHomeScreenFeature import com.getcode.model.TipChatCashFeature import com.getcode.model.TipChatFeature import kotlinx.coroutines.flow.combine @@ -26,7 +27,7 @@ class FeatureRepository @Inject constructor( ) { enabled, available -> BuyModuleFeature(enabled, available) } val tipCards = betaFlags.observe().map { TipCardFeature(it.tipsEnabled) } - + val tipCardOnHomeScreen = betaFlags.observe().map { TipCardOnHomeScreenFeature(it.tipCardOnHomeScreen) } val tipChat = betaFlags.observe().map { TipChatFeature(it.tipsChatEnabled) } val tipChatCash = betaFlags.observe().map { TipChatCashFeature(it.tipsChatCashEnabled) } diff --git a/app/src/main/java/com/getcode/navigation/screens/ModalScreens.kt b/app/src/main/java/com/getcode/navigation/screens/ModalScreens.kt index 7546a41fd..a31f7c54d 100644 --- a/app/src/main/java/com/getcode/navigation/screens/ModalScreens.kt +++ b/app/src/main/java/com/getcode/navigation/screens/ModalScreens.kt @@ -466,19 +466,35 @@ data class ConnectAccount( override fun Content() { val navigator = LocalCodeNavigator.current val viewModel = getViewModel() - ModalContainer( - backButtonEnabled = { - if (navigator.isVisible) { - it is ConnectAccount - } else { - navigator.progress > 0f + when (reason) { + IdentityConnectionReason.TipCard -> { + ModalContainer( + closeButtonEnabled = { + if (navigator.isVisible) { + it is ConnectAccount + } else { + navigator.progress > 0f + } + } + ) { + ConnectAccountScreen(viewModel) + } + } + IdentityConnectionReason.IdentityReveal -> { + ModalContainer( + backButtonEnabled = { + if (navigator.isVisible) { + it is ConnectAccount + } else { + navigator.progress > 0f + } + } + ) { + ConnectAccountScreen(viewModel) } } - ) { - ConnectAccountScreen(viewModel) } - LaunchedEffect(viewModel, reason) { viewModel.dispatchEvent(TipConnectViewModel.Event.OnReasonChanged(reason)) } diff --git a/app/src/main/java/com/getcode/view/main/account/BetaFlagsScreen.kt b/app/src/main/java/com/getcode/view/main/account/BetaFlagsScreen.kt index 30201acf8..544a079de 100644 --- a/app/src/main/java/com/getcode/view/main/account/BetaFlagsScreen.kt +++ b/app/src/main/java/com/getcode/view/main/account/BetaFlagsScreen.kt @@ -89,6 +89,12 @@ fun BetaFlagsScreen( stringResource(id = R.string.beta_tipcard_description), state.tipsEnabled, ), + BetaFeature( + PrefsBool.TIP_CARD_ON_HOMESCREEN, + R.string.beta_tipcard_on_homescreen, + stringResource(id = R.string.beta_tipcard_on_homescreen_description), + state.tipCardOnHomeScreen, + ), BetaFeature( PrefsBool.TIPS_CHAT_ENABLED, R.string.beta_tipchats, diff --git a/app/src/main/java/com/getcode/view/main/home/HomeScan.kt b/app/src/main/java/com/getcode/view/main/home/HomeScan.kt index 89d20399d..8dc82ceba 100644 --- a/app/src/main/java/com/getcode/view/main/home/HomeScan.kt +++ b/app/src/main/java/com/getcode/view/main/home/HomeScan.kt @@ -48,9 +48,11 @@ import com.getcode.navigation.screens.AccountModal import com.getcode.navigation.screens.BalanceModal import com.getcode.navigation.screens.BuyMoreKinModal import com.getcode.navigation.screens.BuySellScreen +import com.getcode.navigation.screens.ConnectAccount import com.getcode.navigation.screens.EnterTipModal import com.getcode.navigation.screens.GetKinModal import com.getcode.navigation.screens.GiveKinModal +import com.getcode.navigation.screens.HomeResult import com.getcode.navigation.screens.ShareDownloadLinkModal import com.getcode.ui.components.OnLifecycleEvent import com.getcode.ui.components.PermissionCheck @@ -81,7 +83,8 @@ enum class HomeBottomSheet { GIVE_KIN, GET_KIN, BALANCE, - SHARE_DOWNLOAD + SHARE_DOWNLOAD, + TIP_CARD } @Composable @@ -191,6 +194,13 @@ private fun HomeScan( HomeBottomSheet.GET_KIN -> navigator.show(GetKinModal) HomeBottomSheet.BALANCE -> navigator.show(BalanceModal) HomeBottomSheet.SHARE_DOWNLOAD -> navigator.show(ShareDownloadLinkModal) + HomeBottomSheet.TIP_CARD -> { + if (dataState.tipCardConnected) { + homeViewModel.presentShareableTipCard() + } else { + navigator.push(ConnectAccount()) + } + } HomeBottomSheet.NONE -> Unit } } diff --git a/app/src/main/java/com/getcode/view/main/home/HomeViewModel.kt b/app/src/main/java/com/getcode/view/main/home/HomeViewModel.kt index f229a50d3..c7471481e 100644 --- a/app/src/main/java/com/getcode/view/main/home/HomeViewModel.kt +++ b/app/src/main/java/com/getcode/view/main/home/HomeViewModel.kt @@ -32,6 +32,7 @@ import com.getcode.model.PrefsBool import com.getcode.model.Rate import com.getcode.model.RequestKinFeature import com.getcode.model.TipCardFeature +import com.getcode.model.TipCardOnHomeScreenFeature import com.getcode.model.TwitterUser import com.getcode.model.Username import com.getcode.models.Bill @@ -147,6 +148,7 @@ data class HomeUiModel( val buyModule: Feature = BuyModuleFeature(), val requestKin: Feature = RequestKinFeature(), val tips: Feature = TipCardFeature(), + val tipCardOnHomeScreen: Feature = TipCardOnHomeScreenFeature(), val tipCardConnected: Boolean = false, ) @@ -225,6 +227,13 @@ class HomeViewModel @Inject constructor( } }.launchIn(viewModelScope) + features.tipCardOnHomeScreen + .onEach { module -> + uiFlow.update { + it.copy(tipCardOnHomeScreen = module) + } + }.launchIn(viewModelScope) + features.requestKin .onEach { module -> uiFlow.update { diff --git a/app/src/main/java/com/getcode/view/main/home/components/HomeBottom.kt b/app/src/main/java/com/getcode/view/main/home/components/HomeBottom.kt index 0f9419543..769b2a620 100644 --- a/app/src/main/java/com/getcode/view/main/home/components/HomeBottom.kt +++ b/app/src/main/java/com/getcode/view/main/home/components/HomeBottom.kt @@ -50,7 +50,11 @@ internal fun HomeBottom( contentPadding = PaddingValues(horizontal = CodeTheme.dimens.grid.x3), ) { BottomBarAction( - label = stringResource(R.string.title_getKin), + label = if (state.tipCardOnHomeScreen.enabled) { + stringResource(R.string.title_tipCard) + } else { + stringResource(R.string.title_getKin) + }, contentPadding = PaddingValues( start = CodeTheme.dimens.grid.x3, end = CodeTheme.dimens.grid.x3, @@ -58,8 +62,18 @@ internal fun HomeBottom( bottom = CodeTheme.dimens.grid.x2, ), imageSize = CodeTheme.dimens.grid.x7, - painter = painterResource(R.drawable.ic_wallet), - onClick = { onPress(HomeBottomSheet.GET_KIN) }, + painter = if (state.tipCardOnHomeScreen.enabled) { + painterResource(R.drawable.ic_tip_card) + } else { + painterResource(R.drawable.ic_wallet) + }, + onClick = { + if (state.tipCardOnHomeScreen.enabled) { + onPress(HomeBottomSheet.TIP_CARD) + } else { + onPress(HomeBottomSheet.GET_KIN) + } + }, ) Spacer(modifier = Modifier.weight(1f)) BottomBarAction( @@ -86,7 +100,12 @@ internal fun HomeBottom( modifier = Modifier.padding(top = 2.dp, end = 2.dp), count = state.chatUnreadCount, color = ChatNodeDefaults.UnreadIndicator, - enterTransition = scaleIn(animationSpec = tween(durationMillis = 300, delayMillis = 1000)) + fadeIn() + enterTransition = scaleIn( + animationSpec = tween( + durationMillis = 300, + delayMillis = 1000 + ) + ) + fadeIn() ) } ) diff --git a/app/src/main/res/drawable/ic_tip_card.xml b/app/src/main/res/drawable/ic_tip_card.xml new file mode 100644 index 000000000..f9edb10ab --- /dev/null +++ b/app/src/main/res/drawable/ic_tip_card.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/app/src/main/res/values/strings-universal.xml b/app/src/main/res/values/strings-universal.xml index 55d4736d5..328c3d16c 100644 --- a/app/src/main/res/values/strings-universal.xml +++ b/app/src/main/res/values/strings-universal.xml @@ -20,6 +20,7 @@ Vibrate on Scan Show Connectivity Status Tip Card + Tip Card on Home Screen Tip Chats Tip Chats Cash Currency Selection in Balance @@ -35,6 +36,7 @@ If enabled, a relationship account will be established with getcode.com if it doesn\'t yet exist. If enabled, an option to unsubscribe from a chat will appear for supported chats. If enabled, you\'ll gain the ability to share a tip card. + If enabled, your tip card will replace Get Cash on the home screen. If enabled, you\'ll gain the ability to chat with tippers. If enabled, you\'ll gain the ability to send Kin in Tip Chats. If enabled, the Buy Kin flow will open in an internal WebView. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a52bd9cbd..4e6cb7013 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -49,4 +49,5 @@ Connect Account Connecting your X account allows you to reveal your identity to the people you tip. To connect your account post to X. Use Kado Sandbox + Tip Card