update error handle
This commit is contained in:
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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>
|
||||
}
|
||||
@@ -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 }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user