NTP-7163 | Added Network Connectivity Interceptor (#13070)

Co-authored-by: Kishan Kumar <kishan.kumar@navi.com>
This commit is contained in:
shankar yadav
2024-10-14 18:08:04 +05:30
committed by GitHub
parent b9363124df
commit 19698aa427
4 changed files with 65 additions and 1 deletions

View File

@@ -50,6 +50,7 @@ object FirebaseRemoteConfigHelper {
const val PRELOAD_HMS_NATIVE_LIB = "PRELOAD_HMS_NATIVE_LIB"
const val PRELOAD_NAVI_NATIVE_LIB = "PRELOAD_NAVI_NATIVE_LIB"
const val SSL_PINNING_ENABLED = "SSL_PINNING_ENABLED"
const val NETWORK_CONNECTIVITY_INTERCEPTOR_ENABLED = "NETWORK_CONNECTIVITY_INTERCEPTOR_ENABLED"
const val SSL_PINNING_KEY = "SSL_PINNING_KEY"
const val ENABLE_LOGIN_OTP_SENDER_VERIFICATION = "ENABLE_LOGIN_OTP_SENDER_VERIFICATION"
const val LOGIN_OTP_SENDER_ID = "LOGIN_OTP_SENDER_ID"

View File

@@ -21,6 +21,7 @@ import com.navi.common.model.NetworkInfo
import com.navi.common.network.authenticator.TokenAuthenticator
import com.navi.common.network.interceptor.GzipInterceptor
import com.navi.common.network.interceptor.MetricInterceptor
import com.navi.common.network.interceptor.NetworkConnectivityInterceptor
import com.navi.common.network.interceptor.S3TimeoutInterceptor
import com.navi.common.utils.TemporaryStorageHelper
import com.navi.common.utils.isS3TimeoutOverrideEnabled
@@ -59,6 +60,10 @@ abstract class BaseHttpClient(
if (shouldAddAuthenticator) {
authenticator(TokenAuthenticator.getInstance())
}
addInterceptor(MetricInterceptor())
if (isNetworkConnectivityInterceptorEnabled()) {
addInterceptor(NetworkConnectivityInterceptor())
}
if (addRootCaCertificate()) {
val certificates = getCertificates(context, R.raw.isrgrootx1)
sslSocketFactory(certificates.sslSocketFactory(), certificates.trustManager)
@@ -77,7 +82,6 @@ abstract class BaseHttpClient(
addInterceptor(S3TimeoutInterceptor())
}
addInterceptor(MetricInterceptor())
protocols(listOf(Protocol.HTTP_1_1))
if (
FirebaseRemoteConfigHelper.getBoolean(

View File

@@ -13,6 +13,7 @@ import com.navi.analytics.utils.NaviTrackEvent
import com.navi.base.AppServiceManager
import com.navi.base.utils.BaseUtils
import com.navi.common.constants.NETWORK_CRASH
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper
import com.navi.common.network.models.ErrorMessage
import com.navi.common.network.models.GenericResponse
import com.navi.common.utils.CommonNaviAnalytics
@@ -107,3 +108,8 @@ fun logIOException(e: Exception, errorMessage: ErrorMessage, request: Request) {
e.log()
}
}
fun isNetworkConnectivityInterceptorEnabled() =
FirebaseRemoteConfigHelper.getBoolean(
FirebaseRemoteConfigHelper.NETWORK_CONNECTIVITY_INTERCEPTOR_ENABLED
)

View File

@@ -0,0 +1,53 @@
/*
*
* * Copyright © 2024 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
package com.navi.common.network.interceptor
import com.navi.base.AppServiceManager
import com.navi.base.network.util.ApiConstants
import com.navi.base.utils.BaseUtils
import com.navi.common.R
import com.navi.common.network.handleException
import com.navi.common.network.logIOException
import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Protocol
import okhttp3.Response
import okhttp3.ResponseBody
class NetworkConnectivityInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
if (!BaseUtils.isNetworkAvailable(AppServiceManager.application)) {
// A mocked response in case of no internet
return Response.Builder()
.request(request)
.protocol(Protocol.HTTP_2)
.code(com.navi.common.network.ApiConstants.NO_INTERNET)
.message(AppServiceManager.application.getString(R.string.no_internet_connection))
.body(ResponseBody.create("application/json".toMediaTypeOrNull(), "{}"))
.addHeader("content-type", "application/json")
.build()
}
return try {
chain.proceed(request)
} catch (e: Exception) {
val errorMessage = handleException(e)
logIOException(e, errorMessage, request)
// A mocked response in case of n/w exception
val errorStatusCode: Int = errorMessage.statusCode ?: ApiConstants.API_CODE_ERROR
Response.Builder()
.request(request)
.protocol(Protocol.HTTP_2)
.code(errorStatusCode)
.message(e.message.orEmpty())
.body(ResponseBody.create("application/json".toMediaTypeOrNull(), "{}"))
.addHeader("content-type", "application/json")
.build()
}
}
}