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 ee75797df1..03ee873c8c 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 @@ -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" diff --git a/android/navi-common/src/main/java/com/navi/common/network/BaseHttpClient.kt b/android/navi-common/src/main/java/com/navi/common/network/BaseHttpClient.kt index 1e65b09fcb..dc1ec77f73 100644 --- a/android/navi-common/src/main/java/com/navi/common/network/BaseHttpClient.kt +++ b/android/navi-common/src/main/java/com/navi/common/network/BaseHttpClient.kt @@ -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( diff --git a/android/navi-common/src/main/java/com/navi/common/network/NetworkUtil.kt b/android/navi-common/src/main/java/com/navi/common/network/NetworkUtil.kt index fbe24f3f18..d5aed50915 100644 --- a/android/navi-common/src/main/java/com/navi/common/network/NetworkUtil.kt +++ b/android/navi-common/src/main/java/com/navi/common/network/NetworkUtil.kt @@ -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 + ) diff --git a/android/navi-common/src/main/java/com/navi/common/network/interceptor/NetworkConnectivityInterceptor.kt b/android/navi-common/src/main/java/com/navi/common/network/interceptor/NetworkConnectivityInterceptor.kt new file mode 100644 index 0000000000..d6c740bf03 --- /dev/null +++ b/android/navi-common/src/main/java/com/navi/common/network/interceptor/NetworkConnectivityInterceptor.kt @@ -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() + } + } +}