diff --git a/app/build.gradle b/app/build.gradle index 9d46ae19a9..f2ed72d956 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -139,6 +139,7 @@ android { buildFeatures { compose true viewBinding true + buildConfig true } composeOptions { diff --git a/app/src/main/java/com/kickstarter/ui/viewholders/KSArrayViewHolder.kt b/app/src/main/java/com/kickstarter/ui/viewholders/KSArrayViewHolder.kt index fb264d35fd..6ca4b7058c 100644 --- a/app/src/main/java/com/kickstarter/ui/viewholders/KSArrayViewHolder.kt +++ b/app/src/main/java/com/kickstarter/ui/viewholders/KSArrayViewHolder.kt @@ -51,7 +51,7 @@ abstract class KSArrayViewHolder(private val view: View) : ActivityLifecycleType * Called when the ViewHolder is being detached. Subclasses should override if they need to do any work * when the ViewHolder is being de-allocated. */ - protected fun destroy() {} + protected open fun destroy() {} protected fun view(): View { return this.view diff --git a/app/src/main/java/com/kickstarter/ui/viewholders/ShippingRuleViewHolder.kt b/app/src/main/java/com/kickstarter/ui/viewholders/ShippingRuleViewHolder.kt index 4231a4978d..d20fd61dd2 100644 --- a/app/src/main/java/com/kickstarter/ui/viewholders/ShippingRuleViewHolder.kt +++ b/app/src/main/java/com/kickstarter/ui/viewholders/ShippingRuleViewHolder.kt @@ -2,10 +2,12 @@ package com.kickstarter.ui.viewholders import android.util.Pair import com.kickstarter.databinding.ItemShippingRuleBinding +import com.kickstarter.libs.utils.extensions.addToDisposable import com.kickstarter.models.Project import com.kickstarter.models.ShippingRule import com.kickstarter.viewmodels.ShippingRuleViewHolderViewModel -import rx.android.schedulers.AndroidSchedulers +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.CompositeDisposable class ShippingRuleViewHolder(private val binding: ItemShippingRuleBinding, val delegate: Delegate) : KSArrayViewHolder(binding.root) { @@ -14,13 +16,14 @@ class ShippingRuleViewHolder(private val binding: ItemShippingRuleBinding, val d } private lateinit var shippingRule: ShippingRule private val viewModel = ShippingRuleViewHolderViewModel.ViewModel(environment()) + private val disposables = CompositeDisposable() init { this.viewModel.outputs.shippingRuleText() - .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe { this.binding.shippingRulesItemTextView.text = it } + .addToDisposable(disposables) this.binding.shippingRuleRoot.setOnClickListener { this.delegate.ruleSelected(this.shippingRule) @@ -34,4 +37,9 @@ class ShippingRuleViewHolder(private val binding: ItemShippingRuleBinding, val d this.viewModel.inputs.configureWith(this.shippingRule, project) } + + override fun destroy() { + this.viewModel.onCleared() + disposables.clear() + } } diff --git a/app/src/main/java/com/kickstarter/viewmodels/ShippingRuleViewHolderViewModel.kt b/app/src/main/java/com/kickstarter/viewmodels/ShippingRuleViewHolderViewModel.kt index 3938f465db..2a031a46d7 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/ShippingRuleViewHolderViewModel.kt +++ b/app/src/main/java/com/kickstarter/viewmodels/ShippingRuleViewHolderViewModel.kt @@ -1,15 +1,15 @@ package com.kickstarter.viewmodels import android.util.Pair -import com.kickstarter.libs.ActivityViewModel import com.kickstarter.libs.Environment +import com.kickstarter.libs.utils.extensions.addToDisposable import com.kickstarter.libs.utils.extensions.isNotNull import com.kickstarter.models.Project import com.kickstarter.models.ShippingRule -import com.kickstarter.ui.viewholders.ShippingRuleViewHolder -import rx.Observable -import rx.subjects.BehaviorSubject -import rx.subjects.PublishSubject +import io.reactivex.Observable +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.subjects.BehaviorSubject +import io.reactivex.subjects.PublishSubject interface ShippingRuleViewHolderViewModel { @@ -23,25 +23,33 @@ interface ShippingRuleViewHolderViewModel { fun shippingRuleText(): Observable } - class ViewModel(val environment: Environment) : ActivityViewModel(environment), Inputs, Outputs { + class ViewModel(val environment: Environment) : Inputs, Outputs { private val shippingRuleAndProject = PublishSubject.create>() private val shippingRuleText = BehaviorSubject.create() + private val disposables = CompositeDisposable() + val inputs: Inputs = this val outputs: Outputs = this init { this.shippingRuleAndProject .filter { it.first.isNotNull() } - .map { it.first.location()?.displayableName() } - .compose(bindToLifecycle()) - .subscribe(this.shippingRuleText) + .map { it.first.location()?.displayableName() ?: "" } + .subscribe { + this.shippingRuleText.onNext(it) + } + .addToDisposable(disposables) } override fun configureWith(shippingRule: ShippingRule, project: Project) = this.shippingRuleAndProject.onNext(Pair.create(shippingRule, project)) override fun shippingRuleText(): Observable = this.shippingRuleText + + fun onCleared() { + disposables.clear() + } } } diff --git a/app/src/test/java/com/kickstarter/viewmodels/ShippingRuleViewHolderViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/ShippingRuleViewHolderViewModelTest.kt index 15729bcc7a..214614dea7 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/ShippingRuleViewHolderViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/ShippingRuleViewHolderViewModelTest.kt @@ -2,23 +2,34 @@ package com.kickstarter.viewmodels import com.kickstarter.KSRobolectricTestCase import com.kickstarter.libs.Environment +import com.kickstarter.libs.utils.extensions.addToDisposable import com.kickstarter.mock.MockCurrentConfig import com.kickstarter.mock.factories.ConfigFactory import com.kickstarter.mock.factories.ProjectFactory import com.kickstarter.mock.factories.ShippingRuleFactory +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.subscribers.TestSubscriber +import org.junit.After import org.junit.Test -import rx.observers.TestSubscriber class ShippingRuleViewHolderViewModelTest : KSRobolectricTestCase() { private lateinit var vm: ShippingRuleViewHolderViewModel.ViewModel private val shippingRuleText = TestSubscriber.create() + private val disposables = CompositeDisposable() private fun setupEnvironment(environment: Environment) { this.vm = ShippingRuleViewHolderViewModel.ViewModel(environment) - this.vm.outputs.shippingRuleText().subscribe(this.shippingRuleText) + this.vm.outputs.shippingRuleText() + .subscribe { this.shippingRuleText.onNext(it) } + .addToDisposable(disposables) + } + + @After + fun clean() { + disposables.clear() } @Test diff --git a/gradle.properties b/gradle.properties index a752f31119..90dba333f5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,7 +14,6 @@ android.enableJetifier=true org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M" android.useAndroidX=true -android.defaults.buildfeatures.buildconfig=true android.nonTransitiveRClass=false android.nonFinalResIds=false #android.debug.obsoleteApi=true