NTP-70675 add clickstream events for phone number metrics (#16820)

This commit is contained in:
Hitesh Kumar
2025-07-02 18:50:23 +05:30
committed by GitHub
parent e24cbd2ffe
commit a45eed83d1
7 changed files with 75 additions and 0 deletions

View File

@@ -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

View File

@@ -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,
)
}
}
}

View File

@@ -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(),
)
}
}

View File

@@ -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
}

View File

@@ -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,
)
}
}

View File

@@ -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<Long>
@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<TransactionContactMetrics>
}

View File

@@ -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,
)