Tp 49444 send events to backend immediately on app kill (#72)
This commit is contained in:
@@ -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'
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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()
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user