TP-59178 | VKYC Waiting Screen Coroutine Job Cancellation Crash Fix (#10069)
This commit is contained in:
@@ -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
|
||||
)
|
||||
|
||||
@@ -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"
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user