diff --git a/navi-alfred/build.gradle b/navi-alfred/build.gradle index 519633a..4bc220c 100644 --- a/navi-alfred/build.gradle +++ b/navi-alfred/build.gradle @@ -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' diff --git a/navi-alfred/src/main/java/com/navi/alfred/AlfredConfig.kt b/navi-alfred/src/main/java/com/navi/alfred/AlfredConfig.kt index 92bd864..8c7dad0 100644 --- a/navi-alfred/src/main/java/com/navi/alfred/AlfredConfig.kt +++ b/navi-alfred/src/main/java/com/navi/alfred/AlfredConfig.kt @@ -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() { diff --git a/navi-alfred/src/main/java/com/navi/alfred/AlfredManager.kt b/navi-alfred/src/main/java/com/navi/alfred/AlfredManager.kt index 4e71852..7cc9da7 100644 --- a/navi-alfred/src/main/java/com/navi/alfred/AlfredManager.kt +++ b/navi-alfred/src/main/java/com/navi/alfred/AlfredManager.kt @@ -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 = diff --git a/navi-alfred/src/main/java/com/navi/alfred/model/FailureRequest.kt b/navi-alfred/src/main/java/com/navi/alfred/model/FailureRequest.kt index 68d429d..681878a 100644 --- a/navi-alfred/src/main/java/com/navi/alfred/model/FailureRequest.kt +++ b/navi-alfred/src/main/java/com/navi/alfred/model/FailureRequest.kt @@ -17,13 +17,17 @@ data class Failure( @SerializedName("zip_name") val zipName: List? = 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? = 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() ) diff --git a/navi-alfred/src/main/java/com/navi/alfred/model/SessionRequest.kt b/navi-alfred/src/main/java/com/navi/alfred/model/SessionRequest.kt index 2e4004c..0e3c7ad 100644 --- a/navi-alfred/src/main/java/com/navi/alfred/model/SessionRequest.kt +++ b/navi-alfred/src/main/java/com/navi/alfred/model/SessionRequest.kt @@ -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, diff --git a/navi-alfred/src/main/java/com/navi/alfred/utils/AlfredConstants.kt b/navi-alfred/src/main/java/com/navi/alfred/utils/AlfredConstants.kt index 0723904..c5a869a 100644 --- a/navi-alfred/src/main/java/com/navi/alfred/utils/AlfredConstants.kt +++ b/navi-alfred/src/main/java/com/navi/alfred/utils/AlfredConstants.kt @@ -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" } \ No newline at end of file diff --git a/navi-alfred/src/main/java/com/navi/alfred/utils/EventUtils.kt b/navi-alfred/src/main/java/com/navi/alfred/utils/EventUtils.kt index 9e1a908..d3e0993 100644 --- a/navi-alfred/src/main/java/com/navi/alfred/utils/EventUtils.kt +++ b/navi-alfred/src/main/java/com/navi/alfred/utils/EventUtils.kt @@ -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 = 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 = mutableListOf() + val eventIdList: MutableList = 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 = 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? = 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)) } diff --git a/navi-alfred/src/main/java/com/navi/alfred/utils/UploadUtils.kt b/navi-alfred/src/main/java/com/navi/alfred/utils/UploadUtils.kt index b2b1b68..d5a5a26 100644 --- a/navi-alfred/src/main/java/com/navi/alfred/utils/UploadUtils.kt +++ b/navi-alfred/src/main/java/com/navi/alfred/utils/UploadUtils.kt @@ -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() + .setConstraints(constraints) + .setInputData(requestData) + .build() + WorkManager.getInstance(AlfredManager.applicationContext) + .beginUniqueWork(uniqueWorkName, ExistingWorkPolicy.KEEP, uniqueWorkRequest) + .enqueue() + } else { + val workRequest = + OneTimeWorkRequestBuilder() + .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, diff --git a/navi-alfred/src/main/java/com/navi/alfred/utils/UserBehaviourUtils.kt b/navi-alfred/src/main/java/com/navi/alfred/utils/UserBehaviourUtils.kt index 1da0ea9..38d8a24 100644 --- a/navi-alfred/src/main/java/com/navi/alfred/utils/UserBehaviourUtils.kt +++ b/navi-alfred/src/main/java/com/navi/alfred/utils/UserBehaviourUtils.kt @@ -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) diff --git a/navi-alfred/src/main/java/com/navi/alfred/utils/ZipUtils.kt b/navi-alfred/src/main/java/com/navi/alfred/utils/ZipUtils.kt index 4834313..0fed444 100644 --- a/navi-alfred/src/main/java/com/navi/alfred/utils/ZipUtils.kt +++ b/navi-alfred/src/main/java/com/navi/alfred/utils/ZipUtils.kt @@ -45,7 +45,7 @@ internal fun zip(_files: java.util.ArrayList, 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, 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 { diff --git a/navi-alfred/src/main/java/com/navi/alfred/worker/UploadEventsWorker.kt b/navi-alfred/src/main/java/com/navi/alfred/worker/UploadEventsWorker.kt new file mode 100644 index 0000000..ce64d20 --- /dev/null +++ b/navi-alfred/src/main/java/com/navi/alfred/worker/UploadEventsWorker.kt @@ -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() + } + } +} diff --git a/navi-alfred/src/main/java/com/navi/alfred/worker/UploadFileWorker.kt b/navi-alfred/src/main/java/com/navi/alfred/worker/UploadFileWorker.kt index 058874d..ff12b5d 100644 --- a/navi-alfred/src/main/java/com/navi/alfred/worker/UploadFileWorker.kt +++ b/navi-alfred/src/main/java/com/navi/alfred/worker/UploadFileWorker.kt @@ -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() }