TP-59178 | VKYC Waiting Screen Coroutine Job Cancellation Crash Fix (#10069)

This commit is contained in:
Sanjay P
2024-03-08 20:42:02 +05:30
committed by GitHub
parent 67ae785def
commit 866894e65a
3 changed files with 46 additions and 10 deletions

View File

@@ -40,14 +40,20 @@ import com.navi.ap.screens.vkyc.utils.ErrorType
import com.navi.ap.screens.vkyc.utils.HMS_AUTH_TOKEN
import com.navi.ap.screens.vkyc.utils.HMS_SDK_SETTINGS_DATA
import com.navi.ap.screens.vkyc.utils.HMS_USER_NAME
import com.navi.ap.screens.vkyc.utils.SCREEN_NAME
import com.navi.ap.screens.vkyc.utils.VKYC_AGENT_CONNECTED_TIMEOUT
import com.navi.ap.screens.vkyc.utils.VKYC_AGENT_CONNECTED_TOAST
import com.navi.ap.screens.vkyc.utils.VKYC_AGENT_IMAGE_URL
import com.navi.ap.screens.vkyc.utils.VKYC_AGENT_JOINED
import com.navi.ap.screens.vkyc.utils.VKYC_AGENT_NAME
import com.navi.ap.screens.vkyc.utils.VKYC_AGENT_POLLING_RESPONSE
import com.navi.ap.screens.vkyc.utils.VKYC_AGENT_POLLING_STARTED
import com.navi.ap.screens.vkyc.utils.VKYC_AGENT_POLLING_TIMEOUT
import com.navi.ap.screens.vkyc.utils.VKYC_AGENT_STATUS
import com.navi.ap.screens.vkyc.utils.VKYC_ON_DESTROY
import com.navi.ap.screens.vkyc.utils.VKYC_ON_PAUSE
import com.navi.ap.screens.vkyc.utils.VKYC_ON_PAUSE_ON_CANCELLED_CALLED
import com.navi.ap.screens.vkyc.utils.VKYC_ON_RESUME
import com.navi.ap.screens.vkyc.utils.VKYC_SETTINGS_PREVIEW_PUT_URL
import com.navi.ap.screens.vkyc.utils.VKYC_SETTINGS_REFERENCE_ID
import com.navi.ap.screens.vkyc.utils.getVKYCBottomSheetFields
@@ -63,6 +69,7 @@ import com.navi.ap.utils.constants.ApNavigationActions
import com.navi.ap.utils.constants.CLIENT_REFERENCE_ID
import com.navi.ap.utils.constants.DEFAULT_SCREEN_STATE_ID
import com.navi.ap.utils.constants.UNDERSCORE_POLL
import com.navi.ap.utils.constants.VKYC_WAITING_SCREEN
import com.navi.ap.utils.initScreenEvent
import com.navi.ap.utils.logApEvent
import com.navi.base.utils.orElse
@@ -173,15 +180,19 @@ fun VKYCWaitingScreen(
val lifecycleEventObserver = LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_RESUME -> {
logApEvent(Pair(SCREEN_NAME, VKYC_WAITING_SCREEN), eventName = VKYC_ON_RESUME)
if (isInitialising) isInitialising = false else activity.finish()
}
Lifecycle.Event.ON_PAUSE -> {
logApEvent(Pair(SCREEN_NAME, VKYC_WAITING_SCREEN), eventName = VKYC_ON_PAUSE)
viewModel.stopApiPolling()
if (isNavigating.not()) {
logApEvent(Pair(SCREEN_NAME, VKYC_WAITING_SCREEN), eventName = VKYC_ON_PAUSE_ON_CANCELLED_CALLED)
viewModel.cancelVKYCCall()
}
}
Lifecycle.Event.ON_DESTROY -> {
logApEvent(Pair(SCREEN_NAME, VKYC_WAITING_SCREEN), eventName = VKYC_ON_DESTROY)
viewModel.stopApiPolling()
}
else -> {}
@@ -261,7 +272,6 @@ private fun handleVKYAgentAssignedResponseState(
eventName = VKYC_AGENT_POLLING_RESPONSE
)
if (vkycAgentAssignedResponse.data?.status == AGENT_JOINED) {
viewModel.stopApiPolling()
val hmsSdkSettingsData =
viewModel.handle.get<VKYCSettingsData>(HMS_SDK_SETTINGS_DATA)
val bundleData =
@@ -271,7 +281,7 @@ private fun handleVKYAgentAssignedResponseState(
vkycSettingsData = hmsSdkSettingsData,
clientReferenceId = viewModel.handle[CLIENT_REFERENCE_ID]
)
logApEvent(eventName = VKYC_AGENT_JOINED)
activity.navController.navigate(
VkycMeetingRoomScreenDestination(bundle = bundleData).route
)

View File

@@ -59,5 +59,8 @@ const val PL_PRE_VKYC_LANDED = "pl_pre_vKYC_Landed"
const val PL_PRE_VKYC_BACK_CLICKED = " pl_pre_vKYC_Back_Clicked"
const val VKYC_ON_RESUME = "VKYC_ON_RESUME"
const val VKYC_ON_PAUSE = "VKYC_ON_PAUSE"
const val VKYC_ON_PAUSE_ON_CANCELLED_CALLED = "VKYC_ON_PAUSE_ON_CANCELLED_CALLED"
const val VKYC_ON_DESTROY = "VKYC_ON_DESTROY"
const val CANCEL_VKYC_CALL = "CANCEL_VKYC_CALL"
const val VKYC_AGENT_JOINED = "VKYC_AGENT_JOINED"
const val COROUTINE_JOB_ON_COMPLETION_CALLED = "COROUTINE_JOB_ON_COMPLETION_CALLED"

View File

@@ -7,6 +7,9 @@
package com.navi.ap.utils
import com.navi.ap.screens.vkyc.utils.COROUTINE_JOB_ON_COMPLETION_CALLED
import com.navi.base.utils.orFalse
import com.navi.common.utils.Constants.ERROR_MESSAGE
import com.navi.common.utils.log
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineExceptionHandler
@@ -37,13 +40,23 @@ class PeriodicTaskScheduler(
}
private fun scheduleTask(): Flow<Unit> = flow {
delay(initialDelaySeconds * 1000)
repeat(maxAttempts) {
task()
delay(taskIntervalSeconds * 1000)
emit(Unit)
try {
delay(initialDelaySeconds * 1000)
repeat(maxAttempts) {
if (job?.isActive.orFalse()) {
task()
delay(taskIntervalSeconds * 1000)
emit(Unit)
}
}
onTimeout?.invoke()
} catch (e: Exception) {
logApEvent(
Pair(ERROR_MESSAGE, e.message.orEmpty()),
eventName = COROUTINE_JOB_ON_COMPLETION_CALLED
)
e.log()
}
onTimeout?.invoke()
}
fun startTask(
@@ -54,12 +67,22 @@ class PeriodicTaskScheduler(
job =
CoroutineScope(coroutineDispatcher + exceptionHandler).launch {
scheduleTask().collect { onResult?.invoke() }
}.apply {
invokeOnCompletion {
val exception: Exception? = it?.cause as? Exception
logApEvent(
Pair(ERROR_MESSAGE, exception?.message.orEmpty()),
eventName = COROUTINE_JOB_ON_COMPLETION_CALLED
)
}
}
}
fun stopTask() {
job?.cancel()
job = null
if (job?.isActive.orFalse()) {
job?.cancel()
job = null
}
}
companion object {