/* Ċ Ġ* ĠCreated Ġby ĠWe i yi ĠLi Ġon Ġ 2 0 2 0 - 0 4 - 2 5 . Ċ Ġ* Ġhttps :// github . com / li 2 Ċ Ġ*/ Ċ package Ġme . li 2 . movies . ui . movie detail Ċ Ċ import Ġandroidx . lifecycle .* Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġme . li 2 . android . common . arch .* Ċ import Ġme . li 2 . android . common . logic . or False Ċ import Ġme . li 2 . movies . data . model .* Ċ import Ġme . li 2 . movies . data . repository . Repository Ċ import Ġme . li 2 . movies . util . distinct Until Changed Ċ import Ġme . li 2 . movies . util . io Ċ import Ġme . li 2 . movies . util . ui Ċ Ċ class ĠMovie Detail ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠRepository , ĊĠĠĠ Ġmovie Item : ĠMovie Item UI Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ movie Detail Ġ= ĠMutable LiveData ( Resource . loading ( Mapper UI . to Movie Detail UI ( movie Item ))) ĊĠĠĠ Ġinternal Ġval Ġmovie Detail : ĠLive Data < Resource < Movie Detail UI >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ movie Detail . distinct Until Changed () ĊĊĠĠĠ Ġprivate Ġval Ġ_ trail ers Ġ= ĠMutable LiveData < Resource < List < Tr ailer >> >( Resource . loading ( emptyList ())) ĊĠĠĠ Ġinternal Ġval Ġtrail ers : ĠLive Data < Resource < List < Tr ailer >>> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ trail ers . distinct Until Changed () ĊĊĠĠĠ Ġprivate Ġval Ġ_ credits Ġ= ĠMutable LiveData ( ĊĠĠĠĠĠĠĠ ĠResource . loading ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCredit List UI ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Id Ġ= Ġmovie Item . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcast s Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcre ws Ġ= Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġinternal Ġval Ġcredits : ĠLive Data < Resource < Credit List UI >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ credits . distinct Until Changed () ĊĊĠĠĠ Ġprivate Ġval Ġ_ movie Reviews Ġ= ĠMutable LiveData < Resource < List < Movie Review UI >> >( Resource . loading ( emptyList ())) ĊĠĠĠ Ġprivate Ġval Ġmovie Reviews : ĠLive Data < Resource < List < Movie Review UI >>> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ movie Reviews . distinct Until Changed () ĊĊĠĠĠ Ġprivate Ġval Ġ_ recommend ations Ġ= ĠMutable LiveData < Resource < List < Movie Item UI >> >( Resource . loading ( emptyList ())) ĊĠĠĠ Ġprivate Ġval Ġrecommendations : ĠLive Data < Resource < List < Movie Item UI >>> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ recommend ations . distinct Until Changed () ĊĊĠĠĠ Ġprivate Ġval Ġ_ isIn Watch list Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġprivate Ġval ĠisIn Watch list : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ isIn Watch list . distinct Until Changed () ĊĊĠĠĠ Ġinternal Ġvar Ġmovie Detail Rows : ĠMed iator LiveData < List < Base Row Data >> ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġmovie Detail Rows Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcombine Latest ( movie Detail , Ġtrail ers , Ġcredits , Ġmovie Reviews , Ġrecommendations , ĠisIn Watch list ) Ġ{ Ġresults Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmovie Detail Ġ= Ġresults [ 0 ] Ġas ĠResource < Movie Detail UI > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrail ers Ġ= Ġresults [ 1 ] Ġas ĠResource < List < Tr ailer >> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcredits Ġ= Ġresults [ 2 ] Ġas ĠResource < Credit List UI > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreviews Ġ= Ġresults [ 3 ] Ġas ĠResource < List < Movie Review UI >> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecommendations Ġ= Ġresults [ 4 ] Ġas ĠResource < List < Movie Item UI >> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠisIn Watch list Ġ= Ġresults [ 5 ] Ġas ĠBoolean ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDetail Row Data ( movie Detail Ġ= Ġmovie Detail . copy ( data Ġ= Ġmovie Detail . data ?. copy ( is Saved Ġ= ĠisIn Watch list ))), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTr ail ers Row Data ( trail ers Ġ= Ġtrail ers ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCred its Row Data ( credits Ġ= Ġcredits ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe views Row Data ( reviews Ġ= Ġreviews ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRec Movies Row Data ( movies Ġ= Ġrecommendations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Movie Detail Screen Data ( movie Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Movie Detail ( movie Id ) ĊĠĠĠĠĠĠĠ Ġget Movie Credits ( movie Id ) ĊĠĠĠĠĠĠĠ Ġget Movie Reviews ( movie Id ) ĊĠĠĠĠĠĠĠ Ġget Movie Trail ers ( movie Id ) ĊĠĠĠĠĠĠĠ Ġget Movie Recommend ations ( movie Id ) ĊĠĠĠĠĠĠĠ Ġis Movie In Watch list ( movie Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Movie Detail ( movie Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Movie Detail ( movie Id , Ġ_ movie Detail ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Movie Credits ( movie Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ credits . post Loading () ĊĠĠĠĠĠĠĠ Ġio ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ credits . post Error ( it ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcredits Ġ= Ġrepository . get Movie Credits ( movie Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ credits . post Success ( credits ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Movie Reviews ( movie Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Movie Reviews ( movie Id , Ġ_ movie Reviews ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Movie Trail ers ( movie Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Movie Trail ers ( movie Id , Ġ_ trail ers ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Movie Recommend ations ( movie Id : ĠInt , Ġpage : ĠInt Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ recommend ations . post Loading () ĊĠĠĠĠĠĠĠ Ġio ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ recommend ations . post Error ( it ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmovies Ġ= Ġrepository . get Movie Recommend ations ( movie Id , Ġpage ). results ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ recommend ations . post Success ( movies ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtoggle Watch list ( movie Id : ĠInt , Ġon Result : Ġ( Boolean ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠisIn Watch list Ġ= Ġ_ isIn Watch list . value . or False () ĊĠĠĠĠĠĠĠ Ġio Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isIn Watch list ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . remove From Watch list ( movie Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save To Watch list ( movie Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ isIn Watch list . post Value (! isIn Watch list ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Result (! isIn Watch list ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Movie In Watch list ( movie Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġio Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ isIn Watch list . post Value ( repository . is Movie In Watch list ( movie Id )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }