From b98357a9ba8619a25259e3af38a9f7e45b953e0b Mon Sep 17 00:00:00 2001 From: Dmitry Ryaboshapko Date: Sun, 25 Jan 2026 14:01:57 +0300 Subject: [PATCH 1/3] =?UTF-8?q?HomeWork=20-=20=D0=A0=D0=B5=D1=84=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=BE=D1=80=D1=83=D1=82=D0=B8=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + .../java/otus/homework/coroutines/CatFact.kt | 6 ++ .../otus/homework/coroutines/CatsPresenter.kt | 55 +++++++++++----- .../otus/homework/coroutines/CatsService.kt | 6 +- .../java/otus/homework/coroutines/CatsView.kt | 21 ++++-- .../otus/homework/coroutines/CatsViewModel.kt | 64 +++++++++++++++++++ .../otus/homework/coroutines/FactImage.kt | 8 +++ .../otus/homework/coroutines/MainActivity.kt | 4 +- app/src/main/res/layout/activity_main.xml | 19 ++++-- app/src/main/res/values/strings.xml | 2 + 10 files changed, 159 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/otus/homework/coroutines/CatFact.kt create mode 100644 app/src/main/java/otus/homework/coroutines/CatsViewModel.kt create mode 100644 app/src/main/java/otus/homework/coroutines/FactImage.kt diff --git a/app/build.gradle b/app/build.gradle index a414e0e8..557b196a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,4 +41,5 @@ 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:2.6.0" } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatFact.kt b/app/src/main/java/otus/homework/coroutines/CatFact.kt new file mode 100644 index 00000000..481762c4 --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/CatFact.kt @@ -0,0 +1,6 @@ +package otus.homework.coroutines + +data class CatFact( + val fact: Fact, + val imageUrl: String +) \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt b/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt index e4b05120..cc3b28f3 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt @@ -1,28 +1,52 @@ package otus.homework.coroutines -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response +import android.content.res.Resources +import kotlinx.coroutines.CoroutineName +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import java.net.SocketTimeoutException class CatsPresenter( - private val catsService: CatsService + private val catsService: CatsService, + private val resources: Resources, ) { private var _catsView: ICatsView? = null - fun onInitComplete() { - catsService.getCatFact().enqueue(object : Callback { - - override fun onResponse(call: Call, response: Response) { - if (response.isSuccessful && response.body() != null) { - _catsView?.populate(response.body()!!) - } + private val presenterScope = CoroutineScope(Dispatchers.Main + CoroutineName("CatsCoroutine")) + private var job: Job = Job() + + fun load() { + job = presenterScope.launch { + runCatching { + val facts = catsService.getCatFact() + val imageUrl = catsService.loadImage().first().url + + CatFact( + fact = facts, + imageUrl = imageUrl, + ) + }.onFailure { + errorHandler(it) + }.onSuccess { + _catsView?.populate(it) } + } + } - override fun onFailure(call: Call, t: Throwable) { - CrashMonitor.trackWarning() - } - }) + private fun errorHandler(e: Throwable) { + if (e is SocketTimeoutException) { + _catsView?.showToast( + resources.getString( + R.string.socet_timeout_error, + ), + ) + } else { + CrashMonitor.trackWarning() + _catsView?.showToast(e.message.orEmpty()) + } } fun attachView(catsView: ICatsView) { @@ -31,5 +55,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..14e468c6 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsService.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsService.kt @@ -1,10 +1,12 @@ package otus.homework.coroutines -import retrofit2.Call import retrofit2.http.GET interface CatsService { @GET("fact") - fun getCatFact() : Call + suspend fun getCatFact() : Fact + + @GET("https://api.thecatapi.com/v1/images/search") + suspend fun loadImage() : 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..d3e9d4ef 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, @@ -17,16 +20,26 @@ class CatsView @JvmOverloads constructor( override fun onFinishInflate() { super.onFinishInflate() findViewById