update error handle

This commit is contained in:
2026-02-16 17:40:21 +03:00
parent b47bba9e22
commit d64f2b5b8f
7 changed files with 61 additions and 13 deletions

View File

@@ -16,7 +16,8 @@ private const val LOG_TAG = "NETWORK_DEBUG"
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
@Inject lateinit var getScheduleUseCase: GetScheduleUseCase
@Inject
lateinit var getScheduleUseCase: GetScheduleUseCase
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -29,8 +30,9 @@ class MainActivity : ComponentActivity() {
val src = if (result.refreshedFromNetwork) "NETWORK" else "CACHE"
Log.d(LOG_TAG, "FROM $src: ${result.data}")
}
is DataResult.Error -> {
Log.e(LOG_TAG, "ERROR", result.throwable)
Log.e(LOG_TAG, "ERROR: $result")
}
}
}

View File

@@ -12,13 +12,13 @@ import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
object AppConfigModule {
private const val BASE_PROD_URL = "https://tulsu.ru/schedule/queries/"
private const val BASE_DEVELOP_URL = "https://tulsu.ru/schedule/queries/"
private const val BASE_URL_PROD = "https://tulsu.ru/schedule/queries/"
private const val BASE_URL_DEVELOP = "https://scherbatykh.ru/app/tsudesk/"
@Provides
@Singleton
fun provideAppConfig(): AppConfig {
val baseUrl = if (BuildConfig.DEBUG) BASE_DEVELOP_URL else BASE_PROD_URL
val baseUrl = if (BuildConfig.DEBUG) BASE_URL_DEVELOP else BASE_URL_PROD
return AppConfig(
isDebug = BuildConfig.DEBUG,
baseUrl = baseUrl,

View File

@@ -0,0 +1,7 @@
package ru.fincode.tsudesk.core.common.model
sealed interface AppError {
data object NoInternet : AppError
data object Timeout : AppError
data class Http(val code: Int) : AppError
data class Unknown(val message: String? = null) : AppError
}

View File

@@ -1,10 +1,6 @@
package ru.fincode.tsudesk.core.common.model
sealed interface DataResult<out T> {
data class Data<T>(
val data: T, val refreshedFromNetwork: Boolean
) : DataResult<T>
data class Error(val throwable: Throwable) : DataResult<Nothing>
data class Data<T>(val data: T, val refreshedFromNetwork: Boolean) : DataResult<T>
data class Error(val error: AppError, val cause: Throwable? = null) : DataResult<Nothing>
}

View File

@@ -1,11 +1,15 @@
package ru.fincode.tsudesk.core.network
import android.annotation.SuppressLint
import okhttp3.OkHttpClient
import ru.fincode.tsudesk.core.common.app.AppConfig
import ru.fincode.tsudesk.core.network.interceptor.DebugInterceptor
import java.security.SecureRandom
import java.security.cert.X509Certificate
import java.util.concurrent.TimeUnit
import javax.inject.Inject
import javax.inject.Singleton
import javax.net.ssl.*
@Singleton
class OkHttpClientFactory @Inject constructor(
@@ -22,8 +26,38 @@ class OkHttpClientFactory @Inject constructor(
if (appConfig.isDebug) {
builder.addInterceptor(debugInterceptor)
applyUnsafeSslForDebug(builder)
}
return builder.build()
}
private fun applyUnsafeSslForDebug(builder: OkHttpClient.Builder) {
val trustManager = @SuppressLint("CustomX509TrustManager")
object : X509TrustManager {
override fun checkClientTrusted(
chain: Array<X509Certificate>,
authType: String
) = Unit
override fun checkServerTrusted(
chain: Array<X509Certificate>,
authType: String
) = Unit
override fun getAcceptedIssuers(): Array<X509Certificate> = emptyArray()
}
val sslContext = SSLContext.getInstance("SSL").apply {
init(null, arrayOf<TrustManager>(trustManager), SecureRandom())
}
builder.sslSocketFactory(
sslContext.socketFactory,
trustManager
)
builder.hostnameVerifier { _, _ -> true }
}
}

View File

@@ -1,5 +1,7 @@
package ru.fincode.tsudesk.core.network.model
import ru.fincode.tsudesk.core.common.model.AppError
sealed class NetworkError(open val meta: NetworkMeta) {
data class NoInternet(override val meta: NetworkMeta) : NetworkError(meta)
@@ -14,4 +16,11 @@ sealed class NetworkError(open val meta: NetworkMeta) {
val throwable: Throwable,
override val meta: NetworkMeta
) : NetworkError(meta)
fun toAppError(): AppError = when (this) {
is NoInternet -> AppError.NoInternet
is Timeout -> AppError.Timeout
is Http -> AppError.Http(code)
is Unknown -> AppError.Unknown(throwable.message)
}
}

View File

@@ -48,7 +48,7 @@ class ScheduleRepositoryImpl @Inject constructor(
}
is NetworkResult.Error -> {
emit(DataResult.Error(Throwable(networkResult.error.toString())))
emit(DataResult.Error(networkResult.error.toAppError()))
return@flow
}
}