From 9c7f55033487bb672b7da187cf1c25ceb258244b Mon Sep 17 00:00:00 2001 From: dmilkov97 Date: Sun, 21 Sep 2025 18:57:42 +0700 Subject: [PATCH 1/8] 1st point --- app/build.gradle | 1 + app/src/main/java/otus/homework/reactivecats/CatsService.kt | 3 ++- gradle/libs.versions.toml | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 4a3a24a..9f5aff5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,4 +47,5 @@ dependencies { implementation libs.picasso implementation libs.rxjava implementation libs.rxandroid + implementation libs.adapter.rxjava2 } diff --git a/app/src/main/java/otus/homework/reactivecats/CatsService.kt b/app/src/main/java/otus/homework/reactivecats/CatsService.kt index f30b3aa..e98252f 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsService.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsService.kt @@ -1,5 +1,6 @@ package otus.homework.reactivecats +import io.reactivex.Single import retrofit2.Call import retrofit2.http.GET @@ -7,5 +8,5 @@ interface CatsService { //@GET("random?animal_type=cat") @GET("fact") - fun getCatFact(): Call + fun getCatFact(): Single } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 46c9578..37a6f4f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,6 +17,7 @@ rxandroid = "2.1.1" rxjava = "2.2.21" [libraries] +adapter-rxjava2 = { module = "com.squareup.retrofit2:adapter-rxjava2", version.ref = "retrofit" } core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" } appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } From 050d2e2f235f0bc0b5670e6437af3c255976b36f Mon Sep 17 00:00:00 2001 From: dmilkov97 Date: Tue, 23 Sep 2025 21:01:20 +0700 Subject: [PATCH 2/8] 2nd point --- .../homework/reactivecats/CatsViewModel.kt | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt index d62eaf9..fb3103e 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt @@ -1,10 +1,15 @@ package otus.homework.reactivecats import android.content.Context +import android.net.http.HttpException import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.schedulers.Schedulers +import okio.IOException import retrofit2.Call import retrofit2.Callback import retrofit2.Response @@ -17,28 +22,37 @@ class CatsViewModel( private val _catsLiveData = MutableLiveData() val catsLiveData: LiveData = _catsLiveData + private val сompositeDisposable = CompositeDisposable() + private var _catsService: CatsService = catsService init { - catsService.getCatFact().enqueue(object : Callback { - override fun onResponse(call: Call, response: Response) { - if (response.isSuccessful && response.body() != null) { - _catsLiveData.value = Success(response.body()!!) - } else { - _catsLiveData.value = Error( - response.errorBody()?.string() ?: context.getString( - R.string.default_error_text - ) - ) - } - } + getFacts() - override fun onFailure(call: Call, t: Throwable) { - _catsLiveData.value = ServerError - } - }) } - fun getFacts() {} + fun getFacts() { + val disposable = _catsService.getCatFact() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + _catsLiveData.value = Success(it) + }, { + when (it) { + is IOException -> { + _catsLiveData.value = ServerError + } + else -> { + _catsLiveData.value = Error(it.message.toString()) + } + } + }) + сompositeDisposable.add(disposable) + } + + override fun onCleared() { + super.onCleared() + сompositeDisposable.dispose() + } } class CatsViewModelFactory( From 56687e5b63f00dd2c8941d1b6c69548ce049c444 Mon Sep 17 00:00:00 2001 From: dmilkov97 Date: Sun, 28 Sep 2025 17:42:11 +0700 Subject: [PATCH 3/8] 3rd point + fixes --- .../main/java/otus/homework/reactivecats/CatsViewModel.kt | 3 +++ app/src/main/java/otus/homework/reactivecats/DiContainer.kt | 2 ++ .../otus/homework/reactivecats/LocalCatFactsGenerator.kt | 5 +++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt index fb3103e..1f4e8ea 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt @@ -24,6 +24,7 @@ class CatsViewModel( val catsLiveData: LiveData = _catsLiveData private val сompositeDisposable = CompositeDisposable() private var _catsService: CatsService = catsService + private val _localCatFactsGenerator = localCatFactsGenerator init { getFacts() @@ -34,6 +35,7 @@ class CatsViewModel( val disposable = _catsService.getCatFact() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) + .onErrorResumeNext { _localCatFactsGenerator.generateCatFact() } .subscribe({ _catsLiveData.value = Success(it) }, { @@ -46,6 +48,7 @@ class CatsViewModel( } } }) + сompositeDisposable.add(disposable) } diff --git a/app/src/main/java/otus/homework/reactivecats/DiContainer.kt b/app/src/main/java/otus/homework/reactivecats/DiContainer.kt index bbccfc7..41d4e3e 100644 --- a/app/src/main/java/otus/homework/reactivecats/DiContainer.kt +++ b/app/src/main/java/otus/homework/reactivecats/DiContainer.kt @@ -2,6 +2,7 @@ package otus.homework.reactivecats import android.content.Context import retrofit2.Retrofit +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory import retrofit2.converter.gson.GsonConverterFactory class DiContainer { @@ -11,6 +12,7 @@ class DiContainer { //.baseUrl("https://cat-fact.herokuapp.com/facts/") .baseUrl("https://catfact.ninja/") .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build() } diff --git a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt index 4481062..c101912 100644 --- a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt +++ b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt @@ -15,7 +15,8 @@ class LocalCatFactsGenerator( * обернутую в подходящий стрим(Flowable/Single/Observable и т.п) */ fun generateCatFact(): Single { - return Single.never() + val success = context.resources.getStringArray(R.array.local_cat_facts)[Random.nextInt(5)] + return Single.just(Fact(success)) } /** @@ -25,6 +26,6 @@ class LocalCatFactsGenerator( */ fun generateCatFactPeriodically(): Flowable { val success = Fact(context.resources.getStringArray(R.array.local_cat_facts)[Random.nextInt(5)]) - return Flowable.empty() + return Flowable.just(success) } } \ No newline at end of file From 62986aaedf3d3fcd794afac25c0484afa1fd2c25 Mon Sep 17 00:00:00 2001 From: dmilkov97 Date: Tue, 14 Oct 2025 19:04:57 +0700 Subject: [PATCH 4/8] done --- .../otus/homework/reactivecats/CatsViewModel.kt | 14 +++++++++----- .../reactivecats/LocalCatFactsGenerator.kt | 13 +++++++++++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt index 1f4e8ea..26dbd5b 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt @@ -6,6 +6,8 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import io.reactivex.Flowable +import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.schedulers.Schedulers @@ -13,6 +15,7 @@ import okio.IOException import retrofit2.Call import retrofit2.Callback import retrofit2.Response +import java.util.concurrent.TimeUnit class CatsViewModel( catsService: CatsService, @@ -28,14 +31,16 @@ class CatsViewModel( init { getFacts() - } fun getFacts() { - val disposable = _catsService.getCatFact() - .subscribeOn(Schedulers.io()) + + val disposable = Observable.interval(0, 2000, TimeUnit.MILLISECONDS) + .flatMapSingle { + _catsService.getCatFact().onErrorResumeNext { _localCatFactsGenerator.generateCatFact() } + } + .distinctUntilChanged() .observeOn(AndroidSchedulers.mainThread()) - .onErrorResumeNext { _localCatFactsGenerator.generateCatFact() } .subscribe({ _catsLiveData.value = Success(it) }, { @@ -48,7 +53,6 @@ class CatsViewModel( } } }) - сompositeDisposable.add(disposable) } diff --git a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt index c101912..716ca69 100644 --- a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt +++ b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt @@ -3,6 +3,10 @@ package otus.homework.reactivecats import android.content.Context import io.reactivex.Flowable import io.reactivex.Single +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers +import io.reactivex.subscribers.DisposableSubscriber +import java.util.concurrent.TimeUnit import kotlin.random.Random class LocalCatFactsGenerator( @@ -25,7 +29,12 @@ class LocalCatFactsGenerator( * Если вновь заэмиченный Fact совпадает с предыдущим - пропускаем элемент. */ fun generateCatFactPeriodically(): Flowable { - val success = Fact(context.resources.getStringArray(R.array.local_cat_facts)[Random.nextInt(5)]) - return Flowable.just(success) + val factsArray = context.resources.getStringArray(R.array.local_cat_facts) + return Flowable.interval(0, 2000, TimeUnit.MILLISECONDS) + .map { + val randomFact = factsArray[Random.nextInt(factsArray.size)] + Fact(randomFact) + } + .distinctUntilChanged() } } \ No newline at end of file From 47d4c38e17e188612934b96cc0f152f7d72e9b6e Mon Sep 17 00:00:00 2001 From: dmilkov97 Date: Sat, 18 Oct 2025 18:38:08 +0700 Subject: [PATCH 5/8] 1st issue fixes --- .../main/java/otus/homework/reactivecats/CatsViewModel.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt index 26dbd5b..510e845 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt @@ -18,16 +18,14 @@ import retrofit2.Response import java.util.concurrent.TimeUnit class CatsViewModel( - catsService: CatsService, - localCatFactsGenerator: LocalCatFactsGenerator, + private val catsService: CatsService, + private val localCatFactsGenerator: LocalCatFactsGenerator, context: Context ) : ViewModel() { private val _catsLiveData = MutableLiveData() val catsLiveData: LiveData = _catsLiveData private val сompositeDisposable = CompositeDisposable() - private var _catsService: CatsService = catsService - private val _localCatFactsGenerator = localCatFactsGenerator init { getFacts() @@ -37,7 +35,7 @@ class CatsViewModel( val disposable = Observable.interval(0, 2000, TimeUnit.MILLISECONDS) .flatMapSingle { - _catsService.getCatFact().onErrorResumeNext { _localCatFactsGenerator.generateCatFact() } + catsService.getCatFact().onErrorResumeNext { localCatFactsGenerator.generateCatFact() } } .distinctUntilChanged() .observeOn(AndroidSchedulers.mainThread()) From 059c8fc7b91aa7cb1e987436e541d4120a5f36d5 Mon Sep 17 00:00:00 2001 From: dmilkov97 Date: Sat, 18 Oct 2025 18:39:35 +0700 Subject: [PATCH 6/8] 2nd issue fixes --- .../main/java/otus/homework/reactivecats/CatsViewModel.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt index 510e845..58904e8 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt @@ -19,8 +19,7 @@ import java.util.concurrent.TimeUnit class CatsViewModel( private val catsService: CatsService, - private val localCatFactsGenerator: LocalCatFactsGenerator, - context: Context + private val localCatFactsGenerator: LocalCatFactsGenerator ) : ViewModel() { private val _catsLiveData = MutableLiveData() @@ -62,13 +61,12 @@ class CatsViewModel( class CatsViewModelFactory( private val catsRepository: CatsService, - private val localCatFactsGenerator: LocalCatFactsGenerator, - private val context: Context + private val localCatFactsGenerator: LocalCatFactsGenerator ) : ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T = - CatsViewModel(catsRepository, localCatFactsGenerator, context) as T + CatsViewModel(catsRepository, localCatFactsGenerator) as T } sealed class Result From bf5d1016060508a3179defb7aea576d11e986074 Mon Sep 17 00:00:00 2001 From: dmilkov97 Date: Sat, 18 Oct 2025 18:43:50 +0700 Subject: [PATCH 7/8] 3rd issue fixes --- app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt index 58904e8..9023b89 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt @@ -36,6 +36,7 @@ class CatsViewModel( .flatMapSingle { catsService.getCatFact().onErrorResumeNext { localCatFactsGenerator.generateCatFact() } } + .subscribeOn(Schedulers.io()) .distinctUntilChanged() .observeOn(AndroidSchedulers.mainThread()) .subscribe({ From a47086c86bad8847444ba503fed629a7dc0a5a7b Mon Sep 17 00:00:00 2001 From: dmilkov97 Date: Sat, 18 Oct 2025 18:50:25 +0700 Subject: [PATCH 8/8] 2nd issue fixes #2 --- app/src/main/java/otus/homework/reactivecats/MainActivity.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/otus/homework/reactivecats/MainActivity.kt b/app/src/main/java/otus/homework/reactivecats/MainActivity.kt index 8ec9571..7b99923 100644 --- a/app/src/main/java/otus/homework/reactivecats/MainActivity.kt +++ b/app/src/main/java/otus/homework/reactivecats/MainActivity.kt @@ -13,8 +13,7 @@ class MainActivity : AppCompatActivity() { private val catsViewModel by viewModels { CatsViewModelFactory( diContainer.service, - diContainer.localCatFactsGenerator(applicationContext), - applicationContext + diContainer.localCatFactsGenerator(applicationContext) ) }