From 1b4e8b61d9a7c1e5c43bd206839429e3bfb2eff0 Mon Sep 17 00:00:00 2001 From: shankar yadav Date: Mon, 16 Dec 2024 16:44:33 +0530 Subject: [PATCH] NTP-7163 | Enhance CL to minimize the occurrence of null instances (#14118) --- .../FirebaseRemoteConfigHelper.kt | 2 + .../navi/pay/analytics/NaviPayAnalytics.kt | 12 ++++- .../com/navi/pay/npcicl/NpciClService.kt | 50 ++++++++++++++++--- 3 files changed, 55 insertions(+), 9 deletions(-) diff --git a/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt b/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt index 8e7cf0338c..aca51ebe6d 100644 --- a/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt +++ b/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt @@ -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 = diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/analytics/NaviPayAnalytics.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/analytics/NaviPayAnalytics.kt index f5cb182b10..c5c2166dc5 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/analytics/NaviPayAnalytics.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/analytics/NaviPayAnalytics.kt @@ -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 { diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/npcicl/NpciClService.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/npcicl/NpciClService.kt index bc3caaaea6..18d369c3bc 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/npcicl/NpciClService.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/npcicl/NpciClService.kt @@ -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() {