update error handle
This commit is contained in:
@@ -16,7 +16,8 @@ private const val LOG_TAG = "NETWORK_DEBUG"
|
|||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
|
|
||||||
@Inject lateinit var getScheduleUseCase: GetScheduleUseCase
|
@Inject
|
||||||
|
lateinit var getScheduleUseCase: GetScheduleUseCase
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@@ -29,8 +30,9 @@ class MainActivity : ComponentActivity() {
|
|||||||
val src = if (result.refreshedFromNetwork) "NETWORK" else "CACHE"
|
val src = if (result.refreshedFromNetwork) "NETWORK" else "CACHE"
|
||||||
Log.d(LOG_TAG, "FROM $src: ${result.data}")
|
Log.d(LOG_TAG, "FROM $src: ${result.data}")
|
||||||
}
|
}
|
||||||
|
|
||||||
is DataResult.Error -> {
|
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)
|
@InstallIn(SingletonComponent::class)
|
||||||
object AppConfigModule {
|
object AppConfigModule {
|
||||||
|
|
||||||
private const val BASE_PROD_URL = "https://tulsu.ru/schedule/queries/"
|
private const val BASE_URL_PROD = "https://tulsu.ru/schedule/queries/"
|
||||||
private const val BASE_DEVELOP_URL = "https://tulsu.ru/schedule/queries/"
|
private const val BASE_URL_DEVELOP = "https://scherbatykh.ru/app/tsudesk/"
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun provideAppConfig(): AppConfig {
|
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(
|
return AppConfig(
|
||||||
isDebug = BuildConfig.DEBUG,
|
isDebug = BuildConfig.DEBUG,
|
||||||
baseUrl = baseUrl,
|
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
|
package ru.fincode.tsudesk.core.common.model
|
||||||
|
|
||||||
sealed interface DataResult<out T> {
|
sealed interface DataResult<out T> {
|
||||||
|
data class Data<T>(val data: T, val refreshedFromNetwork: Boolean) : DataResult<T>
|
||||||
data class Data<T>(
|
data class Error(val error: AppError, val cause: Throwable? = null) : DataResult<Nothing>
|
||||||
val data: T, val refreshedFromNetwork: Boolean
|
}
|
||||||
) : DataResult<T>
|
|
||||||
|
|
||||||
data class Error(val throwable: Throwable) : DataResult<Nothing>
|
|
||||||
}
|
|
||||||
@@ -1,11 +1,15 @@
|
|||||||
package ru.fincode.tsudesk.core.network
|
package ru.fincode.tsudesk.core.network
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import ru.fincode.tsudesk.core.common.app.AppConfig
|
import ru.fincode.tsudesk.core.common.app.AppConfig
|
||||||
import ru.fincode.tsudesk.core.network.interceptor.DebugInterceptor
|
import ru.fincode.tsudesk.core.network.interceptor.DebugInterceptor
|
||||||
|
import java.security.SecureRandom
|
||||||
|
import java.security.cert.X509Certificate
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
import javax.net.ssl.*
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
class OkHttpClientFactory @Inject constructor(
|
class OkHttpClientFactory @Inject constructor(
|
||||||
@@ -22,8 +26,38 @@ class OkHttpClientFactory @Inject constructor(
|
|||||||
|
|
||||||
if (appConfig.isDebug) {
|
if (appConfig.isDebug) {
|
||||||
builder.addInterceptor(debugInterceptor)
|
builder.addInterceptor(debugInterceptor)
|
||||||
|
applyUnsafeSslForDebug(builder)
|
||||||
}
|
}
|
||||||
|
|
||||||
return builder.build()
|
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
|
package ru.fincode.tsudesk.core.network.model
|
||||||
|
|
||||||
|
import ru.fincode.tsudesk.core.common.model.AppError
|
||||||
|
|
||||||
sealed class NetworkError(open val meta: NetworkMeta) {
|
sealed class NetworkError(open val meta: NetworkMeta) {
|
||||||
|
|
||||||
data class NoInternet(override val meta: NetworkMeta) : NetworkError(meta)
|
data class NoInternet(override val meta: NetworkMeta) : NetworkError(meta)
|
||||||
@@ -14,4 +16,11 @@ sealed class NetworkError(open val meta: NetworkMeta) {
|
|||||||
val throwable: Throwable,
|
val throwable: Throwable,
|
||||||
override val meta: NetworkMeta
|
override val meta: NetworkMeta
|
||||||
) : NetworkError(meta)
|
) : 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 -> {
|
is NetworkResult.Error -> {
|
||||||
emit(DataResult.Error(Throwable(networkResult.error.toString())))
|
emit(DataResult.Error(networkResult.error.toAppError()))
|
||||||
return@flow
|
return@flow
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user