NTP-7163 | Enhance CL to minimize the occurrence of null instances (#14118)
This commit is contained in:
@@ -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 =
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user