package Ġcom . example . mov ied atabase . ui . movie detail Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Transform ations Ċ import Ġcom . example . mov ied atabase . base . Base ViewModel Ċ import Ġcom . example . mov ied atabase . domain . use case . movie .* Ċ import Ġcom . example . mov ied atabase . extension . add Ċ import Ġcom . example . mov ied atabase . extension . to MMMM yyyy Ċ import Ġcom . example . mov ied atabase . model .* Ċ import Ġcom . example . mov ied atabase . util . Rx Utils Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠMovie Detail ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġget Movie Detail UseCase : ĠGet Movie Detail UseCase , ĊĠĠĠ Ġprivate Ġval Ġget Movie Videos UseCase : ĠGet Movie Videos UseCase , ĊĠĠĠ Ġprivate Ġval Ġget Movie Credits UseCase : ĠGet Movie Credits UseCase , ĊĠĠĠ Ġprivate Ġval Ġget Movie Comments UseCase : ĠGet Movie Comments UseCase , ĊĠĠĠ Ġprivate Ġval Ġget Movie Recommend ations UseCase : ĠGet Movie Recommend ations UseCase , ĊĠĠĠ Ġprivate Ġval Ġmovie Detail Item Mapper : ĠMovie Detail Item Mapper , ĊĠĠĠ Ġprivate Ġval Ġmovie Videos Item Mapper : ĠMovie Videos Item Mapper , ĊĠĠĠ Ġprivate Ġval Ġmovie Credits Item Mapper : ĠMovie Credits Item Mapper , ĊĠĠĠ Ġprivate Ġval Ġmovie Comment Item Mapper : ĠMovie Comment Item Mapper , ĊĠĠĠ Ġprivate Ġval Ġmovie Item Mapper : ĠMovie Item Mapper Ċ ) Ġ: ĠBase ViewModel () Ġ{ ĊĊĠĠĠ Ġvar Ġpage Recommend ations Ġ= Ġ 1 ĊĊĠĠĠ Ġval Ġmovie Detail Item Ġ= ĠMutable LiveData < Movie Detail Item >() ĊĊĠĠĠ Ġval Ġrelease Date Ġ= ĠTransform ations . map ( movie Detail Item ) Ġ{ ĊĠĠĠĠĠĠĠ Ġit . release Date ?. to MMMM yyyy () ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġgen res : ĠLive Data < List < String >> Ġ= ĠTransform ations . map ( movie Detail Item ) Ġ{ ĊĠĠĠĠĠĠĠ Ġit . genres ?. map Ġ{ Ġgenre Ġ-> Ġ( genre . name Ġ?: Ġ"") Ġ} ?. take ( MAX _ GEN RE _ DISPLAY ED ) Ġ?: ĠlistOf () ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġis Expand ing Overview Ġ= ĠMutable LiveData < Boolean >(). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġrating Ġ= ĠMutable LiveData < Float >(). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmovie Videos Item Ġ= ĠMutable LiveData < Movie Videos Item >() ĊĊĠĠĠ Ġval Ġmovie Credits Item Ġ= ĠMutable LiveData < Movie Credits Item >() ĊĊĠĠĠ Ġval Ġmovie Comments Item Ġ= ĠMutable LiveData < List < Movie Comment Item >>() ĊĊĠĠĠ Ġval Ġmovie Recommend ations Ġ= ĠMutable LiveData < List < Movie Item >>() ĊĊĠĠĠ Ġfun Ġexpand Overview () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Expand ing Overview . value Ġ= Ġis Expand ing Overview . value ?. not () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Movie Detail ( movie Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Movie Detail UseCase . create Observable ( Get Movie Detail UseCase . Params ( movie Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( Rx Utils . apply Single Scheduler ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmovie Detail Item Mapper . map To Presentation ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Detail Item . value Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Throwable ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}). add ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Movie Videos ( movie Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Movie Videos UseCase . create Observable ( Get Movie Videos UseCase . Params ( movie Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( Rx Utils . apply Single Scheduler ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmovie Videos Item Mapper . map To Presentation ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Videos Item . value Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Throwable ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}). add ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Movie Credits ( movie Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Movie Credits UseCase . create Observable ( Get Movie Credits UseCase . Params ( movie Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( Rx Utils . apply Single Scheduler ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmovie Credits Item Mapper . map To Presentation ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Credits Item . value Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Throwable ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}). add ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Movie Comments ( movie Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Movie Comments UseCase . create Observable ( Get Movie Comments UseCase . Params ( movie Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( Rx Utils . apply Single Scheduler ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġlist Ġ-> Ġlist . map Ġ{ Ġmovie Comment Item Mapper . map To Presentation ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Comments Item . value Ġ= Ġit . take ( MAX _ COMMENTS _ DISPLAY ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Throwable ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}). add ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Movie Recommend ations ( movie Id : ĠInt , Ġpage : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Movie Recommend ations UseCase . create Observable ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGet Movie Recommend ations UseCase . Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Id , Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( Rx Utils . apply Single Scheduler ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . map Ġ{ Ġmovie Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Item Mapper . map To Presentation ( movie Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlist Movie Ġ= ĠArrayList < Movie Item >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Movie . addAll ( movie Recommend ations . value Ġ?: Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Movie . addAll ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Recommend ations . value Ġ= Ġlist Movie ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Throwable ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}). add ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ GEN RE _ DISPLAY ED Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ COMMENTS _ DISPLAY ED Ġ= Ġ 3 ĊĠĠĠ Ġ} Ċ } ĊĊ