NTP-47242 | Optimise Upi Spend Transactions data sync and added analytics events (#15602)

This commit is contained in:
Aparna Vadlamani
2025-04-02 17:00:46 +05:30
committed by GitHub
parent 2ead86735d
commit d35cb23552
7 changed files with 42 additions and 18 deletions

View File

@@ -968,6 +968,13 @@ interface GenericErrorBottomSheetEventTracker {
@AutoGenerate
interface UpiTransactionHistorySpendAnalyserEventTracker {
@EventName("mm_upi_spend_data_sync_completed") fun onDataSyncCompleted()
@EventName("mm_upi_spend_data_sync_failed") fun onDataSyncFailed()
@EventName("mm_upi_spend_data_loading_latency")
fun timeToLoadUpiSpendData(timeSpentToLoadApp: String)
@EventName("mm_UpiTransactionHistorySpendAnalyserWidget_visible")
fun onUpiTransactionHistorySpendAnalyserWidgetVisible(variant: String)

View File

@@ -16,13 +16,13 @@ import com.navi.moneymanager.common.network.di.MoneyManagerGsonSerializer
import com.navi.moneymanager.common.network.model.MMConfigResponse
import com.navi.moneymanager.common.utils.DbCacheConstants.MONEY_MANAGER_CONFIG_RESPONSE_KEY
import dagger.Lazy
import dagger.hilt.android.scopes.ActivityRetainedScoped
import javax.inject.Inject
import javax.inject.Singleton
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flow
@ActivityRetainedScoped
@Singleton
class MMConfigResponseHelper
@Inject
constructor(

View File

@@ -43,16 +43,13 @@ import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityRetainedComponent
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(ActivityRetainedComponent::class)
abstract class DataProviderModule {
@Binds
abstract fun bindRemoteDataProvider(
remoteDataProviderImpl: RemoteDataProviderImpl
): RemoteDataProvider
@Binds
abstract fun bindDashboardLocalDataProvider(
dashboardDataProviderImpl: DashboardDataProviderImpl
@@ -103,11 +100,6 @@ abstract class DataProviderModule {
localDataSyncManager: LocalDataSyncManagerImpl
): LocalDataSyncManager
@Binds
abstract fun bindUpiSpendLocalDataSyncManager(
upiSpendLocalDataSyncManager: UpiSpendLocalDataSyncManagerImpl
): UpiSpendLocalDataSyncManager
@Binds
abstract fun bindTxnHistoryUpiSpendDataProvider(
txnHistoryUpiSpendDataProvider: TxnHistoryUpiSpendDataProviderImpl
@@ -128,3 +120,19 @@ abstract class DataProviderModule {
upiSpendTransactionDetailsDataProvider: UpiSpendTransactionDetailsDataProviderImpl
): UpiSpendTransactionDataProvider
}
@Module
@InstallIn(SingletonComponent::class)
abstract class DataProviderSingletonModule {
@Singleton
@Binds
abstract fun bindRemoteDataProvider(
remoteDataProviderImpl: RemoteDataProviderImpl
): RemoteDataProvider
@Singleton
@Binds
abstract fun bindUpiSpendLocalDataSyncManager(
upiSpendLocalDataSyncManager: UpiSpendLocalDataSyncManagerImpl
): UpiSpendLocalDataSyncManager
}

View File

@@ -10,6 +10,7 @@ package com.navi.moneymanager.common.datasync
import com.navi.base.utils.orTrue
import com.navi.base.utils.orZero
import com.navi.common.network.models.isSuccessWithData
import com.navi.moneymanager.common.analytics.UpiTransactionHistorySpendAnalyserEventTrackerImpl
import com.navi.moneymanager.common.dataprovider.data.dashboard.helper.MMConfigResponseHelper
import com.navi.moneymanager.common.dataprovider.domain.RemoteDataProvider
import com.navi.moneymanager.common.dataprovider.domain.upi.UpiSpendLocalDataSyncManager
@@ -21,7 +22,9 @@ import com.navi.moneymanager.common.network.model.MMConfigResponse
import com.navi.moneymanager.common.network.model.UpiSpendTransactionData
import dagger.Lazy
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class UpiSpendDBSyncExecutor
@Inject
constructor(
@@ -42,8 +45,10 @@ constructor(
return if (syncTransactions(startTimestamp)) {
upiSpendLocalDataSyncManager.updateTotalSyncCompleteFlag()
UpiTransactionHistorySpendAnalyserEventTrackerImpl().onDataSyncCompleted()
DataSyncState.Completed
} else {
UpiTransactionHistorySpendAnalyserEventTrackerImpl().onDataSyncFailed()
DataSyncState.Failed
}
}
@@ -71,9 +76,13 @@ constructor(
}
private suspend fun syncTransactions(startTimestamp: Long): Boolean {
val startTime = System.currentTimeMillis()
val transactions = fetchUpiTransactions(startTimestamp)
return if (transactions.isNotEmpty()) {
upiSpendLocalDataSyncManager.insertUpiTransactions(transactions)
val latency = System.currentTimeMillis() - startTime
UpiTransactionHistorySpendAnalyserEventTrackerImpl()
.timeToLoadUpiSpendData(latency.toString())
true
} else {
false

View File

@@ -283,7 +283,7 @@ fun DashboardScreen(
.collect()
}
LaunchedEffect(selectedMonth) { viewModel.updateSpendAnalysisSection(selectedMonth) }
LaunchedEffect(Unit) { viewModel.updateSpendAnalysisSection(selectedMonth) }
BackHandler { viewModel.setEffect { DashboardScreenUiEffect.Navigation.Back } }

View File

@@ -285,8 +285,8 @@ constructor(
fun updateSpendAnalysisSection(selectedMonth: SelectedMonth) {
updateSpendAnalysisSectionParams(
selectedMonth.month ?: state.value.screenData.spendCategorizationState?.selectedMonth,
selectedMonth.year ?: state.value.screenData.spendCategorizationState?.selectedYear,
state.value.screenData.spendCategorizationState?.selectedMonth ?: selectedMonth.month,
state.value.screenData.spendCategorizationState?.selectedYear ?: selectedMonth.year,
)
}

View File

@@ -476,11 +476,11 @@ constructor(
private fun initUpiSpendAnalyser() {
syncUpiSpendAnalyserData()
fetchUpiSpenAnalyserWidgetVariant()
fetchUpiSpendAnalyserWidgetVariant()
}
private fun syncUpiSpendAnalyserData() {
viewModelScope.launch(Dispatchers.IO) {
GlobalScope.launch(Dispatchers.IO) {
if (upiSpendAnalysisWidgetHelper.isTotalSyncCompleted()) {
upiSpendAnalysisFirstSyncCompleted.update { true }
}
@@ -492,7 +492,7 @@ constructor(
}
}
private fun fetchUpiSpenAnalyserWidgetVariant() {
private fun fetchUpiSpendAnalyserWidgetVariant() {
viewModelScope.launch(Dispatchers.IO) {
upiSpendAnalysisWidgetHelper.getEntryPointExpVariant().collect { variant ->
if (