package Ġcom . int act . movies box . presentation . view models Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . int act . movies box . domain . entities . Movie Domain DTO Ċ import Ġcom . int act . movies box . domain . entities . Now Playing Movies Domain DTO Ċ import Ġcom . int act . movies box . domain . entities . Top R ated Movies Domain DTO Ċ import Ġcom . int act . movies box . domain . entities . Up coming Movies Domain DTO Ċ import Ġcom . int act . movies box . domain . use cases . Get Now Playing Movies UseCase Ċ import Ġcom . int act . movies box . domain . use cases . Get Top R ated Movies UseCase Ċ import Ġcom . int act . movies box . domain . use cases . Get Up coming Movies UseCase Ċ import Ġcom . int act . movies box . domain . use cases . Save Movie Detail UseCase Ċ import Ġcom . int act . movies box . presentation . mapper . Mapper Ċ import Ġcom . int act . movies box . presentation . model .* Ċ import Ġcom . int act . movies box . presentation . view models . base . Base ViewModel Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* Ġview Ġmodels Ġdon 't Ġcare Ġabout Ġthe Ġsource Ġof Ġdata . ĠThey Ġare Ġonly Ċ Ġ* Ġdepend able Ġon Ġthe Ġobservable s Ġh anded Ġover Ġby Ġuse Ġcases . ĠView Ġmodels Ċ Ġ* Ġdon 't Ġhave Ġany Ġidea Ġhow Ġto Ġget Ġand Ġset Ġthe Ġdata . ĠView Ġmodels Ġconvert Ġthese Ċ Ġ* Ġobservable s Ġinto Ġlive Ġdata Ġusing Ġlive Ġdata Ġreactive Ġstreams Ġand Ġexpose Ċ Ġ* Ġonly Ġlive Ġdata Ċ Ġ* Ċ Ġ* ĠIf Ġyou Ġwant Ġan ĠObservable Ġto Ġemit Ġa Ġspecific Ġsequence Ġof Ġitems Ġbefore Ġit Ċ Ġ* Ġbegins Ġemit ting Ġthe Ġitems Ġnormally Ġexpected Ġfrom Ġit , Ġapply Ġthe ĠStart With Ċ Ġ* Ġoperator Ġto Ġit . Ċ Ġ* Ċ Ġ* Ġhandling Ġthe Ġerror Ġcases Ġin Ġrx Ġcan Ġbe Ġchecked Ġat Ċ Ġ* Ġhttps :// github . com / Reactive X / Rx Java / wiki / Error - Handling - Operators Ċ Ġ* Ġdo OnError , ĠonError Complete , ĠonError Resume Next , ĠonError Return , ĠonError Return Item Ċ Ġ* Ġon Exception Resume Next , Ġretry , Ġretry Until , Ġretry When Ċ Ġ* Ċ Ġ* ĠTo Ġfollow Ġthe Ġencaps ulation , Ġwe Ġgive Ġthe Ġlive Ġdata Ġto Ġviews Ġbut Ġonly Ġthe Ġgetter Ċ Ġ* Ġinstance . ĠKotlin Ġbacking Ġproperty . ĠA Ġbacking Ġproperty Ġallows Ġyou Ġto Ġreturn Ġsomething Ċ Ġ* Ġfrom Ġa Ġgetter Ġother Ġthan Ġthe Ġexact Ġobject . Ċ Ġ*/ Ċ Ċ class ĠFragment List ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġmovie Mapper : ĠMapper < Movie Domain DTO , ĠMovie DTO >, ĊĠĠĠ Ġprivate Ġval Ġsave Movie Detail UseCase : ĠSave Movie Detail UseCase , ĊĠĠĠ Ġprivate Ġval Ġget Up coming Movies UseCase : ĠGet Up coming Movies UseCase , ĊĠĠĠ Ġprivate Ġval Ġget Top R ated Movies UseCase : ĠGet Top R ated Movies UseCase , ĊĠĠĠ Ġprivate Ġval Ġget Now Playing Movies UseCase : ĠGet Now Playing Movies UseCase , ĊĠĠĠ Ġprivate Ġval Ġtop R ated Movies Mapper : ĠMapper < Top R ated Movies Domain DTO , ĠTop R ated Movies DTO >, ĊĠĠĠ Ġprivate Ġval Ġupcoming Movies Mapper : ĠMapper < Up coming Movies Domain DTO , ĠUp coming Movies DTO >, ĊĠĠĠ Ġprivate Ġval Ġnow Playing Movies Mapper : ĠMapper < Now Playing Movies Domain DTO , ĠNow Playing Movies DTO > Ċ ) Ġ: ĠBase ViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠisLoading Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġprivate Ġval Ġ_ top R ated Error LiveData Ġ= ĠMutable LiveData < Error DTO >() ĊĠĠĠ Ġval Ġtop R ated Error LiveData : ĠLive Data < Error DTO > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ top R ated Error LiveData ĊĠĠĠ Ġprivate Ġval Ġ_ up coming Error LiveData Ġ= ĠMutable LiveData < Error DTO >() ĊĠĠĠ Ġval Ġupcoming Error LiveData : ĠLive Data < Error DTO > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ up coming Error LiveData ĊĠĠĠ Ġprivate Ġval Ġloading Progress LiveData Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġprivate Ġval Ġ_ now Playing Error LiveData Ġ= ĠMutable LiveData < Error DTO >() ĊĠĠĠ Ġval Ġnow Playing Error LiveData : ĠLive Data < Error DTO > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ now Playing Error LiveData ĊĠĠĠ Ġprivate Ġval Ġtop R ated Movies LiveData Ġ= ĠMutable LiveData < ArrayList < Movie DTO >>() ĊĠĠĠ Ġprivate Ġval Ġ_ up coming Movies LiveData Ġ= ĠMutable LiveData < ArrayList < Movie DTO >>() ĊĠĠĠ Ġval Ġupcoming Movies LiveData : ĠLive Data < ArrayList < Movie DTO >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ up coming Movies LiveData ĊĊĠĠĠ Ġ// Ġlazy Ġloading Ġof Ġlive Ġdata ĊĠĠĠ Ġprivate Ġval Ġ_ now Playing Movies LiveData : ĠMutable LiveData < ArrayList < Movie DTO >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < ArrayList < Movie DTO >>() ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġnow Playing Movies LiveData : ĠLive Data < ArrayList < Movie DTO >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ now Playing Movies LiveData ĊĊĊĠĠĠ Ġ// Ġget Ġnow Ġplaying Ġmovies ĊĠĠĠ Ġfun Ġget Now Playing Movies ( pageNumber : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠisLoading . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġget Composite Disposable (). add ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Now Playing Movies UseCase . build UseCase ( Get Now Playing Movies UseCase . Param ( pageNumber Ġ= Ġpage Number )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġfor Ġthe Ġfirst Ġpage Ġwe Ġare Ġasking Ġfor Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pageNumber Ġ== Ġ" 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Progress LiveData . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Terminate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġfor Ġthe Ġfirst Ġpage Ġwe Ġare Ġasking Ġfor Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pageNumber Ġ== Ġ" 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Progress LiveData . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnow Playing Movies Mapper . to ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Success : ĠNow Ġplaying Ġmovies Ġresponse Ġreceived : Ġ${ it . movies }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ now Playing Movies LiveData . value Ġ= Ġit . movies ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ now Playing Error LiveData . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError DTO ( code Ġ= Ġ 4 0 0 , Ġmessage Ġ= Ġit . localized Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġget Ġthe Ġtop Ġr ated Ġmovies ĊĠĠĠ Ġfun Ġget Top R ated Movies ( pageNumber : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠisLoading . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġget Composite Disposable (). add ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Top R ated Movies UseCase . build UseCase ( Get Top R ated Movies UseCase . Param ( pageNumber Ġ= Ġpage Number )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġfor Ġthe Ġfirst Ġpage Ġwe Ġare Ġasking Ġfor Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pageNumber Ġ== Ġ" 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Progress LiveData . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Terminate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġfor Ġthe Ġfirst Ġpage Ġwe Ġare Ġasking Ġfor Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pageNumber Ġ== Ġ" 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Progress LiveData . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġtop R ated Movies Mapper . to ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Success : ĠTop Ġr ated Ġmovies Ġresponse Ġreceived : Ġ${ it . movies }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop R ated Movies LiveData . value Ġ= Ġit . movies ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ top R ated Error LiveData . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError DTO ( code Ġ= Ġ 4 0 0 , Ġmessage Ġ= Ġit . localized Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġget Ġthe Ġupcoming Ġmovies ĊĠĠĠ Ġfun Ġget Up coming Movies ( pageNumber : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠisLoading . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġget Composite Disposable (). add ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Up coming Movies UseCase . build UseCase ( Get Up coming Movies UseCase . Param ( pageNumber Ġ= Ġpage Number )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġfor Ġthe Ġfirst Ġpage Ġwe Ġare Ġasking Ġfor Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pageNumber Ġ== Ġ" 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Progress LiveData . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Terminate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġfor Ġthe Ġfirst Ġpage Ġwe Ġare Ġasking Ġfor Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pageNumber Ġ== Ġ" 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Progress LiveData . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġupcoming Movies Mapper . to ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Success : ĠUp coming Ġmovies Ġresponse Ġreceived : Ġ${ it . movies }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ up coming Movies LiveData . value Ġ= Ġit . movies ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ up coming Error LiveData . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError DTO ( code Ġ= Ġ 4 0 0 , Ġmessage Ġ= Ġit . localized Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġsave Ġthe Ġmovie Ġdetail ĊĠĠĠ Ġfun Ġsave Movie Detail ( movie DTO : ĠMovie DTO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Composite Disposable (). add ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Movie Detail UseCase . build UseCase ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSave Movie Detail UseCase . Param ( movie Domain DTO Ġ= Ġmovie Mapper . from ( movie DTO )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Movie Ġsuccessfully Ġsaved Ġin ĠDB ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Error Ġwhile Ġsaving : Ġ${ it . localized Message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Loading Progress LiveData () Ġ= Ġloading Progress LiveData ĊĠĠĠ Ġfun Ġget Top R ated Movies List LiveData () Ġ= Ġtop R ated Movies LiveData ĊĠĠĠ Ġfun Ġget Up coming Movies List LiveData () Ġ= Ġupcoming Movies LiveData ĊĠĠĠ Ġfun Ġget Now Playing Movies List LiveData () Ġ= Ġnow Playing Movies LiveData Ċ Ċ // ĠĠĠ Ġval Ġtop R ated Movies LiveData : ĠLive Data < Resource < Now Playing Movies Model >> Ċ // ĠĠĠĠĠĠĠ Ġget () Ġ= Ġnow Playing Movies UseCase Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ. build UseCase ( Now Playing Movies UseCase . Param (" 1 ")) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġnow Playing Movies Mapper . to ( it ) Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠResource . success ( it ) Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ. start With ( Resource . loading ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Resume Next ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFunction Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( Resource . error ( it . localized Message )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Flow able ( Back pressure Strategy . LATE ST ) ĠĠĠ Ġ// Ġnot Ġworking Ġwith Ġsingle Ġobservable Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ. to LiveData () Ċ }