Advertisement
Guest User

Untitled

a guest
May 21st, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.69 KB | None | 0 0
  1. package travel.footsteps.city
  2.  
  3. import android.databinding.ObservableArrayList
  4. import android.databinding.ObservableField
  5. import io.reactivex.Completable
  6. import io.reactivex.Observable
  7. import io.reactivex.ObservableSource
  8. import io.reactivex.ObservableTransformer
  9. import io.reactivex.internal.operators.completable.CompletableFromCallable
  10. import io.reactivex.schedulers.Schedulers
  11. import io.reactivex.subjects.PublishSubject
  12. import travel.footsteps.parseobjects.City
  13. import travel.footsteps.parseobjects.Track
  14. import travel.footsteps.ui.base.BaseViewModel
  15. import travel.footsteps.utils.usecase.*
  16. import travel.footsteps.waypoint.Waypoint
  17. import javax.inject.Inject
  18.  
  19. class CityViewModel
  20. @Inject
  21. constructor(
  22.         private val getCityUsecase: GetCityUsecase,
  23.         private val getRoutesUsecase: GetRoutesUsecase,
  24.         private val getWaypointsUsecase: GetWaypointsUsecase
  25. ) : BaseViewModel(), ObservableTransformer<UiEvent, UiEventResults> {
  26.  
  27.     private val eventSubject = PublishSubject.create<UiEvent>()
  28.  
  29.     val city = ObservableField<City>()
  30.     val routes = ObservableArrayList<Track>()
  31.     val waypoints = ObservableArrayList<Waypoint>()
  32.  
  33.     val uiStateObservable: Observable<CityUiState> = eventSubject
  34.             .compose(this)
  35.             .onErrorReturn { UiEventResults.Error(it) }
  36.             .scan(INITIAL_UI_STATE, this::reduceUiState)
  37.             .replay(1)
  38.             .autoConnect()
  39.  
  40.  
  41.     override fun apply(upstream: Observable<UiEvent>): ObservableSource<UiEventResults> {
  42.         return upstream.switchMap { event ->
  43.             when (event) {
  44.                 UiEvent.LOAD_DATA -> loadData()
  45.             }
  46.         }
  47.     }
  48.  
  49.     fun sendUiEvent(uiEvent: UiEvent) {
  50.         eventSubject.onNext(uiEvent)
  51.     }
  52.  
  53.     private fun loadData(): Observable<UiEventResults> {
  54.         return Completable.concatArray(loadCity(), loadRecommendedRoutes(), loadRecommendedWaypoints())
  55.                 .subscribeOn(Schedulers.io())
  56.                 .toSingleDefault(UiEventResults.Success as UiEventResults)
  57.                 .toObservable()
  58.                 .startWith(UiEventResults.Pending)
  59.  
  60.     }
  61.  
  62.     private fun loadCity(): Completable {
  63.         return getCityUsecase
  64.                 .doOnSuccess { city.set(it) }
  65.                 .toCompletable()
  66.  
  67.     }
  68.  
  69.     private fun loadRecommendedRoutes(): Completable {
  70.         return Observable.just(GetRoutesAction.GetRecommendedRoutes)
  71.                 .compose(getRoutesUsecase)
  72.                 .flatMapCompletable {
  73.                     Completable.fromCallable {
  74.                         routes.clear()
  75.                         routes.addAll(it)
  76.                     }
  77.                 }
  78.     }
  79.  
  80.     private fun loadRecommendedWaypoints(): Completable {
  81.         return Observable.just(GetWaypointsAction.GetWaypointsForRoutes(routes))
  82.                 .compose(getWaypointsUsecase)
  83.                 .flatMapCompletable {
  84.                     CompletableFromCallable {
  85.                         waypoints.clear()
  86.                         waypoints.addAll(it)
  87.                     }
  88.                 }
  89.     }
  90.  
  91.     private fun reduceUiState(previousUiState: CityUiState, uiEventResults: UiEventResults): CityUiState {
  92.         return when (uiEventResults) {
  93.             UiEventResults.Success -> previousUiState.copy(false, true, null)
  94.             UiEventResults.Pending -> previousUiState.copy(true, false, null)
  95.             is UiEventResults.Error -> previousUiState.copy(false, false, null)
  96.             UiEventResults.Default -> INITIAL_UI_STATE
  97.         }
  98.     }
  99.  
  100.     companion object {
  101.         private val INITIAL_UI_STATE = CityUiState(false, false, null)
  102.     }
  103.  
  104. }
  105.  
  106. sealed class UiAction {
  107.  
  108.     object LoadCityAction : UiAction()
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement