diff --git a/app/build.gradle b/app/build.gradle index a414e0e8..aaac570d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,4 +41,6 @@ dependencies { implementation 'com.google.android.material:material:1.11.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'com.squareup.picasso:picasso:2.71828' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx' + implementation 'androidx.activity:activity-ktx:1.9.0' } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatImage.kt b/app/src/main/java/otus/homework/coroutines/CatImage.kt new file mode 100644 index 00000000..0679ca84 --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/CatImage.kt @@ -0,0 +1,3 @@ +package otus.homework.coroutines + +data class CatImage(val url: String) diff --git a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt b/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt index e4b05120..c98dff3b 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt @@ -1,28 +1,47 @@ package otus.homework.coroutines -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.CoroutineName +import kotlinx.coroutines.async +import kotlinx.coroutines.launch +import java.net.SocketTimeoutException +import kotlin.coroutines.cancellation.CancellationException class CatsPresenter( - private val catsService: CatsService + private val catsService: CatsService, + private val catsServicePics: CatsServicePics ) { - private var _catsView: ICatsView? = null + val job = SupervisorJob() + private val scope = CoroutineScope(Dispatchers.Main + job + CoroutineName("CatsCoroutine")) fun onInitComplete() { - catsService.getCatFact().enqueue(object : Callback { - - override fun onResponse(call: Call, response: Response) { - if (response.isSuccessful && response.body() != null) { - _catsView?.populate(response.body()!!) - } + scope.launch { + try { + val factDeferred = async { catsService.getCatFact() } + val imageDeferred = async { catsServicePics.getCatPicUrl() } + + val fact = factDeferred.await() + val pic = imageDeferred.await() + val url = pic.firstOrNull()?.url + fact.url = url.toString() + _catsView?.populate(fact) } - - override fun onFailure(call: Call, t: Throwable) { - CrashMonitor.trackWarning() + catch (e: Exception) { + when (e) { + is CancellationException -> throw e + is SocketTimeoutException -> { + _catsView?.showServerErrorToast() + } + else -> { + _catsView?.showToast(e.message.toString()) + CrashMonitor.trackWarning() + } + } } - }) + } } fun attachView(catsView: ICatsView) { @@ -31,5 +50,6 @@ class CatsPresenter( fun detachView() { _catsView = null + job.cancel() } } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatsService.kt b/app/src/main/java/otus/homework/coroutines/CatsService.kt index 479b2cfb..c0a5dbcb 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsService.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsService.kt @@ -1,10 +1,14 @@ package otus.homework.coroutines -import retrofit2.Call import retrofit2.http.GET interface CatsService { @GET("fact") - fun getCatFact() : Call + suspend fun getCatFact() : Fact + +} +interface CatsServicePics { + @GET("v1/images/search") + suspend fun getCatPicUrl() : List } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatsView.kt b/app/src/main/java/otus/homework/coroutines/CatsView.kt index be04b2a8..564251be 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsView.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsView.kt @@ -3,8 +3,11 @@ package otus.homework.coroutines import android.content.Context import android.util.AttributeSet import android.widget.Button +import android.widget.ImageView import android.widget.TextView +import android.widget.Toast import androidx.constraintlayout.widget.ConstraintLayout +import com.squareup.picasso.Picasso class CatsView @JvmOverloads constructor( context: Context, @@ -12,21 +15,34 @@ class CatsView @JvmOverloads constructor( defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr), ICatsView { - var presenter :CatsPresenter? = null override fun onFinishInflate() { super.onFinishInflate() - findViewById