package Ġcom . n andra . movie verse . ui . detail Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . navigation . fragment . nav Args Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . end iar . movie verse . core . data . Resource Ċ import Ġcom . end iar . movie verse . core . domain . model . Film Detail Ċ import Ġcom . end iar . movie verse . core . utils . Constant Ċ import Ġcom . n andra . movie verse . R Ċ import Ġcom . n andra . movie verse . adapter . Cast RecyclerView Adapter Ċ import Ġcom . n andra . movie verse . adapter . Images RecyclerView Adapter Ċ import Ġcom . n andra . movie verse . adapter . Videos Recycler Adapter Ċ import Ġcom . n andra . movie verse . util . Film Type Ċ import Ġcom . n andra . movie verse . util . format Date Ċ import Ġcom . n andra . movie verse . util . setVisibility G one Ċ import Ġcom . n andra . movie verse . util . setVisibility Visible Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġkotlinx . android . synt hetic . main . fragment _ detail .* Ċ Ċ @ Android EntryPoint Ċ class ĠDetail Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġargs : ĠDetail Fragment Args Ġby Ġnav Args () ĊĠĠĠ Ġprivate Ġval Ġdetail ViewModel : ĠDetail ViewModel Ġby Ġview Models () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfilm Type : ĠFil m Type ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġimages RecyclerView Adapter : ĠImages RecyclerView Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcast RecyclerView Adapter : ĠCast RecyclerView Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġvideos Recycler Adapter : ĠV ideos Recycler Adapter ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ detail , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġobserve Data () ĊĠĠĠĠĠĠĠ Ġsetup View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġdetail ViewModel . detail Remote Mediator LiveData . observe ( view Lifecycle Owner ) Ġ{ Ġresource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resource Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( resource ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment _ detail _ scroll _ view . setVisibility G one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ shim mer . setVisibility Visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind Remote Data ( resource . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment _ detail _ scroll _ view . setVisibility Visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ shim mer . setVisibility G one () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment _ detail _ scroll _ view . setVisibility G one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ shim mer . setVisibility Visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( require Context (), Ġ"${ resource . message }", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdetail ViewModel . detail Local Data Mediator LiveData . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Local Data ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup View () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġargs . id ĊĠĠĠĠĠĠĠ Ġfilm Type Ġ= Ġwhen ( args . media Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstant . MOV IE _ FIL M _ TYPE Ġ-> ĠFil m Type . Film Type Movie ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠFil m Type . Film Type TV ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfragment _ detail _ toolbar . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Navigation Icon ( R . drawable . ic _ arrow _ back _ toolbar ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Navigation OnClickListener Ġ{ Ġactivity ?. on Back Pressed () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġimages RecyclerView Adapter Ġ= ĠImages RecyclerView Adapter () ĊĠĠĠĠĠĠĠ Ġcast RecyclerView Adapter Ġ= ĠCast RecyclerView Adapter () ĊĠĠĠĠĠĠĠ Ġvideos Recycler Adapter Ġ= ĠV ideos Recycler Adapter () ĊĊĠĠĠĠĠĠĠ Ġdetail _ images _ recyclerview . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġimages RecyclerView Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( require Context (), ĠLinearLayoutManager . HORIZONTAL , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdetail _ cast _ recyclerview . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġcast RecyclerView Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( require Context (), ĠLinearLayoutManager . HORIZONTAL , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdetail _ videos _ recyclerview . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġvideos Recycler Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( require Context (), ĠLinearLayoutManager . HORIZONTAL , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdetail ViewModel . get Detail Data ( id , Ġfilm Type ) ĊĊĠĠĠĠĠĠĠ Ġdetail _ favorite _ section . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetail ViewModel . toggle Favorite () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Remote Data ( data : ĠFil m Detail ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( film Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFil m Type . Film Type Movie Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ text _ movie _ title . text Ġ= Ġit . movie Title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ text _ release _ date . text Ġ= Ġformat Date ( it . movie Release Date ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġruntime Ġ= Ġ"${ it . runtime } ĠMin utes " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ text _ runtime . text Ġ= Ġruntime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ text _ movie _ title . text Ġ= Ġit . tv Title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ text _ release _ date . text Ġ= Ġformat Date ( it . tv Air Date ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Episode s Ġ= Ġ"${ it . total Episode } ĠEp isode s " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ text _ runtime . text Ġ= Ġtotal Episode s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrating Ġ= Ġ"${ it . vote Average } Ġ/ Ġ 1 0 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ text _ movie _ rating . text Ġ= Ġrating ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ text _ movie _ genre . text Ġ= Ġit . genre . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . overview Ġ== Ġ""){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠgetString ( R . string . overview _ not _ available _ en ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ text _ movie _ overview . text Ġ= Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ text _ movie _ overview . text Ġ= Ġdata . overview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvote Count Ġ= Ġ" From Ġ${ data . vote Count } ĠV otes " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ text _ movie _ rating _ count . text Ġ= Ġvote Count ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ" https :// image . t mdb . org / t / p / w 3 4 2 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġback drop Url Ġ= Ġ" https :// image . t mdb . org / t / p / w 5 0 0 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . poster Image Path . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( url Ġ+ Ġit . poster Image Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( detail _ image _ movie _ poster ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( R . drawable . img _ back _ portrait _ default ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( detail _ image _ movie _ poster ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . backdrop Image Path . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( backdrop Url Ġ+ Ġit . backdrop Image Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( detail _ backdrop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( R . drawable . img _ back _ land scape _ default ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( detail _ backdrop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . image Path List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimages RecyclerView Adapter . submit List ( it . image Path List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ gallery _ text . setVisibility G one () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . cast List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcast RecyclerView Adapter . submit List ( it . cast List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ fragment _ cast _ text . setVisibility G one () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . video Key List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideos Recycler Adapter . submit List ( it . video Key List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ video _ text . setVisibility G one () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Local Data ( favorite Status : ĠBoolean ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġfavorite Status ?. let Ġ{ Ġis Favorite Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Favorite ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( R . drawable . ic _ heart _ pink ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( detail _ image _ heart ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ favorite _ text . text Ġ= ĠgetString ( R . string . favorite _ text _ remove _ to _ favorite _ en ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( R . drawable . ic _ heart _ h ollow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( detail _ image _ heart ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ favorite _ text . text Ġ= ĠgetString ( R . string . favorite _ text _ add _ to _ favorite _ en ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }