Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,7 @@ package com.fernandocejas.sample.core.interactor

import com.fernandocejas.sample.core.exception.Failure
import com.fernandocejas.sample.core.functional.Either
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import kotlinx.coroutines.*

/**
* Abstract class for a Use Case (Interactor in terms of Clean Architecture).
Expand All @@ -34,9 +31,13 @@ abstract class UseCase<out Type, in Params> where Type : Any {

abstract suspend fun run(params: Params): Either<Failure, Type>

operator fun invoke(params: Params, onResult: (Either<Failure, Type>) -> Unit = {}) {
val job = GlobalScope.async(Dispatchers.IO) { run(params) }
GlobalScope.launch(Dispatchers.Main) { onResult(job.await()) }
operator fun invoke(params: Params, scope: CoroutineScope = GlobalScope, onResult: (Either<Failure, Type>) -> Unit = {}) {
scope.launch(Dispatchers.Main) {
val deferred = async(Dispatchers.IO) {
run(params)
}
onResult(deferred.await())
}
}

class None
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package com.fernandocejas.sample.features.movies

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.fernandocejas.sample.core.platform.BaseViewModel
import com.fernandocejas.sample.features.movies.GetMovieDetails.Params
import javax.inject.Inject
Expand All @@ -29,9 +30,14 @@ class MovieDetailsViewModel
val movieDetails: LiveData<MovieDetailsView> = _movieDetails

fun loadMovieDetails(movieId: Int) =
getMovieDetails(Params(movieId)) { it.fold(::handleFailure, ::handleMovieDetails) }
getMovieDetails(Params(movieId), viewModelScope) {
it.fold(
::handleFailure,
::handleMovieDetails
)
}

fun playMovie(url: String) = playMovie(PlayMovie.Params(url))
fun playMovie(url: String) = playMovie(PlayMovie.Params(url), viewModelScope)

private fun handleMovieDetails(movie: MovieDetails) {
_movieDetails.value = MovieDetailsView(movie.id, movie.title, movie.poster,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package com.fernandocejas.sample.features.movies

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.fernandocejas.sample.core.interactor.UseCase.None
import com.fernandocejas.sample.core.platform.BaseViewModel
import javax.inject.Inject
Expand All @@ -27,7 +28,8 @@ class MoviesViewModel
private val _movies: MutableLiveData<List<MovieView>> = MutableLiveData()
val movies: LiveData<List<MovieView>> = _movies

fun loadMovies() = getMovies(None()) { it.fold(::handleFailure, ::handleMovieList) }
fun loadMovies() =
getMovies(None(), viewModelScope) { it.fold(::handleFailure, ::handleMovieList) }

private fun handleMovieList(movies: List<Movie>) {
_movies.value = movies.map { MovieView(it.id, it.poster) }
Expand Down