Tp 49444 send events to backend immediately on app kill (#72)

This commit is contained in:
Sayed Owais Ali
2023-12-12 16:01:30 +05:30
committed by GitHub
parent 75802da058
commit e07e9181f9
12 changed files with 243 additions and 70 deletions

View File

@@ -6,7 +6,7 @@ plugins {
id 'kotlin-parcelize'
}
def VERSION_NAME = "1.0.14"
def VERSION_NAME = "1.0.15"
android {
namespace 'com.navi.alfred'

View File

@@ -14,6 +14,7 @@ import com.navi.alfred.AlfredManager.applicationContext
import com.navi.alfred.model.CruiseAttributes
import com.navi.alfred.model.DeviceAttributes
import com.navi.alfred.utils.AlfredConstants
import com.navi.alfred.utils.AlfredConstants.UNDERSCORE
import com.navi.alfred.utils.getCarrierName
import com.navi.alfred.utils.getNetworkType
import java.util.*
@@ -102,7 +103,7 @@ data class AlfredConfig(
fun getAlfredEventId(): String = this.alfredEventId
fun setAlfredEventId() {
this.alfredEventId = UUID.randomUUID().toString().plus(AlfredConstants.ALFRED_EVENT_ID)
this.alfredEventId = getAlfredSessionId().plus(UNDERSCORE) + UUID.randomUUID().toString().plus(AlfredConstants.ALFRED_EVENT_ID)
}
fun setAlfredSessionId() {

View File

@@ -351,8 +351,8 @@ object AlfredManager {
previousTouchEvent.action = currentTouchEvent.action
previousTouchEvent.pointerPositionX = currentTouchEvent.getX(actionPointer)
previousTouchEvent.pointerPositionY = currentTouchEvent.getY(actionPointer)
previousTouchEvent.rawX = currentTouchEvent.rawX
previousTouchEvent.rawY = currentTouchEvent.rawY
previousTouchEvent.rawX = currentTouchEvent.getRawX()
previousTouchEvent.rawY = currentTouchEvent.getRawY()
}
if (currentTouchEvent?.action == ACTION_UP) {
val touchEventData =

View File

@@ -17,13 +17,17 @@ data class Failure(
@SerializedName("zip_name") val zipName: List<String>? = null,
@SerializedName("error_name") val errorName: String? = "",
@SerializedName("error_status_code") val errorStatusCode: Long? = 0,
@SerializedName("error_message") val errorMessage: String? = ""
@SerializedName("error_message") val errorMessage: String? = "",
@SerializedName("session_id") val sessionId: String? = AlfredManager.config.getAlfredSessionId(),
@SerializedName("network_strength") val networkStrength: Float? = AlfredManager.config.getNetworkStrength(),
@SerializedName("event_id_list") val eventIdList: List<String>? = null
)
data class FailureAttributes(
@SerializedName("client_name") val clientName: String? = AlfredManager.config.getAppName(),
@SerializedName("device_id") val deviceId: String? = AlfredManager.config.getDeviceId(),
@SerializedName("session_id") val sessionId: String? = AlfredManager.config.getAlfredSessionId(),
@SerializedName("phone_number") val phoneNumber: String? = AlfredManager.config.getPhoneNumber(),
@SerializedName("customer_id") val customerId: String? = AlfredManager.config.getUserId()
@SerializedName("customer_id") val customerId: String? = AlfredManager.config.getUserId(),
@SerializedName("app_version_code") val appVersionCode: String? = AlfredManager.config.getAppVersionCode(),
@SerializedName("app_version_name") val appVersionName: String? = AlfredManager.config.getAppVersionName()
)

View File

@@ -19,7 +19,7 @@ data class AnalyticsRequest(
)
data class EventAttribute(
@SerializedName("eventId") val eventId: String? = null,
@SerializedName("event_id") val eventId: String? = null,
@SerializedName("screen_name") val screenName: String? = null,
@SerializedName("event_name") val eventName: String? = null,
@SerializedName("event_timestamp") val eventTimestamp: Long? = null,

View File

@@ -109,4 +109,5 @@ object AlfredConstants {
const val ZIP_ERROR = "ZIP_ERROR"
const val SCREEN_TRANSITION_EVENT = "SCREEN_TRANSITION_EVENT"
const val LATEST_SCREENSHOT_TIMESTAMP = "LATEST_SCREENSHOT_TIMESTAMP"
const val SNAPSHOT_PER_SECOND = "SNAPSHOT_PER_SECOND"
}

View File

@@ -39,11 +39,25 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.sync.withLock
import java.lang.reflect.Type
import java.util.UUID
import kotlin.concurrent.fixedRateTimer
internal suspend fun sendEventsToServer(): Boolean {
if (AlfredManager.config.getAlfredStatus() && AlfredManager.config.getEnableRecordingStatus()) {
internal suspend fun sendEventsToServer(
clientTs: Long? = null,
snapshotPerSecond: Int? = null,
apiKey: String? = null,
workManagerFlow: Boolean? = false
): Boolean {
if (workManagerFlow == true || (AlfredManager.config.getAlfredStatus() && AlfredManager.config.getEnableRecordingStatus())) {
try {
var baseAttributes = BaseAttribute()
if (workManagerFlow == true) {
baseAttributes = BaseAttribute(
clientTs = clientTs,
snapshotPerSecond = snapshotPerSecond
)
AlfredManager.analyticsDao = AlfredManager.alfredDataBase.analyticsDao()
}
AlfredManager.mutex.withLock {
val analyticsEvents =
AlfredManager.analyticsDao.fetchEvents(AlfredManager.config.getEventBatchSize())
@@ -55,14 +69,13 @@ internal suspend fun sendEventsToServer(): Boolean {
val events: ArrayList<EventAttribute> =
Gson().fromJson(detailsList.toString(), listType)
if (events.size > 0) {
val request =
AnalyticsRequest(
baseAttribute = BaseAttribute(),
events = events
)
val request = AnalyticsRequest(
baseAttribute = baseAttributes,
events = events
)
val response = AlfredManager.networkRepository.sendEvents(
AlfredManager.config.getPostUrl(),
AlfredManager.config.getApiKey(),
apiKey ?: AlfredManager.config.getApiKey(),
request
)
return if (
@@ -71,10 +84,12 @@ internal suspend fun sendEventsToServer(): Boolean {
true
} else {
val zipNamesList: MutableList<String> = mutableListOf()
val eventIdList: MutableList<String> = mutableListOf()
events.forEach { event ->
if (!zipNamesList.contains(event.zipName)) {
zipNamesList.add(event.zipName ?: "")
}
eventIdList.add(event.eventId ?: "")
}
val failureEvent = buildFailureEvent(
errorType = API_ERROR,
@@ -84,7 +99,8 @@ internal suspend fun sendEventsToServer(): Boolean {
errorStatusCode = response.code().toLong(),
errorMessage = response.message(),
errorName = INGEST_EVENT_FAILURE,
clientTs = request.baseAttribute?.clientTs
clientTs = request.baseAttribute?.clientTs,
eventIdList = eventIdList
)
AlfredDispatcher.addTaskToQueue(
AddFailureTask(
@@ -118,9 +134,22 @@ internal suspend fun sendEventsToServer(): Boolean {
return false
}
internal suspend fun sendNegativeCaseToServer(): Boolean {
if (AlfredManager.config.getAlfredStatus() && AlfredManager.config.getEnableRecordingStatus()) {
internal suspend fun sendNegativeCaseToServer(
clientTs: Long? = null,
snapshotPerSecond: Int? = null,
apiKey: String? = null,
workManagerFlow: Boolean? = false
): Boolean {
if (workManagerFlow == true || (AlfredManager.config.getAlfredStatus() && AlfredManager.config.getEnableRecordingStatus())) {
try {
var baseAttributes = BaseAttribute()
if (workManagerFlow == true) {
baseAttributes = BaseAttribute(
clientTs = clientTs,
snapshotPerSecond = snapshotPerSecond
)
AlfredManager.negativeCaseDao = AlfredManager.alfredDataBase.negativeCaseDao()
}
AlfredManager.mutex.withLock {
val negativeEvents =
AlfredManager.negativeCaseDao.fetchNegativeCase(AlfredManager.config.getEventBatchSize())
@@ -134,12 +163,12 @@ internal suspend fun sendNegativeCaseToServer(): Boolean {
if (events.size > 0) {
val request =
AnalyticsRequest(
baseAttribute = BaseAttribute(),
baseAttribute = baseAttributes,
events = events
)
val response = AlfredManager.networkRepository.sendNegativeCase(
DEFAULT_SEND_CRASH_URL,
AlfredManager.config.getApiKey(),
apiKey ?: AlfredManager.config.getApiKey(),
request
)
return if (
@@ -188,9 +217,16 @@ internal suspend fun sendNegativeCaseToServer(): Boolean {
return false
}
internal suspend fun sendFailureEventsToServer(): Boolean {
if (AlfredManager.config.getAlfredStatus() && AlfredManager.config.getEnableRecordingStatus()) {
internal suspend fun sendFailureEventsToServer(
apiKey: String? = null,
workManagerFlow: Boolean? = false
): Boolean {
if (workManagerFlow == true || (AlfredManager.config.getAlfredStatus() && AlfredManager.config.getEnableRecordingStatus())) {
try {
val failureAttributes = FailureAttributes()
if (workManagerFlow == true) {
AlfredManager.failureEventDao = AlfredManager.alfredDataBase.failureEventDao()
}
AlfredManager.mutex.withLock {
val failureEvents =
AlfredManager.failureEventDao.fetchFailureEvents(AlfredManager.config.getFailureEventBatchSize())
@@ -204,12 +240,12 @@ internal suspend fun sendFailureEventsToServer(): Boolean {
if (events.size > 0) {
val request =
FailureRequest(
failureAttributes = FailureAttributes(),
failureAttributes = failureAttributes,
events = events
)
val response = AlfredManager.networkRepository.sendFailure(
DEFAULT_SEND_FAILURE_POST_URL,
AlfredManager.config.getApiKey(),
apiKey ?: AlfredManager.config.getApiKey(),
request
)
return if (
@@ -244,7 +280,8 @@ internal fun sendAlfredSessionEvent(
dumpFlow: Boolean = false,
index: Int? = null,
currentZipName: String? = null,
latestScreenshotTimestamp: Long? = null
latestScreenshotTimestamp: Long? = null,
apiKey: String
) {
var request: SessionRequest? = null
if (dumpFlow) {
@@ -313,7 +350,7 @@ internal fun sendAlfredSessionEvent(
AlfredManager.coroutineScope.launch {
val response = AlfredManager.networkRepository.sendSession(
DEFAULT_SEND_SESSION_POST_URL,
AlfredManager.config.getApiKey(),
apiKey,
request
)
if (response.isSuccessful && response.code() == AlfredConstants.CODE_API_SUCCESS) {
@@ -348,9 +385,22 @@ internal fun sendAlfredSessionEvent(
return
}
internal suspend fun sendIngestMetric(): Boolean {
if (AlfredManager.config.getAlfredStatus() && AlfredManager.config.getMetricsApiEnableStatus()) {
internal suspend fun sendIngestMetric(
clientTs: Long? = null,
snapshotPerSecond: Int? = null,
apiKey: String? = null,
workManagerFlow: Boolean? = false
): Boolean {
if ((workManagerFlow == true) || (AlfredManager.config.getAlfredStatus() && AlfredManager.config.getEnableRecordingStatus())) {
try {
var baseAttributes = BaseAttribute()
if (workManagerFlow == true) {
baseAttributes = BaseAttribute(
clientTs = clientTs,
snapshotPerSecond = snapshotPerSecond
)
AlfredManager.apiMetricDao = AlfredManager.alfredDataBase.apiMetricDao()
}
AlfredManager.mutex.withLock {
val metricEventList =
AlfredManager.apiMetricDao.fetchApiMetric(AlfredManager.config.getEventBatchSize())
@@ -362,16 +412,15 @@ internal suspend fun sendIngestMetric(): Boolean {
val events: ArrayList<MetricAttribute> =
Gson().fromJson(detailsList.toString(), listType)
if (events.size > 0) {
val sessionId = events.first().sessionId
val request =
EventMetricRequest(
baseAttribute = BaseAttribute(),
baseAttribute = baseAttributes,
metricsAttribute = events
)
val response =
AlfredManager.networkRepository.eventMetric(
DEFAULT_INGEST_METRIC_URL,
AlfredManager.config.getApiKey(),
apiKey ?: AlfredManager.config.getApiKey(),
metricRequestBody = request
)
return if (
@@ -449,6 +498,7 @@ internal fun buildEvent(
val timeStamp = System.currentTimeMillis()
val eventData =
EventAttribute(
eventId = UUID.randomUUID().toString(),
eventName = eventName,
eventType = eventName,
eventTimestamp = timeStamp,
@@ -473,6 +523,7 @@ internal fun buildNegativeCaseEvent(
val timeStamp = System.currentTimeMillis()
val eventData =
EventAttribute(
eventId = UUID.randomUUID().toString(),
eventName = eventName,
eventType = eventName,
eventTimestamp = timeStamp,
@@ -495,7 +546,8 @@ internal fun buildFailureEvent(
errorStatusCode: Long,
errorMessage: String? = "",
errorName: String? = null,
clientTs: Long? = null
clientTs: Long? = null,
eventIdList: List<String>? = null
): FailureEvent {
val timeStamp = System.currentTimeMillis()
val eventData =
@@ -507,7 +559,8 @@ internal fun buildFailureEvent(
errorStatusCode = errorStatusCode,
errorMessage = errorMessage,
errorName = errorName,
clientTs = clientTs
clientTs = clientTs,
eventIdList = eventIdList
)
return FailureEvent(timeStamp, Gson().toJson(eventData))
}

View File

@@ -17,6 +17,7 @@ import com.navi.alfred.utils.AlfredConstants.POST_METHOD
import com.navi.alfred.utils.AlfredConstants.UPLOAD_TO_S3_FAILURE
import com.navi.alfred.utils.AlfredConstants.ZIP_ERROR
import com.navi.alfred.worker.AddFailureTask
import com.navi.alfred.worker.UploadEventsWorker
import com.navi.alfred.worker.UploadFileWorker
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody.Companion.asRequestBody
@@ -30,7 +31,8 @@ internal suspend fun getPreSignedUrl(
index: Int? = null,
workManagerFlow: Boolean? = false,
alfredEventIdForDumpFlow: String? = null,
latestScreenshotTimestamp: Long? = null
latestScreenshotTimestamp: Long? = null,
apiKey: String? = AlfredManager.config.getApiKey()
) {
val currentZipName: String
val latestScreenshotName: Long
@@ -45,7 +47,7 @@ internal suspend fun getPreSignedUrl(
}
val bucketKey = currentZipName.plus(AlfredConstants.ZIP_FILE_EXTENSION)
val response =
AlfredManager.networkRepository.getPreSignedUrl(bucketKey, AlfredManager.config.getApiKey())
AlfredManager.networkRepository.getPreSignedUrl(bucketKey, apiKey.toString())
if (response.isSuccessful && response.code() == AlfredConstants.CODE_API_SUCCESS) {
checkFileExists(zipFileName, AlfredManager.applicationContext)?.let { file ->
response.body()?.data?.let {
@@ -57,7 +59,8 @@ internal suspend fun getPreSignedUrl(
zipFileName,
workManagerFlow = workManagerFlow,
currentZipName = currentZipName,
latestScreenshotTimestamp = latestScreenshotName
latestScreenshotTimestamp = latestScreenshotName,
apiKey = apiKey.toString()
)
}
}
@@ -105,34 +108,43 @@ internal fun checkAndInitiateFileUploadWorkManager() {
AlfredManager.isAppInBackground = false
AlfredManager.hasRecordingStarted = false
AlfredManager.config.clearZipFileName()
val requestData =
val alfredSessionId = AlfredManager.config.getAlfredSessionId()
val sessionTimestamp = AlfredManager.config.getSessionStartRecordingTime()
val clientTs = AlfredManager.config.getEventStartRecordingTime()
val latestScreenshotTimestamp = AlfredManager.config.getLatestScreenshotTimestamp()
val snapshotPerSecond = AlfredManager.config.getSnapshotPerSecond()
val alfredEventId = AlfredManager.config.getAlfredEventId()
val apiKey = AlfredManager.config.getApiKey()
val requestDataForZip =
Data.Builder()
.putString(AlfredConstants.ALFRED_SESSION_ID, AlfredManager.config.getAlfredSessionId())
.putLong(
AlfredConstants.SESSION_START_RECORDING_TIME,
AlfredManager.config.getSessionStartRecordingTime()
)
.putLong(
AlfredConstants.EVENT_START_RECORDING_TIME,
AlfredManager.config.getEventStartRecordingTime() ?: 0L
)
.putString(AlfredConstants.ALFRED_SESSION_ID, alfredSessionId)
.putLong(AlfredConstants.SESSION_START_RECORDING_TIME, sessionTimestamp)
.putLong(AlfredConstants.EVENT_START_RECORDING_TIME, clientTs ?: 0L)
.putString(AlfredConstants.SCREENSHOT_LIST, Gson().toJson(screenShotList))
.putString(AlfredConstants.ALFRED_EVENT_ID, AlfredManager.config.getAlfredEventId())
.putLong(
AlfredConstants.LATEST_SCREENSHOT_TIMESTAMP,
AlfredManager.config.getLatestScreenshotTimestamp()
)
.putString(AlfredConstants.ALFRED_EVENT_ID, alfredEventId)
.putLong(AlfredConstants.LATEST_SCREENSHOT_TIMESTAMP, latestScreenshotTimestamp)
.putString(AlfredConstants.X_API_KEY, apiKey)
.build()
buildWorkManager(requestData)
buildWorkManagerForZip(requestDataForZip)
val requestDataForEvents =
Data.Builder()
.putString(AlfredConstants.X_API_KEY, apiKey)
.putLong(AlfredConstants.EVENT_START_RECORDING_TIME, clientTs ?: 0L)
.putInt(AlfredConstants.SNAPSHOT_PER_SECOND, snapshotPerSecond)
.build()
buildWorkManagerForEvents(requestDataForEvents)
}
internal fun buildWorkManager(requestData: Data) {
internal fun buildWorkManagerForZip(requestData: Data) {
val constraints =
Constraints.Builder()
.setRequiresBatteryNotLow(false)
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val uniqueWorkName = "YOUR_UNIQUE_WORK_NAME"
val uniqueWorkName = "SESSION_UPLOAD_WORK"
val uniqueWorkStatus =
WorkManager.getInstance(AlfredManager.applicationContext)
.getWorkInfosForUniqueWork(uniqueWorkName)
@@ -156,6 +168,36 @@ internal fun buildWorkManager(requestData: Data) {
}
}
internal fun buildWorkManagerForEvents(requestData: Data) {
val constraints =
Constraints.Builder()
.setRequiresBatteryNotLow(false)
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val uniqueWorkName = "EVENTS_UPLOAD_WORK"
val uniqueWorkStatus =
WorkManager.getInstance(AlfredManager.applicationContext)
.getWorkInfosForUniqueWork(uniqueWorkName)
.get()
if (uniqueWorkStatus.isNullOrEmpty()) {
val uniqueWorkRequest =
OneTimeWorkRequestBuilder<UploadEventsWorker>()
.setConstraints(constraints)
.setInputData(requestData)
.build()
WorkManager.getInstance(AlfredManager.applicationContext)
.beginUniqueWork(uniqueWorkName, ExistingWorkPolicy.KEEP, uniqueWorkRequest)
.enqueue()
} else {
val workRequest =
OneTimeWorkRequestBuilder<UploadEventsWorker>()
.setConstraints(constraints)
.setInputData(requestData)
.build()
WorkManager.getInstance(AlfredManager.applicationContext).enqueue(workRequest)
}
}
internal suspend fun uploadFile(
uploadFile: File,
url: String,
@@ -164,13 +206,14 @@ internal suspend fun uploadFile(
zipFileName: String,
workManagerFlow: Boolean? = false,
currentZipName: String? = "",
latestScreenshotTimestamp: Long? = 0L
latestScreenshotTimestamp: Long? = 0L,
apiKey: String
) {
val requestBody = uploadFile.asRequestBody("application/zip".toMediaTypeOrNull())
val uploadResponse = AlfredManager.networkRepository.uploadZipToS3(url, requestBody)
if (uploadResponse.isSuccessful && uploadResponse.code() == AlfredConstants.CODE_API_SUCCESS) {
uploadFile.delete()
sendAlfredSessionEvent(dumpFlow, index, currentZipName, latestScreenshotTimestamp)
sendAlfredSessionEvent(dumpFlow, index, currentZipName, latestScreenshotTimestamp, apiKey)
} else {
val failureEvent = buildFailureEvent(
errorType = ZIP_ERROR,

View File

@@ -32,14 +32,14 @@ internal fun getTouchEvent(
(difference(currentTouchEvent?.rawX, previousTouchEvent?.rawX) &&
difference(currentTouchEvent?.rawY, previousTouchEvent?.rawY))
) {
properties[AlfredConstants.START_X] = min(previousTouchEvent?.pointerPositionX ?: 0f, screenWidth.toFloat()).times(0.5f).toString()
properties[AlfredConstants.START_Y] = min(previousTouchEvent?.pointerPositionY ?: 0f, screenHeight.toFloat()).times(0.5f).toString()
properties[AlfredConstants.START_X] = min(previousTouchEvent?.rawX ?: 0f, screenWidth.toFloat()).times(0.5f).toString()
properties[AlfredConstants.START_Y] = min(previousTouchEvent?.rawY ?: 0f, screenHeight.toFloat()).times(0.5f).toString()
AlfredConstants.TOUCH_EVENT
} else {
properties[AlfredConstants.START_X] = min(previousTouchEvent?.pointerPositionX ?: 0f, screenWidth.toFloat()).times(0.5f).toString()
properties[AlfredConstants.START_Y] = min(previousTouchEvent?.pointerPositionY ?: 0f, screenHeight.toFloat()).times(0.5f).toString()
properties[AlfredConstants.END_X] = min(currentTouchEvent?.getX(pointerIndex) ?: 0f, screenWidth.toFloat()).times(0.5f).toString()
properties[AlfredConstants.END_Y] = min(currentTouchEvent?.getY(pointerIndex) ?: 0f, screenHeight.toFloat()).times(0.5f).toString()
properties[AlfredConstants.START_X] = min(previousTouchEvent?.rawX ?: 0f, screenWidth.toFloat()).times(0.5f).toString()
properties[AlfredConstants.START_Y] = min(previousTouchEvent?.rawY ?: 0f, screenHeight.toFloat()).times(0.5f).toString()
properties[AlfredConstants.END_X] = min(currentTouchEvent?.getRawX() ?: 0f, screenWidth.toFloat()).times(0.5f).toString()
properties[AlfredConstants.END_Y] = min(currentTouchEvent?.getRawY() ?: 0f, screenHeight.toFloat()).times(0.5f).toString()
AlfredConstants.SCROLL_EVENT
}
return Pair(eventName, properties)

View File

@@ -45,7 +45,7 @@ internal fun zip(_files: java.util.ArrayList<String>, zipFilePath: String?): Boo
zipFilePath?.let { path ->
if (File(path).exists()) return true
else {
File(path)
File(path).createNewFile()
}
}
var origin: BufferedInputStream? = null
@@ -75,7 +75,7 @@ internal fun zip(_files: java.util.ArrayList<String>, zipFilePath: String?): Boo
return null
}
internal fun checkDbBeforeStartRecording() {
internal fun checkDbBeforeStartRecording(apiKey: String? = AlfredManager.config.getApiKey()) {
AlfredManager.coroutineScope.launch(Dispatchers.IO) {
if (AlfredManager.screenShotDao.getScreenShotCount() > 0) {
AlfredManager.screenShotDao.deleteAllScreenShot()
@@ -95,7 +95,8 @@ internal fun checkDbBeforeStartRecording() {
dumpFlow = true,
index = index,
alfredEventIdForDumpFlow = DumpZipDetailsHelper.alfredEventId,
latestScreenshotTimestamp = DumpZipDetailsHelper.latestScreenshotTimestamp
latestScreenshotTimestamp = DumpZipDetailsHelper.latestScreenshotTimestamp,
apiKey = apiKey
)
} else {
AlfredManager.zipDetailsDao.deleteZipFileDetail(DumpZipDetailsHelper.id)
@@ -125,7 +126,8 @@ internal suspend fun toZipForWorkManager(
eventStartRecordingTime: Long? = null,
index: Int? = null,
alfredEventId: String,
latestScreenshotTimestamp: Long
latestScreenshotTimestamp: Long,
apiKey: String
) {
AlfredManager.sessionIdForCrash = alfredSessionId
AlfredManager.sessionStartRecordingTimeForCrash = sessionStartRecordingTime
@@ -147,7 +149,8 @@ internal suspend fun toZipForWorkManager(
workManagerFlow = true,
dumpFlow = true,
alfredEventIdForDumpFlow = alfredEventId,
latestScreenshotTimestamp = latestScreenshotTimestamp
latestScreenshotTimestamp = latestScreenshotTimestamp,
apiKey = apiKey
)
}
}
@@ -209,7 +212,7 @@ internal fun uploadWorkManagerFailedZip(alfredEventId: String? = null, latestScr
Gson().toJson(inputData.screenShots)
)
.build()
buildWorkManager(requestData)
buildWorkManagerForZip(requestData)
AlfredManager.zipUploadRetryCount += 1
AlfredManager.workFailureData.removeAt(0)
} else {

View File

@@ -0,0 +1,66 @@
/*
*
* * Copyright © 2023 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
package com.navi.alfred.worker
import android.content.Context
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import com.navi.alfred.AlfredManager
import com.navi.alfred.db.AlfredDatabaseHelper
import com.navi.alfred.utils.AlfredConstants
import com.navi.alfred.utils.sendEventsToServer
import com.navi.alfred.utils.sendFailureEventsToServer
import com.navi.alfred.utils.sendIngestMetric
import com.navi.alfred.utils.sendNegativeCaseToServer
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
class UploadEventsWorker(context: Context, workerParams: WorkerParameters) :
CoroutineWorker(context, workerParams) {
override suspend fun doWork(): Result =
withContext(Dispatchers.IO) {
val apiKey = inputData.getString(AlfredConstants.X_API_KEY)
val clientTs = inputData.getLong(AlfredConstants.EVENT_START_RECORDING_TIME, 0L)
val snapshotPerSecond = inputData.getInt(AlfredConstants.SNAPSHOT_PER_SECOND, 1)
try {
if (apiKey == null) {
Result.failure()
} else {
AlfredManager.alfredDataBase = AlfredDatabaseHelper.getAnalyticsDatabase(AlfredManager.applicationContext)
sendEventsToServer(
clientTs = clientTs,
snapshotPerSecond = snapshotPerSecond,
apiKey = apiKey,
workManagerFlow = true
)
sendIngestMetric(
clientTs = clientTs,
snapshotPerSecond = snapshotPerSecond,
apiKey = apiKey,
workManagerFlow = true
)
sendNegativeCaseToServer(
clientTs = clientTs,
snapshotPerSecond = snapshotPerSecond,
apiKey = apiKey,
workManagerFlow = true
)
sendFailureEventsToServer(
apiKey = apiKey,
workManagerFlow = true
)
Result.success()
}
} catch (e: Exception) {
e.printStackTrace()
Result.retry()
}
}
}

View File

@@ -45,6 +45,7 @@ class UploadFileWorker(context: Context, workerParams: WorkerParameters) :
.plus(AlfredConstants.ALFRED_EVENT_ID)
val latestScreenshotTimestamp =
inputData.getLong(AlfredConstants.LATEST_SCREENSHOT_TIMESTAMP, 0L)
val apiKey = inputData.getString(AlfredConstants.X_API_KEY).toString()
workFailureData.add(
WorkManagerFailureInputData(
alfredSessionId = alfredSessionId,
@@ -72,7 +73,8 @@ class UploadFileWorker(context: Context, workerParams: WorkerParameters) :
alfredSessionId = alfredSessionId,
eventStartRecordingTime = eventStartRecordingTime,
alfredEventId = alfredEventId,
latestScreenshotTimestamp = latestScreenshotTimestamp
latestScreenshotTimestamp = latestScreenshotTimestamp,
apiKey = apiKey
)
Result.success()
}