diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/common/usecase/ValidateVpaUseCase.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/common/usecase/ValidateVpaUseCase.kt index ffa754e6af..54463e92cc 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/common/usecase/ValidateVpaUseCase.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/common/usecase/ValidateVpaUseCase.kt @@ -8,6 +8,7 @@ package com.navi.pay.common.usecase import com.google.gson.Gson +import com.navi.base.utils.retry import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.NAVI_PAY_ENABLE_VALIDATE_VPA_CACHING import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.NAVI_PAY_VALIDATE_VPA_CACHING_TTL_IN_HOURS @@ -19,6 +20,9 @@ import com.navi.pay.common.repository.CommonRepository import com.navi.pay.common.validatevpa.model.view.ValidateVpaEntity import com.navi.pay.management.paytocontacts.model.network.PayToContactRequest import com.navi.pay.network.di.NaviPayGsonBuilder +import com.navi.pay.utils.DEFAULT_RETRY_COUNT +import com.navi.pay.utils.RETRY_INTERVAL_IN_SECONDS +import com.navi.pay.utils.isStatusCodeOfTypeException import javax.inject.Inject import kotlin.math.absoluteValue import org.joda.time.DateTime @@ -75,10 +79,24 @@ constructor( val apiResponse = when (request) { is ValidateVpaRequest -> { - commonRepository.validateVpa(validateVpaRequest = request) + retry( + retryCount = DEFAULT_RETRY_COUNT, + retryIntervalInSeconds = RETRY_INTERVAL_IN_SECONDS, + execute = { commonRepository.validateVpa(validateVpaRequest = request) }, + shouldRetry = { response -> + response.statusCode?.isStatusCodeOfTypeException() == true + } + ) } is PayToContactRequest -> { - commonRepository.payToContact(payToContactRequest = request) + retry( + retryCount = DEFAULT_RETRY_COUNT, + retryIntervalInSeconds = RETRY_INTERVAL_IN_SECONDS, + execute = { commonRepository.payToContact(payToContactRequest = request) }, + shouldRetry = { response -> + response.statusCode?.isStatusCodeOfTypeException() == true + } + ) } else -> { // This case should never happen diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/util/UPILiteCLHelper.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/util/UPILiteCLHelper.kt index 523bf6c509..36ad64a22c 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/util/UPILiteCLHelper.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/management/lite/util/UPILiteCLHelper.kt @@ -7,6 +7,7 @@ package com.navi.pay.management.lite.util +import com.navi.base.utils.retry import com.navi.common.network.models.isSuccessWithData import com.navi.pay.common.utils.DeviceInfoProvider import com.navi.pay.management.lite.models.network.LiteSyncRequest @@ -14,6 +15,8 @@ import com.navi.pay.management.lite.repository.UPILiteRepository import com.navi.pay.npcicl.NpciRepository import com.navi.pay.npcicl.UpiLiteBoundStatusResponse import com.navi.pay.onboarding.account.detail.model.view.LinkedAccountEntity +import com.navi.pay.utils.DEFAULT_RETRY_COUNT +import com.navi.pay.utils.RETRY_INTERVAL_IN_SECONDS import javax.inject.Inject import timber.log.Timber @@ -59,7 +62,13 @@ constructor( merchantCustomerId = deviceInfoProvider.getMerchantCustomerId() ) - val liteSyncResponse = upiLiteRepository.liteSync(liteSyncRequest = liteSyncRequest) + val liteSyncResponse = + retry( + retryCount = DEFAULT_RETRY_COUNT, + retryIntervalInSeconds = RETRY_INTERVAL_IN_SECONDS, + execute = { upiLiteRepository.liteSync(liteSyncRequest = liteSyncRequest) }, + shouldRetry = { !it.isSuccessWithData() } + ) if (liteSyncResponse.isSuccessWithData()) { return registerUPILiteState( diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/utils/NaviPayExt.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/utils/NaviPayExt.kt index e940ccd985..4ff775709a 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/utils/NaviPayExt.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/utils/NaviPayExt.kt @@ -683,3 +683,12 @@ fun Activity.launchPermissionSettingsScreen() { ) startActivity(intent) } + +/* + 2 digit custom error codes are considered for retrying the network call + This includes different exceptions viz. SocketTimeoutException, ConnectException etc. + For more ref, checkout: ApiConstants.kt +*/ +fun Int.isStatusCodeOfTypeException(): Boolean { + return this.toString().length == 2 +}