NTP-68061 | lite default pre-filled amounts experiment removal (#16396)

This commit is contained in:
Shaurya Rehan
2025-06-02 19:07:05 +05:30
committed by GitHub
parent 9da8f8c009
commit eb8462e999
5 changed files with 28 additions and 115 deletions

View File

@@ -1,80 +0,0 @@
/*
*
* * Copyright © 2024-2025 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
package com.navi.pay.common.usecase
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.navi.common.usecase.LitmusExperimentsUseCase
import com.navi.pay.management.lite.models.NaviPayUpiLiteConfig
import com.navi.pay.management.lite.models.view.UpiLiteDefaultEnteredAmountExperimentData
import com.navi.pay.network.di.NaviPayGsonBuilder
import com.navi.pay.utils.LITMUS_EXPERIMENT_NAVIPAY_LITE_DEFAULT_ENTERED_AMOUNT
import com.navi.pay.utils.UPI_LITE_CONFIG
import javax.inject.Inject
import org.json.JSONObject
class UpiLiteExperimentationUseCase
@Inject
constructor(
private val litmusExperimentsUseCase: LitmusExperimentsUseCase,
private val naviPayConfigUseCase: NaviPayConfigUseCase,
@NaviPayGsonBuilder private val gson: Gson,
) {
suspend fun getUpiLiteDefaultEnteredAmountExperimentData(
screenName: String
): UpiLiteDefaultEnteredAmountExperimentData {
val upiLiteConfig =
naviPayConfigUseCase.execute<NaviPayUpiLiteConfig>(
configKey = UPI_LITE_CONFIG,
type = object : TypeToken<NaviPayUpiLiteConfig>() {}.type,
screenName = screenName,
) ?: NaviPayUpiLiteConfig()
val defaultPreFilledAmount = upiLiteConfig.config.defaultPreFilledAmount
val liteExperimentInfoJson =
litmusExperimentsUseCase.execute(
experimentName = LITMUS_EXPERIMENT_NAVIPAY_LITE_DEFAULT_ENTERED_AMOUNT
)
if (liteExperimentInfoJson == null) {
return UpiLiteDefaultEnteredAmountExperimentData(
initialTopUpAmount = defaultPreFilledAmount,
subsequentTopUpAmount = defaultPreFilledAmount,
)
}
val experimentData = liteExperimentInfoJson.variant
val experimentPayloadJson =
(experimentData?.payload?.get("value") as? String)?.let { JSONObject(it) }
if (experimentPayloadJson == null) {
return UpiLiteDefaultEnteredAmountExperimentData(
initialTopUpAmount = defaultPreFilledAmount,
subsequentTopUpAmount = defaultPreFilledAmount,
)
}
val type = object : TypeToken<Map<String, Int>>() {}.type
val initialTopUpAmount =
gson
.fromJson<Map<String, Int>>(experimentPayloadJson.toString(), type)
.getOrElse(key = "initialTopUpAmount", defaultValue = { defaultPreFilledAmount })
val subsequentTopUpAmount =
gson
.fromJson<Map<String, Int>>(experimentPayloadJson.toString(), type)
.getOrElse(key = "subsequentTopUpAmount", defaultValue = { defaultPreFilledAmount })
return UpiLiteDefaultEnteredAmountExperimentData(
initialTopUpAmount = initialTopUpAmount,
subsequentTopUpAmount = subsequentTopUpAmount,
)
}
}

View File

@@ -19,7 +19,8 @@ data class NaviPayUpiLiteConfig(
data class NaviPayUpiLiteConfigContent(
@SerializedName("mandateThresholdAmount") val mandateThresholdAmount: Int = 100,
@SerializedName("defaultPreFilledAmount") val defaultPreFilledAmount: Int = 1000,
@SerializedName("defaultInitialTopUpAmount") val defaultInitialTopUpAmount: Int = 10,
@SerializedName("defaultSubsequentTopUpAmount") val defaultSubsequentTopUpAmount: Int = 1000,
@SerializedName("maxTopUpLimit") val maxTopUpLimit: Int = 5000,
@SerializedName("amountChips") val amountChips: List<String> = listOf("100", "200", "500"),
@SerializedName("maxPayableAmount") val maxPayableAmount: Int = 500,

View File

@@ -7,7 +7,7 @@
package com.navi.pay.management.lite.models.view
data class UpiLiteDefaultEnteredAmountExperimentData(
data class UpiLiteDefaultEnteredAmountData(
val initialTopUpAmount: Int,
val subsequentTopUpAmount: Int,
)

View File

@@ -59,7 +59,6 @@ import com.navi.pay.common.usecase.LocationUseCase
import com.navi.pay.common.usecase.NaviPayConfigUseCase
import com.navi.pay.common.usecase.UpiLiteBalanceUseCase
import com.navi.pay.common.usecase.UpiLiteBannerRotationUseCase
import com.navi.pay.common.usecase.UpiLiteExperimentationUseCase
import com.navi.pay.common.usecase.UpiRequestIdUseCase
import com.navi.pay.common.utils.DeviceInfoProvider
import com.navi.pay.common.utils.NaviPayCommonUtils
@@ -99,7 +98,7 @@ import com.navi.pay.management.lite.models.view.UPILiteAccountStatus
import com.navi.pay.management.lite.models.view.UPILiteEntity
import com.navi.pay.management.lite.models.view.UpiLiteBannerDisplayType
import com.navi.pay.management.lite.models.view.UpiLiteBottomSheetStateHolder
import com.navi.pay.management.lite.models.view.UpiLiteDefaultEnteredAmountExperimentData
import com.navi.pay.management.lite.models.view.UpiLiteDefaultEnteredAmountData
import com.navi.pay.management.lite.repository.UPILiteRepository
import com.navi.pay.management.lite.util.AddBalanceButtonSource
import com.navi.pay.management.lite.util.DisableUpiLiteStatus
@@ -151,6 +150,7 @@ import com.navi.pay.utils.ACTION_PIN_SET
import com.navi.pay.utils.CUSTOMER_DEBITED_VIA_PAY
import com.navi.pay.utils.DATE_TIME_FORMAT_YEAR_MONTH_DATE_WITH_SLASH_SEPARATOR
import com.navi.pay.utils.DEFAULT_MANDATE_AMOUNT_RULE
import com.navi.pay.utils.DEFAULT_TOP_UP_AMOUNT
import com.navi.pay.utils.DEFAULT_UPI_CURRENCY
import com.navi.pay.utils.DEFAULT_UPI_MODE
import com.navi.pay.utils.KEY_UPI_LITE_ACTIVE_ACCOUNT_INFO
@@ -229,7 +229,6 @@ constructor(
private val orderRepository: OrderRepository,
private val naviCacheRepository: NaviCacheRepository,
private val mandateRepository: MandateRepository,
private val upiLiteExperimentationUseCase: UpiLiteExperimentationUseCase,
val accountListCheckBalanceUseCase: AccountListCheckBalanceUseCase,
private val upiLiteBannerRotationUseCase: UpiLiteBannerRotationUseCase,
private val naviPayPspManager: NaviPayPspManager,
@@ -287,8 +286,7 @@ constructor(
private val _isUserOnboarded = MutableStateFlow(false)
val isUserOnboarded = _isUserOnboarded.asStateFlow()
private val _enteredAmount =
MutableStateFlow(naviPayUpiLiteConfig.value.config.defaultPreFilledAmount.toString())
private val _enteredAmount = MutableStateFlow(DEFAULT_TOP_UP_AMOUNT)
val enteredAmount = _enteredAmount.asStateFlow()
private val _enableButtonLottie = MutableStateFlow(false)
@@ -424,11 +422,12 @@ constructor(
private val _upiLiteMandateInfo = MutableStateFlow<MandateItem?>(null)
val upiLiteMandateInfo = _upiLiteMandateInfo.asStateFlow()
private val upiLiteDefaultEnteredAmountExperimentInfo =
private val upiLiteDefaultEnteredAmountInfo =
MutableStateFlow(
UpiLiteDefaultEnteredAmountExperimentData(
initialTopUpAmount = naviPayUpiLiteConfig.value.config.defaultPreFilledAmount,
subsequentTopUpAmount = naviPayUpiLiteConfig.value.config.defaultPreFilledAmount,
UpiLiteDefaultEnteredAmountData(
initialTopUpAmount = naviPayUpiLiteConfig.value.config.defaultInitialTopUpAmount,
subsequentTopUpAmount =
naviPayUpiLiteConfig.value.config.defaultSubsequentTopUpAmount,
)
)
@@ -972,7 +971,6 @@ constructor(
init {
updateScreenSourceFromIntent()
fetchNaviPayUpiLiteConfig()
setLitmusExperimentValues()
setUpUpiLiteBannerDisplayType()
getLiteMandateInfo()
updateNaviPaySessionAttributes()
@@ -1159,24 +1157,6 @@ constructor(
}
}
private fun setLitmusExperimentValues() {
viewModelScope.launch(coroutineDispatcherProvider.io) {
upiLiteDefaultEnteredAmountExperimentInfo.update {
upiLiteExperimentationUseCase.getUpiLiteDefaultEnteredAmountExperimentData(
screenName = screenName
)
}
naviPayAnalytics.onDevGenericEvent(
event = ::setLitmusExperimentValues.name,
params =
mapOf(
"upiLiteDefaultEnteredAmountExperimentInfo" to
upiLiteDefaultEnteredAmountExperimentInfo.value.toString()
),
)
}
}
private fun setUpUpiLiteBannerDisplayType() {
viewModelScope.launch(coroutineDispatcherProvider.io) {
_upiLiteBannerDisplayType.update { upiLiteBannerRotationUseCase.execute() }
@@ -1339,6 +1319,15 @@ constructor(
_upiLiteTnCUrl.update { tncUrl }
}
private fun updateDefaultTopUpAmount(initialTopUpAmount: Int, subsequentTopUpAmount: Int) {
upiLiteDefaultEnteredAmountInfo.update {
it.copy(
initialTopUpAmount = initialTopUpAmount,
subsequentTopUpAmount = subsequentTopUpAmount,
)
}
}
private fun fetchNaviPayUpiLiteConfig() {
viewModelScope.launch(coroutineDispatcherProvider.io) {
_naviPayUpiLiteConfig.update {
@@ -1352,6 +1341,11 @@ constructor(
updateMaxTopUpLimit(maxTopUpLimit = naviPayUpiLiteConfig.value.config.maxTopUpLimit)
updateAmountChips(chips = naviPayUpiLiteConfig.value.config.amountChips)
updateTnCUrl(tncUrl = naviPayUpiLiteConfig.value.config.upiLiteTnCUrl)
updateDefaultTopUpAmount(
initialTopUpAmount = naviPayUpiLiteConfig.value.config.defaultInitialTopUpAmount,
subsequentTopUpAmount =
naviPayUpiLiteConfig.value.config.defaultSubsequentTopUpAmount,
)
naviPayAnalytics.onDevGenericEvent(
event = ::fetchNaviPayUpiLiteConfig.name,
@@ -3711,9 +3705,9 @@ constructor(
private fun getDefaultTopUpAmountFromExperiment() =
if (isUserOnboarded.value) {
upiLiteDefaultEnteredAmountExperimentInfo.value.subsequentTopUpAmount
upiLiteDefaultEnteredAmountInfo.value.subsequentTopUpAmount
} else {
upiLiteDefaultEnteredAmountExperimentInfo.value.initialTopUpAmount
upiLiteDefaultEnteredAmountInfo.value.initialTopUpAmount
}
private suspend fun processInitialTopUpPendingState(

View File

@@ -33,6 +33,7 @@ const val BUTLER_VPA_TRANSACTIONS_INFO_MAX_SIZE = 10
const val BAU = "BAU"
const val ORDER_HISTORY_LOCAL_SYNC_BATCH_LIMIT = 500
const val UPI_LITE_SCREEN_SOURCE_KEY = "UPILiteScreenSource"
const val DEFAULT_TOP_UP_AMOUNT = "10"
const val MAX_VISIBLE_TRANSACTION_ITEMS_IN_SCREEN_HEIGHT = 5
const val NAVI_UPI = "Navi UPI"
@@ -182,8 +183,6 @@ const val NAVI_PAY_SYNC_TABLE_ORDER_ERROR_MAPPING_KEY = "orderErrorMappingKey"
const val NAVI_PAY_SYNC_TABLE_CUSTOMER_ONBOARDING_DATA_KEY = "customerOnboardingDataKey"
// Litmus experiments
const val LITMUS_EXPERIMENT_NAVIPAY_LITE_DEFAULT_ENTERED_AMOUNT =
"NaviPay-lite-default-entered-amount"
const val LITMUS_EXPERIMENT_NAVIPAY_TRANSACTION_LEDGER = "NaviPay-exp-txn-ledger"
const val LITMUS_EXPERIMENT_NAVIPAY_SMV_BINDING = "NaviPay-exp-smv-binding"
const val LITMUS_EXPERIMENT_NAVI_FESTIVE_THEME = "festive-theme"
@@ -197,7 +196,6 @@ const val LITMUS_EXPERIMENT_NAVIPAY_RCC_LANDING_EXP = "NaviPay-rcc-landing-exper
val NAVI_PAY_LITMUS_EXPERIMENTS =
listOf(
LITMUS_EXPERIMENT_NAVIPAY_TRANSACTION_LEDGER,
LITMUS_EXPERIMENT_NAVIPAY_LITE_DEFAULT_ENTERED_AMOUNT,
LITMUS_EXPERIMENT_NAVIPAY_SMV_BINDING,
LITMUS_EXPERIMENT_NAVI_FESTIVE_THEME,
LITMUS_EXPERIMENT_NAVIPAY_OFFER_EXPERIENCE,