diff --git a/android/app/src/main/java/com/naviapp/network/retrofit/NaviHttpClient.kt b/android/app/src/main/java/com/naviapp/network/retrofit/NaviHttpClient.kt index ccc242a7e9..a2b89a1377 100644 --- a/android/app/src/main/java/com/naviapp/network/retrofit/NaviHttpClient.kt +++ b/android/app/src/main/java/com/naviapp/network/retrofit/NaviHttpClient.kt @@ -10,6 +10,7 @@ package com.naviapp.network.retrofit import android.content.Context import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.HP_RETRY_INTERCEPTOR_ENABLED import com.navi.common.model.NetworkInfo import com.navi.common.network.BaseHttpClient import com.navi.common.network.retry.interceptor.RetryInterceptor @@ -24,8 +25,8 @@ class NaviHttpClient(networkInfo: NetworkInfo, context: Context) : val httpClientBuilder: OkHttpClient.Builder get() { val okHttpClientBuilder = baseHttpClientBuilder - if (BuildConfig.DEBUG) { - with(okHttpClientBuilder) { + with(okHttpClientBuilder) { + if (BuildConfig.DEBUG) { addInterceptor(loggingInterceptor()) addInterceptor( ChuckerInterceptor.Builder(NaviApplication.instance.applicationContext) @@ -37,9 +38,9 @@ class NaviHttpClient(networkInfo: NetworkInfo, context: Context) : .alwaysReadResponseBody(false) .build() ) - if (isRetryInterceptorEnabled()) { - addInterceptor(RetryInterceptor()) - } + } + if (isRetryInterceptorEnabled(HP_RETRY_INTERCEPTOR_ENABLED)) { + addInterceptor(RetryInterceptor()) } } return okHttpClientBuilder diff --git a/android/app/src/main/java/com/naviapp/network/retrofit/RetrofitService.kt b/android/app/src/main/java/com/naviapp/network/retrofit/RetrofitService.kt index fc63c00fa7..c4e3db1b01 100644 --- a/android/app/src/main/java/com/naviapp/network/retrofit/RetrofitService.kt +++ b/android/app/src/main/java/com/naviapp/network/retrofit/RetrofitService.kt @@ -109,11 +109,6 @@ import com.naviapp.payment.models.TransactionDetail import com.naviapp.screenOverlay.model.OverlayItemsStateUpdates import com.naviapp.screenOverlay.model.OverlayScreenStructure import com.naviapp.screenOverlay.model.ScreenOverlayActionUpdateRequest -import java.net.ConnectException -import java.net.SocketTimeoutException -import java.net.UnknownHostException -import javax.net.ssl.SSLHandshakeException -import javax.net.ssl.SSLPeerUnverifiedException import okhttp3.RequestBody import retrofit2.Response import retrofit2.http.Body @@ -143,6 +138,7 @@ interface RetrofitService { @Header(HEADER_X_TENANT_ID) tenantId: String, ): Response> + @RetryPolicy @POST("/login-service/v1/login") suspend fun userLogin( @Body loginRequest: UserLoginRequest, @@ -202,7 +198,9 @@ interface RetrofitService { @Query("subProduct") subProduct: String? = null, ): Response>> - @POST("/auth/v1/logout") suspend fun logout(): Response> + @RetryPolicy + @POST("/auth/v1/logout") + suspend fun logout(): Response> @GET("/login-settings") suspend fun fetchLoginSettings(): Response> @@ -505,6 +503,7 @@ interface RetrofitService { @Body deviceDetail: DeviceDetail, ): Response> + @RetryPolicy @GET("/forge/screen/{screenId}") suspend fun fetchForgeScreen( @Header(X_IS_SCREEN_LOCK_ENABLED) isScreenLockEnabled: Boolean? = null, @@ -533,6 +532,7 @@ interface RetrofitService { @Body request: AlchemistScreenRequest?, ): Response> + @RetryPolicy @GET("/forge/screen/{screenId}") suspend fun fetchNotificationForgeScreen( @Header("Accept-Encoding") acceptEncoding: String, @@ -546,17 +546,7 @@ interface RetrofitService { @Body notificationStatusRequest: List, ): Response> - @RetryPolicy( - retryCount = 3, - retryOn = - [ - SocketTimeoutException::class, - UnknownHostException::class, - ConnectException::class, - SSLHandshakeException::class, - SSLPeerUnverifiedException::class, - ], - ) + @RetryPolicy @GET("/forge/screen/{screenId}") suspend fun fetchInsuranceTabForgeScreen( @Header("Accept-Encoding") acceptEncoding: String, @@ -564,6 +554,7 @@ interface RetrofitService { @Path("screenId") screenId: String, ): Response> + @RetryPolicy @GET("/forge/screen/{screenId}") suspend fun fetchTrialDashboardForgeScreen( @Header("Accept-Encoding") acceptEncoding: String, @@ -577,6 +568,7 @@ interface RetrofitService { @QueryMap queryMap: Map, ): Response + @RetryPolicy @GET("/forge/screen/{screenId}") suspend fun fetchLendingPermissionScreenResponse( @Header("Accept-Encoding") acceptEncoding: String, @@ -610,7 +602,7 @@ interface RetrofitService { ): Response> @GET("/alchemist/inflate/v2/{screenId}") - @RetryPolicy(retryCount = 3) + @RetryPolicy suspend fun fetchInvestmentTabScreenResponse( @Header("Accept-Encoding") acceptEncoding: String, @Header("X-Target") target: String, @@ -628,7 +620,7 @@ interface RetrofitService { @Header(HEADER_X_PLATFORM) platform: String = Constants.OS_ANDROID, ): Response> - @RetryPolicy(retryCount = 3) + @RetryPolicy @PATCH("/nudge/state") suspend fun updateScreenOverlayElementState( @Body request: OverlayItemsStateUpdates diff --git a/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/retrofit/NaviApHttpClient.kt b/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/retrofit/NaviApHttpClient.kt index a62b483561..57ba7eede1 100644 --- a/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/retrofit/NaviApHttpClient.kt +++ b/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/retrofit/NaviApHttpClient.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2023-2024 by Navi Technologies Limited + * * Copyright © 2023-2025 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -13,8 +13,11 @@ import com.chuckerteam.chucker.api.ChuckerInterceptor import com.navi.ap.BuildConfig import com.navi.ap.network.retrofit.interceptor.PlatformInterceptor import com.navi.ap.network.utils.NetworkInfoProvider +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.AP_RETRY_INTERCEPTOR_ENABLED import com.navi.common.model.NetworkInfo import com.navi.common.network.BaseHttpClient +import com.navi.common.network.retry.interceptor.RetryInterceptor +import com.navi.common.network.retry.interceptor.isRetryInterceptorEnabled import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject import okhttp3.OkHttpClient @@ -44,6 +47,9 @@ constructor( ) } addInterceptor(platformInterceptor) + if (isRetryInterceptorEnabled(AP_RETRY_INTERCEPTOR_ENABLED)) { + addInterceptor(RetryInterceptor()) + } } return okHttpClientBuilder } diff --git a/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/retrofit/service/APRetrofitService.kt b/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/retrofit/service/APRetrofitService.kt index dfdd5eccb4..ecc46214a1 100644 --- a/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/retrofit/service/APRetrofitService.kt +++ b/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/retrofit/service/APRetrofitService.kt @@ -18,6 +18,7 @@ import com.navi.ap.network.model.FillApplicationRequestBody import com.navi.base.utils.EMPTY import com.navi.common.model.ModuleName import com.navi.common.network.models.GenericResponse +import com.navi.common.network.retry.annotations.RetryPolicy import com.navi.common.utils.Constants.GZIP import com.navi.common.utils.Constants.OS_ANDROID import retrofit2.Response @@ -57,6 +58,7 @@ interface APRetrofitService : CoinsLambdaService, GenericLambdaService { @Header("X-Platform") applicationHash: String = OS_ANDROID, ): Response> + @RetryPolicy @POST("/arc-warden/api/v3/application") suspend fun createApplicationAndGetCta( @Body applicationRequestBody: ApplicationRequestBody, diff --git a/android/navi-amc/src/main/java/com/navi/amc/network/retrofit/NaviHttpClient.kt b/android/navi-amc/src/main/java/com/navi/amc/network/retrofit/NaviHttpClient.kt index 712f4066d8..c67047fe7d 100644 --- a/android/navi-amc/src/main/java/com/navi/amc/network/retrofit/NaviHttpClient.kt +++ b/android/navi-amc/src/main/java/com/navi/amc/network/retrofit/NaviHttpClient.kt @@ -11,7 +11,6 @@ import android.content.Context import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor import com.navi.amc.BuildConfig -import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.NAVI_AMC_RETRY_POLICY_ENABLED import com.navi.common.model.NetworkInfo import com.navi.common.network.BaseHttpClient @@ -38,10 +37,7 @@ class NaviHttpClient(networkInfo: NetworkInfo, private val context: Context) : ) } } - if ( - isRetryInterceptorEnabled() && - FirebaseRemoteConfigHelper.getBoolean(NAVI_AMC_RETRY_POLICY_ENABLED) - ) { + if (isRetryInterceptorEnabled(NAVI_AMC_RETRY_POLICY_ENABLED)) { okHttpClientBuilder.addInterceptor(RetryInterceptor()) } diff --git a/android/navi-amc/src/main/java/com/navi/amc/network/retrofit/RetrofitService.kt b/android/navi-amc/src/main/java/com/navi/amc/network/retrofit/RetrofitService.kt index ca37118122..9e211778a4 100644 --- a/android/navi-amc/src/main/java/com/navi/amc/network/retrofit/RetrofitService.kt +++ b/android/navi-amc/src/main/java/com/navi/amc/network/retrofit/RetrofitService.kt @@ -63,6 +63,7 @@ interface RetrofitService { @GET("/amc/checker/CVL_KYC_CHECK") suspend fun fetchCheckerData(): Response> + @RetryPolicy @GET("/kyc/hpc-pan-redirection-page") suspend fun fetchHpcPanRedirectionData(): Response> @@ -305,6 +306,7 @@ interface RetrofitService { @Query("fundCategory") fundCategory: String? ): Response> + @RetryPolicy @GET(FUND_LIST_DATA_V3) suspend fun fetchFundListDataV3( @Query("fundCategory") fundCategory: String? @@ -341,6 +343,7 @@ interface RetrofitService { @Query("redemptionOrderId") redemptionOrderId: String ): Response> + @RetryPolicy @GET("/my-investment/tabs") suspend fun fetchMyInvestmentsTabs( @Query("tab") tab: String?, @@ -396,7 +399,7 @@ interface RetrofitService { ): Response>> @GET("/fund/fund-details") - @RetryPolicy(retryCount = 3) + @RetryPolicy suspend fun fetchFundDetails( @Query("isin") isin: String ): Response> @@ -544,6 +547,7 @@ interface RetrofitService { @Body map: Map? ): Response> + @RetryPolicy @GET("/fund/v1/fund-graph/{isin}") suspend fun fetchFundGraphData( @Path("isin") isin: String?, diff --git a/android/navi-bbps/src/main/kotlin/com/navi/bbps/network/NaviBbpsHttpClient.kt b/android/navi-bbps/src/main/kotlin/com/navi/bbps/network/NaviBbpsHttpClient.kt index d80bcdf564..7505477ecf 100644 --- a/android/navi-bbps/src/main/kotlin/com/navi/bbps/network/NaviBbpsHttpClient.kt +++ b/android/navi-bbps/src/main/kotlin/com/navi/bbps/network/NaviBbpsHttpClient.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2024 by Navi Technologies Limited + * * Copyright © 2024-2025 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -11,8 +11,11 @@ import android.content.Context import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor import com.navi.bbps.BuildConfig +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.BBPS_RETRY_INTERCEPTOR_ENABLED import com.navi.common.model.NetworkInfo import com.navi.common.network.BaseHttpClient +import com.navi.common.network.retry.interceptor.RetryInterceptor +import com.navi.common.network.retry.interceptor.isRetryInterceptorEnabled import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor @@ -21,8 +24,8 @@ class NaviBbpsHttpClient(val networkInfo: NetworkInfo, private val context: Cont val httpClientBuilder: OkHttpClient.Builder get() { val okHttpClientBuilder = baseHttpClientBuilder - if (BuildConfig.DEBUG) { - with(okHttpClientBuilder) { + with(okHttpClientBuilder) { + if (BuildConfig.DEBUG) { addInterceptor(loggingInterceptor()) addInterceptor( ChuckerInterceptor.Builder(context) @@ -33,6 +36,9 @@ class NaviBbpsHttpClient(val networkInfo: NetworkInfo, private val context: Cont .build() ) } + if (isRetryInterceptorEnabled(BBPS_RETRY_INTERCEPTOR_ENABLED)) { + addInterceptor(RetryInterceptor()) + } } return okHttpClientBuilder } diff --git a/android/navi-bbps/src/main/kotlin/com/navi/bbps/network/service/NaviBbpsRetrofitService.kt b/android/navi-bbps/src/main/kotlin/com/navi/bbps/network/service/NaviBbpsRetrofitService.kt index e44897b6d9..19e1008ce8 100644 --- a/android/navi-bbps/src/main/kotlin/com/navi/bbps/network/service/NaviBbpsRetrofitService.kt +++ b/android/navi-bbps/src/main/kotlin/com/navi/bbps/network/service/NaviBbpsRetrofitService.kt @@ -35,6 +35,7 @@ import com.navi.bbps.feature.transactiondetails.model.network.BbpsBillAcknowledg import com.navi.bbps.feature.transactiondetails.model.network.BbpsTransactionStatusResponse import com.navi.common.alchemist.model.AlchemistScreenDefinition import com.navi.common.network.models.GenericResponse +import com.navi.common.network.retry.annotations.RetryPolicy import com.navi.rr.common.models.ABSettings import retrofit2.Response import retrofit2.http.Body @@ -68,6 +69,7 @@ interface NaviBbpsRetrofitService { @Path("savedBillId") savedBillId: String ): Response> + @RetryPolicy @POST("/billpay-gateway/$NAVI_BBPS_API_VERSION/billpay/categories/{categoryId}/billers") suspend fun getBillers( @Path("categoryId") categoryId: String, @@ -85,6 +87,7 @@ interface NaviBbpsRetrofitService { @Path("billerId") billerId: String ): Response> + @RetryPolicy @POST("/billpay-gateway/$NAVI_BBPS_API_VERSION_2/billpay/bill-details") suspend fun getBillDetails( @Body billDetailsRequest: BillDetailsRequest @@ -95,6 +98,7 @@ interface NaviBbpsRetrofitService { @Path("savedBillId") savedBillId: String ): Response> + @RetryPolicy @POST("/billpay-gateway/$NAVI_BBPS_API_VERSION/billpay/bill-payment-request") suspend fun fetchPaymentToken( @Body payBillRequest: PayBillRequest @@ -122,12 +126,14 @@ interface NaviBbpsRetrofitService { suspend fun getOperatorCircleMappingFromPhoneSeries(): Response> + @RetryPolicy @POST("/billpay-gateway/$NAVI_BBPS_API_VERSION/billpay/phonenumber-operator-circle") suspend fun getOperatorCircleMappingForPhoneNumber( @Body phoneNumberToOperatorCircleCodeMappingRequest: PhoneNumberToOperatorCircleCodeMappingRequest ): Response> + @RetryPolicy @GET("/billpay-gateway/$NAVI_BBPS_API_VERSION/billpay/prepaid/plans/all") suspend fun fetchAllPrepaidPlans(): Response> @@ -142,6 +148,7 @@ interface NaviBbpsRetrofitService { @GET("/billpay-gateway/$NAVI_BBPS_API_VERSION/billpay/reward-details") suspend fun getRewardDetails(): Response> + @RetryPolicy @GET("/alchemist/inflate/{screenId}") suspend fun fetchAlchemistScreenUiTronConfigs( @Header("Accept-Encoding") acceptEncoding: String, @@ -161,6 +168,7 @@ interface NaviBbpsRetrofitService { @Body category: Map = mutableMapOf() ): Response> + @RetryPolicy @GET("gullak/v1/discount/coin") suspend fun fetchCoinDiscount( @Query("product") product: String = "BBPS" diff --git a/android/navi-chat/src/main/java/com/navi/chat/network/retrofit/NaviChatHttpClient.kt b/android/navi-chat/src/main/java/com/navi/chat/network/retrofit/NaviChatHttpClient.kt index 4d267f5421..8e21c00d94 100644 --- a/android/navi-chat/src/main/java/com/navi/chat/network/retrofit/NaviChatHttpClient.kt +++ b/android/navi-chat/src/main/java/com/navi/chat/network/retrofit/NaviChatHttpClient.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2020-2023 by Navi Technologies Limited + * * Copyright © 2020-2025 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -11,11 +11,14 @@ import android.content.Context import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor import com.navi.chat.BuildConfig +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.CHAT_RETRY_INTERCEPTOR_ENABLED import com.navi.common.model.ModuleName import com.navi.common.model.NetworkInfo import com.navi.common.network.ApiConstants import com.navi.common.network.BaseHttpClient import com.navi.common.network.handleException +import com.navi.common.network.retry.interceptor.RetryInterceptor +import com.navi.common.network.retry.interceptor.isRetryInterceptorEnabled import java.io.IOException import okhttp3.* import okhttp3.MediaType.Companion.toMediaTypeOrNull @@ -26,8 +29,8 @@ class NaviChatHttpClient(networkInfo: NetworkInfo, private val context: Context) val httpClientBuilder: OkHttpClient.Builder get() { val okHttpClientBuilder = baseHttpClientBuilder - if (BuildConfig.DEBUG) { - with(okHttpClientBuilder) { + with(okHttpClientBuilder) { + if (BuildConfig.DEBUG) { addInterceptor(loggingInterceptor()) addInterceptor( ChuckerInterceptor.Builder(context) @@ -38,6 +41,9 @@ class NaviChatHttpClient(networkInfo: NetworkInfo, private val context: Context) .build() ) } + if (isRetryInterceptorEnabled(CHAT_RETRY_INTERCEPTOR_ENABLED)) { + addInterceptor(RetryInterceptor()) + } } okHttpClientBuilder.addInterceptor(customChatHeaderInterceptor) return okHttpClientBuilder diff --git a/android/navi-coin/src/main/java/com/navi/coin/network/CoinHttpClient.kt b/android/navi-coin/src/main/java/com/navi/coin/network/CoinHttpClient.kt index 311005a923..4b5a8c5436 100644 --- a/android/navi-coin/src/main/java/com/navi/coin/network/CoinHttpClient.kt +++ b/android/navi-coin/src/main/java/com/navi/coin/network/CoinHttpClient.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2024 by Navi Technologies Limited + * * Copyright © 2024-2025 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -11,6 +11,7 @@ import android.content.Context import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor import com.navi.coin.BuildConfig +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.COIN_RETRY_INTERCEPTOR_ENABLED import com.navi.common.model.NetworkInfo import com.navi.common.network.BaseHttpClient import com.navi.common.network.retry.interceptor.RetryInterceptor @@ -37,7 +38,8 @@ class CoinHttpClient(networkInfo: NetworkInfo, private val context: Context) : ) } } - if (isRetryInterceptorEnabled()) okHttpClientBuilder.addInterceptor(RetryInterceptor()) + if (isRetryInterceptorEnabled(COIN_RETRY_INTERCEPTOR_ENABLED)) + okHttpClientBuilder.addInterceptor(RetryInterceptor()) return okHttpClientBuilder } diff --git a/android/navi-coin/src/main/java/com/navi/coin/network/RetrofitService.kt b/android/navi-coin/src/main/java/com/navi/coin/network/RetrofitService.kt index e65b2ee368..d21f77bc31 100644 --- a/android/navi-coin/src/main/java/com/navi/coin/network/RetrofitService.kt +++ b/android/navi-coin/src/main/java/com/navi/coin/network/RetrofitService.kt @@ -22,9 +22,6 @@ import com.navi.common.network.models.GenericResponse import com.navi.common.network.retry.annotations.RetryPolicy import com.navi.rr.common.models.ABSettings import com.navi.rr.referral.models.ReferralContactList -import java.net.ConnectException -import java.net.SocketTimeoutException -import java.net.UnknownHostException import retrofit2.Response import retrofit2.http.Body import retrofit2.http.GET @@ -51,11 +48,7 @@ interface RetrofitService { ): Response> @GET("/forge/screen/{screenId}") - @RetryPolicy( - retryCount = 3, - retryOn = - [SocketTimeoutException::class, UnknownHostException::class, ConnectException::class], - ) + @RetryPolicy suspend fun fetchScreenUiTronConfigs( @Header("Accept-Encoding") acceptEncoding: String, @Header("X-Target") target: String, @@ -63,7 +56,7 @@ interface RetrofitService { ): Response> @GET("/alchemist/inflate/{screenId}") - @RetryPolicy(retryCount = 3) + @RetryPolicy suspend fun fetchAlchemistScreenUiTronConfigs( @Header("Accept-Encoding") acceptEncoding: String, @Header("X-Target") target: String, 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 194ecff363..9bd47c05bb 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,7 @@ object FirebaseRemoteConfigHelper { const val LOW_NETWORK_SIGNAL_THRESHOLD = "LOW_NETWORK_SIGNAL_THRESHOLD" const val LOW_NETWORK_BANDWIDTH_THRESHOLD = "LOW_NETWORK_BANDWIDTH_THRESHOLD" const val LOW_NETWORK_SPEED_THRESHOLD = "LOW_NETWORK_SPEED_THRESHOLD" + const val API_RETRY_COUNT = "API_RETRY_COUNT" // GI const val NAVI_GI_RETRY_POLICY_ENABLED = "NAVI_GI_RETRY_POLICY_ENABLED" @@ -210,9 +211,20 @@ object FirebaseRemoteConfigHelper { const val WEB_REDIRECTION_SMS_UPLOADED_DELAY_IN_MILLIS = "WEB_REDIRECTION_SMS_UPLOADED_DELAY_IN_MILLIS" - const val RETRY_INTERCEPTOR_ENABLED = "RETRY_INTERCEPTOR_ENABLED" const val ROOT_CA_ADDITION_TARGET_SDK = "ROOT_CA_ADDITION_TARGET_SDK" + // Api Retry constants + const val RETRY_INTERCEPTOR_ENABLED = "RETRY_INTERCEPTOR_ENABLED" + const val UPI_RETRY_INTERCEPTOR_ENABLED = "UPI_RETRY_INTERCEPTOR_ENABLED" + const val BBPS_RETRY_INTERCEPTOR_ENABLED = "BBPS_RETRY_INTERCEPTOR_ENABLED" + const val CHAT_RETRY_INTERCEPTOR_ENABLED = "CHAT_RETRY_INTERCEPTOR_ENABLED" + const val AP_RETRY_INTERCEPTOR_ENABLED = "AP_RETRY_INTERCEPTOR_ENABLED" + const val RR_RETRY_INTERCEPTOR_ENABLED = "RR_RETRY_INTERCEPTOR_ENABLED" + const val CYCS_RETRY_INTERCEPTOR_ENABLED = "CYCS_RETRY_INTERCEPTOR_ENABLED" + const val COIN_RETRY_INTERCEPTOR_ENABLED = "COIN_RETRY_INTERCEPTOR_ENABLED" + const val HP_RETRY_INTERCEPTOR_ENABLED = "HP_RETRY_INTERCEPTOR_ENABLED" + const val MM_RETRY_INTERCEPTOR_ENABLED = "MM_RETRY_INTERCEPTOR_ENABLED" + const val ANR_MONITOR_ENABLED_EXPERIMENT = "ANR_MONITOR_ENABLED_EXPERIMENT" // Rewards X-target migration configs diff --git a/android/navi-common/src/main/java/com/navi/common/network/retrofit/CommonHttpClient.kt b/android/navi-common/src/main/java/com/navi/common/network/retrofit/CommonHttpClient.kt index 8c7234af53..ecc88722a2 100644 --- a/android/navi-common/src/main/java/com/navi/common/network/retrofit/CommonHttpClient.kt +++ b/android/navi-common/src/main/java/com/navi/common/network/retrofit/CommonHttpClient.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2021-2022 by Navi Technologies Limited + * * Copyright © 2021-2025 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -13,6 +13,8 @@ import com.chuckerteam.chucker.api.ChuckerInterceptor import com.navi.common.BuildConfig import com.navi.common.model.NetworkInfo import com.navi.common.network.BaseHttpClient +import com.navi.common.network.retry.interceptor.RetryInterceptor +import com.navi.common.network.retry.interceptor.isRetryInterceptorEnabled import okhttp3.Interceptor import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor @@ -22,8 +24,8 @@ class CommonHttpClient(networkInfo: NetworkInfo, private val context: Context) : val httpClientBuilder: OkHttpClient.Builder get() { val okHttpClientBuilder = baseHttpClientBuilder - if (BuildConfig.DEBUG) { - with(okHttpClientBuilder) { + with(okHttpClientBuilder) { + if (BuildConfig.DEBUG) { addInterceptor(loggingInterceptor()) addInterceptor( ChuckerInterceptor.Builder(context) @@ -34,6 +36,9 @@ class CommonHttpClient(networkInfo: NetworkInfo, private val context: Context) : .build() ) } + if (isRetryInterceptorEnabled()) { + addInterceptor(RetryInterceptor()) + } } return okHttpClientBuilder diff --git a/android/navi-common/src/main/java/com/navi/common/network/retry/annotations/RetryPolicy.kt b/android/navi-common/src/main/java/com/navi/common/network/retry/annotations/RetryPolicy.kt index 0d26f05781..d26c538209 100644 --- a/android/navi-common/src/main/java/com/navi/common/network/retry/annotations/RetryPolicy.kt +++ b/android/navi-common/src/main/java/com/navi/common/network/retry/annotations/RetryPolicy.kt @@ -8,8 +8,11 @@ package com.navi.common.network.retry.annotations import java.net.ConnectException +import java.net.SocketException import java.net.SocketTimeoutException import java.net.UnknownHostException +import javax.net.ssl.SSLHandshakeException +import javax.net.ssl.SSLPeerUnverifiedException import kotlin.reflect.KClass /** @@ -21,12 +24,19 @@ import kotlin.reflect.KClass * @property retryCount The number of times the function should be retried upon failure. Default * is 0. * @property retryOn An array of exception classes that should trigger a retry. Defaults are - * [SocketTimeoutException::class, UnknownHostException::class, ConnectException::class]. + * [SocketTimeoutException::class, UnknownHostException::class, ConnectException::class, SSLPeerUnverifiedException::class, SocketException::class]. */ @Target(AnnotationTarget.FUNCTION) @Retention(AnnotationRetention.RUNTIME) annotation class RetryPolicy( - val retryCount: Int = 1, + val retryCount: Int = -1, val retryOn: Array> = - [SocketTimeoutException::class, UnknownHostException::class, ConnectException::class], + [ + SocketTimeoutException::class, + UnknownHostException::class, + ConnectException::class, + SSLHandshakeException::class, + SSLPeerUnverifiedException::class, + SocketException::class, + ], ) diff --git a/android/navi-common/src/main/java/com/navi/common/network/retry/interceptor/RetryInterceptor.kt b/android/navi-common/src/main/java/com/navi/common/network/retry/interceptor/RetryInterceptor.kt index 4b06533439..01bd6e7c20 100644 --- a/android/navi-common/src/main/java/com/navi/common/network/retry/interceptor/RetryInterceptor.kt +++ b/android/navi-common/src/main/java/com/navi/common/network/retry/interceptor/RetryInterceptor.kt @@ -9,9 +9,9 @@ package com.navi.common.network.retry.interceptor import com.navi.base.utils.isNotNull import com.navi.base.utils.isNull -import com.navi.base.utils.orFalse import com.navi.base.utils.orZero import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.API_RETRY_COUNT import com.navi.common.network.retry.annotations.RetryPolicy import com.navi.common.network.retry.utils.RetryManager import com.navi.common.utils.CommonNaviAnalytics @@ -33,7 +33,7 @@ class RetryInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val request = chain.request() - val tag = request.getAnnotation() ?: return chain.proceed(request) + val tag = getRequestRetryTag(request) ?: return chain.proceed(request) return handleRetryableRequest(chain, request, tag) } @@ -112,11 +112,32 @@ class RetryInterceptor : Interceptor { private fun shouldRetry(tag: RetryPolicy, exception: Exception) = tag.retryOn.any { it.isInstance(exception) } + + /** + * Retrieves the retry policy for a given request. + * + * This method checks if the request is annotated with a `RetryPolicy`. If the annotation is + * present, it uses the defined retry count or fetches the retry count from Firebase Remote + * Config. If no retry policy is defined, the method returns null. + * + * @param request The request for which the retry policy is to be retrieved. + * @return A `RetryPolicy` object if the request is retryable, or null if no retry policy is + * defined. + */ + private fun getRequestRetryTag(request: Request): RetryPolicy? { + val retryPolicy = request.getAnnotation() ?: return null + val retryCount = + if (retryPolicy.retryCount > 0) { + retryPolicy.retryCount + } else { + FirebaseRemoteConfigHelper.getLong(API_RETRY_COUNT, 1L).toInt() + } + return RetryPolicy(retryCount = retryCount, retryOn = retryPolicy.retryOn) + } } -fun isRetryInterceptorEnabled(): Boolean { - return FirebaseRemoteConfigHelper.getBoolean( - FirebaseRemoteConfigHelper.RETRY_INTERCEPTOR_ENABLED - ) - .orFalse() +fun isRetryInterceptorEnabled( + key: String = FirebaseRemoteConfigHelper.RETRY_INTERCEPTOR_ENABLED +): Boolean { + return FirebaseRemoteConfigHelper.getBoolean(key) } diff --git a/android/navi-cycs/src/main/kotlin/com/navi/cycs/network/CycsHttpClient.kt b/android/navi-cycs/src/main/kotlin/com/navi/cycs/network/CycsHttpClient.kt index bb3dc74740..e460357fcd 100644 --- a/android/navi-cycs/src/main/kotlin/com/navi/cycs/network/CycsHttpClient.kt +++ b/android/navi-cycs/src/main/kotlin/com/navi/cycs/network/CycsHttpClient.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2024 by Navi Technologies Limited + * * Copyright © 2024-2025 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -10,8 +10,11 @@ package com.navi.cycs.network import android.content.Context import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.CYCS_RETRY_INTERCEPTOR_ENABLED import com.navi.common.model.NetworkInfo import com.navi.common.network.BaseHttpClient +import com.navi.common.network.retry.interceptor.RetryInterceptor +import com.navi.common.network.retry.interceptor.isRetryInterceptorEnabled import com.navi.cycs.BuildConfig import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor @@ -21,8 +24,8 @@ class CycsHttpClient(val networkInfo: NetworkInfo, private val context: Context) val httpClientBuilder: OkHttpClient.Builder get() { val okHttpClientBuilder = baseHttpClientBuilder - if (BuildConfig.DEBUG) { - with(okHttpClientBuilder) { + with(okHttpClientBuilder) { + if (BuildConfig.DEBUG) { addInterceptor(loggingInterceptor()) addInterceptor( ChuckerInterceptor.Builder(context) @@ -33,6 +36,9 @@ class CycsHttpClient(val networkInfo: NetworkInfo, private val context: Context) .build() ) } + if (isRetryInterceptorEnabled(CYCS_RETRY_INTERCEPTOR_ENABLED)) { + addInterceptor(RetryInterceptor()) + } } return okHttpClientBuilder } diff --git a/android/navi-gold/src/main/java/com/navi/gold/retrofit/NaviHttpClient.kt b/android/navi-gold/src/main/java/com/navi/gold/retrofit/NaviHttpClient.kt index 178aeed32c..eabfaeaed4 100644 --- a/android/navi-gold/src/main/java/com/navi/gold/retrofit/NaviHttpClient.kt +++ b/android/navi-gold/src/main/java/com/navi/gold/retrofit/NaviHttpClient.kt @@ -10,7 +10,6 @@ package com.navi.gold.retrofit import android.content.Context import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor -import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.NAVI_GOLD_RETRY_POLICY_ENABLED import com.navi.common.model.NetworkInfo import com.navi.common.network.BaseHttpClient @@ -39,10 +38,7 @@ class NaviHttpClient(networkInfo: NetworkInfo, private val context: Context) : } } - if ( - isRetryInterceptorEnabled() && - FirebaseRemoteConfigHelper.getBoolean(NAVI_GOLD_RETRY_POLICY_ENABLED) - ) { + if (isRetryInterceptorEnabled(NAVI_GOLD_RETRY_POLICY_ENABLED)) { okHttpClientBuilder.addInterceptor(RetryInterceptor()) } diff --git a/android/navi-gold/src/main/java/com/navi/gold/retrofit/RetrofitService.kt b/android/navi-gold/src/main/java/com/navi/gold/retrofit/RetrofitService.kt index 32209e3dd9..b59b903d29 100644 --- a/android/navi-gold/src/main/java/com/navi/gold/retrofit/RetrofitService.kt +++ b/android/navi-gold/src/main/java/com/navi/gold/retrofit/RetrofitService.kt @@ -51,6 +51,7 @@ interface RetrofitService { @GET("/kuber/home/sub-widgets") suspend fun getDigitalGoldHomePolling(): Response> + @RetryPolicy @GET("/kuber/order/get-sell-page-content") suspend fun getDigitalGoldSellPage( @Query("vendorKey") vendorKey: String? @@ -62,13 +63,13 @@ interface RetrofitService { ): Response> @GET("/kuber/sip/setup-sip-page-content") - @RetryPolicy(retryCount = 3) + @RetryPolicy suspend fun getDigitalGoldSetupSipPage( @QueryMap params: Map ): Response> @GET("/kuber/transactions/transaction-history-page-content") - @RetryPolicy(retryCount = 3) + @RetryPolicy suspend fun fetchDigitalGoldTransactionHistory( @QueryMap params: Map ): Response> @@ -98,6 +99,7 @@ interface RetrofitService { @Path("requestId") requestId: String? ): Response> + @RetryPolicy @POST("/kuber/kyc/get-kyc-buy-api-decider") suspend fun getGoldBuyNextPageCta( @Body goldKycVerifyRequest: GoldKycPageRequest? @@ -114,13 +116,13 @@ interface RetrofitService { ): Response> @GET("/kuber/home/get-home-content") - @RetryPolicy(retryCount = 3) + @RetryPolicy suspend fun getDigitalGoldHome( @QueryMap params: Map ): Response> @POST("/kuber/order/sell") - @RetryPolicy(retryCount = 3) + @RetryPolicy suspend fun getDigitalGoldSellOrder( @Body goldSellOrderRequest: GoldSellOrderRequest ): Response> @@ -151,7 +153,7 @@ interface RetrofitService { ): Response> @GET("/kuber/order/payment-details/get-upi-page-content") - @RetryPolicy(retryCount = 3) + @RetryPolicy suspend fun fetchDigitalGoldSellUpiScreenData( @Query("exchangeRateId") exchangeRateId: String, @Query("amount") amount: Double, @@ -165,6 +167,7 @@ interface RetrofitService { @GET("/kuber/home/get-gold-blocked-page") suspend fun getKuberBlockerPageDetails(): Response> + @RetryPolicy @GET("/csat/{featureName}") suspend fun fetchDigitalGoldCsatResponse( @Path("featureName") featureName: String?, @@ -217,6 +220,7 @@ interface RetrofitService { @GET("/kuber/bank/bank-search-page") suspend fun fetchBankSearchPage(): Response> + @RetryPolicy @GET("/kuber/sip/setup-sip-bottomsheet") suspend fun fetchSetupSipBottomSheet( @QueryMap params: Map @@ -237,6 +241,7 @@ interface RetrofitService { @Query("requestId") requestId: String ): Response> + @RetryPolicy @POST("/kuber/order/v2/buy") suspend fun getDigitalGoldBuyOrderV2( @Body goldBuyOrderRequest: GoldBuyOrderRequest diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/network/retrofit/GIHttpClient.kt b/android/navi-insurance/src/main/java/com/navi/insurance/network/retrofit/GIHttpClient.kt index 2bdd8199cf..42b53fd4f0 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/network/retrofit/GIHttpClient.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/network/retrofit/GIHttpClient.kt @@ -10,7 +10,6 @@ package com.navi.insurance.network.retrofit import android.content.Context import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor -import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.NAVI_GI_RETRY_POLICY_ENABLED import com.navi.common.model.NetworkInfo import com.navi.common.network.BaseHttpClient @@ -38,10 +37,7 @@ class GIHttpClient(networkInfo: NetworkInfo, private val context: Context) : ) } } - if ( - isRetryInterceptorEnabled() && - FirebaseRemoteConfigHelper.getBoolean(NAVI_GI_RETRY_POLICY_ENABLED) - ) { + if (isRetryInterceptorEnabled(NAVI_GI_RETRY_POLICY_ENABLED)) { okHttpClientBuilder.addInterceptor(RetryInterceptor()) } return okHttpClientBuilder diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/network/retrofit/RetrofitService.kt b/android/navi-insurance/src/main/java/com/navi/insurance/network/retrofit/RetrofitService.kt index 95615a0382..092701223a 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/network/retrofit/RetrofitService.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/network/retrofit/RetrofitService.kt @@ -712,6 +712,7 @@ interface RetrofitService { @GET("/claims-origination/customer/activity/v2") suspend fun fetchClaimsActivitiesList(): Response> + @RetryPolicy @GET("/pre-quotes") suspend fun fetchPreQuoteForm( @Query("applicationType") applicationType: String @@ -986,12 +987,14 @@ interface RetrofitService { @Body policyMembersRequest: PolicyMembersRequest, ): Response> + @RetryPolicy @POST("/journeys/question-journey") suspend fun fetchHrcHomepageAndQuestions( @Query("type") type: String, @Query("isFreeInsurance") isFreeInsurance: Boolean, ): Response> + @RetryPolicy @POST("/health-risk-scores") suspend fun fetchHrsDetailsWithQuesData( @Body questionSubmissionRequest: QuestionSubmissionRequest @@ -1171,6 +1174,7 @@ interface RetrofitService { @Body details: PolicyIncompleteMemberDetails? = null, ): Response> + @RetryPolicy @GET("/journeys/quiz-journey") suspend fun fetchQuestionnaire(): Response> @@ -1197,7 +1201,7 @@ interface RetrofitService { @GET("/hi-quiz-scores") suspend fun fetchQuizResult(): Response> - @RetryPolicy(retryCount = 3) + @RetryPolicy @PATCH("/pre-quotes/{preQuoteId}/transitions/{transitionName}") suspend fun nextPagePreQuote( @Path("preQuoteId") preQuoteId: String, @@ -1205,7 +1209,7 @@ interface RetrofitService { @Body formNextPageRequest: FormWidgetRequest, ): Response> - @RetryPolicy(retryCount = 3) + @RetryPolicy @GET("/pre-quotes/{preQuoteId}") suspend fun fetchFormPageWithPreQuoteId( @Path("preQuoteId") preQuoteId: String, @@ -1213,21 +1217,21 @@ interface RetrofitService { @Query("applicationId") applicationId: String? = null, ): Response> - @RetryPolicy(retryCount = 3) + @RetryPolicy @POST("/pre-quotes") suspend fun fetchPreQuoteFormWithApplicationType( @Query("applicationType") applicationType: String, @Body formNextPageRequest: FormWidgetRequest, ): Response> - @RetryPolicy(retryCount = 3) + @RetryPolicy @GET("/pre-quotes") suspend fun fetchPreQuoteJourney( @Query("applicationType") applicationType: String, @Query("applicationId") applicationId: String? = null, ): Response> - @RetryPolicy(retryCount = 3) + @RetryPolicy @POST("/quotes/{quoteId}/pages/{pageType}") suspend fun fetchFormPageWithQuoteId( @Path("quoteId") quoteId: String, diff --git a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/network/HttpClient.kt b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/network/HttpClient.kt index 99e46d6de3..9f3b713c1f 100644 --- a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/network/HttpClient.kt +++ b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/network/HttpClient.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2024 by Navi Technologies Limited + * * Copyright © 2024-2025 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -10,8 +10,11 @@ package com.navi.moneymanager.common.network import android.content.Context import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.MM_RETRY_INTERCEPTOR_ENABLED import com.navi.common.model.NetworkInfo import com.navi.common.network.BaseHttpClient +import com.navi.common.network.retry.interceptor.RetryInterceptor +import com.navi.common.network.retry.interceptor.isRetryInterceptorEnabled import com.navi.moneymanager.BuildConfig import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor @@ -21,8 +24,8 @@ class HttpClient(val networkInfo: NetworkInfo, private val context: Context) : val httpClientBuilder: OkHttpClient.Builder get() { val okHttpClientBuilder = baseHttpClientBuilder - if (BuildConfig.DEBUG) { - with(okHttpClientBuilder) { + with(okHttpClientBuilder) { + if (BuildConfig.DEBUG) { addInterceptor(loggingInterceptor()) addInterceptor( ChuckerInterceptor.Builder(context) @@ -33,6 +36,9 @@ class HttpClient(val networkInfo: NetworkInfo, private val context: Context) : .build() ) } + if (isRetryInterceptorEnabled(MM_RETRY_INTERCEPTOR_ENABLED)) { + addInterceptor(RetryInterceptor()) + } } return okHttpClientBuilder } diff --git a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/network/service/RetrofitService.kt b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/network/service/RetrofitService.kt index d9a7974ae4..51061ae2a6 100644 --- a/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/network/service/RetrofitService.kt +++ b/android/navi-money-manager/src/main/kotlin/com/navi/moneymanager/common/network/service/RetrofitService.kt @@ -20,7 +20,6 @@ import com.navi.moneymanager.common.network.model.OnboardingStatusResponse import com.navi.moneymanager.common.network.model.PollingStatusResponse import com.navi.moneymanager.common.network.model.RefreshDataResponse import com.navi.moneymanager.common.network.model.TransactionResponse -import com.navi.moneymanager.common.utils.Constants.API_RETRY_COUNT import com.navi.moneymanager.postonboard.monthlysummary.model.PostCategoryTransactionData import retrofit2.Response import retrofit2.http.Body @@ -33,7 +32,7 @@ import retrofit2.http.Query interface RetrofitService { - @RetryPolicy(retryCount = API_RETRY_COUNT) + @RetryPolicy @GET("/money-manager/core/transactions") suspend fun fetchTransactions( @Query("from") from: Long, @@ -42,27 +41,27 @@ interface RetrofitService { @Query("queryBy") queryBy: String, ): Response> - @RetryPolicy(retryCount = API_RETRY_COUNT) + @RetryPolicy @GET("/money-manager/core/user-onboarded") suspend fun fetchUserOnboardingStatus(): Response> - @RetryPolicy(retryCount = API_RETRY_COUNT) + @RetryPolicy @GET("/alchemist/inflate/{screenName}") suspend fun fetchAlchemistScreen( @Path("screenName") screenName: String ): Response> - @RetryPolicy(retryCount = API_RETRY_COUNT) + @RetryPolicy @GET("/money-manager/core/config") suspend fun fetchMMConfigResponse(): Response> - @RetryPolicy(retryCount = API_RETRY_COUNT) + @RetryPolicy @POST("/money-manager/core/init-onboarding") suspend fun fetchFinarkeinSDKInitData( @Body emptyBody: EmptyRequestBody = EmptyRequestBody() ): Response> - @RetryPolicy(retryCount = API_RETRY_COUNT) + @RetryPolicy @GET("/money-manager/core/accounts") suspend fun fetchUserAccounts(): Response> diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/network/NaviPayHttpClient.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/network/NaviPayHttpClient.kt index abd941faa0..1d2e8e078f 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/network/NaviPayHttpClient.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/network/NaviPayHttpClient.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2022-2024 by Navi Technologies Limited + * * Copyright © 2022-2025 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -10,9 +10,12 @@ package com.navi.pay.network import android.content.Context import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.UPI_RETRY_INTERCEPTOR_ENABLED import com.navi.common.model.NetworkInfo import com.navi.common.network.BaseHttpClient import com.navi.common.network.NAVI_DNS +import com.navi.common.network.retry.interceptor.RetryInterceptor +import com.navi.common.network.retry.interceptor.isRetryInterceptorEnabled import com.navi.common.utils.TemporaryStorageHelper import com.navi.pay.BuildConfig import okhttp3.OkHttpClient @@ -23,8 +26,8 @@ class NaviPayHttpClient(val networkInfo: NetworkInfo, val context: Context) : val httpClientBuilder: OkHttpClient.Builder get() { val okHttpClientBuilder = baseHttpClientBuilder - if (BuildConfig.DEBUG) { - with(okHttpClientBuilder) { + with(okHttpClientBuilder) { + if (BuildConfig.DEBUG) { addInterceptor(loggingInterceptor()) addInterceptor( ChuckerInterceptor.Builder(context) @@ -35,8 +38,9 @@ class NaviPayHttpClient(val networkInfo: NetworkInfo, val context: Context) : .build() ) } - } - with(okHttpClientBuilder) { + if (isRetryInterceptorEnabled(UPI_RETRY_INTERCEPTOR_ENABLED)) { + addInterceptor(RetryInterceptor()) + } if (TemporaryStorageHelper.isOkHttpCustomDnsV2Enabled) { dns(NAVI_DNS) } diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/network/retrofit/NaviPayRetrofitService.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/network/retrofit/NaviPayRetrofitService.kt index 41c7c59a7f..945a176eea 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/network/retrofit/NaviPayRetrofitService.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/network/retrofit/NaviPayRetrofitService.kt @@ -8,6 +8,7 @@ package com.navi.pay.network.retrofit import com.navi.common.network.models.GenericResponse +import com.navi.common.network.retry.annotations.RetryPolicy import com.navi.pay.common.model.network.RequestIdResponse import com.navi.pay.common.model.network.ValidateVpaRequest import com.navi.pay.common.model.network.ValidateVpaResponse @@ -109,6 +110,7 @@ interface NaviPayRetrofitService { private const val NAVI_PAY_API_VERSION3 = "v3" } + @RetryPolicy @POST("/gateway-service/$NAVI_PAY_API_VERSION/navipay/customer") suspend fun getCustomer( @Body customerRequest: CustomerRequest @@ -119,6 +121,7 @@ interface NaviPayRetrofitService { @Body bankListRequest: BankListRequest ): Response> + @RetryPolicy @POST("/gateway-service/$NAVI_PAY_API_VERSION/navipay/banks/fetch-accounts") suspend fun getBankAccounts( @Body fetchAccountsRequest: FetchAccountsRequest @@ -187,14 +190,17 @@ interface NaviPayRetrofitService { @Body npciTokenRequest: NpciTokenRequest ): Response> + @RetryPolicy @GET("/gateway-service/$NAVI_PAY_API_VERSION/navipay/npci/key") suspend fun fetchNpciKeys(): Response> + @RetryPolicy @POST("/gateway-service/$NAVI_PAY_API_VERSION/navipay/account/balance") suspend fun checkBalance( @Body checkBalanceRequest: CheckBalanceRequest ): Response> + @RetryPolicy @POST("/gateway-service/navipay/$NAVI_PAY_API_VERSION3/txn/sendMoney") suspend fun sendMoney( @Body sendMoneyRequest: SendMoneyRequest @@ -205,6 +211,7 @@ interface NaviPayRetrofitService { @Body mandateListRequest: MandateListRequest ): Response> + @RetryPolicy @POST("/gateway-service/navipay/$NAVI_PAY_API_VERSION/vpa/validate") suspend fun validateVpa( @Body validateVpaRequest: ValidateVpaRequest @@ -318,6 +325,7 @@ interface NaviPayRetrofitService { @GET("/gateway-service/$NAVI_PAY_API_VERSION/navipay/requestId/fetch/list") suspend fun getRequestIdList(): Response> + @RetryPolicy @POST("/gateway-service/$NAVI_PAY_API_VERSION/navipay/phone-number/vpa") suspend fun payToContact( @Body payToContactRequest: PayToContactRequest diff --git a/android/navi-payment/src/main/java/com/navi/payment/network/retrofit/NaviPaymentsHttpClient.kt b/android/navi-payment/src/main/java/com/navi/payment/network/retrofit/NaviPaymentsHttpClient.kt index d7a316c928..d107914558 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/network/retrofit/NaviPaymentsHttpClient.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/network/retrofit/NaviPaymentsHttpClient.kt @@ -10,7 +10,6 @@ package com.navi.payment.network.retrofit import android.content.Context import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor -import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.NAVI_PMT_RETRY_POLICY_ENABLED import com.navi.common.model.NetworkInfo import com.navi.common.network.BaseHttpClient @@ -27,10 +26,7 @@ class NaviPaymentsHttpClient(networkInfo: NetworkInfo, private val context: Cont val httpClientBuilder: OkHttpClient.Builder get() { val okHttpClientBuilder = baseHttpClientBuilder - if ( - isRetryInterceptorEnabled() && - FirebaseRemoteConfigHelper.getBoolean(NAVI_PMT_RETRY_POLICY_ENABLED) - ) { + if (isRetryInterceptorEnabled(NAVI_PMT_RETRY_POLICY_ENABLED)) { okHttpClientBuilder.addInterceptor(RetryInterceptor()) } return okHttpClientBuilder diff --git a/android/navi-payment/src/main/java/com/navi/payment/network/retrofit/RetrofitService.kt b/android/navi-payment/src/main/java/com/navi/payment/network/retrofit/RetrofitService.kt index 3279111b33..1451ab4332 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/network/retrofit/RetrofitService.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/network/retrofit/RetrofitService.kt @@ -25,11 +25,6 @@ import com.navi.payment.paymentscreen.model.ValidateVPAResponse import com.navi.payment.turbocheckout.model.PaymentScreenResponse import com.navi.payment.utils.Constants.PAYMENT_SDK_VERSION import com.navi.paymentclients.model.InitiatePaymentRequest -import java.net.ConnectException -import java.net.SocketTimeoutException -import java.net.UnknownHostException -import javax.net.ssl.SSLHandshakeException -import javax.net.ssl.SSLPeerUnverifiedException import org.json.JSONObject import retrofit2.Response import retrofit2.http.Body @@ -80,6 +75,7 @@ interface RetrofitService { ): Response> // get ui-tron response + @RetryPolicy @POST("/api/v2/get-methods") suspend fun getPaymentMethodsV2( @Header("X-Payment-SDK-Token") token: String?, @@ -98,17 +94,7 @@ interface RetrofitService { // Pay button @POST("/api/v1/paynow") - @RetryPolicy( - retryCount = 3, - retryOn = - [ - SocketTimeoutException::class, - UnknownHostException::class, - ConnectException::class, - SSLHandshakeException::class, - SSLPeerUnverifiedException::class, - ], - ) + @RetryPolicy suspend fun postPayNow( @Header("X-Payment-SDK-Token") token: String?, @Header("X-Target") xTarget: String, @@ -141,17 +127,7 @@ interface RetrofitService { // transaction status @POST("/api/v1/transaction/status") - @RetryPolicy( - retryCount = 3, - retryOn = - [ - SocketTimeoutException::class, - UnknownHostException::class, - ConnectException::class, - SSLHandshakeException::class, - SSLPeerUnverifiedException::class, - ], - ) + @RetryPolicy suspend fun fetchTransactionStatus( @Header("X-Payment-SDK-Token") token: String, @Header("X-Payment-SDK-Version") @@ -177,6 +153,7 @@ interface RetrofitService { @Header("X-Payment-SDK-Version") paymentSdkVersion: String = PAYMENT_SDK_VERSION, ): Response> + @RetryPolicy @POST("/api/v2/get-methods") suspend fun getPaymentScreenResponse( @Header("X-Payment-SDK-Token") token: String?, @@ -186,17 +163,7 @@ interface RetrofitService { ): Response> @POST("api/v1/one-time-payment/get-methods") - @RetryPolicy( - retryCount = 3, - retryOn = - [ - SocketTimeoutException::class, - UnknownHostException::class, - ConnectException::class, - SSLHandshakeException::class, - SSLPeerUnverifiedException::class, - ], - ) + @RetryPolicy suspend fun fetchScreenData( @Header("X-Payment-SDK-Token") token: String?, @Header("X-Payment-SDK-Version") paymentSdkVersion: String, diff --git a/android/navi-rr/src/main/java/com/navi/rr/common/network/retrofit/NaviHttpClient.kt b/android/navi-rr/src/main/java/com/navi/rr/common/network/retrofit/NaviHttpClient.kt index efad76184b..65ee4d57be 100644 --- a/android/navi-rr/src/main/java/com/navi/rr/common/network/retrofit/NaviHttpClient.kt +++ b/android/navi-rr/src/main/java/com/navi/rr/common/network/retrofit/NaviHttpClient.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2023-2024 by Navi Technologies Limited + * * Copyright © 2023-2025 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -10,8 +10,11 @@ package com.navi.rr.common.network.retrofit import android.content.Context import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.RR_RETRY_INTERCEPTOR_ENABLED import com.navi.common.model.NetworkInfo import com.navi.common.network.BaseHttpClient +import com.navi.common.network.retry.interceptor.RetryInterceptor +import com.navi.common.network.retry.interceptor.isRetryInterceptorEnabled import com.navi.rr.BuildConfig import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor @@ -21,8 +24,8 @@ class NaviHttpClient(networkInfo: NetworkInfo, private val context: Context) : val httpClientBuilder: OkHttpClient.Builder get() { val okHttpClientBuilder = baseHttpClientBuilder - if (BuildConfig.DEBUG) { - with(okHttpClientBuilder) { + with(okHttpClientBuilder) { + if (BuildConfig.DEBUG) { addInterceptor(loggingInterceptor()) addInterceptor( ChuckerInterceptor.Builder(context) @@ -33,6 +36,9 @@ class NaviHttpClient(networkInfo: NetworkInfo, private val context: Context) : .build() ) } + if (isRetryInterceptorEnabled(RR_RETRY_INTERCEPTOR_ENABLED)) { + addInterceptor(RetryInterceptor()) + } } return okHttpClientBuilder }