From eb8462e999f76189f3a8ad1b2fc5066e97097537 Mon Sep 17 00:00:00 2001 From: Shaurya Rehan Date: Mon, 2 Jun 2025 19:07:05 +0530 Subject: [PATCH] NTP-68061 | lite default pre-filled amounts experiment removal (#16396) --- .../usecase/UpiLiteExperimentationUseCase.kt | 80 ------------------- .../lite/models/NaviPayUpiLiteConfig.kt | 3 +- ....kt => UpiLiteDefaultEnteredAmountData.kt} | 2 +- .../lite/viewmodel/UpiLiteViewModel.kt | 54 ++++++------- .../com/navi/pay/utils/NaviPayConstants.kt | 4 +- 5 files changed, 28 insertions(+), 115 deletions(-) delete mode 100644 android/navi-pay/src/main/kotlin/com/navi/pay/common/usecase/UpiLiteExperimentationUseCase.kt rename android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/models/view/{UpiLiteExperimentationData.kt => UpiLiteDefaultEnteredAmountData.kt} (81%) diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/common/usecase/UpiLiteExperimentationUseCase.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/common/usecase/UpiLiteExperimentationUseCase.kt deleted file mode 100644 index 27ba6124fa..0000000000 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/common/usecase/UpiLiteExperimentationUseCase.kt +++ /dev/null @@ -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( - configKey = UPI_LITE_CONFIG, - type = object : TypeToken() {}.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>() {}.type - val initialTopUpAmount = - gson - .fromJson>(experimentPayloadJson.toString(), type) - .getOrElse(key = "initialTopUpAmount", defaultValue = { defaultPreFilledAmount }) - val subsequentTopUpAmount = - gson - .fromJson>(experimentPayloadJson.toString(), type) - .getOrElse(key = "subsequentTopUpAmount", defaultValue = { defaultPreFilledAmount }) - - return UpiLiteDefaultEnteredAmountExperimentData( - initialTopUpAmount = initialTopUpAmount, - subsequentTopUpAmount = subsequentTopUpAmount, - ) - } -} diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/models/NaviPayUpiLiteConfig.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/models/NaviPayUpiLiteConfig.kt index 8f5544eac4..dc1d60e644 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/models/NaviPayUpiLiteConfig.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/models/NaviPayUpiLiteConfig.kt @@ -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 = listOf("100", "200", "500"), @SerializedName("maxPayableAmount") val maxPayableAmount: Int = 500, diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/models/view/UpiLiteExperimentationData.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/models/view/UpiLiteDefaultEnteredAmountData.kt similarity index 81% rename from android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/models/view/UpiLiteExperimentationData.kt rename to android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/models/view/UpiLiteDefaultEnteredAmountData.kt index b6af3485c9..72078c1b44 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/models/view/UpiLiteExperimentationData.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/models/view/UpiLiteDefaultEnteredAmountData.kt @@ -7,7 +7,7 @@ package com.navi.pay.management.lite.models.view -data class UpiLiteDefaultEnteredAmountExperimentData( +data class UpiLiteDefaultEnteredAmountData( val initialTopUpAmount: Int, val subsequentTopUpAmount: Int, ) diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/viewmodel/UpiLiteViewModel.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/viewmodel/UpiLiteViewModel.kt index 0b87ed84b4..1b72776d96 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/viewmodel/UpiLiteViewModel.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/viewmodel/UpiLiteViewModel.kt @@ -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(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( diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/utils/NaviPayConstants.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/utils/NaviPayConstants.kt index 005f402f13..917c65c33b 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/utils/NaviPayConstants.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/utils/NaviPayConstants.kt @@ -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,