package Ġio . kor ost ens ky i . che st nut . presentation . screen . details Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġdagger . ass isted . Ass isted Ċ import Ġdagger . ass isted . Ass isted Factory Ċ import Ġdagger . ass isted . Ass isted Inject Ċ import Ġio . kor ost ens ky i . che st nut . domain . inter actor . Movie Interactor Ċ import Ġio . kor ost ens ky i . che st nut . domain . model . Movie Info Ċ import Ġio . kor ost ens ky i . che st nut . presentation . navigation . Navigation Flow Ċ import Ġio . kor ost ens ky i . che st nut . presentation . navigation . Navigation Names Ċ import Ġio . kor ost ens ky i . che st nut . presentation . navigation . Router Ċ import Ġio . kor ost ens ky i . che st nut . presentation . utils . Intent Utils Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . as State Flow Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠDetails ViewModel Ġ@ Ass isted Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġmovie Interactor : ĠMovie Interactor , ĊĠĠĠ Ġprivate Ġval Ġnavigation Flow : ĠNavigation Flow , ĊĠĠĠ Ġprivate Ġval Ġintent Utils : ĠIntent Utils , ĊĠĠĠ Ġ@ Ass isted ( Navigation Names . Movie Id Argument ) Ġprivate Ġval Ġmovie Id : ĠInt Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ details State Flow Ġ= ĠMutable State Flow < Details State >( Details State . Idle ) ĊĠĠĠ Ġval Ġdetails State Flow Ġ= Ġ_ details State Flow . as State Flow () ĊĊĠĠĠ Ġprivate Ġval Ġ_ favorites Flow Ġ= ĠMutable State Flow ( false ) ĊĠĠĠ Ġval Ġfavor ites Flow Ġ= Ġ_ favorites Flow . as State Flow () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ details State Flow . emit ( Details State . Loading ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmovie Info Ġ= Ġmovie Interactor . retrieve Movie Info ( movie Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ details State Flow . emit ( Details State . Success ( movie Info )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Interactor . favorite Movies Flow . collect Ġ{ Ġfavor ites Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ favorites Flow . emit ( favorites . contains ( movie Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshare ( movie : ĠMovie Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġintent Utils . share ( movie . title ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġback () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Flow . navigate ( Router :: back ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtoggle F avorites () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( favorites Flow . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Interactor . remove From F avorites ( movie Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Interactor . addTo F avorites ( movie Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ass isted Factory ĊĠĠĠ Ġinterface ĠDetails Ass isted Factory Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate (@ Ass isted ( Navigation Names . Movie Id Argument ) Ġmovie Id : ĠInt ): ĠDetails ViewModel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġprovide Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġass isted Factory : ĠDetails Ass isted Factory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Id : ĠInt ĊĠĠĠĠĠĠĠ Ġ): ĠViewModel Provider . Factory Ġ= Ġobject Ġ: ĠViewModel Provider . Factory Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel ?> Ġcreate ( model Class : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġass isted Factory . create ( movie Id ) Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ