diff --git a/navi-ap/src/main/kotlin/com/navi/ap/common/handler/ApiActionHandler.kt b/navi-ap/src/main/kotlin/com/navi/ap/common/handler/ApiActionHandler.kt index 3d6ef165c9..7262bd57a2 100644 --- a/navi-ap/src/main/kotlin/com/navi/ap/common/handler/ApiActionHandler.kt +++ b/navi-ap/src/main/kotlin/com/navi/ap/common/handler/ApiActionHandler.kt @@ -35,7 +35,6 @@ import com.navi.common.uitron.model.action.GetScreenDefinitionApiAction import com.navi.common.uitron.model.action.LambdaApiAction import com.navi.common.uitron.model.action.PartialFillCallAction import com.navi.common.uitron.model.action.SourceType -import com.navi.common.uitron.util.ApActionType import com.navi.common.utils.Constants import com.navi.common.utils.getDeviceData import getInputId @@ -166,6 +165,9 @@ fun getFillApplicationRequestBody( SourceType.CURRENT_TIMESTAMP.name -> { Field(item.name.orEmpty(), Timestamp(System.currentTimeMillis()).toString()) } + SourceType.ZERO_TIMESTAMP.name -> { + Field(item.name.orEmpty(), Timestamp(0).toString()) + } SourceType.SDK_OUTPUT.name -> { val output: String? = viewModel.handle[item.sourceProperty.orEmpty()] output?.let { Field(item.name.orEmpty(), output) } diff --git a/navi-ap/src/main/kotlin/com/navi/ap/common/handler/UploadDataActionHandler.kt b/navi-ap/src/main/kotlin/com/navi/ap/common/handler/UploadDataActionHandler.kt index c50bce866f..59e206bdcf 100644 --- a/navi-ap/src/main/kotlin/com/navi/ap/common/handler/UploadDataActionHandler.kt +++ b/navi-ap/src/main/kotlin/com/navi/ap/common/handler/UploadDataActionHandler.kt @@ -22,13 +22,13 @@ import com.navi.common.uitron.model.action.UploadDeviceDataType import com.navi.common.uitron.model.action.UploadLocationDataConfig import com.navi.common.useruploaddata.model.IngestionStatusType import com.navi.common.useruploaddata.viewmodel.UserDataViewModel +import com.navi.common.utils.CommonNaviAnalytics import com.navi.common.utils.getDeviceDetails import com.navi.common.utils.getScreenRefreshRate import com.navi.uitron.viewmodel.UiTronViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.launch -import orTrue import timber.log.Timber @Composable @@ -38,6 +38,7 @@ fun HandleUploadDataAction( userDataViewModel: UserDataViewModel = hiltViewModel(), activity: ApplicationPlatformActivity ) { + val analyticsTracker = remember { CommonNaviAnalytics.naviAnalytics.HandleUploadDataAction() } val action = remember { mutableStateOf(UploadDataAction()) } val needToUploadDataToS3 = remember { mutableStateOf(true) } val uploadedDataToS3 = remember { mutableStateOf(false) } @@ -53,119 +54,119 @@ fun HandleUploadDataAction( viewModel.getActionCallback().collect { uiTronAction -> if (uiTronAction is UploadDataAction) { action.value = uiTronAction - if (uiTronAction.shouldUpload.orTrue()) { - (uiTronAction.data)?.let { data -> - val uploadSmsToS3: Boolean = - data.any { it?.uploadType == UploadDeviceDataType.UploadSmsToS3.name } + (uiTronAction.data)?.let { data -> + val uploadSmsToS3: Boolean = + data.any { it?.uploadType == UploadDeviceDataType.UploadSmsToS3.name } - val uploadContactsToS3: Boolean = - data.any { - it?.uploadType == UploadDeviceDataType.UploadContactsToS3.name - } - - val uploadAppsDataToS3: Boolean = - data.any { - it?.uploadType == UploadDeviceDataType.UploadAppsDataToS3.name - } - - val uploadSmsToFinoramic: Boolean = - data.any { - it?.uploadType == UploadDeviceDataType.UploadSmsToFinoramic.name - } - - val uploadDeviceData: Boolean = - data.any { - it?.uploadType == UploadDeviceDataType.UploadDeviceData.name - } - - val uploadSmsContactsBatchData: Boolean = - data.any { - it?.uploadType == - UploadDeviceDataType.UploadSmsContactsBatchData.name - } - - val businessVertical: String? = data.firstOrNull()?.businessVertical - val screenName: String = data.firstOrNull()?.screenName.orEmpty() - val numberOfRetriesLeft: Int = - data.firstOrNull()?.numberOfRetries.orZero() - - needToUploadDataToS3.value = - uploadSmsToS3 || uploadContactsToS3 || uploadAppsDataToS3 - needToUploadDeviceDataToS3.value = uploadDeviceData - needToUploadBatchesDataToS3.value = uploadSmsContactsBatchData - - if (uploadSmsContactsBatchData) { - viewModel.viewModelScope.launch(Dispatchers.IO) { - val smsTask = async { - activity.utilsHandler.commonSmsUtil.readSms( - CommonLibManager.application - ) - } - val contactsTask = async { - CommonContactsUtil.readContacts(CommonLibManager.application) - } - smsTask.await() - contactsTask.await() - Timber.d( - "SmsTask, ContactsTask and Device Details Task Done (in batches)" - ) - uploadedBatchesData.value = true - } + val uploadContactsToS3: Boolean = + data.any { + it?.uploadType == UploadDeviceDataType.UploadContactsToS3.name } - if (uploadSmsToS3 || uploadContactsToS3 || uploadAppsDataToS3) { - userDataViewModel.sendUserDataToAwsWithRetries( - uploadSmsToS3, - uploadContactsToS3, - uploadAppsDataToS3, - businessVertical.orEmpty(), - numberOfRetriesLeft - ) { _, userDataUploadCallbackResponse -> - if ( + val uploadAppsDataToS3: Boolean = + data.any { + it?.uploadType == UploadDeviceDataType.UploadAppsDataToS3.name + } + + val uploadSmsToFinoramic: Boolean = + data.any { + it?.uploadType == UploadDeviceDataType.UploadSmsToFinoramic.name + } + + val uploadDeviceData: Boolean = + data.any { + it?.uploadType == UploadDeviceDataType.UploadDeviceData.name + } + + val uploadSmsContactsBatchData: Boolean = + data.any { + it?.uploadType == + UploadDeviceDataType.UploadSmsContactsBatchData.name + } + + val businessVertical: String? = data.firstOrNull()?.businessVertical + val screenName: String = data.firstOrNull()?.screenName.orEmpty() + val numberOfRetriesLeft: Int = data.firstOrNull()?.numberOfRetries.orZero() + + needToUploadDataToS3.value = + uploadSmsToS3 || uploadContactsToS3 || uploadAppsDataToS3 + needToUploadDeviceDataToS3.value = uploadDeviceData + needToUploadBatchesDataToS3.value = uploadSmsContactsBatchData + + if (uploadSmsContactsBatchData) { + viewModel.viewModelScope.launch(Dispatchers.IO) { + val smsTask = async { + activity.utilsHandler.commonSmsUtil.readSms( + CommonLibManager.application + ) + } + val contactsTask = async { + CommonContactsUtil.readContacts(CommonLibManager.application) + } + smsTask.await() + contactsTask.await() + Timber.d( + "SmsTask, ContactsTask and Device Details Task Done (in batches)" + ) + uploadedBatchesData.value = true + } + } + + if (uploadSmsToS3 || uploadContactsToS3 || uploadAppsDataToS3) { + userDataViewModel.sendUserDataToAwsWithRetries( + uploadSmsToS3, + uploadContactsToS3, + uploadAppsDataToS3, + businessVertical.orEmpty(), + numberOfRetriesLeft + ) { _, userDataUploadCallbackResponse -> + if ( + userDataUploadCallbackResponse.ingestionStatusList + ?.ingestionStatusList + ?.any { it.status == IngestionStatusType.FAILED } + .orFalse() + ) { + analyticsTracker.onUploadToS3Failed( userDataUploadCallbackResponse.ingestionStatusList ?.ingestionStatusList - ?.any { it.status == IngestionStatusType.FAILED } - .orFalse() - ) { - viewModel.handleActions(uiTronAction.onFailure) - } else { - uploadedDataToS3.value = true - } - } - } - - if (uploadSmsToFinoramic) { - activity.sdkHandler.finoramicHandler - .getFinoramicHelper(activity = activity) - ?.sendSms(context) - } - - if (uploadDeviceData) { - val deviceDetails = - getDeviceDetails( - getScreenRefreshRate( - context, - (context as? BaseActivity)?.windowManager - ) + .toString() ) - userDataViewModel.sendDeviceDetails(deviceDetails) { - uploadedDeviceData.value = true + viewModel.handleActions(uiTronAction.onFailure) + } else { + uploadedDataToS3.value = true } } + } - (data.firstOrNull { + if (uploadSmsToFinoramic) { + activity.sdkHandler.finoramicHandler + .getFinoramicHelper(activity = activity) + ?.sendSms(context) + } + + if (uploadDeviceData) { + val deviceDetails = + getDeviceDetails( + getScreenRefreshRate( + context, + (context as? BaseActivity)?.windowManager + ) + ) + userDataViewModel.sendDeviceDetails(deviceDetails) { + uploadedDeviceData.value = true + } + } + + (data.firstOrNull { it?.uploadType == UploadDeviceDataType.UploadLocationData.name } as? UploadLocationDataConfig) - ?.let { - (context as? BaseActivity)?.updateLocation( - it.eventName, - businessVertical, - screenName - ) - } - } - } else { - viewModel.handleActions(uiTronAction.onFailure) + ?.let { + (context as? BaseActivity)?.updateLocation( + it.eventName, + businessVertical, + screenName + ) + } } } } @@ -174,8 +175,8 @@ fun HandleUploadDataAction( if ( (uploadedDataToS3.value || !needToUploadDataToS3.value) && - (uploadedDeviceData.value || !needToUploadDeviceDataToS3.value) && - (uploadedBatchesData.value || !needToUploadBatchesDataToS3.value) + (uploadedDeviceData.value || !needToUploadDeviceDataToS3.value) && + (uploadedBatchesData.value || !needToUploadBatchesDataToS3.value) ) { needToUploadDataToS3.value = true uploadedDataToS3.value = false @@ -186,6 +187,7 @@ fun HandleUploadDataAction( needToUploadBatchesDataToS3.value = true uploadedBatchesData.value = false + analyticsTracker.onDataUploadSuccess() viewModel.handleActions(action.value.onSuccess) } } diff --git a/navi-ap/src/main/kotlin/com/navi/ap/common/renderer/CollapsableItemsWithTitleWidget.kt b/navi-ap/src/main/kotlin/com/navi/ap/common/renderer/CollapsableItemsWithTitleWidget.kt index 18b3c351cb..6fe0b6b782 100644 --- a/navi-ap/src/main/kotlin/com/navi/ap/common/renderer/CollapsableItemsWithTitleWidget.kt +++ b/navi-ap/src/main/kotlin/com/navi/ap/common/renderer/CollapsableItemsWithTitleWidget.kt @@ -42,14 +42,14 @@ class CollapsableItemsWithTitleWidget { fun Render(viewModel: ApplicationPlatformVM, widget: WidgetModelDefinition) { val titleDescriptionListWidgetData = widget.widgetData?.data?.get("widget_data_${widget.widgetId}") - as? CollapsableItemsWithTitleWidgetData + as? CollapsableItemsWithTitleWidgetData Column( - modifier = Modifier - .background( - titleDescriptionListWidgetData?.backgroundColor?.hexToComposeColor - ?: Color.White - ) - .padding(20.dp, 24.dp) + modifier = + Modifier.background( + titleDescriptionListWidgetData?.backgroundColor?.hexToComposeColor + ?: Color.White + ) + .padding(20.dp, 24.dp) ) { widget.widgetData?.parentComposeView?.let { UiTronRenderer(widget.widgetData.data, viewModel).Render(composeViews = it) @@ -59,48 +59,52 @@ class CollapsableItemsWithTitleWidget { val rotation = remember { mutableStateOf(0f) } Column(modifier = Modifier.padding(top = 24.dp)) { Row( - modifier = Modifier.fillMaxWidth(), + modifier = + Modifier.fillMaxWidth().clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() } + ) { + expand.value = expand.value.not() + rotation.value = rotation.value + 180 + }, horizontalArrangement = Arrangement.SpaceBetween ) { - TextRenderer().Render( - property = titleDescriptionListWidgetData.itemTitleProperty - ?: TextProperty(), - uiTronData = titleDescriptionListWidgetData.itemTitleData?.apply { - text = it.title - } ?: TextData(text = it.title), - uiTronViewModel = viewModel, - modifier = null - ) + TextRenderer() + .Render( + property = titleDescriptionListWidgetData.itemTitleProperty + ?: TextProperty(), + uiTronData = + titleDescriptionListWidgetData.itemTitleData?.apply { + text = it.title + } + ?: TextData(text = it.title), + uiTronViewModel = viewModel, + modifier = null + ) AsyncImage( contentDescription = "", model = - ImageRequest.Builder(LocalContext.current) - .data(titleDescriptionListWidgetData.dropDownIconUrl) - .size(Size.ORIGINAL) - .allowHardware(false) - .build(), - modifier = - Modifier - .rotate(rotation.value) - .clickable( - indication = null, - interactionSource = remember { MutableInteractionSource() } - ) { - expand.value = expand.value.not() - rotation.value = rotation.value + 180 - } + ImageRequest.Builder(LocalContext.current) + .data(titleDescriptionListWidgetData.dropDownIconUrl) + .size(Size.ORIGINAL) + .allowHardware(false) + .build(), + modifier = Modifier.rotate(rotation.value) ) } AnimatedVisibility(visible = expand.value) { - TextRenderer().Render( - property = titleDescriptionListWidgetData.itemDescriptionProperty - ?: TextProperty(), - uiTronData = titleDescriptionListWidgetData.itemTitleData?.apply { - text = it.description - } ?: TextData(text = it.description), - uiTronViewModel = viewModel, - modifier = null - ) + TextRenderer() + .Render( + property = titleDescriptionListWidgetData.itemDescriptionProperty + ?: TextProperty(), + uiTronData = + titleDescriptionListWidgetData.itemTitleData?.apply { + text = it.description + } + ?: TextData(text = it.description), + uiTronViewModel = viewModel, + modifier = null + ) } } } diff --git a/navi-ap/src/main/res/raw/generic_error_bottom_sheet_config.json b/navi-ap/src/main/res/raw/generic_error_bottom_sheet_config.json index 5988b593bf..ded096ee0f 100644 --- a/navi-ap/src/main/res/raw/generic_error_bottom_sheet_config.json +++ b/navi-ap/src/main/res/raw/generic_error_bottom_sheet_config.json @@ -142,7 +142,7 @@ "size": 100 }, "colors": { - "backgroundColor": "#FF5732" + "backgroundColor": "#1F002A" } }, "childrenViews": [ diff --git a/navi-common/src/main/java/com/navi/common/permission/CommonContactsUtil.kt b/navi-common/src/main/java/com/navi/common/permission/CommonContactsUtil.kt index eae5d1fca1..c5f9e6574b 100644 --- a/navi-common/src/main/java/com/navi/common/permission/CommonContactsUtil.kt +++ b/navi-common/src/main/java/com/navi/common/permission/CommonContactsUtil.kt @@ -24,6 +24,7 @@ import com.navi.common.useruploaddata.model.UserContact import com.navi.common.useruploaddata.model.UserPhone import com.navi.common.useruploaddata.repository.UserDataRepository import com.navi.common.useruploaddata.utils.PermissionUtil.hasPermissions +import com.navi.common.utils.CommonNaviAnalytics import com.navi.common.utils.Constants import com.navi.common.utils.Constants.QUESTION_MARK import com.navi.common.utils.Constants.UNDERSCORE @@ -36,6 +37,8 @@ import retrofit2.Response object CommonContactsUtil { + private val analyticsTracker = CommonNaviAnalytics.naviAnalytics.CommonContactsUtil() + suspend fun readContacts(applicationContext: Context) { try { val cursor = executeQueryToReadContacts(applicationContext) @@ -44,14 +47,18 @@ object CommonContactsUtil { if (!moveToFirst()) return var pageNumber = 1 val contacts = mutableListOf() + analyticsTracker.contactReadStartTime(pageNumber) do { readContact(contacts) if (contacts.size == Constants.USER_DATA_PAYLOAD_SIZE) { + analyticsTracker.contactReadEndTime(pageNumber) postContactsAndClearList(contacts, getTotalPages(), pageNumber) pageNumber += 1 + analyticsTracker.contactReadStartTime(pageNumber) } } while (moveToNext()) if (contacts.size > 0) { + analyticsTracker.contactReadEndTime(pageNumber) postContactsAndClearList(contacts, getTotalPages(), pageNumber) } } @@ -86,10 +93,22 @@ object CommonContactsUtil { totalPages: Int, pageNumber: Int ) { + analyticsTracker.contactUploadStartTime(pageNumber) val request = UserDataWrapper(totalPages, pageNumber, contacts) + analyticsTracker.onContactUploadStart(totalPages, pageNumber, contacts.size) val response = UserDataRepository().postContacts(request) - response.error?.let { Exception("Contact Upload Issue" + UNDERSCORE + it.statusCode).log() } + analyticsTracker.contactUploadEndTime(pageNumber) + response.error?.let { + Exception("Contact Upload Issue" + UNDERSCORE + it.statusCode).log() + analyticsTracker.onContactUploadFailure( + totalPages, + pageNumber, + contacts.size, + it.statusCode + ) + } contacts.clear() + analyticsTracker.onContactUploadSuccess(totalPages, pageNumber, contacts.size) } suspend fun readZipAndUploadContacts( @@ -102,14 +121,22 @@ object CommonContactsUtil { val contactList = mutableListOf() var pageNumber = 1 cursor?.apply { + analyticsTracker.contactReadStartTime(pageNumber) if (!moveToFirst()) return null do readContact(contactList) while (moveToNext()) close() + if (contactList.size > 0) { + analyticsTracker.contactReadEndTime(pageNumber) + } else if (contactList.isEmpty()) { + analyticsTracker.onFoundEmptyContactsList() + } } val contactData = ContactData(contactList) + analyticsTracker.onZippingSuccess(Constants.CONTACTS) postZippedContacts(contactData, url, referenceId, pageNumber = pageNumber) } catch (e: Exception) { e.log() + analyticsTracker.onZippingFailure(Constants.CONTACTS) IngestionStatus( referenceId = referenceId, ingestionType = IngestionType.CONTACTS, @@ -124,16 +151,23 @@ object CommonContactsUtil { referenceId: String, pageNumber: Int ): IngestionStatus { + analyticsTracker.contactUploadStartTime(pageNumber) val gson = Gson().toJson(contactData) + analyticsTracker.onZippingUploadInitiated(Constants.CONTACTS) val response = postZippedData(gson, url) + analyticsTracker.contactUploadEndTime(pageNumber) val ingestionStatus = IngestionStatus( referenceId = referenceId, ingestionType = IngestionType.CONTACTS, ) if (response.isSuccessful) { + analyticsTracker.onContactUploadSuccess() + analyticsTracker.onZippingUploadSuccess(Constants.CONTACTS) ingestionStatus.status = IngestionStatusType.SUCCESS } else { + analyticsTracker.onContactUploadFailureEvent() + analyticsTracker.onZippingUploadFailure(Constants.CONTACTS) ingestionStatus.status = IngestionStatusType.FAILED } return ingestionStatus diff --git a/navi-common/src/main/java/com/navi/common/permission/CommonSmsUtil.kt b/navi-common/src/main/java/com/navi/common/permission/CommonSmsUtil.kt index 722ac643e4..c359f6795b 100644 --- a/navi-common/src/main/java/com/navi/common/permission/CommonSmsUtil.kt +++ b/navi-common/src/main/java/com/navi/common/permission/CommonSmsUtil.kt @@ -17,12 +17,15 @@ import com.navi.common.useruploaddata.repository.UserDataRepository import com.navi.common.useruploaddata.utils.PermissionUtil.hasPermissions import com.navi.common.useruploaddata.utils.getSmsDataProjection import com.navi.common.useruploaddata.utils.getUserSmsFromCursorData +import com.navi.common.utils.CommonNaviAnalytics import com.navi.common.utils.Constants import com.navi.common.utils.getTotalPages import com.navi.common.utils.log class CommonSmsUtil { + private val analyticsTracker = CommonNaviAnalytics.naviAnalytics.CommonSmsUtil() + suspend fun readSms(applicationContext: Context) { try { val cursor = executeQueryToReadSms(applicationContext) @@ -30,14 +33,18 @@ class CommonSmsUtil { if (!moveToFirst()) return var pageNumber = 1 val smsList = mutableListOf() + analyticsTracker.smsReadStartTime(pageNumber) do { readSmsWithCursor(cursor = this, smsList = smsList) if (smsList.size == Constants.USER_DATA_PAYLOAD_SIZE) { + analyticsTracker.smsReadEndTime(pageNumber) postSmsAndClearList(smsList, getTotalPages(), pageNumber) pageNumber += 1 + analyticsTracker.smsReadStartTime(pageNumber) } } while (moveToNext()) if (smsList.size > 0) { + analyticsTracker.smsReadEndTime(pageNumber) postSmsAndClearList(smsList, getTotalPages(), pageNumber) } } @@ -72,15 +79,32 @@ class CommonSmsUtil { pageNumber: Int, retryCount: Int = 0 ) { + analyticsTracker.smsUploadStartTime(pageNumber) val request = UserDataWrapper(totalPages, pageNumber, smsList) + analyticsTracker.onSmsUploadStart(totalPages, pageNumber, smsList.size, retryCount) val response = UserDataRepository().postSms(request) + analyticsTracker.smsUploadEndTime(pageNumber, retryCount) response.error?.let { Exception("Installed App Upload Issue" + Constants.UNDERSCORE + it.statusCode).log() + analyticsTracker.onSmsUploadFailure( + totalPages, + pageNumber, + smsList.size, + it.statusCode, + ) if (retryCount < 1) { postSmsAndClearList(smsList, totalPages, pageNumber, retryCount = retryCount + 1) return } } - ?: run { smsList.clear() } + ?: run { + smsList.clear() + analyticsTracker.onSmsUploadSuccess( + totalPages, + pageNumber, + smsList.size, + retryCount + ) + } } } diff --git a/navi-common/src/main/java/com/navi/common/uitron/model/action/TriggerApiActions.kt b/navi-common/src/main/java/com/navi/common/uitron/model/action/TriggerApiActions.kt index ccc783bfa0..435706e4fc 100644 --- a/navi-common/src/main/java/com/navi/common/uitron/model/action/TriggerApiActions.kt +++ b/navi-common/src/main/java/com/navi/common/uitron/model/action/TriggerApiActions.kt @@ -54,5 +54,6 @@ enum class SourceType { DEVICE_PROPERTY, SDK_OUTPUT, PRE_DEFINED, - CURRENT_TIMESTAMP + CURRENT_TIMESTAMP, + ZERO_TIMESTAMP } diff --git a/navi-common/src/main/java/com/navi/common/uitron/model/action/UploadDataAction.kt b/navi-common/src/main/java/com/navi/common/uitron/model/action/UploadDataAction.kt index f660ee7ee9..d3a4a8dc79 100644 --- a/navi-common/src/main/java/com/navi/common/uitron/model/action/UploadDataAction.kt +++ b/navi-common/src/main/java/com/navi/common/uitron/model/action/UploadDataAction.kt @@ -18,8 +18,7 @@ import kotlinx.parcelize.Parcelize open class UploadDataAction( @SerializedName("data") val data: List? = null, @SerializedName("onSuccess") val onSuccess: UiTronActionData? = null, - @SerializedName("onFailure") val onFailure: UiTronActionData? = null, - @SerializedName("shouldUpload") val shouldUpload: Boolean? = null + @SerializedName("onFailure") val onFailure: UiTronActionData? = null ) : UiTronAction(), Parcelable { override suspend fun manageAction(actionDetails: ActionDetails) { val action = actionDetails.uiTronAction as UploadDataAction diff --git a/navi-common/src/main/java/com/navi/common/useruploaddata/utils/PermissionUtil.kt b/navi-common/src/main/java/com/navi/common/useruploaddata/utils/PermissionUtil.kt index 15a4a10c12..849cf19987 100644 --- a/navi-common/src/main/java/com/navi/common/useruploaddata/utils/PermissionUtil.kt +++ b/navi-common/src/main/java/com/navi/common/useruploaddata/utils/PermissionUtil.kt @@ -17,6 +17,8 @@ import android.provider.Telephony import android.util.Base64 import androidx.core.content.ContextCompat import com.google.gson.Gson +import com.navi.base.utils.isNotNull +import com.navi.base.utils.orZero import com.navi.common.CommonLibManager.application import com.navi.common.managers.PermissionsManager import com.navi.common.model.UploadDataAsyncResponse @@ -26,8 +28,11 @@ import com.navi.common.network.ApiConstants import com.navi.common.useruploaddata.model.* import com.navi.common.useruploaddata.repository.UserDataRepository import com.navi.common.utils.COMMA +import com.navi.common.utils.CommonNaviAnalytics +import com.navi.common.utils.Constants import com.navi.common.utils.Constants.QUESTION_MARK import com.navi.common.utils.gzipCompress +import com.navi.common.utils.isValidResponse import com.navi.common.utils.log import kotlinx.coroutines.* import okhttp3.MediaType.Companion.toMediaTypeOrNull @@ -36,14 +41,20 @@ import retrofit2.Response object PermissionUtil { + private val analyticsTracker = CommonNaviAnalytics.naviAnalytics.PermissionUtil() + fun hasPermissions( context: Context, permissions: Array = PermissionsManager.requiredPermissions - ): Boolean = - permissions.all { permission -> - ContextCompat.checkSelfPermission(context, permission) == - PackageManager.PERMISSION_GRANTED - } + ): Boolean { + val hasPermission = + permissions.all { permission -> + ContextCompat.checkSelfPermission(context, permission) == + PackageManager.PERMISSION_GRANTED + } + analyticsTracker.hasPermissions(hasPermission) + return hasPermission + } suspend fun uploadAppData( scope: CoroutineScope, @@ -98,7 +109,11 @@ object PermissionUtil { needTohandleIngestionPolling: Boolean ) { val startTimeInMillis = System.currentTimeMillis() + analyticsTracker.postGettingPreSignedUrlInitiated() var response = UserDataRepository().getPreSignedUrlList(ingestionType, businessVertical) + if (response.error != null || response.errors != null) { + analyticsTracker.postErrorInGettingPreSignedUrl(response.error ?: response.errors) + } var retryCount = 1 // retry the getPreSignedUrlList api max 3 times while ((response.error != null || !response.errors.isNullOrEmpty()) && retryCount <= 4) { if (retryCount == 4) { @@ -108,17 +123,30 @@ object PermissionUtil { return } retryCount++ + analyticsTracker.postGettingPreSignedUrlInitiated(retryCount - 1) response = UserDataRepository().getPreSignedUrlList(ingestionType, businessVertical) } + if (response.isValidResponse()) { + analyticsTracker.postGettingPreSignedUrlSuccess(retryCount) + } var ingestionList: List? = null try { val taskLists = extractTasks(response.data, scope) ingestionList = (taskLists.awaitAll().filterNotNull()) var uploadedResponseData: UploadDataAsyncResponse? = null if (ingestionList.isNotEmpty()) { + analyticsTracker.onDataUploadAcknowledgementInitiated(ingestionList.toString()) val uploadedResponse = UserDataRepository().postIngestionStatus(IngestionStatusBody(ingestionList)) uploadedResponseData = uploadedResponse.data + if (uploadedResponse.error != null || uploadedResponse.errors != null) { + analyticsTracker.onErrorUploadingSms( + error = uploadedResponse.error ?: uploadedResponse.errors + ) + analyticsTracker.onDataUploadAcknowledgementFailure(ingestionList.toString()) + } else { + analyticsTracker.onDataUploadAcknowledgementSuccess(ingestionList.toString()) + } } val endTimeInMillis = System.currentTimeMillis() val timeTakenToUploadAppData = (endTimeInMillis - startTimeInMillis) @@ -136,10 +164,21 @@ object PermissionUtil { // callback invocation means ,we are done with uploading } catch (e: Exception) { e.log() + analyticsTracker.onExceptionWhileUploadingData() ingestionList?.filterNotNull()?.let { if (it.isNotEmpty()) { + analyticsTracker.onDataUploadAcknowledgementInitiated(ingestionList.toString()) val uploadedResponse = UserDataRepository().postIngestionStatus(IngestionStatusBody(it)) + if (uploadedResponse.error.isNotNull() || uploadedResponse.errors.isNotNull()) { + analyticsTracker.onDataUploadAcknowledgementFailure( + ingestionList.toString() + ) + } else { + analyticsTracker.onDataUploadAcknowledgementSuccess( + ingestionList.toString() + ) + } val userDataUploadCallbackResponse = UserDataUploadCallbackResponse( IngestionStatusBody(it), @@ -152,8 +191,11 @@ object PermissionUtil { UploadDataPollingUtil() .handleUploadDataResponse(userDataUploadCallbackResponse) } + } else { + analyticsTracker.onIngestionTaskListEmpty(true) } } + ?: run { analyticsTracker.onIngestionTaskListNull() } } } @@ -163,6 +205,12 @@ object PermissionUtil { ): MutableList> { val taskLists = mutableListOf>() preSignedUrlResponse?.preSignedUrlList?.forEach { preSignedModel -> + analyticsTracker.postPreSignedIngestionStatus( + preSignedModel.preSignedUrl, + preSignedModel.referenceId, + preSignedModel.ingestionType, + preSignedModel.upload, + ) if ( preSignedModel.upload == true && preSignedModel.referenceId != null && @@ -177,6 +225,10 @@ object PermissionUtil { ?.let { taskLists.add(it) } } } + analyticsTracker.numberOfUrlsReceivedAndNumberOfDataUploaded( + preSignedUrlResponse?.preSignedUrlList?.size.orZero(), + taskLists.size + ) return taskLists } @@ -222,10 +274,15 @@ object PermissionUtil { if (!moveToFirst()) return null do readSms(smsList) while (moveToNext()) close() + if (smsList.isEmpty()) { + analyticsTracker.onFoundEmptySmsList() + } } + analyticsTracker.onZippingSuccess(Constants.SMS) postZippedMessages(smsList, url, referenceId) } catch (e: Exception) { e.log() + analyticsTracker.onZippingFailure(Constants.SMS) IngestionStatus( referenceId = referenceId, ingestionType = IngestionType.SMS, @@ -248,9 +305,11 @@ object PermissionUtil { AppDetails(it.applicationInfo.name, it.firstInstallTime, it.lastUpdateTime) ) } + analyticsTracker.onZippingSuccess(IngestionType.APPS.name) postZippedApps(installedApps.toMutableList(), url, referenceId) } catch (e: Exception) { e.log() + analyticsTracker.onZippingFailure(IngestionType.APPS.name) IngestionStatus( referenceId = referenceId, ingestionType = IngestionType.APPS, @@ -272,11 +331,13 @@ object PermissionUtil { if (!moveToFirst()) return null do readContact(contactList) while (moveToNext()) close() + analyticsTracker.onZippingSuccess(IngestionType.CONTACTS.name) } val contactData = ContactData(contactList) postZippedContacts(contactData, url, referenceId, pageNumber = pageNumber) } catch (e: Exception) { e.log() + analyticsTracker.onZippingFailure(IngestionType.CONTACTS.name) IngestionStatus( referenceId = referenceId, ingestionType = IngestionType.CONTACTS, @@ -352,6 +413,7 @@ object PermissionUtil { referenceId: String ): IngestionStatus { val gson = Gson().toJson(UserSmsData(smsList.sortedBy { it.timeStamp })) + analyticsTracker.onZippingUploadInitiated(Constants.SMS) val response = postZippedData(gson, url) val ingestionStatus = @@ -363,8 +425,10 @@ object PermissionUtil { ) if (response.isSuccessful) { + analyticsTracker.onZippingUploadSuccess(Constants.SMS) ingestionStatus.status = IngestionStatusType.SUCCESS } else { + analyticsTracker.onZippingUploadFailure(Constants.SMS) ingestionStatus.status = IngestionStatusType.FAILED } @@ -379,6 +443,7 @@ object PermissionUtil { pageNumber: Int ): IngestionStatus { val gson = Gson().toJson(contactData) + analyticsTracker.onZippingUploadInitiated(IngestionType.CONTACTS.name) val response = postZippedData(gson, url) val ingestionStatus = IngestionStatus( @@ -386,8 +451,10 @@ object PermissionUtil { ingestionType = IngestionType.CONTACTS, ) if (response.isSuccessful) { + analyticsTracker.onZippingUploadSuccess(IngestionType.CONTACTS.name) ingestionStatus.status = IngestionStatusType.SUCCESS } else { + analyticsTracker.onZippingUploadFailure(IngestionType.CONTACTS.name) ingestionStatus.status = IngestionStatusType.FAILED } return ingestionStatus @@ -420,6 +487,7 @@ object PermissionUtil { referenceId: String ): IngestionStatus { val gson = Gson().toJson(UserAppData(appList)) + analyticsTracker.onZippingUploadInitiated(IngestionType.APPS.name) val response = postZippedData(gson, url) val ingestionStatus = @@ -429,8 +497,10 @@ object PermissionUtil { ) if (response.isSuccessful) { + analyticsTracker.onZippingUploadSuccess(IngestionType.APPS.name) ingestionStatus.status = IngestionStatusType.SUCCESS } else { + analyticsTracker.onZippingUploadFailure(IngestionType.APPS.name) ingestionStatus.status = IngestionStatusType.FAILED } diff --git a/navi-common/src/main/java/com/navi/common/utils/CommonNaviAnalytics.kt b/navi-common/src/main/java/com/navi/common/utils/CommonNaviAnalytics.kt index 62abda90ee..d0d9f0ab87 100644 --- a/navi-common/src/main/java/com/navi/common/utils/CommonNaviAnalytics.kt +++ b/navi-common/src/main/java/com/navi/common/utils/CommonNaviAnalytics.kt @@ -10,7 +10,6 @@ package com.navi.common.utils import androidx.annotation.Keep import com.navi.analytics.alfred.AlfredManager import com.navi.analytics.utils.NaviTrackEvent -import com.navi.base.utils.orFalse import com.navi.base.model.ActionData import com.navi.base.model.GenericAnalyticsData import com.navi.base.sharedpref.CommonPrefConstants @@ -744,41 +743,43 @@ class CommonNaviAnalytics private constructor() { ) } - inner class AuthenticatorEvents{ + inner class AuthenticatorEvents { - fun createNewSessionNeeded(apiUrl: String, isNeeded : Boolean) { + fun createNewSessionNeeded(apiUrl: String, isNeeded: Boolean) { val map = mapOf(Pair("isNeeded", isNeeded.toString()), Pair("apiUrl", apiUrl)) NaviTrackEvent.trackEvent("dev_is_new_session_needed", map) } - fun authenticateCalledForApi(apiUrl : String) { + fun authenticateCalledForApi(apiUrl: String) { val map = mapOf(Pair("apiUrl", apiUrl)) NaviTrackEvent.trackEvent("authentication_needed", map) } fun reTriggerUnAuthApi(apiUrl: String, isSessionDataPresent: Boolean) { - val map = mapOf( - Pair("apiUrl", apiUrl), - Pair("isSessionDataPresent", isSessionDataPresent.toString()) - ) + val map = + mapOf( + Pair("apiUrl", apiUrl), + Pair("isSessionDataPresent", isSessionDataPresent.toString()) + ) NaviTrackEvent.trackEvent("dev_retrigger_unauth_api", map) } - fun refreshTokenCancelled(apiUrl : String) { + fun refreshTokenCancelled(apiUrl: String) { val map = mapOf(Pair("apiUrl", apiUrl)) NaviTrackEvent.trackEvent("refresh_token_cancelled", map) } - fun onGetExistingSessionToken(apiUrl: String, isLoggedIn : Boolean) { + fun onGetExistingSessionToken(apiUrl: String, isLoggedIn: Boolean) { val map = mapOf(Pair("isLoggedIn", isLoggedIn.toString()), Pair("apiUrl", apiUrl)) NaviTrackEvent.trackEvent("dev_get_existing_session_token", map) } + fun refreshTokenApiCalled( - unAuthApiUrl : String, + unAuthApiUrl: String, isError: Boolean, error: GenericErrorResponse?, errorMessage: ErrorMessage?, - isRefreshTokenExpired : Boolean + isRefreshTokenExpired: Boolean ) { val map = mapOf( @@ -794,10 +795,7 @@ class CommonNaviAnalytics private constructor() { NaviTrackEvent.trackEvent("refresh_token", map) } - fun refreshTokenApiError( - error: GenericErrorResponse?, - errorMessage: ErrorMessage? - ) { + fun refreshTokenApiError(error: GenericErrorResponse?, errorMessage: ErrorMessage?) { val map = mapOf( Pair("error_data", error.toString()), @@ -809,10 +807,7 @@ class CommonNaviAnalytics private constructor() { NaviTrackEvent.trackEvent("refresh_token_error", map) } - fun refreshTokenExpired( - error: GenericErrorResponse?, - errorMessage: ErrorMessage? - ) { + fun refreshTokenExpired(error: GenericErrorResponse?, errorMessage: ErrorMessage?) { val map = mapOf( Pair("error_data", error.toString()), @@ -824,24 +819,29 @@ class CommonNaviAnalytics private constructor() { NaviTrackEvent.trackEvent("refresh_token_expired", map) } - fun logout(error: GenericErrorResponse?, isRefreshTokenExpired : Boolean) { - val map = mapOf( - Pair("isRefreshTokenExpired", isRefreshTokenExpired.toString()), - Pair("reason", "refresh token failed"), - Pair("statusCode", error?.statusCode.toString()) - ) + fun logout(error: GenericErrorResponse?, isRefreshTokenExpired: Boolean) { + val map = + mapOf( + Pair("isRefreshTokenExpired", isRefreshTokenExpired.toString()), + Pair("reason", "refresh token failed"), + Pair("statusCode", error?.statusCode.toString()) + ) NaviTrackEvent.trackEvent("logout", map) } - fun createNewSessionResponse(isSessionTokenCreated: Boolean, - isRefreshTokenCreated: Boolean, - error: GenericErrorResponse?, - errorMessage: ErrorMessage?) { - val map = mapOf(Pair("isSessionTokenCreated", isSessionTokenCreated.toString()), - Pair("isRefreshTokenCreated", isRefreshTokenCreated.toString()), - Pair("error", error.toString()), - Pair("errorMessage", errorMessage.toString()) - ) + fun createNewSessionResponse( + isSessionTokenCreated: Boolean, + isRefreshTokenCreated: Boolean, + error: GenericErrorResponse?, + errorMessage: ErrorMessage? + ) { + val map = + mapOf( + Pair("isSessionTokenCreated", isSessionTokenCreated.toString()), + Pair("isRefreshTokenCreated", isRefreshTokenCreated.toString()), + Pair("error", error.toString()), + Pair("errorMessage", errorMessage.toString()) + ) NaviTrackEvent.trackEvent("dev_create_new_session_response", map) } } @@ -948,6 +948,404 @@ class CommonNaviAnalytics private constructor() { } } + inner class HandleUploadDataAction { + + fun onUploadToS3Failed(ingestionStatusList: String) { + NaviTrackEvent.trackEventOnClickStream( + eventName = "dev_ap_on_upload_to_s3_failed", + eventValues = mapOf(Pair("ingestionStatusList", ingestionStatusList)) + ) + } + + fun onDataUploadSuccess() { + NaviTrackEvent.trackEventOnClickStream(eventName = "dev_ap_on_data_upload_Success") + } + } + + inner class CommonContactsUtil { + fun onFoundEmptyContactsList() { + NaviTrackEvent.trackEventOnClickStream("PL_DEV_CONTACT_LIST_IS_EMPTY") + } + + fun onContactUploadStart(totalPages: Int, pageNumber: Int, size: Int) { + NaviTrackEvent.trackEventOnClickStream( + "contact_upload_started", + mapOf( + Pair("totalPages", totalPages.toString()), + Pair("pageNumber", pageNumber.toString()), + Pair("size", size.toString()) + ) + ) + } + + fun onContactUploadSuccess(totalPages: Int, pageNumber: Int, size: Int) { + NaviTrackEvent.trackEventOnClickStream( + "contact_upload_success", + mapOf( + Pair("totalPages", totalPages.toString()), + Pair("pageNumber", pageNumber.toString()), + Pair("size", size.toString()) + ) + ) + } + + fun onContactUploadSuccess() { + NaviTrackEvent.trackEventOnClickStream("pl_dev_contact_upload_success") + } + + fun onContactUploadFailureEvent() { + NaviTrackEvent.trackEventOnClickStream("pl_dev_contact_upload_failure") + } + + fun onContactUploadFailure(totalPages: Int, pageNumber: Int, size: Int, statusCode: Int?) { + NaviTrackEvent.trackEventOnClickStream( + "contact_upload_failure", + mapOf( + Pair("totalPages", totalPages.toString()), + Pair("pageNumber", pageNumber.toString()), + Pair("size", size.toString()), + Pair("statusCode", statusCode.toString()) + ) + ) + } + + fun contactUploadStartTime(pageNumber: Int) { + NaviTrackEvent.trackEventOnClickStream( + "contact_number_upload_start_time", + mapOf( + Pair("atTimeStamp", System.currentTimeMillis().toString()), + Pair("pageNumber", pageNumber.toString()) + ) + ) + } + + fun contactUploadEndTime(pageNumber: Int) { + NaviTrackEvent.trackEventOnClickStream( + "contact_number_upload_end_time", + mapOf( + Pair("atTimeStamp", System.currentTimeMillis().toString()), + Pair("pageNumber", pageNumber.toString()) + ) + ) + } + + fun contactReadStartTime(pageNumber: Int) { + NaviTrackEvent.trackEventOnClickStream( + "contact_number_read_start_time", + mapOf( + Pair("atTimeStamp", System.currentTimeMillis().toString()), + Pair("pageNumber", pageNumber.toString()) + ) + ) + } + + fun contactReadEndTime(pageNumber: Int) { + NaviTrackEvent.trackEventOnClickStream( + "contact_number_read_end_time", + mapOf( + Pair("atTimeStamp", System.currentTimeMillis().toString()), + Pair("pageNumber", pageNumber.toString()) + ) + ) + } + + 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 CommonSmsUtil { + fun onSmsUploadStart(totalPages: Int, pageNumber: Int, size: Int, retryCount: Int = 0) { + NaviTrackEvent.trackEventOnClickStream( + if (retryCount == 0) "sms_upload_started" else "retry_sms_upload_started", + mapOf( + Pair("totalPages", totalPages.toString()), + Pair("pageNumber", pageNumber.toString()), + Pair("size", size.toString()) + ) + ) + } + + fun onSmsUploadSuccess(totalPages: Int, pageNumber: Int, size: Int, retryCount: Int = 0) { + NaviTrackEvent.trackEventOnClickStream( + if (retryCount == 0) "sms_upload_success" else "retry_sms_upload_success", + mapOf( + Pair("totalPages", totalPages.toString()), + Pair("pageNumber", pageNumber.toString()), + Pair("size", size.toString()) + ) + ) + } + + fun onSmsUploadFailure(totalPages: Int, pageNumber: Int, size: Int, statusCode: Int?) { + NaviTrackEvent.trackEventOnClickStream( + "sms_upload_failure", + mapOf( + Pair("totalPages", totalPages.toString()), + Pair("pageNumber", pageNumber.toString()), + Pair("size", size.toString()), + Pair("statusCode", statusCode.toString()) + ) + ) + } + + fun smsUploadStartTime(pageNumber: Int) { + NaviTrackEvent.trackEventOnClickStream( + "sms_upload_start_time", + mapOf( + Pair("atTimeStamp", System.currentTimeMillis().toString()), + Pair("pageNumber", pageNumber.toString()) + ) + ) + } + + fun smsUploadEndTime(pageNumber: Int, retryCount: Int = 0) { + NaviTrackEvent.trackEventOnClickStream( + if (retryCount == 0) "sms_upload_end_time" else "retry_sms_upload_end_time", + mapOf( + Pair("atTimeStamp", System.currentTimeMillis().toString()), + Pair("pageNumber", pageNumber.toString()) + ) + ) + } + + fun smsReadStartTime(pageNumber: Int) { + NaviTrackEvent.trackEventOnClickStream( + "sms_read_start_time", + mapOf( + Pair("atTimeStamp", System.currentTimeMillis().toString()), + Pair("pageNumber", pageNumber.toString()) + ) + ) + } + + fun smsReadEndTime(pageNumber: Int) { + NaviTrackEvent.trackEventOnClickStream( + "sms_read_end_time", + mapOf( + Pair("atTimeStamp", System.currentTimeMillis().toString()), + Pair("pageNumber", pageNumber.toString()) + ) + ) + } + } + + inner class PermissionUtil { + + fun hasPermissions(hasPermissions: Boolean) { + NaviTrackEvent.trackEventOnClickStream( + "dev_has_all_required_permissions_for_data_upload", + mapOf(Pair("hasPermissions", hasPermissions.toString())) + ) + } + + 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", + mapOf(Pair("error", error?.toString() ?: EMPTY)) + ) + } + + fun onErrorUploadingSms(error: Any?) { + NaviTrackEvent.trackEventOnClickStream( + "PL_AWS_SMS_UPLOADING_FAILURE", + mapOf(Pair("error", error?.toString() ?: EMPTY)) + ) + } + + fun onExceptionWhileUploadingData() { + NaviTrackEvent.trackEventOnClickStream("AWS_DATA_UPLOADING_EXCEPTION") + } + + fun onFoundEmptySmsList() { + NaviTrackEvent.trackEventOnClickStream("PL_SMS_IS_EMPTY") + } + + fun postPreSignedIngestionStatus( + preSignedUrl: String?, + referenceId: String?, + ingestionType: String?, + upload: Boolean? + ) { + NaviTrackEvent.trackEventOnClickStream( + "PL_PRESIGNED_INGESTION_DATA", + mapOf( + Pair("presignedUrl", preSignedUrl.toString()), + Pair("referenceId", referenceId.toString()), + Pair("ingestionType", ingestionType.toString()), + Pair("needToUpload", upload.toString()), + ) + ) + } + + 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 onIngestionTaskListEmpty(isException: Boolean) { + NaviTrackEvent.trackEvent( + eventName = "PL_Ingestion_Task_List_Empty", + eventValues = mapOf(Pair("isException", isException.toString())) + ) + } + + fun onIngestionTaskListNull() { + NaviTrackEvent.trackEvent(eventName = "PL_Ingestion_Task_List_Null") + } + + 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) + ) + ) + } + } + companion object { const val OVERRIDE_EVENT = "override_event" const val TEXT_TRUE = "true" diff --git a/navi-design/src/main/java/com/navi/design/theme/Theme.kt b/navi-design/src/main/java/com/navi/design/theme/Theme.kt index 4a2d8fc721..936d98c045 100644 --- a/navi-design/src/main/java/com/navi/design/theme/Theme.kt +++ b/navi-design/src/main/java/com/navi/design/theme/Theme.kt @@ -16,9 +16,9 @@ import com.google.accompanist.systemuicontroller.rememberSystemUiController private val LightColors = Colors( - primary = FFFF5732, + primary = FF1F002A, primaryVariant = Color.Black, - secondary = FFFF5732, + secondary = FF1F002A, secondaryVariant = FF018786, background = FF0000FF, surface = Color.White, diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/utils/NaviWidgetIconUtils.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/utils/NaviWidgetIconUtils.kt index 54e89606ee..4377b02c50 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/utils/NaviWidgetIconUtils.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/utils/NaviWidgetIconUtils.kt @@ -1398,11 +1398,11 @@ object NaviWidgetIconUtils { EMAIL_LOGO -> R.drawable.ic_email RIGHT_ARROW_DARK_BLACK -> R.drawable.ic_right_arrow_dark_black SALARIED_UNSELECTED_ICON -> R.drawable.ic_salaried_unselected - SALARIED_SELECTED_ICON -> R.drawable.ic_salaried_selected + SALARIED_SELECTED_ICON -> R.drawable.ic_salaried_selected_purple_color SELF_EMPLOYED_UNSELECTED_ICON -> R.drawable.ic_others_unselected - SELF_EMPLOYED_SELECTED_ICON -> R.drawable.ic_others_selected + SELF_EMPLOYED_SELECTED_ICON -> R.drawable.ic_self_employed_selected_purple_theme OTHERS_UNSELECTED_ICON -> R.drawable.ic_others_employment_unselected - OTHERS_SELECTED_ICON -> R.drawable.ic_others_employment_selected + OTHERS_SELECTED_ICON -> R.drawable.ic_others_selected_purple_theme DELAY -> R.drawable.delay else -> -1 } diff --git a/navi-widgets/src/main/res/drawable/ic_others_selected_purple_theme.xml b/navi-widgets/src/main/res/drawable/ic_others_selected_purple_theme.xml new file mode 100644 index 0000000000..ecebcf145e --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_others_selected_purple_theme.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_salaried_selected_purple_color.xml b/navi-widgets/src/main/res/drawable/ic_salaried_selected_purple_color.xml new file mode 100644 index 0000000000..24467b14bb --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_salaried_selected_purple_color.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_self_employed_selected_purple_theme.xml b/navi-widgets/src/main/res/drawable/ic_self_employed_selected_purple_theme.xml new file mode 100644 index 0000000000..2e7467e850 --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_self_employed_selected_purple_theme.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + +