Skip to content

Commit

Permalink
Fixed Possible Memory Leaks - Rx disposable and contexts
Browse files Browse the repository at this point in the history
  • Loading branch information
Shobhith45 committed May 4, 2023
1 parent 5a96172 commit cf28b30
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import android.graphics.drawable.Drawable
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import androidx.leanback.app.DetailsSupportFragment
import androidx.leanback.app.DetailsSupportFragmentBackgroundController
import androidx.leanback.widget.Action
Expand Down Expand Up @@ -51,7 +51,7 @@ class ProductDetailFragment : DetailsSupportFragment() {
private fun setItemClickListener() {
setOnItemViewClickedListener { _, item, _, _ ->
if (item is Product) {
val intent = Intent(requireContext(), ProductDetailActivity::class.java)
val intent = Intent(activity, ProductDetailActivity::class.java)
with(intent) {
putExtra(Constants.EXTRA_PRODUCT_ID, item.id)
putExtra(Constants.EXTRA_PRODUCT_CATEGORY, item.category)
Expand All @@ -69,7 +69,7 @@ class ProductDetailFragment : DetailsSupportFragment() {
bindDetailsData(it.details)
}
is ProductDetailsState.Error -> {
Toast.makeText(context, "${it.message}", Toast.LENGTH_SHORT).show()
Toast.makeText(activity?.applicationContext, "${it.message}", Toast.LENGTH_SHORT).show()
}
is ProductDetailsState.RelatedItemsFetched -> {
bindRelatedItems(it.products)
Expand Down Expand Up @@ -111,7 +111,7 @@ class ProductDetailFragment : DetailsSupportFragment() {
}

val fullWidthMovieDetailsPresenter = FullWidthDetailsOverviewRowPresenter(ProductDetailsDescriptionPresenter()).apply {
backgroundColor = ContextCompat.getColor(requireContext(), R.color.details_background_color)
backgroundColor = ResourcesCompat.getColor(resources, R.color.details_background_color, null)
}

val classPresenterSelector = ClassPresenterSelector().apply {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.shobhith.atvproductsapp.details.util.ProductDetailConstants.DEFAULT_C
import com.shobhith.atvproductsapp.details.util.ProductDetailConstants.DEFAULT_ID
import com.shobhith.atvproductsapp.home.domain.usecase.GetProductByCategoryName
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.schedulers.Schedulers

class ProductDetailViewModel(
Expand All @@ -26,34 +27,45 @@ class ProductDetailViewModel(
private val _detailsState = MutableLiveData<ProductDetailsState>()
val detailsState: LiveData<ProductDetailsState> get() = _detailsState

private val disposable = CompositeDisposable()

init {
getProductDetailsById(productId)
}

fun getProductDetailsById(id: Int) {
getProductDetails(id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe (
{
_detailsState.value = ProductDetailsState.DetailsFetched(it)
getRelatedProducts(categoryName)
},
{ _detailsState.value = ProductDetailsState.Error(it.message) }
)
disposable.add(
getProductDetails(id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe (
{
_detailsState.value = ProductDetailsState.DetailsFetched(it)
getRelatedProducts(categoryName)
},
{ _detailsState.value = ProductDetailsState.Error(it.message) }
)
)
}

fun getRelatedProducts(categoryName: String) {
getProductByName(categoryName)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
_detailsState.value =
ProductDetailsState.RelatedItemsFetched(it.products.shuffled())
},
{ _detailsState.value = ProductDetailsState.Error(it.message) }
)
disposable.add(
getProductByName(categoryName)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
_detailsState.value =
ProductDetailsState.RelatedItemsFetched(it.products.shuffled())
},
{ _detailsState.value = ProductDetailsState.Error(it.message) }
)
)
}

override fun onCleared() {
disposable.dispose()
super.onCleared()
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class HomeFragment : BrowseSupportFragment() {
private fun setOnProductClickListener() {
setOnItemViewClickedListener { _, item, _, _ ->
if (item is Product) {
val intent = Intent(requireContext(), ProductDetailActivity::class.java)
val intent = Intent(activity, ProductDetailActivity::class.java)
intent.putExtra(EXTRA_PRODUCT_ID, item.id)
intent.putExtra(EXTRA_PRODUCT_CATEGORY, item.category)
startActivity(intent)
Expand All @@ -67,7 +67,7 @@ class HomeFragment : BrowseSupportFragment() {
viewModel.productHomeState.observe(viewLifecycleOwner) { state ->
when(state) {
is ProductListState.Error -> {
Toast.makeText(context, state.errorMessage.toString(), Toast.LENGTH_LONG).show()
Toast.makeText(activity?.applicationContext, state.errorMessage.toString(), Toast.LENGTH_LONG).show()
}
is ProductListState.ProductsFetched -> {
if ((state.products != null) && state.products.isNotEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.shobhith.atvproductsapp.home.domain.usecase.GetProductCategories
import com.shobhith.atvproductsapp.home.presentation.state.ProductListState
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.schedulers.Schedulers

class HomeViewModel(
Expand All @@ -18,25 +19,33 @@ class HomeViewModel(
private val _productHomeState = MutableLiveData<ProductListState>()
val productHomeState: LiveData<ProductListState> get() = _productHomeState

private val disposables = CompositeDisposable()

init {
getProducts()
}

fun getProducts() {
getCategories()
.subscribeOn(Schedulers.io())
.flatMap { catList -> Observable.fromIterable(catList) }
.concatMap { catName -> getProductByCategoryName(catName) }
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
_productHomeState.value = ProductListState.ProductsFetched(it.products)
},
{
_productHomeState.value = ProductListState.Error(it.message)
}
)
disposables.add(
getCategories()
.subscribeOn(Schedulers.io())
.flatMap { catList -> Observable.fromIterable(catList) }
.concatMap { catName -> getProductByCategoryName(catName) }
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
_productHomeState.value = ProductListState.ProductsFetched(it.products)
},
{
_productHomeState.value = ProductListState.Error(it.message)
}
)
)
}

override fun onCleared() {
disposables.dispose()
super.onCleared()
}
}

0 comments on commit cf28b30

Please sign in to comment.