package Ġcom . j pp . mp account . account Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . j pp . mp domain . Account Movie Type Ċ import Ġcom . j pp . mp domain . Movie Ċ import Ġcom . j pp . mp domain . Movie Page Ċ import Ġcom . j pp . mp domain . User Account Ċ import Ġcom . j pp . mp domain . use case . GetUser Account Movies UseCase Ċ import Ġcom . j pp . mp domain . use case . GetUser Account UseCase Ċ import Ġcom . j pp . mp domain . use case . Log Out UseCase Ċ import Ġcom . j pp . mp domain . use case . Try Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ /** Ċ Ġ* Ġ[ ViewModel ] Ġto Ġhandle Ġthe Ġstate Ġof Ġthe Ġ[ User Account Fragment ]. Ċ Ġ* ĠIt Ġconsume s Ġdata Ġcoming Ġfrom Ġthe Ġlower Ġlayers Ċ Ġ* Ġand Ġmaps Ġthat Ġdata Ġto Ġview Ġlogic . Ċ Ġ*/ Ċ class ĠUser Account ViewModel ( ĊĠĠĠ Ġprivate Ġval ĠgetUser Account UseCase : ĠGetUser Account UseCase , ĊĠĠĠ Ġprivate Ġval Ġget Movies UseCase : ĠGetUser Account Movies UseCase , ĊĠĠĠ Ġprivate Ġval Ġlog Out UseCase : ĠLog Out UseCase , ĊĠĠĠ Ġprivate Ġval Ġnavigator : ĠUser Account Navigator , ĊĠĠĠ Ġprivate Ġval Ġio Dispatcher : ĠCor outine Dispatcher Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ header ViewState Ġ= ĠMutable LiveData < User Account Header State >() ĊĠĠĠ Ġinternal Ġval Ġheader ViewState : ĠLive Data < User Account Header State > Ġ= Ġ_ header ViewState ĊĊĠĠĠ Ġprivate Ġval Ġ_ body ViewState Ġ= ĠMutable LiveData < User Account Body ViewState >() ĊĠĠĠ Ġinternal Ġval Ġbody ViewState : ĠLive Data < User Account Body ViewState > Ġ= Ġ_ body ViewState ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġon ĠVM Ġinitialization . ĠThe ĠView Ġ( Fragment ) Ġshould Ġcall Ġthis Ġmethod Ġto ĊĠĠĠĠ Ġ* Ġindicate Ġthat Ġit Ġis Ġready Ġto Ġstart Ġrendering . ĠWhen Ġthe Ġmethod Ġis Ġcalled , Ġthe ĠVM ĊĠĠĠĠ Ġ* Ġinternally Ġverifies Ġthe Ġstate Ġof Ġthe Ġapplication Ġand Ġupdates Ġthe Ġview Ġstate Ġbased ĊĠĠĠĠ Ġ* Ġon Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġon Init () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġlaunch Ġin Ġparallel ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ Ġfetch User Account Header () Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ Ġfetch User Account Body () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġuser Ġwants Ġto Ġperform Ġthe Ġlogout Ġof Ġthe Ġapplication . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġon Logout () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ header ViewState . value Ġ= ĠUser Account Header State . show Loading () ĊĠĠĠĠĠĠĠ Ġ_ body ViewState . value Ġ= ĠUser Account Body ViewState . show Loading () ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Out UseCase . execute () Ġ// Ġresult Ġis Ġnot Ġimportant ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigator . navigate Home () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġuser Ġwants Ġto Ġsee Ġthe Ġfavor ites Ġmovies . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġon F avorites () Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigator . navigate To F avorites () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġuser Ġwants Ġto Ġsee Ġthe Ġr ated Ġmovies . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġon R ated () Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigator . navigate To R ated () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġuser Ġwants Ġto Ġsee Ġthe Ġwatch list . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġon Watch list () Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigator . navigate To Watch List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfetch User Account Header () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ header ViewState . value Ġ= ĠUser Account Header State . show Loading () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġwith Context ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetUser Account UseCase . execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Success Ġ-> Ġprocess User Account ( result . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Failure Ġ-> Ġ_ header ViewState . value Ġ= Ġ_ header ViewState . value ?. hide () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfetch User Account Body () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ body ViewState . value Ġ= ĠUser Account Body ViewState . show Loading () ĊĊĠĠĠĠĠĠĠ Ġval Ġmovies Result Ġ= Ġwith Context ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Movies UseCase . execute ( FIRST _ PAGE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( movies Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Success Ġ-> Ġprocess Movies Page Result ( movies Result . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Failure Ġ-> Ġprocess Movies Page Failure Cause ( movies Result . cause ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess User Account ( account : ĠUser Account ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ header ViewState . value Ġ= Ġ_ header ViewState . value ?. with Avatar ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= Ġaccount . getUser Name (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Name Ġ= Ġaccount . username , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġavatar Url Ġ= Ġaccount . avatar . getFull Url (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġavatar Callback Ġ= Ġ{ Ġuser Avatar Callback ( account ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġuser Avatar Callback ( account : ĠUser Account ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ header ViewState . value Ġ= Ġ_ header ViewState . value ?. with Letter ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= Ġaccount . getUser Name (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Name Ġ= Ġaccount . username , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Letter Ġ= Ġaccount . getUser Letter () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Movies Page Result ( result : ĠMap < Account Movie Type , ĠMovie Page >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview State Mapper : Ġ( Movie Page ?, ĠUser Movies ViewState ) Ġ-> ĠUser Movies ViewState Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġpage , Ġempty ViewState Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Ġ== Ġnull Ġ-> ĠUser Movies ViewState . create Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage . results . isEmpty () Ġ-> Ġempty ViewState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUser Movies ViewState . create With Items ( page . results . map To User Movie Item ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfavor ites ViewState Ġ= Ġview State Mapper ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Account Movie Type . Favorite ], ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser Movies ViewState . create Favorite Empty () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġwatch ListView State Ġ= Ġview State Mapper ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Account Movie Type . Watch list ], ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser Movies ViewState . create Watch list Empty () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġr ated ViewState Ġ= Ġview State Mapper ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ Account Movie Type . R ated ], ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser Movies ViewState . create R ated Empty () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ_ body ViewState . value Ġ= Ġ_ body ViewState . value ?. show Content With Movies ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfavorite Movie State Ġ= Ġfavor ites ViewState , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr ated Movie State Ġ= Ġr ated ViewState , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwatch List State Ġ= Ġwatch ListView State ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Movies Page Failure Cause ( cause : ĠTry . Failure Cause ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( cause ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Failure Cause . No Connectivity Ġ-> Ġ_ body ViewState . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ body ViewState . value ?. show No Connectivity Error Ġ{ Ġon Init () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Failure Cause . Unknown Ġ-> Ġ_ body ViewState . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ body ViewState . value ?. show Unknown Error Ġ{ Ġon Init () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Failure Cause . User Not Logged Ġ-> Ġnavigator . navigate Home () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Movie >. map To User Movie Item (): ĠList < User Movie Item > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġto Mutable List (). map Ġ{ Ġmovie Ġ-> ĠUser Movie Item ( movie . poster _ path Ġ?: Ġ" no Path ") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFIRST _ PAGE Ġ= Ġ 1 ĊĠĠĠ Ġ} Ċ } Ċ