From 19259b13488879d57d7a1771db00f6b1806be9d8 Mon Sep 17 00:00:00 2001 From: Baturina Anna Date: Fri, 25 Aug 2023 13:34:33 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=201.=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B9=D1=82=D0=B8=20=D1=81=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D0=BB=D0=B1=D0=B5=D0=BA=D0=BE=D0=B2=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=81=D0=B0=D1=81=D0=BF=D0=B5=D0=BD=D0=B4=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B8=20=D0=BA=D0=BE?= =?UTF-8?q?=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 + .../otus/homework/coroutines/CatsPresenter.kt | 31 ++++++++++--------- .../otus/homework/coroutines/CatsService.kt | 3 +- .../java/otus/homework/coroutines/CatsView.kt | 9 +++++- .../otus/homework/coroutines/CrashMonitor.kt | 2 +- .../java/otus/homework/coroutines/Fact.kt | 22 +++---------- .../homework/coroutines/PresenterScope.kt | 12 +++++++ 7 files changed, 44 insertions(+), 36 deletions(-) create mode 100644 app/src/main/java/otus/homework/coroutines/PresenterScope.kt diff --git a/app/build.gradle b/app/build.gradle index 679dbba4..cefb25df 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,4 +42,5 @@ dependencies { implementation 'com.google.android.material:material:1.3.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'com.squareup.picasso:picasso:2.71828' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4' } \ 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..cd6aa41e 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt @@ -1,28 +1,29 @@ package otus.homework.coroutines -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response +import kotlinx.coroutines.* +import java.net.SocketTimeoutException class CatsPresenter( private val catsService: CatsService ) { private var _catsView: ICatsView? = null + private val outerScope = PresenterScope() + private lateinit var innerScope: CoroutineScope fun onInitComplete() { - catsService.getCatFact().enqueue(object : Callback { - - override fun onResponse(call: Call, response: Response) { - if (response.isSuccessful && response.body() != null) { - _catsView?.populate(response.body()!!) - } - } - - override fun onFailure(call: Call, t: Throwable) { - CrashMonitor.trackWarning() + outerScope.launch { + innerScope = CoroutineScope(Dispatchers.IO) + try { + val catFact = innerScope.async { catsService.getCatFact() } + _catsView?.populate(catFact.await()) + } catch (exc: SocketTimeoutException) { + _catsView?.makeToast("Не удалось получить ответ от сервером") + } catch (exc: Exception) { + CrashMonitor.trackWarning(exc) + _catsView?.makeToast(exc.message.toString()) } - }) + } } fun attachView(catsView: ICatsView) { @@ -31,5 +32,7 @@ class CatsPresenter( fun detachView() { _catsView = null + outerScope.cancel() + innerScope.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..829b930c 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsService.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsService.kt @@ -1,10 +1,9 @@ package otus.homework.coroutines -import retrofit2.Call import retrofit2.http.GET interface CatsService { @GET("fact") - fun getCatFact() : Call + suspend fun getCatFact(): Fact } \ 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 30ac2531..d878eb41 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsView.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsView.kt @@ -4,6 +4,7 @@ import android.content.Context import android.util.AttributeSet import android.widget.Button import android.widget.TextView +import android.widget.Toast import androidx.constraintlayout.widget.ConstraintLayout class CatsView @JvmOverloads constructor( @@ -22,11 +23,17 @@ class CatsView @JvmOverloads constructor( } override fun populate(fact: Fact) { - findViewById(R.id.fact_textView).text = fact.text + findViewById(R.id.fact_textView).text = fact.fact + } + + override fun makeToast(text: String) { + Toast.makeText(context, text, Toast.LENGTH_LONG).show() } } interface ICatsView { fun populate(fact: Fact) + + fun makeToast(text: String) } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CrashMonitor.kt b/app/src/main/java/otus/homework/coroutines/CrashMonitor.kt index 32e6b018..fadba509 100644 --- a/app/src/main/java/otus/homework/coroutines/CrashMonitor.kt +++ b/app/src/main/java/otus/homework/coroutines/CrashMonitor.kt @@ -5,6 +5,6 @@ object CrashMonitor { /** * Pretend this is Crashlytics/AppCenter */ - fun trackWarning() { + fun trackWarning(e: Throwable) { } } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/Fact.kt b/app/src/main/java/otus/homework/coroutines/Fact.kt index 15c6c7ae..643a5a33 100644 --- a/app/src/main/java/otus/homework/coroutines/Fact.kt +++ b/app/src/main/java/otus/homework/coroutines/Fact.kt @@ -3,22 +3,8 @@ package otus.homework.coroutines import com.google.gson.annotations.SerializedName data class Fact( - @field:SerializedName("createdAt") - val createdAt: String, - @field:SerializedName("deleted") - val deleted: Boolean, - @field:SerializedName("_id") - val id: String, - @field:SerializedName("text") - val text: String, - @field:SerializedName("source") - val source: String, - @field:SerializedName("used") - val used: Boolean, - @field:SerializedName("type") - val type: String, - @field:SerializedName("user") - val user: String, - @field:SerializedName("updatedAt") - val updatedAt: String + @field:SerializedName("fact") + val fact: String, + @field:SerializedName("length") + val length: Int ) \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/PresenterScope.kt b/app/src/main/java/otus/homework/coroutines/PresenterScope.kt new file mode 100644 index 00000000..5080af09 --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/PresenterScope.kt @@ -0,0 +1,12 @@ +package otus.homework.coroutines + +import kotlinx.coroutines.CoroutineName +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlin.coroutines.CoroutineContext + +class PresenterScope: CoroutineScope { + + override val coroutineContext: CoroutineContext + get() = Dispatchers.Main + CoroutineName("CatsCoroutine") +} \ No newline at end of file From aaec55b72ebb4bdd52e988a16833703537494b72 Mon Sep 17 00:00:00 2001 From: Baturina Anna Date: Fri, 25 Aug 2023 14:21:19 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=202.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BA=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D1=83=20=D1=84?= =?UTF-8?q?=D0=B0=D0=BA=D1=82=D0=BE=D0=B2=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=81=20=D1=80=D0=B0=D0=BD=D0=B4=D0=BE=D0=BC=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D0=BA=D0=B0=D1=80=D1=82=D0=B8=D0=BD=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/otus/homework/coroutines/CatImage.kt | 8 ++++++++ .../main/java/otus/homework/coroutines/CatModel.kt | 6 ++++++ .../java/otus/homework/coroutines/CatsPresenter.kt | 8 +++++--- .../java/otus/homework/coroutines/CatsService.kt | 3 +++ .../main/java/otus/homework/coroutines/CatsView.kt | 11 ++++++++--- .../java/otus/homework/coroutines/DiContainer.kt | 12 ++++++++++-- .../java/otus/homework/coroutines/MainActivity.kt | 2 +- app/src/main/res/layout/activity_main.xml | 9 +++++++++ 8 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/otus/homework/coroutines/CatImage.kt create mode 100644 app/src/main/java/otus/homework/coroutines/CatModel.kt 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..9e331b40 --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/CatImage.kt @@ -0,0 +1,8 @@ +package otus.homework.coroutines + +import com.google.gson.annotations.SerializedName + +data class CatImage( + @field:SerializedName("file") + val url: String +) \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatModel.kt b/app/src/main/java/otus/homework/coroutines/CatModel.kt new file mode 100644 index 00000000..0e66479f --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/CatModel.kt @@ -0,0 +1,6 @@ +package otus.homework.coroutines + +data class CatModel( + val fact: String, + val url: 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 cd6aa41e..03417566 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt @@ -4,7 +4,8 @@ import kotlinx.coroutines.* import java.net.SocketTimeoutException class CatsPresenter( - private val catsService: CatsService + private val serviceCatFact: CatsService, + private val serviceCatImage: CatsService ) { private var _catsView: ICatsView? = null @@ -15,8 +16,9 @@ class CatsPresenter( outerScope.launch { innerScope = CoroutineScope(Dispatchers.IO) try { - val catFact = innerScope.async { catsService.getCatFact() } - _catsView?.populate(catFact.await()) + val catFact = innerScope.async { serviceCatFact.getCatFact() } + val catImage = innerScope.async { serviceCatImage.getCatImage() } + _catsView?.populate(CatModel(catFact.await().fact, catImage.await().url)) } catch (exc: SocketTimeoutException) { _catsView?.makeToast("Не удалось получить ответ от сервером") } catch (exc: Exception) { diff --git a/app/src/main/java/otus/homework/coroutines/CatsService.kt b/app/src/main/java/otus/homework/coroutines/CatsService.kt index 829b930c..e1c76c54 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsService.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsService.kt @@ -6,4 +6,7 @@ interface CatsService { @GET("fact") suspend fun getCatFact(): Fact + + @GET("meow") + suspend fun getCatImage(): CatImage } \ 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 d878eb41..90bbc038 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsView.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsView.kt @@ -3,9 +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, @@ -22,8 +24,11 @@ class CatsView @JvmOverloads constructor( } } - override fun populate(fact: Fact) { - findViewById(R.id.fact_textView).text = fact.fact + override fun populate(model: CatModel) { + findViewById(R.id.fact_textView).text = model.fact + Picasso.get() + .load(model.url) + .into(findViewById(R.id.cat_image)) } override fun makeToast(text: String) { @@ -33,7 +38,7 @@ class CatsView @JvmOverloads constructor( interface ICatsView { - fun populate(fact: Fact) + fun populate(model: CatModel) fun makeToast(text: String) } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/DiContainer.kt b/app/src/main/java/otus/homework/coroutines/DiContainer.kt index 23ddc3b2..0c612485 100644 --- a/app/src/main/java/otus/homework/coroutines/DiContainer.kt +++ b/app/src/main/java/otus/homework/coroutines/DiContainer.kt @@ -5,12 +5,20 @@ import retrofit2.converter.gson.GsonConverterFactory class DiContainer { - private val retrofit by lazy { + private val retrofitCatFact by lazy { Retrofit.Builder() .baseUrl("https://catfact.ninja/") .addConverterFactory(GsonConverterFactory.create()) .build() } - val service by lazy { retrofit.create(CatsService::class.java) } + private val retrofitCatImage by lazy { + Retrofit.Builder() + .baseUrl("https://aws.random.cat/") + .addConverterFactory(GsonConverterFactory.create()) + .build() + } + + val serviceCatFact: CatsService by lazy { retrofitCatFact.create(CatsService::class.java) } + val serviceCatImage: CatsService by lazy { retrofitCatImage.create(CatsService::class.java) } } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/MainActivity.kt b/app/src/main/java/otus/homework/coroutines/MainActivity.kt index a9dafb3b..ebbb5267 100644 --- a/app/src/main/java/otus/homework/coroutines/MainActivity.kt +++ b/app/src/main/java/otus/homework/coroutines/MainActivity.kt @@ -15,7 +15,7 @@ class MainActivity : AppCompatActivity() { val view = layoutInflater.inflate(R.layout.activity_main, null) as CatsView setContentView(view) - catsPresenter = CatsPresenter(diContainer.service) + catsPresenter = CatsPresenter(diContainer.serviceCatFact, diContainer.serviceCatImage) view.presenter = catsPresenter catsPresenter.attachView(view) catsPresenter.onInitComplete() diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 9508066d..43b6b9b2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,6 +6,15 @@ android:padding="16dp" android:layout_height="match_parent" tools:context=".MainActivity"> + + Date: Fri, 25 Aug 2023 16:32:10 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=203.=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20Vie?= =?UTF-8?q?wModel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 17 ++++++----- .../otus/homework/coroutines/CatsResult.kt | 6 ++++ .../java/otus/homework/coroutines/CatsView.kt | 4 +-- .../otus/homework/coroutines/CatsViewModel.kt | 29 +++++++++++++++++++ .../otus/homework/coroutines/MainActivity.kt | 22 ++++++-------- build.gradle | 4 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- 7 files changed, 58 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/otus/homework/coroutines/CatsResult.kt create mode 100644 app/src/main/java/otus/homework/coroutines/CatsViewModel.kt diff --git a/app/build.gradle b/app/build.gradle index cefb25df..b544998f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,13 +4,13 @@ plugins { } android { - compileSdkVersion 30 + compileSdkVersion 33 buildToolsVersion "30.0.3" defaultConfig { applicationId "otus.homework.coroutines" minSdkVersion 23 - targetSdkVersion 30 + targetSdkVersion 33 versionCode 1 versionName "1.0" @@ -33,14 +33,15 @@ android { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation 'androidx.core:core-ktx:1.3.2' + implementation "org.jetbrains.kotlin:kotlin-stdlib:1.8.10" + implementation 'androidx.core:core-ktx:1.10.1' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' - implementation 'com.google.code.gson:gson:2.8.6' - implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'com.google.android.material:material:1.3.0' - implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'com.google.code.gson:gson:2.8.9' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.9.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'com.squareup.picasso:picasso:2.71828' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatsResult.kt b/app/src/main/java/otus/homework/coroutines/CatsResult.kt new file mode 100644 index 00000000..2a9859c8 --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/CatsResult.kt @@ -0,0 +1,6 @@ +package otus.homework.coroutines + +sealed interface CatsResult { + class Success (val result: T): CatsResult + class Error(val exc: String): CatsResult +} \ 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 90bbc038..c2bec125 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsView.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsView.kt @@ -15,12 +15,12 @@ class CatsView @JvmOverloads constructor( defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr), ICatsView { - var presenter :CatsPresenter? = null + var viewModel :CatsViewModel? = null override fun onFinishInflate() { super.onFinishInflate() findViewById