diff --git a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/analytics/MMAnalytics.kt b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/analytics/MMAnalytics.kt index 95fdab1577..349544fda7 100644 --- a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/analytics/MMAnalytics.kt +++ b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/analytics/MMAnalytics.kt @@ -80,6 +80,14 @@ interface DataSyncEventTracker { @EventName("mm_dev_sync_transactions_failed") fun transactionSyncFailed(type: String) @EventName("mm_dev_sync_spend_goals_failed") fun spendGoalsSyncFailed(type: String) + + @EventName("mm_transaction_contact_metrics") + fun transactionContactMetrics( + totalTxnCount: Int, + txnCountWithPhoneNumber: Int, + txnCountWithContactsOverriddenName: Int, + syncType: String, + ) } @AutoGenerate diff --git a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/dataprovider/data/dashboard/helper/UserContactsConsentHelper.kt b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/dataprovider/data/dashboard/helper/UserContactsConsentHelper.kt index a7e8053337..67f5d89b9a 100644 --- a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/dataprovider/data/dashboard/helper/UserContactsConsentHelper.kt +++ b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/dataprovider/data/dashboard/helper/UserContactsConsentHelper.kt @@ -11,7 +11,9 @@ import android.Manifest import android.content.Context import android.content.pm.PackageManager import androidx.core.content.ContextCompat +import com.navi.moneymanager.common.analytics.DataSyncEventTrackerImpl import com.navi.moneymanager.common.dataprovider.data.datastore.DataStoreInfoProvider +import com.navi.moneymanager.common.model.database.TransactionContactMetrics import com.navi.moneymanager.common.network.di.RoomDataStoreInfoProvider import com.navi.moneymanager.common.utils.Constants.CONTACTS_USAGE_CONSENT_GIVEN import dagger.hilt.android.qualifiers.ApplicationContext @@ -19,6 +21,7 @@ import javax.inject.Inject import javax.inject.Singleton import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map @Singleton @@ -54,4 +57,20 @@ constructor( fun isContactSyncDeniedByUser(): Boolean { return isContactSyncDeniedByUser } + + suspend fun trackTransactionContactMetrics( + dataSyncEventTracker: DataSyncEventTrackerImpl, + contactMetrics: TransactionContactMetrics, + syncType: String, + ) { + if (canAccessContacts().first()) { + dataSyncEventTracker.transactionContactMetrics( + totalTxnCount = contactMetrics.totalTxnCount, + txnCountWithPhoneNumber = contactMetrics.txnCountWithPhoneNumber, + txnCountWithContactsOverriddenName = + contactMetrics.txnCountWithContactsOverriddenName, + syncType = syncType, + ) + } + } } diff --git a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/dataprovider/data/remote/LocalDataSyncManagerImpl.kt b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/dataprovider/data/remote/LocalDataSyncManagerImpl.kt index 59ba66cd4d..969875b687 100644 --- a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/dataprovider/data/remote/LocalDataSyncManagerImpl.kt +++ b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/dataprovider/data/remote/LocalDataSyncManagerImpl.kt @@ -18,6 +18,7 @@ import com.navi.moneymanager.common.db.database.MMDatabase import com.navi.moneymanager.common.helper.AccountsDataHelper import com.navi.moneymanager.common.helper.SpendGoalsDataHelper import com.navi.moneymanager.common.helper.TransactionsDataHelper +import com.navi.moneymanager.common.model.database.TransactionContactMetrics import com.navi.moneymanager.common.network.di.RoomDataStoreInfoProvider import com.navi.moneymanager.common.network.model.AccountData import com.navi.moneymanager.common.network.model.SpendGoalData @@ -149,4 +150,12 @@ constructor( flow = database.get().transactionsDao().getLatestTransactionTimestamp(), ) } + + override suspend fun getTransactionContactMetrics(): TransactionContactMetrics { + return executeQueryFirst( + queryName = database.get().transactionsDao()::getTransactionContactMetrics.name, + methodName = ::getTransactionContactMetrics.name, + flow = database.get().transactionsDao().getTransactionContactMetrics(), + ) + } } diff --git a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/dataprovider/domain/LocalDataSyncManager.kt b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/dataprovider/domain/LocalDataSyncManager.kt index 92522bfd4d..0661f4c28b 100644 --- a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/dataprovider/domain/LocalDataSyncManager.kt +++ b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/dataprovider/domain/LocalDataSyncManager.kt @@ -7,6 +7,7 @@ package com.navi.moneymanager.common.dataprovider.domain +import com.navi.moneymanager.common.model.database.TransactionContactMetrics import com.navi.moneymanager.common.network.model.AccountData import com.navi.moneymanager.common.network.model.SpendGoalData import com.navi.moneymanager.common.network.model.TransactionData @@ -38,4 +39,6 @@ interface LocalDataSyncManager { suspend fun updateNewTransactionCount(newTransaction: Int) suspend fun getLatestTransactionTimestamp(): Long + + suspend fun getTransactionContactMetrics(): TransactionContactMetrics } diff --git a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/datasync/helper/AllMonthsDataSyncHelper.kt b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/datasync/helper/AllMonthsDataSyncHelper.kt index c0376865a2..3a3517f3d5 100644 --- a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/datasync/helper/AllMonthsDataSyncHelper.kt +++ b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/datasync/helper/AllMonthsDataSyncHelper.kt @@ -9,6 +9,7 @@ package com.navi.moneymanager.common.datasync.helper import com.navi.base.utils.orZero import com.navi.moneymanager.common.dataprovider.data.dashboard.helper.MMConfigResponseHelper +import com.navi.moneymanager.common.dataprovider.data.dashboard.helper.MMContactsConsentHelper import com.navi.moneymanager.common.dataprovider.domain.LocalDataSyncManager import com.navi.moneymanager.common.dataprovider.domain.RemoteDataProvider import com.navi.moneymanager.common.datasync.model.DataSyncState @@ -27,6 +28,7 @@ constructor( remoteDataProvider: RemoteDataProvider, localDataSyncManager: LocalDataSyncManager, mmConfigResponseHelper: MMConfigResponseHelper, + private val contactsConsentHelper: MMContactsConsentHelper, ) : BaseDataSyncHelper(remoteDataProvider, localDataSyncManager, mmConfigResponseHelper) { override suspend fun execute( @@ -72,6 +74,7 @@ constructor( localDataSyncManager.updateCurrentMonthSyncFlag() localDataSyncManager.updateTotalSyncCompleteFlag() dataSyncEventTracker.syncSuccess(syncType) + trackTransactionContactMetrics(syncType) return DataSyncState.Completed } @@ -97,6 +100,7 @@ constructor( localDataSyncManager.updateNewTransactionCount(newTransactionCount) } dataSyncEventTracker.syncSuccess(syncType) + trackTransactionContactMetrics(syncType) return DataSyncState.Completed } @@ -157,4 +161,13 @@ constructor( } return DataSyncState.Completed } + + private suspend fun trackTransactionContactMetrics(syncType: String) { + val contactMetrics = localDataSyncManager.getTransactionContactMetrics() + contactsConsentHelper.trackTransactionContactMetrics( + dataSyncEventTracker = dataSyncEventTracker, + contactMetrics = contactMetrics, + syncType = syncType, + ) + } } diff --git a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/db/dao/TransactionsDao.kt b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/db/dao/TransactionsDao.kt index c51f0b2a32..9ba21e6f54 100644 --- a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/db/dao/TransactionsDao.kt +++ b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/db/dao/TransactionsDao.kt @@ -14,6 +14,7 @@ import androidx.room.Upsert import com.navi.moneymanager.common.db.entity.TransactionEntity import com.navi.moneymanager.common.model.CategorySummary import com.navi.moneymanager.common.model.MonthAmountAggregate +import com.navi.moneymanager.common.model.database.TransactionContactMetrics import com.navi.moneymanager.common.model.database.TransactionDetails import com.navi.moneymanager.common.model.database.TransactionSummaryData import com.navi.moneymanager.common.utils.Constants.TRANSACTION_TABLE @@ -257,4 +258,12 @@ interface TransactionsDao { @Query("SELECT MAX(txnTimestamp) FROM $TRANSACTION_TABLE") fun getLatestTransactionTimestamp(): Flow + + @Query( + "SELECT " + + "(SELECT COUNT(txnId) FROM $TRANSACTION_TABLE) AS totalTxnCount, " + + "(SELECT COUNT(txnId) FROM $TRANSACTION_TABLE WHERE counterPartyPhoneNumber IS NOT NULL) AS txnCountWithPhoneNumber, " + + "(SELECT COUNT(txnId) FROM $TRANSACTION_TABLE WHERE contactsOverriddenName IS NOT NULL) AS txnCountWithContactsOverriddenName" + ) + fun getTransactionContactMetrics(): Flow } diff --git a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/model/database/TransactionContactMetrics.kt b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/model/database/TransactionContactMetrics.kt new file mode 100644 index 0000000000..93ea037c9b --- /dev/null +++ b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/model/database/TransactionContactMetrics.kt @@ -0,0 +1,14 @@ +/* + * + * * Copyright © 2025 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.moneymanager.common.model.database + +data class TransactionContactMetrics( + val totalTxnCount: Int, + val txnCountWithPhoneNumber: Int, + val txnCountWithContactsOverriddenName: Int, +)