diff --git a/README.md b/README.md index 8b5decd7..5a6a8a0c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Coroutines Homework +## Задача + ### Перейти с коллбеков на саспенд функции и корутины 1. Поменять возвращаемый тип в `CatsService` и добавить модификатор `suspend` @@ -19,3 +21,17 @@ 1. Реализовать наследника `ViewModel` и продублировать в нем логику из `CatsPresenter`, с необходимыми изменениями. Используйте `viewModelScope` в качестве скоупа. 2. Добавить логирование ошибок через CoroutineExceptionHanlder. Используйте класс CrashMonitor в качестве фейкового CrashMonitor инструмента 3. Создать sealed класс `Result`. Унаследовать от него классы `Success`, `Error`. Использовать эти классы как стейт необходимый для рендеринга/отображени ошибки + + +## Решение + +Приложение переведено на coroutines. + +В качестве сервиса получения случайных картинок используется [TheCat](https://developers.thecatapi.com/view-account/ylX4blBYT9FaoVd6OhvR?report=bOoHBz-8t), позволяющий получить список случайных изображений. + +Представлены три варианта реализации задачи, находящиеся в ```app/src/main/java/otus/homework/coroutines/presentation``` + +1. ```/mvp``` - реализация *custom view* на основе паттеран `MVP` +2. ```/mvvm/parent``` - реализация *custom view* на основе паттерна ```MVVM``` и `findViewTreeViewModelStoreOwner` +3. ```/mvvm/owners``` - реализация *custom view* на основе паттерна ```MVVM``` и *custom* ```ViewModelStoreOwner, LifecycleOwner``` +4. ```/mvi``` - реализация *custom view* на основе паттерна ```MVI``` и библиотеки ```MVICore``` diff --git a/app/build.gradle b/app/build.gradle index 679dbba4..00bc7d50 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" @@ -42,4 +42,29 @@ dependencies { implementation 'com.google.android.material:material:1.3.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'com.squareup.picasso:picasso:2.71828' + + + // coroutines + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4' + + // lifecycle + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1' + + // appcompat + implementation 'androidx.appcompat:appcompat:1.3.1' + + // mvi core + implementation 'com.github.badoo.mvicore:mvicore:1.4.0' + implementation 'com.github.badoo.mvicore:mvicore-android:1.4.0' + implementation 'com.github.badoo.mvicore:binder:1.4.0' + implementation 'com.github.badoo.mvicore:mvicore-diff:1.4.0' + + // rxjava2 + implementation "io.reactivex.rxjava2:rxjava:2.2.21" + implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' + + // coroutines-rx2 + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.7.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe34985b..15ed8506 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,14 +3,29 @@ package="otus.homework.coroutines"> + - + + + + 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 e4b05120..00000000 --- a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt +++ /dev/null @@ -1,35 +0,0 @@ -package otus.homework.coroutines - -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response - -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()!!) - } - } - - override fun onFailure(call: Call, t: Throwable) { - CrashMonitor.trackWarning() - } - }) - } - - 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 deleted file mode 100644 index 479b2cfb..00000000 --- a/app/src/main/java/otus/homework/coroutines/CatsService.kt +++ /dev/null @@ -1,10 +0,0 @@ -package otus.homework.coroutines - -import retrofit2.Call -import retrofit2.http.GET - -interface CatsService { - - @GET("fact") - fun getCatFact() : Call -} \ 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 deleted file mode 100644 index 30ac2531..00000000 --- a/app/src/main/java/otus/homework/coroutines/CatsView.kt +++ /dev/null @@ -1,32 +0,0 @@ -package otus.homework.coroutines - -import android.content.Context -import android.util.AttributeSet -import android.widget.Button -import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout - -class CatsView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), ICatsView { - - var presenter :CatsPresenter? = null - - override fun onFinishInflate() { - super.onFinishInflate() - findViewById