NTP-7163 | Enhance CL to minimize the occurrence of null instances (#14118)

This commit is contained in:
shankar yadav
2024-12-16 16:44:33 +05:30
committed by GitHub
parent 93883c982a
commit 1b4e8b61d9
3 changed files with 55 additions and 9 deletions

View File

@@ -137,6 +137,8 @@ object FirebaseRemoteConfigHelper {
"NAVI_PAY_REMOVE_TASK_ON_INTENT_PAYMENT_SUCCESS"
const val NAVI_PAY_REMOVE_APP_ON_INTENT_PAYMENT_SUCCESS =
"NAVI_PAY_REMOVE_APP_ON_INTENT_PAYMENT_SUCCESS"
const val NAVI_PAY_CL_MAX_RETRY_COUNT = "NAVI_PAY_CL_MAX_RETRY_COUNT"
const val NAVI_PAY_CL_RETRY_DISABLED = "NAVI_PAY_CL_RETRY_DISABLED"
// COMMON
const val LITMUS_EXPERIMENTS_CACHE_DURATION_IN_MILLIS =

View File

@@ -5680,16 +5680,24 @@ class NaviPayAnalytics private constructor() {
fun onServiceConnectedClServiceNull(
isOldClInstanceNull: Boolean,
isNewClInstanceNull: Boolean
isNewClInstanceNull: Boolean,
retryCount: Int,
) {
NaviTrackEvent.trackEventOnClickStream(
"NaviPay_Dev_NpciCl_ServiceConnectedClServiceNull",
mapOf(
"isOldClInstanceNull" to isOldClInstanceNull.toString(),
"isNewClInstanceNull" to isNewClInstanceNull.toString()
"isNewClInstanceNull" to isNewClInstanceNull.toString(),
"retryCount" to retryCount.toString()
)
)
}
fun onServiceConnectedClServiceNull() {
NaviTrackEvent.trackEventOnClickStream(
"NaviPay_Dev_NpciCl_ServiceConnectedClServiceNull"
)
}
}
companion object {

View File

@@ -8,12 +8,19 @@
package com.navi.pay.npcicl
import android.content.Context
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.NAVI_PAY_CL_MAX_RETRY_COUNT
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.NAVI_PAY_CL_RETRY_DISABLED
import com.navi.pay.analytics.NaviPayAnalytics
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
import javax.inject.Singleton
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import org.npci.upi.security.services.CLServices
@@ -29,6 +36,9 @@ class NpciClService @Inject constructor(@ApplicationContext private val context:
NaviPayAnalytics.INSTANCE.NaviPayClService()
suspend fun instance(): CLServices? {
clService?.let {
return it
}
mutex.withLock {
return suspendCoroutine { continuation ->
clService?.let {
@@ -47,18 +57,44 @@ class NpciClService @Inject constructor(@ApplicationContext private val context:
context,
object : ServiceConnectionStatusNotifier {
override fun serviceConnected(clServices: CLServices?) {
if (clServices == null) {
val clServiceGetInstance = CLServices.getClServicesInstance()
val isRetryDisabled =
FirebaseRemoteConfigHelper.getBoolean(NAVI_PAY_CL_RETRY_DISABLED)
if (
clServices != null ||
CLServices.getClServicesInstance() != null ||
isRetryDisabled
) {
clService = clServices ?: CLServices.getClServicesInstance()
continuation.resume(clService)
if (clService == null) {
naviPayAnalytics.onServiceConnectedClServiceNull()
}
naviPayAnalytics.onServiceConnected()
return
}
CoroutineScope(Dispatchers.Default).launch {
var clServiceGetInstance = CLServices.getClServicesInstance()
var retryCount = 0
val maxRetry =
FirebaseRemoteConfigHelper.getLong(
NAVI_PAY_CL_MAX_RETRY_COUNT,
10
)
while (clServiceGetInstance == null && retryCount < maxRetry) {
retryCount++
delay(100L)
clServiceGetInstance = CLServices.getClServicesInstance()
}
naviPayAnalytics.onServiceConnectedClServiceNull(
isOldClInstanceNull = clService == null,
isNewClInstanceNull = clServiceGetInstance == null
isNewClInstanceNull = clServiceGetInstance == null,
retryCount = retryCount
)
clService = clServiceGetInstance
} else {
clService = clServices
continuation.resume(clService)
naviPayAnalytics.onServiceConnected()
}
continuation.resume(clService)
naviPayAnalytics.onServiceConnected()
}
override fun serviceDisconnected() {