TP-33493 | added clickstream events for PL Data Upload funnel (#6960)

* TP-33493 | added clickstream events for PL Data Upload funnel

* TP-33493 | clickstream changes

* TP-33493 | import fix

* TP-33493 | import fixes

* TP-33493 | spotlessApply

* TP-33493 | moved common code to same inner class
This commit is contained in:
Shubhanjay Varma
2023-06-21 18:01:45 +05:30
committed by GitHub Enterprise
parent 3a8c66382d
commit 2712dee81d
4 changed files with 171 additions and 4 deletions

View File

@@ -5481,6 +5481,58 @@ class NaviAnalytics private constructor() {
}
}
inner class ZippingProcess {
fun onZippingSuccess(type: String) {
NaviTrackEvent.trackEventOnClickStream(
"on_zipping_success",
mapOf(
Pair("atTimeStamp", System.currentTimeMillis().toString()),
Pair("type", type)
)
)
}
fun onZippingFailure(type: String) {
NaviTrackEvent.trackEventOnClickStream(
"on_zipping_failure",
mapOf(
Pair("atTimeStamp", System.currentTimeMillis().toString()),
Pair("type", type)
)
)
}
fun onZippingUploadInitiated(type: String) {
NaviTrackEvent.trackEventOnClickStream(
"on_zipping_upload_initiated",
mapOf(
Pair("atTimeStamp", System.currentTimeMillis().toString()),
Pair("type", type)
)
)
}
fun onZippingUploadSuccess(type: String) {
NaviTrackEvent.trackEventOnClickStream(
"on_zipping_upload_success",
mapOf(
Pair("atTimeStamp", System.currentTimeMillis().toString()),
Pair("type", type)
)
)
}
fun onZippingUploadFailure(type: String) {
NaviTrackEvent.trackEventOnClickStream(
"on_zipping_upload_failure",
mapOf(
Pair("atTimeStamp", System.currentTimeMillis().toString()),
Pair("type", type)
)
)
}
}
inner class UserData {
fun onUserDataSent() {
@@ -5501,6 +5553,20 @@ class NaviAnalytics private constructor() {
)
}
fun deviceDetailsSuccess() {
NaviTrackEvent.trackEventOnClickStream(
"post_device_details_success",
mapOf(Pair("atTimeStamp", System.currentTimeMillis().toString()))
)
}
fun deviceDetailsFailure() {
NaviTrackEvent.trackEventOnClickStream(
"post_device_details_failure",
mapOf(Pair("atTimeStamp", System.currentTimeMillis().toString()))
)
}
fun postPermissionStartTime() {
NaviTrackEvent.trackEventOnClickStream(
"post_permission_start_time",
@@ -5522,6 +5588,26 @@ class NaviAnalytics private constructor() {
)
}
fun postGettingPreSignedUrlInitiated(retryCount: Int = 0) {
NaviTrackEvent.trackEventOnClickStream(
"PL_GET_PRE_SIGNED_URL_CALL_INITIATED",
mapOf(
Pair("atTimeStamp", System.currentTimeMillis().toString()),
Pair("retryCount", retryCount.toString())
)
)
}
fun postGettingPreSignedUrlSuccess(retryCount: Int) {
NaviTrackEvent.trackEventOnClickStream(
"PL_GET_PRE_SIGNED_URL_CALL_SUCCESS",
mapOf(
Pair("atTimeStamp", System.currentTimeMillis().toString()),
Pair("retryCount", retryCount.toString())
)
)
}
fun postErrorInGettingPreSignedUrl(error: Any?) {
NaviTrackEvent.trackEventOnClickStream(
"PL_ERROR_IN_GETTING_PRESIGNED_URL",
@@ -5561,6 +5647,48 @@ class NaviAnalytics private constructor() {
)
}
fun numberOfUrlsReceivedAndNumberOfDataUploaded(urlsReceived: Int, uploadTypeCount: Int) {
NaviTrackEvent.trackEventOnClickStream(
"PL_PRE_SIGNED_URLS_RECEIVED",
mapOf(
Pair("url_received_count", urlsReceived.toString()),
Pair("upload_type_count", uploadTypeCount.toString())
)
)
}
fun onDataUploadAcknowledgementInitiated(ingestionList: String) {
NaviTrackEvent.trackEventOnClickStream(
"on_data_upload_acknowledgement_initiated",
mapOf(
Pair("atTimeStamp", System.currentTimeMillis().toString()),
Pair("ingestion_list", ingestionList)
)
)
}
fun onDataUploadAcknowledgementSuccess(ingestionList: String) {
NaviTrackEvent.trackEventOnClickStream(
"on_data_upload_acknowledgement_success",
mapOf(
Pair("atTimeStamp", System.currentTimeMillis().toString()),
Pair("ingestion_list", ingestionList)
)
)
}
fun onDataUploadAcknowledgementFailure(ingestionList: String) {
NaviTrackEvent.trackEventOnClickStream(
"on_data_upload_acknowledgement_failure",
mapOf(
Pair("atTimeStamp", System.currentTimeMillis().toString()),
Pair("ingestion_list", ingestionList)
)
)
}
fun onUserDataUploadToCdsStatus(
isSmsUploadFailed: Boolean,
isContactsUploadFailed: Boolean,

View File

@@ -1,6 +1,6 @@
/*
*
* * Copyright © 2019-2022 by Navi Technologies Limited
* * Copyright © 2019-2023 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
@@ -171,11 +171,13 @@ class UserDataViewModel(application: Application) : AndroidViewModel(application
val response = repository.updateFcmToken(deviceDetail)
analyticsTracker.deviceDetailsEndTime()
if (response.error == null && response.errors.isNullOrEmpty()) {
analyticsTracker.deviceDetailsSuccess()
PreferenceManager.setLongPreference(
FCM_TOKEN_LAST_UPDATED_TIME,
System.currentTimeMillis()
)
} else {
analyticsTracker.deviceDetailsFailure()
PreferenceManager.setLongPreference(FCM_TOKEN_LAST_UPDATED_TIME, 0L)
}
}

View File

@@ -1,6 +1,6 @@
/*
*
* * Copyright © 2019 by Navi Technologies Private Limited
* * Copyright © 2019-2023 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
@@ -18,6 +18,7 @@ import com.navi.common.model.UserDataWrapper
import com.navi.common.useruploaddata.model.IngestionStatus
import com.navi.common.useruploaddata.model.IngestionStatusType
import com.navi.common.useruploaddata.model.IngestionType
import com.navi.common.utils.Constants.CONTACTS
import com.navi.common.utils.Constants.UNDERSCORE
import com.navi.common.utils.log
import com.navi.common.utils.gzipCompress
@@ -37,6 +38,7 @@ import retrofit2.Response
object ContactsUtil {
private val analyticsTrackerContactUpload: NaviAnalytics.ContactUpload =
NaviAnalytics.naviAnalytics.ContactUpload()
private val zippingAnalyticsTracker: NaviAnalytics.ZippingProcess = NaviAnalytics.naviAnalytics.ZippingProcess()
suspend fun readContacts(applicationContext: Context) {
try {
@@ -93,8 +95,8 @@ object ContactsUtil {
pageNumber: Int
) {
analyticsTrackerContactUpload.contactUploadStartTime(pageNumber)
analyticsTrackerContactUpload.onContactUploadStart(totalPages, pageNumber, contacts.size)
val request = UserDataWrapper(totalPages, pageNumber, contacts)
analyticsTrackerContactUpload.onContactUploadStart(totalPages, pageNumber, contacts.size)
val response = UserDataRepository().postContacts(request)
analyticsTrackerContactUpload.contactUploadEndTime(pageNumber)
response.error?.let {
@@ -132,10 +134,12 @@ object ContactsUtil {
}
}
val contactData = ContactData(contactList)
zippingAnalyticsTracker.onZippingSuccess(CONTACTS)
postZippedContacts(contactData, url, referenceId, pageNumber = pageNumber)
} catch (e: Exception) {
e.log()
zippingAnalyticsTracker.onZippingFailure(CONTACTS)
IngestionStatus(
referenceId = referenceId,
ingestionType = IngestionType.CONTACTS,
@@ -152,6 +156,7 @@ object ContactsUtil {
): IngestionStatus {
analyticsTrackerContactUpload.contactUploadStartTime(pageNumber)
val gson = Gson().toJson(contactData)
zippingAnalyticsTracker.onZippingUploadInitiated(CONTACTS)
val response = postZippedData(gson, url)
analyticsTrackerContactUpload.contactUploadEndTime(pageNumber)
val ingestionStatus = IngestionStatus(
@@ -160,9 +165,11 @@ object ContactsUtil {
)
if (response.isSuccessful) {
analyticsTrackerContactUpload.onContactUploadSuccess()
zippingAnalyticsTracker.onZippingUploadSuccess(CONTACTS)
ingestionStatus.status = IngestionStatusType.SUCCESS
} else {
analyticsTrackerContactUpload.onContactUploadFailureEvent()
zippingAnalyticsTracker.onZippingUploadFailure(CONTACTS)
ingestionStatus.status = IngestionStatusType.FAILED
}
return ingestionStatus
@@ -212,4 +219,4 @@ object ContactsUtil {
}
return null
}
}
}

View File

@@ -16,6 +16,7 @@ import android.util.Base64
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.navi.base.utils.isNotNull
import com.navi.base.utils.orZero
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper
import com.navi.common.model.UploadDataAsyncResponse
import com.navi.common.model.UserDataWrapper
@@ -25,8 +26,10 @@ import com.navi.common.useruploaddata.model.*
import com.navi.common.useruploaddata.utils.UploadDataPollingUtil
import com.navi.common.useruploaddata.utils.getSmsDataProjection
import com.navi.common.useruploaddata.utils.getUserSmsFromCursorData
import com.navi.common.utils.Constants.SMS
import com.navi.common.utils.Constants.UNDERSCORE
import com.navi.common.utils.gzipCompress
import com.navi.common.utils.isValidResponse
import com.navi.common.utils.log
import com.navi.insurance.util.FirebaseRemoteConfigUtils
import com.naviapp.BuildConfig
@@ -51,6 +54,7 @@ object SmsUtil {
private val analyticsTrackerSmsUpload: NaviAnalytics.SmsUpload =
NaviAnalytics.naviAnalytics.SmsUpload()
private val analyticsTracker: NaviAnalytics.UserData = NaviAnalytics.naviAnalytics.UserData()
private val zippingAnalyticsTracker: NaviAnalytics.ZippingProcess = NaviAnalytics.naviAnalytics.ZippingProcess()
private const val MAX_RETRY_PRE_SIGNED_API = 4
private const val TIME_TO_UPLOAD_WHEN_FAILED = 0L
private const val TIME_TO_UPLOAD_WHEN_EXCEPTION = -1L
@@ -265,6 +269,7 @@ object SmsUtil {
callback: (timeTakenToUpload: Long, ingestionStatusBody: IngestionStatusBody) -> Unit
) {
val startTimeInMillis = System.currentTimeMillis()
analyticsTracker.postGettingPreSignedUrlInitiated()
var response = UserDataRepository().getPreSignedUrlList(ingestionType)
var retryCountForPreSignedUrl = 1
while ((response.error.isNotNull() || !response.errors.isNullOrEmpty()) && retryCountForPreSignedUrl <= MAX_RETRY_PRE_SIGNED_API) {
@@ -279,8 +284,12 @@ object SmsUtil {
return
}
retryCountForPreSignedUrl++
analyticsTracker.postGettingPreSignedUrlInitiated(retryCountForPreSignedUrl-1)
response = UserDataRepository().getPreSignedUrlList(ingestionType)
}
if(response.isValidResponse()) {
analyticsTracker.postGettingPreSignedUrlSuccess(retryCountForPreSignedUrl)
}
var ingestionList: List<IngestionStatus?>? = null
@@ -289,12 +298,16 @@ object SmsUtil {
ingestionList = (taskLists.awaitAll().filterNotNull())
var uploadedResponseData: UploadDataAsyncResponse? = null
if (ingestionList.isNotEmpty()) {
analyticsTracker.onDataUploadAcknowledgementInitiated(ingestionList.toString())
val uploadedResponse =
UserDataRepository().postIngestionStatusAsync(IngestionStatusBody(ingestionList))
if (uploadedResponse.error.isNotNull() || uploadedResponse.errors.isNotNull()) {
analyticsTracker.onErrorUploadingSms(
error = uploadedResponse.error ?: uploadedResponse.errors
)
analyticsTracker.onDataUploadAcknowledgementFailure(ingestionList.toString())
} else {
analyticsTracker.onDataUploadAcknowledgementSuccess(ingestionList.toString())
}
uploadedResponseData = uploadedResponse.data
}
@@ -328,10 +341,16 @@ object SmsUtil {
analyticsTracker.onExceptionWhileUploadingData()
ingestionList?.filterNotNull()?.let {
if (it.isNotEmpty()) {
analyticsTracker.onDataUploadAcknowledgementInitiated(ingestionList.toString())
val uploadedResponse =
UserDataRepository().postIngestionStatusAsync(
IngestionStatusBody(it)
)
if(uploadedResponse.error.isNotNull() || uploadedResponse.errors.isNotNull()) {
analyticsTracker.onDataUploadAcknowledgementFailure(ingestionList.toString())
} else {
analyticsTracker.onDataUploadAcknowledgementSuccess(ingestionList.toString())
}
val userDataUploadCallbackResponse = UserDataUploadCallbackResponse(
IngestionStatusBody(it),
uploadedResponse.data
@@ -382,6 +401,7 @@ object SmsUtil {
}
}
}
analyticsTracker.numberOfUrlsReceivedAndNumberOfDataUploaded(preSignedUrlResponse?.preSignedUrlList?.size.orZero(), taskLists.size)
return taskLists
}
@@ -438,9 +458,11 @@ object SmsUtil {
analyticsTracker.onFoundEmptySmsList()
}
}
zippingAnalyticsTracker.onZippingSuccess(SMS)
postZippedMessages(smsList, url, referenceId)
} catch (e: Exception) {
e.log()
zippingAnalyticsTracker.onZippingFailure(SMS)
IngestionStatus(
referenceId = referenceId,
ingestionType = IngestionType.SMS,
@@ -475,9 +497,11 @@ object SmsUtil {
)
)
}
zippingAnalyticsTracker.onZippingSuccess(IngestionType.APPS.name)
postZippedApps(installedApps.toMutableList(), url, referenceId)
} catch (e: Exception) {
e.log()
zippingAnalyticsTracker.onZippingFailure(IngestionType.APPS.name)
IngestionStatus(
referenceId = referenceId,
ingestionType = IngestionType.APPS,
@@ -492,6 +516,7 @@ object SmsUtil {
referenceId: String
): IngestionStatus {
val gson = Gson().toJson(UserSmsData(smsList.sortedBy { it.timeStamp }))
zippingAnalyticsTracker.onZippingUploadInitiated(SMS)
val response = postZippedData(gson, url)
val ingestionStatus = IngestionStatus(
@@ -502,8 +527,10 @@ object SmsUtil {
)
if (response.isSuccessful) {
zippingAnalyticsTracker.onZippingUploadSuccess(SMS)
ingestionStatus.status = IngestionStatusType.SUCCESS
} else {
zippingAnalyticsTracker.onZippingUploadFailure(SMS)
ingestionStatus.status = IngestionStatusType.FAILED
}
@@ -517,6 +544,7 @@ object SmsUtil {
referenceId: String
): IngestionStatus {
val gson = Gson().toJson(UserAppData(appList))
zippingAnalyticsTracker.onZippingUploadInitiated(IngestionType.APPS.name)
val response = postZippedData(gson, url)
val ingestionStatus = IngestionStatus(
@@ -525,8 +553,10 @@ object SmsUtil {
)
if (response.isSuccessful) {
zippingAnalyticsTracker.onZippingUploadSuccess(IngestionType.APPS.name)
ingestionStatus.status = IngestionStatusType.SUCCESS
} else {
zippingAnalyticsTracker.onZippingUploadFailure(IngestionType.APPS.name)
ingestionStatus.status = IngestionStatusType.FAILED
}