package Ġcom . j pp . mp credits Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . j pp . mp . common . extensions . addAll Mapping Ċ import Ġcom . j pp . mp domain . Cast Character Ċ import Ġcom . j pp . mp domain . Credits Ċ import Ġcom . j pp . mp domain . Cre w Member Ċ import Ġcom . j pp . mp domain . use case . Get Credits 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 ] Ġthat Ġsupports Ġthe Ġcredits Ġsection . ĠThe ĠVM Ġretrieves Ċ Ġ* Ġthe Ġdata Ġfrom Ġthe Ġunderlying Ġlayers Ġand Ġmaps Ġthe Ġbusiness Ċ Ġ* Ġdata Ġto ĠUI Ġdata , Ġproducing Ġa Ġ[ Credits ViewState ] Ġthat Ġrepresents Ġthe Ġconfiguration Ġof Ġthe Ġview Ċ Ġ* Ġat Ġany Ġgiven Ġmoment . Ċ Ġ* Ċ Ġ* ĠThis ĠVM Ġis Ġlanguage Ġaware , Ġmeaning Ġthat Ġwhen Ġthe Ġuser Ġchanges Ġthe Ġlanguage Ġof Ġthe Ġdevice , Ġthe Ċ Ġ* ĠVM Ġis Ġnotified Ġabout Ġsuch Ġevent Ġand Ġexecutes Ġa Ġrefresh Ġof Ġboth : Ġthe Ġdata Ġstored Ġby Ġthe Ġapplication Ċ Ġ* Ġand Ġthe Ġview Ġstate Ġbeing Ġshown Ġto Ġthe Ġuser . Ċ Ġ*/ Ċ class ĠCred its ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġget Credits UseCase : ĠGet Credits UseCase , ĊĠĠĠ Ġprivate Ġval Ġnavigator : ĠCredit Navigator , ĊĠĠĠ Ġprivate Ġval Ġio Dispatcher : ĠCor outine Dispatcher , ĊĠĠĠ Ġprivate Ġval Ġsaved State Handle : ĠSaved State Handle Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ view State Ġ= ĠMutable LiveData < Credits ViewState >() ĊĠĠĠ Ġinternal Ġval Ġview State : ĠLive Data < Credits ViewState > Ġ= Ġ_ view State ĊĊĠĠĠ Ġprivate Ġvar Ġmovie Id : ĠDouble ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġsaved State Handle . set ( MOV IE _ ID _ KEY , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsaved State Handle . get ( MOV IE _ ID _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Trying Ġto Ġaccess Ġ$ MOV IE _ ID _ KEY Ġwhen Ġit Ġis Ġnot Ġyet Ġset ") ĊĊĠĠĠ Ġprivate Ġvar Ġmovie Title : ĠString ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġsaved State Handle . set ( MOV IE _ TITLE _ KEY , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsaved State Handle . get ( MOV IE _ TITLE _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Trying Ġto Ġaccess Ġ$ MOV IE _ TITLE _ KEY Ġwhen Ġit Ġis Ġnot Ġyet Ġset ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ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 ( param : ĠCred its Init Param ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ view State . value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Id Ġ= Ġparam . movie Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Title Ġ= Ġparam . movie Title ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Movie Credits () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġan Ġitem Ġis Ġselected Ġin Ġthe Ġlist Ġof Ġcredit Ġpersons . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġon Credit ItemSelected ( person Item : ĠCredit Person ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigator . navigate To Credit Detail ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperson Item . id . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperson Item . profile Path , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperson Item . sub Title ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen Ġcalled , Ġthis Ġmethod Ġwill Ġpush Ġthe Ġloading Ġview Ġstate Ġand Ġwill Ġfetch Ġthe Ġcredits ĊĠĠĠĠ Ġ* Ġof Ġthe Ġmovie Ġbeing Ġshown . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfetch Movie Credits () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ view State . value Ġ= ĠCred its ViewState . show Loading ( movie Title ) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġwith Context ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Credits UseCase . execute ( movie Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Success Ġ-> Ġprocess Credits Response ( result . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Failure Ġ-> Ġprocess Failure ( result . cause ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Failure ( failure : ĠTry . Failure Cause ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ view State . value Ġ= Ġwhen Ġ( failure ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Failure Cause . No Connectivity Ġ-> Ġ_ view State . value ?. show No Connectivity Error Ġ{ Ġfetch Movie Credits () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ_ view State . value ?. show Unknown Error Ġ{ Ġfetch Movie Credits () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Credits Response ( credits : ĠCred its ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( credits . cast . isEmpty () Ġ&& Ġcredits . cre w . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ view State . value Ġ= Ġ_ view State . value ?. show No Credits Available () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcredit Person Items Ġ= Ġcredits . cast ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcast Character Ġ-> Ġcast Character . map To Credit Person () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAll Mapping Ġ{ Ġcredits . cre w . map Ġ{ Ġcre w Member Ġ-> Ġcre w Member . map To Credit Person () Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ view State . value Ġ= Ġ_ view State . value ?. show Credits ( credit Person Items ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCast Character . map To Credit Person (): ĠCredit Person Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCredit Person ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Path Ġ= Ġprofile _ path Ġ?: Ġ" empty ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġcharacter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Title Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCre w Member . map To Credit Person (): ĠCredit Person Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCredit Person ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Path Ġ= Ġprofile _ path Ġ?: Ġ" empty ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Title Ġ= Ġdepartment ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMOV IE _ ID _ KEY Ġ= Ġ" MOV IE _ ID _ KEY " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMOV IE _ TITLE _ KEY Ġ= Ġ" MOV IE _ TITLE _ KEY " ĊĠĠĠ Ġ} Ċ } Ċ