NTP-50641 | Updated formatting to use Locale.US and added firebase remote config for upi spend analyser (#15649)

This commit is contained in:
Aparna Vadlamani
2025-04-05 11:37:29 +05:30
committed by GitHub
parent 1d57cb2d88
commit 2c2fc82739
9 changed files with 45 additions and 45 deletions

View File

@@ -276,7 +276,7 @@ fun <T> convertObjectToJson(type: T): JSONObject? {
return null
}
fun Double.formatToDecimalPlaces(digits: Int) = "%.${digits}f".format(this)
fun Double.formatToDecimalPlaces(digits: Int) = "%.${digits}f".format(Locale.US, this)
fun Double.formatToInrWithDecimals(digits: Int = 2): String {
val numberFormat = NumberFormat.getCurrencyInstance(Locale("en", "IN"))

View File

@@ -142,6 +142,7 @@ object FirebaseRemoteConfigHelper {
const val NAVI_PAY_SET_AS_WALLPAPER_ENABLED = "NAVI_PAY_SET_AS_WALLPAPER_ENABLED"
const val UPI_SPEND_CROSS_VARIANT_TIMEOUT_MILLIS = "UPI_SPEND_CROSS_VARIANT_TIMEOUT_MILLIS"
const val NAVI_PAY_AUTO_ZOOM_DELAY_IN_SECONDS = "NAVI_PAY_AUTO_ZOOM_DELAY_IN_SECONDS"
const val UPI_SPEND_ANALYSER_ENABLED = "UPI_SPEND_ANALYSER_ENABLED"
// COMMON
const val LITMUS_EXPERIMENTS_CACHE_DURATION_IN_MILLIS =

View File

@@ -685,4 +685,8 @@
<key>UPI_SPEND_CROSS_VARIANT_TIMEOUT_MILLIS</key>
<value>1296000000</value>
</entry>
<entry>
<key>UPI_SPEND_ANALYSER_ENABLED</key>
<value>true</value>
</entry>
</defaultsMap>

View File

@@ -20,6 +20,7 @@ import com.navi.moneymanager.common.utils.Constants
import com.navi.moneymanager.common.utils.Constants.UNCATEGORIZED
import com.navi.moneymanager.common.utils.MonthConstants
import dagger.hilt.android.qualifiers.ApplicationContext
import java.util.Locale
import javax.inject.Inject
class TransactionsDataHelper @Inject constructor(@ApplicationContext private val context: Context) {
@@ -37,7 +38,8 @@ class TransactionsDataHelper @Inject constructor(@ApplicationContext private val
linkedAccRef = it.linkedAccRef,
txnReference = it.txnReference,
txnTimestamp = it.txnTimestamp,
txnAmount = String.format("%.2f", it.txnAmount).toDouble(),
txnAmount =
String.format(locale = Locale.US, format = "%.2f", it.txnAmount).toDouble(),
valueDate = it.valueDate,
narration = it.narration,
mode = it.mode,

View File

@@ -10,6 +10,7 @@ package com.navi.moneymanager.common.helper
import com.navi.base.utils.BaseUtils.getDayMonthAndYearFromTimestamp
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.UPI_SPEND_CROSS_VARIANT_TIMEOUT_MILLIS
import com.navi.common.network.models.VariantInfo
import com.navi.common.usecase.LitmusExperimentsUseCase
import com.navi.moneymanager.common.dataprovider.data.datastore.DataStoreInfoProvider
import com.navi.moneymanager.common.dataprovider.domain.upi.TxnHistoryUpiSpendDataProvider
@@ -19,11 +20,10 @@ import com.navi.moneymanager.common.model.upi.UpiTxnHistorySpendAnalysisData
import com.navi.moneymanager.common.network.di.RoomDataStoreInfoProvider
import com.navi.moneymanager.common.utils.Constants.CONTROL
import com.navi.moneymanager.common.utils.Constants.LITMUS_EXPERIMENT_TXN_HISTORY_SPEND_ANALYSIS
import com.navi.moneymanager.common.utils.Constants.SPEND_ANALYSIS_EXP_CROSS_VARIANT
import com.navi.moneymanager.common.utils.Constants.UPI_SPEND_CROSS_VARIANT_DISMISS_TIMESTAMP
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flow
import org.joda.time.DateTime
class UpiSpendAnalysisWidgetHelper
@@ -45,22 +45,26 @@ constructor(
)
}
fun getEntryPointExpVariant(): Flow<String> = flow {
suspend fun getEntryPointExpVariant(): String {
val expResponse =
litmusExperimentsUseCase.execute(
experimentName = LITMUS_EXPERIMENT_TXN_HISTORY_SPEND_ANALYSIS
)
val currentVariant =
if (expResponse?.variant?.enabled == true) {
expResponse.variant.name
} else {
CONTROL
}
emit(currentVariant)
return getVariantName(expResponse?.variant)
}
suspend fun shouldShowCrossVariant(): Boolean {
private suspend fun getVariantName(variant: VariantInfo?): String {
return when {
variant?.name == SPEND_ANALYSIS_EXP_CROSS_VARIANT && !shouldShowCrossVariant() -> {
CONTROL
}
else -> {
variant?.name ?: CONTROL
}
}
}
private suspend fun shouldShowCrossVariant(): Boolean {
val lastDismissTime =
dbDataStoreProvider.getLongData(UPI_SPEND_CROSS_VARIANT_DISMISS_TIMESTAMP, 0L).first()

View File

@@ -17,6 +17,7 @@ import com.navi.moneymanager.common.network.model.MMConfigResponse
import com.navi.moneymanager.common.network.model.UpiSpendTransactionData
import com.navi.moneymanager.common.utils.Constants.UNCATEGORIZED
import dagger.hilt.android.qualifiers.ApplicationContext
import java.util.Locale
import javax.inject.Inject
class UpiSpendTransactionsDataHelper
@@ -35,7 +36,8 @@ constructor(@ApplicationContext private val context: Context) {
upiTxnId = it.upiTxnId.orEmpty(),
naviUpiTxnId = it.naviUpiTxnId.orEmpty(),
txnTimestamp = it.txnTimestamp,
txnAmount = String.format("%.2f", it.txnAmount).toDouble(),
txnAmount =
String.format(locale = Locale.US, format = "%.2f", it.txnAmount).toDouble(),
valueDate = it.valueDate,
mode = it.mode,
type = it.type,

View File

@@ -14,10 +14,8 @@ import java.util.Locale
class DateUtils(
private val calendarInstance: Calendar = Calendar.getInstance(),
private val dayMonthFormatter: SimpleDateFormat =
SimpleDateFormat("dd MMM", Locale.getDefault()),
private val dayMonthWeekFormatter: SimpleDateFormat =
SimpleDateFormat("EEE, dd MMM", Locale.getDefault()),
private val dayMonthFormatter: SimpleDateFormat = SimpleDateFormat("dd MMM", Locale.US),
private val dayMonthWeekFormatter: SimpleDateFormat = SimpleDateFormat("EEE, dd MMM", Locale.US),
) {
fun normalizeDate(date: Date): Date =
calendarInstance.run {

View File

@@ -62,6 +62,7 @@ import com.navi.pay.utils.RUPEE_SYMBOL
import com.navi.pay.utils.clickableDebounce
import com.navi.pay.utils.noRippleClickableWithDebounce
import com.navi.rr.utils.ext.clickable
import java.util.Locale
@Composable
fun OrderHistoryBottomSheetContent(
@@ -252,6 +253,7 @@ private fun UpiSpendAnalyzerInfoBottomSheetContent(
NaviText(
text =
String.format(
Locale.US,
stringResource(R.string.upi_spend_analyzer_bottomsheet_info_description),
convertMonthStringToPair(upiSpendAnalyzerInfoBottomsheetData?.date.orEmpty())
.first,

View File

@@ -23,13 +23,14 @@ import com.google.gson.reflect.TypeToken
import com.navi.base.utils.DateUtils
import com.navi.base.utils.EMPTY
import com.navi.base.utils.ResourceProvider
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.UPI_SPEND_ANALYSER_ENABLED
import com.navi.common.usecase.LitmusExperimentsUseCase
import com.navi.common.utils.CommonUtils.getDisplayableAmount
import com.navi.moneymanager.common.datasync.UpiSpendDBSyncExecutor
import com.navi.moneymanager.common.datasync.model.DataSyncState
import com.navi.moneymanager.common.helper.UpiSpendAnalysisWidgetHelper
import com.navi.moneymanager.common.utils.Constants.CONTROL
import com.navi.moneymanager.common.utils.Constants.SPEND_ANALYSIS_EXP_CROSS_VARIANT
import com.navi.pay.R
import com.navi.pay.analytics.NaviPayAnalytics
import com.navi.pay.analytics.NaviPayAnalytics.Companion.NAVI_PAY_T_STORE_ORDER_LIST
@@ -481,33 +482,19 @@ constructor(
}
private fun initUpiSpendAnalyser() {
syncUpiSpendAnalyserData()
fetchUpiSpendAnalyserWidgetVariant()
}
private fun syncUpiSpendAnalyserData() {
GlobalScope.launch(Dispatchers.IO) {
if (upiSpendAnalysisWidgetHelper.isTotalSyncCompleted()) {
upiSpendAnalysisFirstSyncCompleted.update { true }
}
if (FirebaseRemoteConfigHelper.getBoolean(UPI_SPEND_ANALYSER_ENABLED)) {
val litmusExpVariant = upiSpendAnalysisWidgetHelper.getEntryPointExpVariant()
_upiSpendAnalysisWidgetVariant.update { litmusExpVariant }
if (litmusExpVariant != CONTROL) {
if (upiSpendAnalysisWidgetHelper.isTotalSyncCompleted()) {
upiSpendAnalysisFirstSyncCompleted.update { true }
}
val state = upiDBSyncExecutor.execute(screenName)
if (state is DataSyncState.Completed) {
isUpiSpendAnalysisSyncCompleted.update { true }
}
}
}
private fun fetchUpiSpendAnalyserWidgetVariant() {
viewModelScope.launch(Dispatchers.IO) {
upiSpendAnalysisWidgetHelper.getEntryPointExpVariant().collect { variant ->
if (
variant == SPEND_ANALYSIS_EXP_CROSS_VARIANT &&
!upiSpendAnalysisWidgetHelper.shouldShowCrossVariant()
) {
_upiSpendAnalysisWidgetVariant.update { CONTROL }
} else {
_upiSpendAnalysisWidgetVariant.update { variant }
val dataSyncState = upiDBSyncExecutor.execute(screenName)
if (dataSyncState is DataSyncState.Completed) {
isUpiSpendAnalysisSyncCompleted.update { true }
}
}
}
}