From 30cf2b2a06c8d3f55c9fdf0115c055ff10040a2d Mon Sep 17 00:00:00 2001 From: kutalek Date: Tue, 21 Nov 2023 22:06:11 -0800 Subject: [PATCH] Add support for buy data to home screen and buy data, borrow airtime, and data balance to SIM cards --- .../stax/accounts/AccountDetailFragment.kt | 3 +- .../domain/use_case/sims/ListSimsUseCase.kt | 7 +- .../presentation/home/BalancesViewModel.kt | 14 ++-- .../stax/presentation/home/HomeFragment.kt | 4 +- .../stax/presentation/home/HomeScreen.kt | 3 + .../home/components/PrimaryFeatures.kt | 6 ++ .../stax/presentation/sims/SimFragment.kt | 9 ++- .../hover/stax/presentation/sims/SimScreen.kt | 7 +- .../presentation/sims/components/SimItem.kt | 76 ++++++++++++++----- .../stax/transfers/AbstractFormFragment.kt | 10 ++- .../hover/stax/transfers/TransferFragment.kt | 67 ++++++++-------- app/src/main/res/drawable/ic_data.xml | 5 ++ app/src/main/res/values/logging_strings.xml | 3 + app/src/main/res/values/strings.xml | 4 + gradle/libs.versions.toml | 2 +- 15 files changed, 150 insertions(+), 70 deletions(-) create mode 100644 app/src/main/res/drawable/ic_data.xml diff --git a/app/src/main/java/com/hover/stax/accounts/AccountDetailFragment.kt b/app/src/main/java/com/hover/stax/accounts/AccountDetailFragment.kt index 8aa082e81..99ce0d8c5 100644 --- a/app/src/main/java/com/hover/stax/accounts/AccountDetailFragment.kt +++ b/app/src/main/java/com/hover/stax/accounts/AccountDetailFragment.kt @@ -27,6 +27,7 @@ import androidx.core.content.ContextCompat import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs +import com.hover.sdk.actions.HoverAction.BALANCE import com.hover.stax.R import com.hover.stax.databinding.FragmentAccountBinding import com.hover.stax.domain.model.Account @@ -218,7 +219,7 @@ class AccountDetailFragment : } private fun onTapBalanceRefresh(account: Account?) { - balancesViewModel.requestBalance(account) + balancesViewModel.requestAction(account, BALANCE) } private fun setUpRemoveAccount(account: Account) { diff --git a/app/src/main/java/com/hover/stax/domain/use_case/sims/ListSimsUseCase.kt b/app/src/main/java/com/hover/stax/domain/use_case/sims/ListSimsUseCase.kt index d2f5cfa16..e08d2315e 100644 --- a/app/src/main/java/com/hover/stax/domain/use_case/sims/ListSimsUseCase.kt +++ b/app/src/main/java/com/hover/stax/domain/use_case/sims/ListSimsUseCase.kt @@ -28,7 +28,8 @@ data class SimWithAccount( val sim: SimInfo, val account: Account, val balanceAction: HoverAction?, - val airtimeActions: List = emptyList() + val airtimeActions: List = emptyList(), + val dataActions: List = emptyList() ) class ListSimsUseCase( @@ -45,6 +46,7 @@ class ListSimsUseCase( var account = accountRepository.getAccountBySim(sim.subscriptionId) var balanceAct: HoverAction? = null var airtimeActs: List = emptyList() + var dataActs: List = emptyList() if (account == null) account = accountRepository.createAccount(sim) @@ -52,8 +54,9 @@ class ListSimsUseCase( if (account.channelId != -1) { balanceAct = actionRepository.getFirstAction(account.institutionId, account.countryAlpha2, HoverAction.BALANCE) airtimeActs = actionRepository.getActionsByRecipientInstitution(account.institutionId, account.countryAlpha2, HoverAction.AIRTIME) + dataActs = actionRepository.getActionsByRecipientInstitution(account.institutionId, account.countryAlpha2, HoverAction.BUY_DATA) } - result.add(SimWithAccount(sim, account, balanceAct, airtimeActs)) + result.add(SimWithAccount(sim, account, balanceAct, airtimeActs, dataActs)) } result } diff --git a/app/src/main/java/com/hover/stax/presentation/home/BalancesViewModel.kt b/app/src/main/java/com/hover/stax/presentation/home/BalancesViewModel.kt index d51fd284e..e22a58e6e 100644 --- a/app/src/main/java/com/hover/stax/presentation/home/BalancesViewModel.kt +++ b/app/src/main/java/com/hover/stax/presentation/home/BalancesViewModel.kt @@ -56,27 +56,27 @@ class BalancesViewModel( getAccounts() } - fun requestBalance(account: Account?) { + fun requestAction(account: Account?, type: String) { if (account == null) { AnalyticsUtil.logAnalyticsEvent( - (getApplication() as Context).getString(R.string.refresh_balance_failed), + (getApplication() as Context).getString(R.string.action_failed, type), getApplication() ) - Toast.makeText(getApplication(), R.string.refresh_balance_failed, Toast.LENGTH_LONG).show() + Toast.makeText(getApplication(), (getApplication() as Context).getString(R.string.action_failed, type), Toast.LENGTH_LONG).show() } else { AnalyticsUtil.logAnalyticsEvent( - (getApplication() as Context).getString(R.string.refresh_balance), + (getApplication() as Context).getString(R.string.action_starting, type), getApplication() ) userRequestedBalanceAccount.value = account - startBalanceActionFor(userRequestedBalanceAccount.value) + startActionFor(userRequestedBalanceAccount.value, type) } } - private fun startBalanceActionFor(account: Account?) = viewModelScope.launch(Dispatchers.IO) { + private fun startActionFor(account: Account?, type: String) = viewModelScope.launch(Dispatchers.IO) { if (account == null) return@launch - val action = actionRepo.getFirstAction(account.institutionId, account.countryAlpha2, HoverAction.BALANCE) + val action = actionRepo.getFirstAction(account.institutionId, account.countryAlpha2, type) action?.let { _balanceAction.emit(action) } ?: run { _actionRunError.send((getApplication() as Context).getString(R.string.error_running_action)) } } diff --git a/app/src/main/java/com/hover/stax/presentation/home/HomeFragment.kt b/app/src/main/java/com/hover/stax/presentation/home/HomeFragment.kt index e4469f188..df4c5c339 100644 --- a/app/src/main/java/com/hover/stax/presentation/home/HomeFragment.kt +++ b/app/src/main/java/com/hover/stax/presentation/home/HomeFragment.kt @@ -70,6 +70,7 @@ class HomeFragment : AbstractBalanceCheckerFragment(), FinancialTipClickInterfac private fun getHomeClickFunctions(): HomeClickFunctions { fun onSendMoneyClicked() = navigateTo(getTransferDirection(HoverAction.P2P)) fun onBuyAirtimeClicked() = navigateTo(getTransferDirection(HoverAction.AIRTIME)) + fun onBuyDataClicked() = navigateTo(getTransferDirection(HoverAction.BUY_DATA)) fun onBuyGoodsClicked() = navigateTo(HomeFragmentDirections.actionNavigationHomeToMerchantFragment()) fun onPayBillClicked() = navigateTo(HomeFragmentDirections.actionNavigationHomeToPaybillFragment()) fun onRequestMoneyClicked() = navigateTo(HomeFragmentDirections.actionNavigationHomeToNavigationRequest()) @@ -81,6 +82,7 @@ class HomeFragment : AbstractBalanceCheckerFragment(), FinancialTipClickInterfac return HomeClickFunctions( onSendMoneyClicked = { onSendMoneyClicked() }, onBuyAirtimeClicked = { onBuyAirtimeClicked() }, + onBuyDataClicked = { onBuyDataClicked() }, onBuyGoodsClicked = { onBuyGoodsClicked() }, onPayBillClicked = { onPayBillClicked() }, onRequestMoneyClicked = { onRequestMoneyClicked() }, @@ -153,7 +155,7 @@ class HomeFragment : AbstractBalanceCheckerFragment(), FinancialTipClickInterfac } override fun onTapBalanceRefresh(account: Account?) { - balancesViewModel.requestBalance(account) + balancesViewModel.requestAction(account, HoverAction.BALANCE) } override fun onTapBalanceDetail(accountId: Int) { diff --git a/app/src/main/java/com/hover/stax/presentation/home/HomeScreen.kt b/app/src/main/java/com/hover/stax/presentation/home/HomeScreen.kt index 911a37e06..a5844980f 100644 --- a/app/src/main/java/com/hover/stax/presentation/home/HomeScreen.kt +++ b/app/src/main/java/com/hover/stax/presentation/home/HomeScreen.kt @@ -49,6 +49,7 @@ import com.hover.stax.utils.AnalyticsUtil data class HomeClickFunctions( val onSendMoneyClicked: () -> Unit, val onBuyAirtimeClicked: () -> Unit, + val onBuyDataClicked: () -> Unit, val onBuyGoodsClicked: () -> Unit, val onPayBillClicked: () -> Unit, val onRequestMoneyClicked: () -> Unit, @@ -109,6 +110,7 @@ fun HomeScreen( PrimaryFeatures( onSendMoneyClicked = homeClickFunctions.onSendMoneyClicked, onBuyAirtimeClicked = homeClickFunctions.onBuyAirtimeClicked, + onBuyDataClicked = homeClickFunctions.onBuyDataClicked, onBuyGoodsClicked = homeClickFunctions.onBuyGoodsClicked, onPayBillClicked = homeClickFunctions.onPayBillClicked, onRequestMoneyClicked = homeClickFunctions.onRequestMoneyClicked, @@ -210,6 +212,7 @@ fun HomeScreenPreview() { PrimaryFeatures( onSendMoneyClicked = { }, onBuyAirtimeClicked = { }, + onBuyDataClicked = { }, onBuyGoodsClicked = { }, onPayBillClicked = { }, onRequestMoneyClicked = {}, diff --git a/app/src/main/java/com/hover/stax/presentation/home/components/PrimaryFeatures.kt b/app/src/main/java/com/hover/stax/presentation/home/components/PrimaryFeatures.kt index b86be24a8..5864a7339 100644 --- a/app/src/main/java/com/hover/stax/presentation/home/components/PrimaryFeatures.kt +++ b/app/src/main/java/com/hover/stax/presentation/home/components/PrimaryFeatures.kt @@ -28,6 +28,7 @@ import com.hover.stax.R fun PrimaryFeatures( onSendMoneyClicked: () -> Unit, onBuyAirtimeClicked: () -> Unit, + onBuyDataClicked: () -> Unit, onBuyGoodsClicked: () -> Unit, onPayBillClicked: () -> Unit, onRequestMoneyClicked: () -> Unit, @@ -49,6 +50,11 @@ fun PrimaryFeatures( drawable = R.drawable.ic_system_upate_24, stringRes = R.string.cta_airtime ) + VerticalImageTextView( + onItemClick = onBuyDataClicked, + drawable = R.drawable.ic_data, + stringRes = R.string.cta_buy_data + ) if (showKenyaFeatures) { VerticalImageTextView( onItemClick = onBuyGoodsClicked, diff --git a/app/src/main/java/com/hover/stax/presentation/sims/SimFragment.kt b/app/src/main/java/com/hover/stax/presentation/sims/SimFragment.kt index 151df597a..7cbb3055d 100644 --- a/app/src/main/java/com/hover/stax/presentation/sims/SimFragment.kt +++ b/app/src/main/java/com/hover/stax/presentation/sims/SimFragment.kt @@ -50,9 +50,12 @@ class SimFragment : AbstractBalanceCheckerFragment(), BalanceTapListener { setContent { SimScreen( - refreshBalance = { acct -> balancesViewModel.requestBalance(acct) }, + refreshBalance = { acct -> balancesViewModel.requestAction(acct, HoverAction.BALANCE) }, buyAirtime = { navigateTo(SimFragmentDirections.toTransferFragment(HoverAction.AIRTIME)) }, - navTo = { dest -> navigateTo(dest) } + navTo = { dest -> navigateTo(dest) }, + refreshDataBalance = { acct -> balancesViewModel.requestAction(acct, HoverAction.DATA_BALANCE) }, + buyData = { acct -> balancesViewModel.requestAction(acct, HoverAction.BUY_DATA) }, + borrow = { acct -> balancesViewModel.requestAction(acct, HoverAction.BORROW_AIRTIME) }, ) } } @@ -82,7 +85,7 @@ class SimFragment : AbstractBalanceCheckerFragment(), BalanceTapListener { (requireActivity() as MainActivity).checkPermissionsAndNavigate(navDirections) override fun onTapBalanceRefresh(account: Account?) { - balancesViewModel.requestBalance(account) + balancesViewModel.requestAction(account, HoverAction.BALANCE) } override fun onTapBalanceDetail(accountId: Int) {} diff --git a/app/src/main/java/com/hover/stax/presentation/sims/SimScreen.kt b/app/src/main/java/com/hover/stax/presentation/sims/SimScreen.kt index 8d5b44219..c6d1b1374 100644 --- a/app/src/main/java/com/hover/stax/presentation/sims/SimScreen.kt +++ b/app/src/main/java/com/hover/stax/presentation/sims/SimScreen.kt @@ -54,6 +54,9 @@ fun SimScreen( refreshBalance: (Account) -> Unit, buyAirtime: (Account) -> Unit, navTo: (dest: Int) -> Unit, + refreshDataBalance: (Account) -> Unit, + buyData: (Account) -> Unit, + borrow: (Account) -> Unit, simViewModel: SimViewModel = getViewModel() ) { val sims by simViewModel.sims.collectAsState() @@ -92,7 +95,7 @@ fun SimScreen( items(sims.sortedWith(comparator)) { sim -> // Don't show removed SIM cards that we don't support, it is confusing if (sim.account.channelId != -1 || sim.sim.slotIdx != -1) - SimItem(sim, refreshBalance, buyAirtime) + SimItem(sim, refreshBalance, buyAirtime, refreshDataBalance, buyData, borrow) } } } @@ -135,7 +138,7 @@ private fun SimScreenPreview( itemsIndexed(sims) { index, sim -> SimItem( simWithAccount = sim, - { }, { } + { }, { }, { }, { }, { } ) } } diff --git a/app/src/main/java/com/hover/stax/presentation/sims/components/SimItem.kt b/app/src/main/java/com/hover/stax/presentation/sims/components/SimItem.kt index 427bda7d1..0e209f3ab 100644 --- a/app/src/main/java/com/hover/stax/presentation/sims/components/SimItem.kt +++ b/app/src/main/java/com/hover/stax/presentation/sims/components/SimItem.kt @@ -16,12 +16,7 @@ package com.hover.stax.presentation.sims.components import android.content.Context -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.MaterialTheme import androidx.compose.material.Text @@ -55,7 +50,10 @@ import com.hover.stax.utils.Utils internal fun SimItem( simWithAccount: SimWithAccount, refreshBalance: (Account) -> Unit, - buyAirtime: (Account) -> Unit + buyAirtime: (Account) -> Unit, + dataBalance: (Account) -> Unit, + buyData: (Account) -> Unit, + borrow: (Account) -> Unit ) { StaxCard { val context = LocalContext.current @@ -92,17 +90,59 @@ internal fun SimItem( Spacer(modifier = Modifier.height(32.dp)) - if (simWithAccount.account.channelId == -1) { - SecondaryButton( - context.getString(R.string.email_support), null, - onClick = { emailStax(simWithAccount, context) } - ) - } else { - val bonus = getBonus(simWithAccount.airtimeActions) - SecondaryButton( - getAirtimeButtonLabel(bonus, context), getAirtimeButtonIcon(bonus), - onClick = { buyAirtime(simWithAccount.account) } - ) + Row( + modifier = Modifier.padding(bottom = dimensionResource(id = R.dimen.margin_13)), + verticalAlignment = Alignment.CenterVertically + + ) { + Column(modifier = Modifier.weight(1f)) { + + if (simWithAccount.account.channelId == -1) { + SecondaryButton( + context.getString(R.string.email_support), null, + onClick = { emailStax(simWithAccount, context) } + ) + } else { + val bonus = getBonus(simWithAccount.airtimeActions) + SecondaryButton( + getAirtimeButtonLabel(bonus, context), null, + onClick = { buyAirtime(simWithAccount.account) } + ) + } + } + + Column(modifier = Modifier.weight(1f), + horizontalAlignment = Alignment.End) { + SecondaryButton( + context.getString(R.string.cta_borrow), + null, + onClick = { borrow(simWithAccount.account) } + ) + } + } + + Row( + modifier = Modifier.padding(bottom = dimensionResource(id = R.dimen.margin_13)), + verticalAlignment = Alignment.CenterVertically + + ) { + + Column(modifier = Modifier.weight(1f)) { + SecondaryButton( + context.getString(R.string.cta_data_balance), + null, + onClick = { dataBalance(simWithAccount.account) } + ) + } + + Column(modifier = Modifier.weight(1f), + horizontalAlignment = Alignment.End) { + SecondaryButton( + context.getString(R.string.cta_buy_data), + null, + onClick = { buyData(simWithAccount.account) } + ) + } } } } diff --git a/app/src/main/java/com/hover/stax/transfers/AbstractFormFragment.kt b/app/src/main/java/com/hover/stax/transfers/AbstractFormFragment.kt index 904f8305d..71f994f04 100644 --- a/app/src/main/java/com/hover/stax/transfers/AbstractFormFragment.kt +++ b/app/src/main/java/com/hover/stax/transfers/AbstractFormFragment.kt @@ -133,9 +133,10 @@ abstract class AbstractFormFragment : Fragment() { } private fun fabClicked() { - if (accountsViewModel.activeAccount.value != null && !accountsViewModel.isValidAccount()) - askToCheckBalance(accountsViewModel.activeAccount.value!!) - else if (validates()) { +// if (accountsViewModel.activeAccount.value != null && !accountsViewModel.isValidAccount()) +// askToCheckBalance(accountsViewModel.activeAccount.value!!) +// else + if (validates()) { if (abstractFormViewModel.isEditing.value == true) { onFinishForm() } else { @@ -155,7 +156,7 @@ abstract class AbstractFormFragment : Fragment() { .setDialogTitle(R.string.finish_adding_title) .setDialogMessage(getString(R.string.finish_adding_desc, account.userAlias)) .setNegButton(R.string.btn_cancel, null) - .setPosButton(R.string.connect_cta) { balancesViewModel.requestBalance(account) } + .setPosButton(R.string.connect_cta) { balancesViewModel.requestAction(account, HoverAction.BALANCE) } dialog.showIt() } @@ -170,6 +171,7 @@ abstract class AbstractFormFragment : Fragment() { return when { isEditing -> getString(R.string.btn_continue) accountsViewModel.getActionType() == HoverAction.AIRTIME -> getString(R.string.fab_airtimenow) + accountsViewModel.getActionType() == HoverAction.BUY_DATA -> getString(R.string.fab_datanow) accountsViewModel.getActionType() == HoverAction.P2P || accountsViewModel.getActionType() == HoverAction.MERCHANT || accountsViewModel.getActionType() == HoverAction.BILL -> getString(R.string.fab_transfernow) diff --git a/app/src/main/java/com/hover/stax/transfers/TransferFragment.kt b/app/src/main/java/com/hover/stax/transfers/TransferFragment.kt index c786881a2..213838fa1 100644 --- a/app/src/main/java/com/hover/stax/transfers/TransferFragment.kt +++ b/app/src/main/java/com/hover/stax/transfers/TransferFragment.kt @@ -102,7 +102,11 @@ class TransferFragment : AbstractFormFragment(), ActionSelect.HighlightListener } private fun setTitle() { - val titleRes = if (accountsViewModel.getActionType() == HoverAction.AIRTIME) R.string.cta_airtime else R.string.cta_transfer + val titleRes = when(accountsViewModel.getActionType()) { + HoverAction.AIRTIME -> R.string.cta_airtime + HoverAction.BUY_DATA -> R.string.cta_buy_data + else -> R.string.cta_transfer + } binding.editCard.root.setTitle(getString(titleRes)) binding.summaryCard.root.setTitle(getString(titleRes)) } @@ -447,40 +451,41 @@ class TransferFragment : AbstractFormFragment(), ActionSelect.HighlightListener } private fun updateBonusBanner(selected: HoverAction?, actions: List?) { - if (args.transactionType == HoverAction.AIRTIME) { - - with(binding.bonusLayout) { - learnMore.movementMethod = LinkMovementMethod.getInstance() - - if (selected != null && selected.bonus_percent > 0) { - cardBonus.visibility = View.VISIBLE - title.text = getString(R.string.congratulations) - message.text = getString(R.string.you_are_getting_extra_airtime, selected.bonus_percent) - cta.visibility = View.GONE - } else if (actions?.any { a -> a.bonus_percent > 0 } != true) { - cardBonus.visibility = View.GONE - } else if (transferViewModel.isEditing.value == true) { - cardBonus.visibility = View.VISIBLE - val bonus = actions.first { a -> a.bonus_percent > 0 } - title.text = getString(R.string.get_extra_airtime) - message.text = bonus.bonus_message - cta.apply { - visibility = View.VISIBLE - text = getString(R.string.top_up_with, bonus.from_institution_name) - - setOnClickListener { - AnalyticsUtil.logAnalyticsEvent(getString(R.string.clicked_bonus_airtime_banner), requireActivity()) - accountsViewModel.payWith(bonus.from_institution_id) - } - } - } else { cardBonus.visibility = View.GONE } - } - } + binding.bonusLayout.cardBonus.visibility = View.GONE +// if (args.transactionType == HoverAction.AIRTIME) { +// +// with(binding.bonusLayout) { +// learnMore.movementMethod = LinkMovementMethod.getInstance() +// +// if (selected != null && selected.bonus_percent > 0) { +// cardBonus.visibility = View.VISIBLE +// title.text = getString(R.string.congratulations) +// message.text = getString(R.string.you_are_getting_extra_airtime, selected.bonus_percent) +// cta.visibility = View.GONE +// } else if (actions?.any { a -> a.bonus_percent > 0 } != true) { +// cardBonus.visibility = View.GONE +// } else if (transferViewModel.isEditing.value == true) { +// cardBonus.visibility = View.VISIBLE +// val bonus = actions.first { a -> a.bonus_percent > 0 } +// title.text = getString(R.string.get_extra_airtime) +// message.text = bonus.bonus_message +// cta.apply { +// visibility = View.VISIBLE +// text = getString(R.string.top_up_with, bonus.from_institution_name) +// +// setOnClickListener { +// AnalyticsUtil.logAnalyticsEvent(getString(R.string.clicked_bonus_airtime_banner), requireActivity()) +// accountsViewModel.payWith(bonus.from_institution_id) +// } +// } +// } else { cardBonus.visibility = View.GONE } +// } +// } } override fun showEdit(isEditing: Boolean) { super.showEdit(isEditing) - updateBonusBanner(actionSelectViewModel.activeAction.value, accountsViewModel.bonusActions.value) +// updateBonusBanner(actionSelectViewModel.activeAction.value, accountsViewModel.bonusActions.value) } override fun onDestroyView() { diff --git a/app/src/main/res/drawable/ic_data.xml b/app/src/main/res/drawable/ic_data.xml new file mode 100644 index 000000000..6b866be78 --- /dev/null +++ b/app/src/main/res/drawable/ic_data.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/values/logging_strings.xml b/app/src/main/res/values/logging_strings.xml index b48b2b8ad..cab0d2ba7 100644 --- a/app/src/main/res/values/logging_strings.xml +++ b/app/src/main/res/values/logging_strings.xml @@ -61,7 +61,10 @@ Visited load screen Complete load screen + Failed to start action %1$s, account was null + Starting %1$s Starting balance check + Starting data balance check Failed to start balance check, account was null Visited %1$s screen Onboarding diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7a367f6b4..ca8d9f03d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -145,6 +145,9 @@ Welcome to Send money Buy airtime + Buy data + Data balance + Borrow airtime Request money Pay a bill Pay\n a bill @@ -381,6 +384,7 @@ Send money now Buy airtime now + Buy data now You can review this info in the next step. %1$d contacts diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0915c40b1..afeff5952 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -82,7 +82,7 @@ glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" } glide-compiler = { module = "com.github.bumptech.glide:compiler", version.ref = "glide" } coil = "io.coil-kt:coil-compose:2.1.0" -hover = "com.hover:android-sdk:2.0.0-beta01" +hover = "com.hover:android-sdk:2.0.0-research" volley = "com.android.volley:volley:1.2.1" play-services = "com.google.android.gms:play-services-analytics:18.0.1" picasso = "com.squareup.picasso:picasso:2.71828"