cloudstream/app/src/main/java/com/lagradost/cloudstream3/mvvm/ArchComponentExt.kt

73 lines
2.5 KiB
Kotlin
Raw Normal View History

2021-05-12 21:51:02 +00:00
package com.lagradost.cloudstream3.mvvm
import android.util.Log
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
fun <T> LifecycleOwner.observe(liveData: LiveData<T>, action: (t: T) -> Unit) {
liveData.observe(this, Observer { it?.let { t -> action(t) } })
}
2021-05-23 17:07:43 +00:00
fun <T> LifecycleOwner.observeDirectly(liveData: LiveData<T>, action: (t: T) -> Unit) {
liveData.observe(this, Observer { it?.let { t -> action(t) } })
val currentValue = liveData.value
if (currentValue != null)
action(currentValue)
}
2021-05-12 21:51:02 +00:00
sealed class Resource<out T> {
data class Success<out T>(val value: T) : Resource<T>()
data class Failure(
val isNetworkError: Boolean,
val errorCode: Int?,
val errorResponse: Any?, //ResponseBody
val errorString: String,
) : Resource<Nothing>()
2021-06-16 16:54:07 +00:00
data class Loading(val url : String? = null) : Resource<Nothing>()
2021-05-12 21:51:02 +00:00
}
2021-06-17 16:20:05 +00:00
fun logError(throwable: Throwable) {
Log.d("ApiError", "-------------------------------------------------------------------")
Log.d("ApiError", "safeApiCall: " + throwable.localizedMessage)
Log.d("ApiError", "safeApiCall: " + throwable.message)
throwable.printStackTrace()
Log.d("ApiError", "-------------------------------------------------------------------")
}
fun<T> normalSafeApiCall(apiCall : () -> T) : T? {
return try {
apiCall.invoke()
} catch (throwable: Throwable) {
logError(throwable)
return null
}
}
2021-05-12 21:51:02 +00:00
suspend fun <T> safeApiCall(
apiCall: suspend () -> T,
): Resource<T> {
return withContext(Dispatchers.IO) {
try {
Resource.Success(apiCall.invoke())
} catch (throwable: Throwable) {
2021-06-17 16:20:05 +00:00
logError(throwable)
2021-05-12 21:51:02 +00:00
when (throwable) {
/*is HttpException -> {
Resource.Failure(false, throwable.code(), throwable.response()?.errorBody(), throwable.localizedMessage)
}
is SocketTimeoutException -> {
Resource.Failure(true,null,null,"Please try again later.")
}
is UnknownHostException ->{
Resource.Failure(true,null,null,"Cannot connect to server, try again later.")
}*/
else -> {
Resource.Failure(true, null, null, throwable.localizedMessage)
}
}
}
}
}