From ceb8a8d27d108a54803d5ff2b99efe97dd421619 Mon Sep 17 00:00:00 2001 From: rozak Date: Tue, 4 Jun 2024 18:13:27 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B9=D1=82=D0=B8?= =?UTF-8?q?=20=D1=81=20=D0=BA=D0=BE=D0=BB=D0=BB=D0=B1=D0=B5=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BD=D0=B0=20=D1=81=D0=B0=D1=81=D0=BF=D0=B5=D0=BD?= =?UTF-8?q?=D0=B4=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B8=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 --- .../otus/homework/coroutines/CatsPresenter.kt | 30 +++++++++++-------- .../otus/homework/coroutines/CatsService.kt | 2 +- .../java/otus/homework/coroutines/CatsView.kt | 7 +++++ .../otus/homework/coroutines/CrashMonitor.kt | 5 +++- .../otus/homework/coroutines/MainActivity.kt | 1 + .../homework/coroutines/PresenterScope.kt | 10 +++++++ app/src/main/res/values/strings.xml | 1 + 7 files changed, 42 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/otus/homework/coroutines/PresenterScope.kt diff --git a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt b/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt index e4b05120..6403b738 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt @@ -1,28 +1,34 @@ package otus.homework.coroutines +import android.util.Log +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import retrofit2.Call import retrofit2.Callback import retrofit2.Response +import java.net.SocketTimeoutException class CatsPresenter( private val catsService: CatsService -) { +){ 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()!!) - } - } + val scope = PresenterScope() - override fun onFailure(call: Call, t: Throwable) { - CrashMonitor.trackWarning() + fun onInitComplete() { + scope.launch { + try { + Log.d("CatsPresenter", this.coroutineContext.toString()) + val result = catsService.getCatFact() + _catsView?.populate(result) + } catch (e: SocketTimeoutException) { + _catsView?.showToast("Не удалось получить ответ от сервером") + } catch (e: Exception) { + _catsView?.showToast(e.message.toString()) } - }) + } } fun attachView(catsView: ICatsView) { diff --git a/app/src/main/java/otus/homework/coroutines/CatsService.kt b/app/src/main/java/otus/homework/coroutines/CatsService.kt index 479b2cfb..ca9e3f73 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsService.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsService.kt @@ -6,5 +6,5 @@ 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 be04b2a8..a44c5ad8 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( @@ -21,6 +22,10 @@ class CatsView @JvmOverloads constructor( } } + override fun showToast(msg: String) { + Toast.makeText(context, msg, Toast.LENGTH_LONG).show() + } + override fun populate(fact: Fact) { findViewById(R.id.fact_textView).text = fact.fact } @@ -28,5 +33,7 @@ class CatsView @JvmOverloads constructor( interface ICatsView { + fun showToast(msg: String) fun populate(fact: Fact) + } \ 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..c6ef39c4 100644 --- a/app/src/main/java/otus/homework/coroutines/CrashMonitor.kt +++ b/app/src/main/java/otus/homework/coroutines/CrashMonitor.kt @@ -1,10 +1,13 @@ package otus.homework.coroutines +import android.util.Log + object CrashMonitor { /** * Pretend this is Crashlytics/AppCenter */ - fun trackWarning() { + fun trackWarning(msg: String) { + Log.e("CrashMonitor", msg) } } \ 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..334e46e6 100644 --- a/app/src/main/java/otus/homework/coroutines/MainActivity.kt +++ b/app/src/main/java/otus/homework/coroutines/MainActivity.kt @@ -2,6 +2,7 @@ package otus.homework.coroutines import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.widget.Toast class MainActivity : AppCompatActivity() { 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..a5ac6bdd --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/PresenterScope.kt @@ -0,0 +1,10 @@ +package otus.homework.coroutines + +import kotlinx.coroutines.CoroutineName +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlin.coroutines.CoroutineContext + +class PresenterScope(override val coroutineContext: CoroutineContext = CoroutineName("CatsCoroutine") + Dispatchers.Main) : CoroutineScope { +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6c270d5d..a51e9b50 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,4 +1,5 @@ Cat Facts More Facts + Не удалось получить ответ от сервером \ No newline at end of file From c45aebc86f60fd35784d4dd27b4716e0b0107af9 Mon Sep 17 00:00:00 2001 From: rozak Date: Tue, 4 Jun 2024 18:33:51 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BA=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D1=83=20?= =?UTF-8?q?=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D0=B2=20=D0=B7=D0=B0=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=20=D1=80=D0=B0=D0=BD=D0=B4=D0=BE=D0=BC=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=BA=D0=B0=D1=80=D1=82=D0=B8=D0=BD=D0=BE=D0=BA=20?= =?UTF-8?q?=D1=81=20https://api.thecatapi.com/v1/images/search?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/otus/homework/coroutines/CatapiImage.kt | 3 +++ .../otus/homework/coroutines/CatapiImageItem.kt | 8 ++++++++ .../java/otus/homework/coroutines/CatsPresenter.kt | 8 ++++++-- .../java/otus/homework/coroutines/CatsService.kt | 5 ++++- .../main/java/otus/homework/coroutines/CatsView.kt | 11 +++++++---- .../java/otus/homework/coroutines/CatsViewModel.kt | 13 +++++++++++++ .../main/java/otus/homework/coroutines/Content.kt | 6 ++++++ .../otus/homework/coroutines/PresentationMopdel.kt | 4 ++++ app/src/main/res/layout/activity_main.xml | 10 ++++++++++ 9 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/otus/homework/coroutines/CatapiImage.kt create mode 100644 app/src/main/java/otus/homework/coroutines/CatapiImageItem.kt create mode 100644 app/src/main/java/otus/homework/coroutines/CatsViewModel.kt create mode 100644 app/src/main/java/otus/homework/coroutines/Content.kt create mode 100644 app/src/main/java/otus/homework/coroutines/PresentationMopdel.kt diff --git a/app/src/main/java/otus/homework/coroutines/CatapiImage.kt b/app/src/main/java/otus/homework/coroutines/CatapiImage.kt new file mode 100644 index 00000000..30c0f763 --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/CatapiImage.kt @@ -0,0 +1,3 @@ +package otus.homework.coroutines + +class CatapiImage : ArrayList() \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatapiImageItem.kt b/app/src/main/java/otus/homework/coroutines/CatapiImageItem.kt new file mode 100644 index 00000000..c7f9fa57 --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/CatapiImageItem.kt @@ -0,0 +1,8 @@ +package otus.homework.coroutines + +data class CatapiImageItem( + val height: Int, + val id: String, + val url: String, + val width: Int +) \ 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 6403b738..695200f7 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt @@ -3,6 +3,8 @@ package otus.homework.coroutines import android.util.Log import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel import kotlinx.coroutines.launch import retrofit2.Call import retrofit2.Callback @@ -21,8 +23,9 @@ class CatsPresenter( scope.launch { try { Log.d("CatsPresenter", this.coroutineContext.toString()) - val result = catsService.getCatFact() - _catsView?.populate(result) + val resultFact = catsService.getCatFact() + val resultImg = catsService.getImg() + _catsView?.populate(Content(resultImg, resultFact)) } catch (e: SocketTimeoutException) { _catsView?.showToast("Не удалось получить ответ от сервером") } catch (e: Exception) { @@ -36,6 +39,7 @@ class CatsPresenter( } fun detachView() { + scope.cancel() _catsView = null } } \ 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 ca9e3f73..aa7dee2a 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsService.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsService.kt @@ -1,10 +1,13 @@ package otus.homework.coroutines -import retrofit2.Call import retrofit2.http.GET +import retrofit2.http.Url interface CatsService { @GET("fact") suspend fun getCatFact() : Fact + + @GET + suspend fun getImg(@Url url:String = "https://api.thecatapi.com/v1/images/search") : CatapiImage } \ 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 a44c5ad8..9f591a9f 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, @@ -13,7 +15,7 @@ class CatsView @JvmOverloads constructor( defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr), ICatsView { - var presenter :CatsPresenter? = null + var presenter: CatsPresenter? = null override fun onFinishInflate() { super.onFinishInflate() @@ -26,14 +28,15 @@ class CatsView @JvmOverloads constructor( Toast.makeText(context, msg, Toast.LENGTH_LONG).show() } - override fun populate(fact: Fact) { - findViewById(R.id.fact_textView).text = fact.fact + override fun populate(content: Content) { + findViewById(R.id.fact_textView).text = content.fact.fact + Picasso.get().load(content.catapiImage[0].url).into(findViewById(R.id.fact_imgView)) } } interface ICatsView { fun showToast(msg: String) - fun populate(fact: Fact) + fun populate(content: Content) } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatsViewModel.kt b/app/src/main/java/otus/homework/coroutines/CatsViewModel.kt new file mode 100644 index 00000000..59e99cfd --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/CatsViewModel.kt @@ -0,0 +1,13 @@ +package otus.homework.coroutines + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel + +class CatsViewModel: ViewModel() { + + private val _liveData = MutableLiveData>() + val liveData: LiveData> = _liveData + + +} \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/Content.kt b/app/src/main/java/otus/homework/coroutines/Content.kt new file mode 100644 index 00000000..28a7b600 --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/Content.kt @@ -0,0 +1,6 @@ +package otus.homework.coroutines + +data class Content( + val catapiImage: CatapiImage, + val fact: Fact, +) \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/PresentationMopdel.kt b/app/src/main/java/otus/homework/coroutines/PresentationMopdel.kt new file mode 100644 index 00000000..ef1f1854 --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/PresentationMopdel.kt @@ -0,0 +1,4 @@ +package otus.homework.coroutines + +class PresentationMopdel { +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 9508066d..d621a8e6 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -7,6 +7,16 @@ android:layout_height="match_parent" tools:context=".MainActivity"> + + Date: Tue, 4 Jun 2024 18:33:51 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BA=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D1=83=20?= =?UTF-8?q?=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D0=B2=20=D0=B7=D0=B0=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=20=D1=80=D0=B0=D0=BD=D0=B4=D0=BE=D0=BC=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=BA=D0=B0=D1=80=D1=82=D0=B8=D0=BD=D0=BE=D0=BA=20?= =?UTF-8?q?=D1=81=20https://api.thecatapi.com/v1/images/search?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 2 +- .../otus/homework/coroutines/ApiResult.kt | 6 +++ .../otus/homework/coroutines/CatapiImage.kt | 3 ++ .../homework/coroutines/CatapiImageItem.kt | 8 +++ .../otus/homework/coroutines/CatsPresenter.kt | 41 --------------- .../otus/homework/coroutines/CatsService.kt | 5 +- .../java/otus/homework/coroutines/CatsView.kt | 25 ++-------- .../otus/homework/coroutines/CatsViewModel.kt | 45 +++++++++++++++++ .../java/otus/homework/coroutines/Content.kt | 6 +++ .../otus/homework/coroutines/MainActivity.kt | 31 ------------ .../otus/homework/coroutines/MainActivity2.kt | 50 +++++++++++++++++++ .../homework/coroutines/PresentationMopdel.kt | 4 ++ app/src/main/res/layout/activity_main.xml | 12 ++++- 14 files changed, 142 insertions(+), 97 deletions(-) create mode 100644 app/src/main/java/otus/homework/coroutines/ApiResult.kt create mode 100644 app/src/main/java/otus/homework/coroutines/CatapiImage.kt create mode 100644 app/src/main/java/otus/homework/coroutines/CatapiImageItem.kt delete mode 100644 app/src/main/java/otus/homework/coroutines/CatsPresenter.kt create mode 100644 app/src/main/java/otus/homework/coroutines/CatsViewModel.kt create mode 100644 app/src/main/java/otus/homework/coroutines/Content.kt delete mode 100644 app/src/main/java/otus/homework/coroutines/MainActivity.kt create mode 100644 app/src/main/java/otus/homework/coroutines/MainActivity2.kt create mode 100644 app/src/main/java/otus/homework/coroutines/PresentationMopdel.kt diff --git a/app/build.gradle b/app/build.gradle index a414e0e8..a00b3aa8 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.2.0" } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe34985b..34db0550 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Coroutines"> - diff --git a/app/src/main/java/otus/homework/coroutines/ApiResult.kt b/app/src/main/java/otus/homework/coroutines/ApiResult.kt new file mode 100644 index 00000000..594bf52d --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/ApiResult.kt @@ -0,0 +1,6 @@ +package otus.homework.coroutines + +sealed class ApiResult { + data class Success(val data: T) : ApiResult() + data class Error(val error: Throwable) : ApiResult() +} \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatapiImage.kt b/app/src/main/java/otus/homework/coroutines/CatapiImage.kt new file mode 100644 index 00000000..30c0f763 --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/CatapiImage.kt @@ -0,0 +1,3 @@ +package otus.homework.coroutines + +class CatapiImage : ArrayList() \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatapiImageItem.kt b/app/src/main/java/otus/homework/coroutines/CatapiImageItem.kt new file mode 100644 index 00000000..c7f9fa57 --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/CatapiImageItem.kt @@ -0,0 +1,8 @@ +package otus.homework.coroutines + +data class CatapiImageItem( + val height: Int, + val id: String, + val url: String, + val width: Int +) \ 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 deleted file mode 100644 index 6403b738..00000000 --- a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt +++ /dev/null @@ -1,41 +0,0 @@ -package otus.homework.coroutines - -import android.util.Log -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response -import java.net.SocketTimeoutException - -class CatsPresenter( - private val catsService: CatsService -){ - - private var _catsView: ICatsView? = null - - val scope = PresenterScope() - - fun onInitComplete() { - scope.launch { - try { - Log.d("CatsPresenter", this.coroutineContext.toString()) - val result = catsService.getCatFact() - _catsView?.populate(result) - } catch (e: SocketTimeoutException) { - _catsView?.showToast("Не удалось получить ответ от сервером") - } catch (e: Exception) { - _catsView?.showToast(e.message.toString()) - } - } - } - - fun attachView(catsView: ICatsView) { - _catsView = catsView - } - - fun detachView() { - _catsView = null - } -} \ 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 ca9e3f73..aa7dee2a 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsService.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsService.kt @@ -1,10 +1,13 @@ package otus.homework.coroutines -import retrofit2.Call import retrofit2.http.GET +import retrofit2.http.Url interface CatsService { @GET("fact") suspend fun getCatFact() : Fact + + @GET + suspend fun getImg(@Url url:String = "https://api.thecatapi.com/v1/images/search") : CatapiImage } \ 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 a44c5ad8..0025d7c4 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsView.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsView.kt @@ -3,37 +3,18 @@ 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, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), ICatsView { +) : ConstraintLayout(context, attrs, defStyleAttr) { - var presenter :CatsPresenter? = null - override fun onFinishInflate() { - super.onFinishInflate() - findViewById