diff --git a/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/retrofit/ApResponseCallback.kt b/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/retrofit/ApResponseCallback.kt index a4d37352e9..76af91c844 100644 --- a/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/retrofit/ApResponseCallback.kt +++ b/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/retrofit/ApResponseCallback.kt @@ -218,6 +218,15 @@ abstract class ApResponseCallback { description = getString(R.string.technical_issue) } } + ApiConstants.API_SECURED_CONNECTION_EXCEPTION -> { + fetchNewKeyFromFirebaseAndRestart() + statusCode = ApiConstants.API_SECURED_CONNECTION_EXCEPTION + methodName = NetworkErrorType.SECURED_CONNECTION_EXCEPTION.name + AppServiceManager.application.apply { + title = getString(R.string.secure_connection_issue) + description = getString(R.string.secure_connection_issue_description) + } + } ApiConstants.API_CODE_SSL_HANDSHAKE_EXCEPTION, ApiConstants.API_ERROR_PEER_UNVERIFIED -> { fetchNewKeyFromFirebaseAndRestart() diff --git a/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/utils/Utils.kt b/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/utils/Utils.kt index 394194d0b1..4194ad55fc 100644 --- a/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/utils/Utils.kt +++ b/android/application-platform/navi-ap/src/main/kotlin/com/navi/ap/network/utils/Utils.kt @@ -50,6 +50,7 @@ enum class NetworkErrorType { UNKNOWN_HOST, JSON_PARSE, CONNECT_ERROR, + SECURED_CONNECTION_EXCEPTION, } fun handleGlobalErrorEvent( diff --git a/android/navi-common/src/main/java/com/navi/common/checkmate/utils/CheckMateExt.kt b/android/navi-common/src/main/java/com/navi/common/checkmate/utils/CheckMateExt.kt index 49e6d0db8c..a6ee4a5417 100644 --- a/android/navi-common/src/main/java/com/navi/common/checkmate/utils/CheckMateExt.kt +++ b/android/navi-common/src/main/java/com/navi/common/checkmate/utils/CheckMateExt.kt @@ -23,6 +23,7 @@ import com.navi.common.network.ApiConstants.API_CODE_UNKNOWN_HOST import com.navi.common.network.ApiConstants.API_ERROR_PEER_UNVERIFIED import com.navi.common.network.ApiConstants.API_INTERNAL_SERVER_ERROR import com.navi.common.network.ApiConstants.API_NOT_FOUND +import com.navi.common.network.ApiConstants.API_SECURED_CONNECTION_EXCEPTION import com.navi.common.network.ApiConstants.API_WRONG_ERROR_RESPONSE import com.navi.common.network.ApiConstants.IO_EXCEPTION_ERROR import com.navi.common.network.ApiConstants.NO_INTERNET @@ -285,6 +286,8 @@ fun getErrorTitle(title: String, isNae: Boolean, statusCode: Int): String { AppServiceManager.application.getString(R.string.no_internet_connection) statusCode == API_CODE_SLOW_NETWORK -> AppServiceManager.application.getString(R.string.internet_too_slow) + statusCode == API_SECURED_CONNECTION_EXCEPTION -> + AppServiceManager.application.getString(R.string.secure_connection_issue) statusCode == API_CODE_ERROR || statusCode == API_CODE_SOCKET_TIMEOUT || statusCode == API_WRONG_ERROR_RESPONSE || @@ -308,6 +311,8 @@ fun getErrorDescription(description: String, isNae: Boolean, statusCode: Int): S ) statusCode == API_CODE_SLOW_NETWORK -> AppServiceManager.application.getString(R.string.check_internet_connectivity) + statusCode == API_SECURED_CONNECTION_EXCEPTION -> + AppServiceManager.application.getString(R.string.secure_connection_issue_description) statusCode == API_CODE_ERROR || statusCode == API_CODE_SOCKET_TIMEOUT || statusCode == API_WRONG_ERROR_RESPONSE || diff --git a/android/navi-common/src/main/java/com/navi/common/network/ApiConstants.kt b/android/navi-common/src/main/java/com/navi/common/network/ApiConstants.kt index 08b3071335..41fa0d305e 100644 --- a/android/navi-common/src/main/java/com/navi/common/network/ApiConstants.kt +++ b/android/navi-common/src/main/java/com/navi/common/network/ApiConstants.kt @@ -26,6 +26,7 @@ object ApiConstants { const val API_ERROR_PEER_UNVERIFIED = 26 const val IO_EXCEPTION_ERROR = 27 const val API_CODE_SLOW_NETWORK = 28 + const val API_SECURED_CONNECTION_EXCEPTION = 29 // Server error const val API_SUCCESS_CODE = 200 @@ -38,5 +39,13 @@ object ApiConstants { const val API_NOT_FOUND = 404 const val API_INTERNAL_SERVER_ERROR = 500 const val API_BAD_GATEWAY = 502 + + /** + * Status code 525 denotes SSL handshake issue between Cloudfare / Gateway and the origin + * Server. We shouldn't be appending this from client side based on SSLHandShake or + * UnVerifiedPeerExceptions received from okhttp java IO exception since these would be for + * client side. The gateway itself will send 525 which is the BE API Code error, hence added new + * status code for this case and corrected the error message shown to the customer. + */ const val API_CODE_SSL_HANDSHAKE_EXCEPTION = 525 } 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 5cf6d61345..6b65719f04 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 @@ -62,7 +62,7 @@ fun handleException(e: Throwable, tag: String? = null): ErrorMessage { if (isNetworkPoor(maxBandwidth, networkSpeed, signalLevel, signalType)) { errorMessage.statusCode = ApiConstants.API_CODE_SLOW_NETWORK } else { - errorMessage.statusCode = ApiConstants.API_CODE_SSL_HANDSHAKE_EXCEPTION + errorMessage.statusCode = ApiConstants.API_SECURED_CONNECTION_EXCEPTION } } else { errorMessage.statusCode = ApiConstants.API_CODE_ERROR diff --git a/android/navi-common/src/main/java/com/navi/common/utils/CommonUtils.kt b/android/navi-common/src/main/java/com/navi/common/utils/CommonUtils.kt index a514230776..952aa46df3 100644 --- a/android/navi-common/src/main/java/com/navi/common/utils/CommonUtils.kt +++ b/android/navi-common/src/main/java/com/navi/common/utils/CommonUtils.kt @@ -54,6 +54,7 @@ import com.navi.common.network.ApiConstants.API_CODE_SLOW_NETWORK import com.navi.common.network.ApiConstants.API_CODE_SOCKET_TIMEOUT import com.navi.common.network.ApiConstants.API_CODE_SSL_HANDSHAKE_EXCEPTION import com.navi.common.network.ApiConstants.API_CODE_UNKNOWN_HOST +import com.navi.common.network.ApiConstants.API_SECURED_CONNECTION_EXCEPTION import com.navi.common.network.ApiConstants.API_WRONG_ERROR_RESPONSE import com.navi.common.network.ApiConstants.NO_INTERNET import com.navi.common.network.fetchNewKeyFromFirebaseAndRestart @@ -345,10 +346,12 @@ object CommonUtils { errorMessage.statusCode = API_CODE_SLOW_NETWORK } else { errorMessage.message = - AppServiceManager.application.getString(R.string.something_went_wrong) + AppServiceManager.application.getString(R.string.secure_connection_issue) errorMessage.description = - AppServiceManager.application.getString(R.string.technical_issue) - errorMessage.statusCode = API_CODE_SSL_HANDSHAKE_EXCEPTION + AppServiceManager.application.getString( + R.string.secure_connection_issue_description + ) + errorMessage.statusCode = API_SECURED_CONNECTION_EXCEPTION } } } else { @@ -400,6 +403,18 @@ object CommonUtils { AppServiceManager.application.getString(R.string.internet_too_slow) + "_" } + API_SECURED_CONNECTION_EXCEPTION -> { + errorMessage.message = + AppServiceManager.application.getString(R.string.secure_connection_issue) + errorMessage.description = + AppServiceManager.application.getString( + R.string.secure_connection_issue_description + ) + errorMessage.trace = + (errorMessage.trace ?: "") + + AppServiceManager.application.getString(R.string.secure_connection_issue) + + "_" + } API_CODE_ERROR, API_CODE_SOCKET_TIMEOUT, API_WRONG_ERROR_RESPONSE, diff --git a/android/navi-common/src/main/java/com/navi/common/utils/GenericErrorData.kt b/android/navi-common/src/main/java/com/navi/common/utils/GenericErrorData.kt index 20aec287f8..79e9450a73 100644 --- a/android/navi-common/src/main/java/com/navi/common/utils/GenericErrorData.kt +++ b/android/navi-common/src/main/java/com/navi/common/utils/GenericErrorData.kt @@ -90,6 +90,29 @@ fun getNoInternetData( ) } +fun getSecureConnectionErrorData( + context: Context, + statusCode: Int? = null, + apiUrl: String? = null, + logMessage: String? = null, + errorMetaData: ErrorMetaData? = null, + showFullScreenError: Boolean = false, +): GenericErrorResponse { + return GenericErrorResponse( + actions = listOf(Action(context.getString(R.string.retry))), + assetDetails = AssetDetails(WIFI_ERROR_ICON), + message = context.getString(R.string.secure_connection_issue_description), + title = context.getString(R.string.secure_connection_issue), + optionalNote = null, + code = SECURE_CONNECTION, + statusCode = statusCode, + apiUrl = apiUrl, + logMessage = logMessage, + errorMetaData = errorMetaData, + showFullScreenError = showFullScreenError, + ) +} + fun getSlowInternetData( context: Context, statusCode: Int? = null, @@ -213,6 +236,7 @@ fun getEditAccountData(context: Context): GenericWarningResponse { const val GENERAL_ERROR = "generic_error_screen" const val NO_INTERNET = "internet_connectivity_error_screen" const val SLOW_INTERNET = "slow_internet_error_screen" +const val SECURE_CONNECTION = "secure_connection_error_screen" const val SOCKET_TIMEOUT = "socket_timeout" const val HL_NO_BANK_DISCOVERED = "hl_no_bank_discovered" const val AADHAR_VERIFICATION_CANCELED = "AADHAR_VERIFICATION_CANCELED" diff --git a/android/navi-common/src/main/java/com/navi/common/viewmodel/BaseVM.kt b/android/navi-common/src/main/java/com/navi/common/viewmodel/BaseVM.kt index 5a0fa5a93c..1c89e50f46 100644 --- a/android/navi-common/src/main/java/com/navi/common/viewmodel/BaseVM.kt +++ b/android/navi-common/src/main/java/com/navi/common/viewmodel/BaseVM.kt @@ -26,6 +26,7 @@ import com.navi.common.network.ApiConstants.API_ERROR_NO_USER_FOUND import com.navi.common.network.ApiConstants.API_FORBIDDEN import com.navi.common.network.ApiConstants.API_INTERNAL_SERVER_ERROR import com.navi.common.network.ApiConstants.API_NOT_FOUND +import com.navi.common.network.ApiConstants.API_SECURED_CONNECTION_EXCEPTION import com.navi.common.network.ApiConstants.API_WRONG_ERROR_RESPONSE import com.navi.common.network.ApiConstants.NO_INTERNET import com.navi.common.network.handleException @@ -38,6 +39,7 @@ import com.navi.common.utils.CommonNaviAnalytics import com.navi.common.utils.getApiFailedData import com.navi.common.utils.getErrorData import com.navi.common.utils.getNoInternetData +import com.navi.common.utils.getSecureConnectionErrorData import com.navi.common.utils.getSlowInternetData import com.navi.common.utils.getSocketTimeOutData import com.navi.common.utils.isNetworkAvailable @@ -168,6 +170,19 @@ abstract class BaseVM( cancelable, ) } + API_SECURED_CONNECTION_EXCEPTION -> { + Triple( + getSecureConnectionErrorData( + AppServiceManager.application, + error.statusCode, + apiUrl = error.apiUrl, + logMessage = error.message, + errorMetaData = errorMetaData, + ), + errorTag, + cancelable, + ) + } API_CODE_SOCKET_TIMEOUT -> { Triple( getSocketTimeOutData( diff --git a/android/navi-rr/src/main/java/com/navi/rr/common/network/response/handlers/types/NetworkResponseTypes.kt b/android/navi-rr/src/main/java/com/navi/rr/common/network/response/handlers/types/NetworkResponseTypes.kt index 7b0321803d..466c3d83cb 100644 --- a/android/navi-rr/src/main/java/com/navi/rr/common/network/response/handlers/types/NetworkResponseTypes.kt +++ b/android/navi-rr/src/main/java/com/navi/rr/common/network/response/handlers/types/NetworkResponseTypes.kt @@ -12,11 +12,11 @@ import com.navi.common.network.ApiConstants.API_BAD_REQUEST import com.navi.common.network.ApiConstants.API_CODE_CONNECT_EXCEPTION import com.navi.common.network.ApiConstants.API_CODE_ERROR import com.navi.common.network.ApiConstants.API_CODE_SOCKET_TIMEOUT -import com.navi.common.network.ApiConstants.API_CODE_SSL_HANDSHAKE_EXCEPTION import com.navi.common.network.ApiConstants.API_CODE_UNKNOWN_HOST import com.navi.common.network.ApiConstants.API_ERROR_NO_USER_FOUND import com.navi.common.network.ApiConstants.API_ERROR_PEER_UNVERIFIED import com.navi.common.network.ApiConstants.API_INTERNAL_SERVER_ERROR +import com.navi.common.network.ApiConstants.API_SECURED_CONNECTION_EXCEPTION import com.navi.common.network.ApiConstants.API_SUCCESS_CODE import com.navi.common.network.ApiConstants.API_SUCCESS_CODE_204 import com.navi.common.network.ApiConstants.API_WRONG_ERROR_RESPONSE @@ -240,7 +240,7 @@ class SuccessHandlerNetwork : NetworkResponseProcessor(API_SUCCESS_CODE) { } class SSLHandshakeExceptionHandlerNetwork : - NetworkResponseProcessor(API_CODE_SSL_HANDSHAKE_EXCEPTION) { + NetworkResponseProcessor(API_SECURED_CONNECTION_EXCEPTION) { override fun handleResponse(response: Response>): RepoResult { return RepoResult( data = null, @@ -248,11 +248,11 @@ class SSLHandshakeExceptionHandlerNetwork : ErrorMessage( message = response.message() ?: message, description = description, - statusCode = API_CODE_SSL_HANDSHAKE_EXCEPTION, + statusCode = API_SECURED_CONNECTION_EXCEPTION, appRequestId = getRequestIdFromResponse(response), vertical = getVerticalFromResponse(response), ), - statusCode = API_CODE_SSL_HANDSHAKE_EXCEPTION, + statusCode = API_SECURED_CONNECTION_EXCEPTION, warning = response.body()?.warning, errors = response.body()?.errors, )