package Ġcom . example . movie app . views Ċ Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . util . Log Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . fragment . app . Fragment Transaction Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . view pager 2 . widget . Composite Page Transformer Ċ import Ġandroidx . view pager 2 . widget . Margin Page Transformer Ċ import Ġandroidx . view pager 2 . widget . ViewPager 2 Ċ import Ġcom . example . movie app . R Ċ import Ġcom . example . movie app . ViewModel . Recommended Movie ViewModel Ċ import Ġcom . example . movie app . adapter . Movie Genre Adapter Ċ import Ġcom . example . movie app . adapter . Related Movies Adapter Ċ import Ġcom . example . movie app . data . datasource . Resource Ċ import Ġcom . example . movie app . model . Genre Ċ import Ġcom . example . movie app . model . Languages Ċ import Ġcom . example . movie app . model . Result Ċ import Ġcom . example . movie app . model . Result X Ċ import Ġcom . example . movie app . utils . Read Error Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . squareup . pic asso . Pic asso Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġdagger . h ilt . android . scopes . Fragment Scoped Ċ import Ġkotlinx . android . synt hetic . main . fragment _ related _ movies .* Ċ import Ġkotlinx . android . synt hetic . main . fragment _ single _ movie . movie Name Ċ import Ġkotlinx . coroutines . launch Ċ import Ġokhttp 3 . ResponseBody Ċ import Ġkotlin . math . log Ċ Ċ @ Android EntryPoint Ċ @ Fragment Scoped Ċ class ĠRelated Movies Fragment Ġ: ĠFragment ( R . layout . fragment _ related _ movies ), ĠRelated Movies Adapter . CallBack Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Related Movies Fragment " ĊĠĠĠ Ġprivate Ġval ĠviewModel Ġby Ġview Models < Recommended Movie ViewModel >() ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrelated Adapter : ĠRelated Movies Adapter ĊĠĠĠ Ġprivate Ġvar Ġmovie Genre : ĠList < Genre >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġgenre List Ġ= Ġarray ListOf < String >() ĊĠĠĠ Ġvar Ġresult : ĠResult ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġrelated Movies : ĠList < Result X >? Ġ= Ġnull ĊĠĠĠ Ġval Ġslider Handler : ĠHandler Ġ= ĠHandler () ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= Ġarguments ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġbundle !!. get Parcelable (" Main ĠMovie ") ĊĊĠĠĠĠĠĠĠ Ġmovie Name . text Ġ= Ġresult ?. title ĊĠĠĠĠĠĠĠ Ġrelease Date . text Ġ= Ġresult ?. release _ date ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġ" https :// image . t mdb . org / t / p / w 5 0 0 ${ result ?. poster _ path }" ĊĠĠĠĠĠĠĠ ĠPic asso . get (). load ( path ). into ( main Image ) ĊĠĠĠĠĠĠĠ Ġcount . text Ġ= Ġresult ?. vote _ count . toString () ĊĠĠĠĠĠĠĠ Ġvote Average . text Ġ= Ġresult ?. vote _ average . toString () ĊĠĠĠĠĠĠĠ Ġresult ?. original _ language ?. let Ġ{ Ġget Languages ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġrecommended Movies ( result !!. id , Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġmovie Gen res () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrecommended Movies ( movie ID : ĠInt , Ġpage No : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . get Recommended Movies ( movie ID , Ġpage No ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . recommended Movie Response . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" movie Gen res : Ġ${ it . value }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelated Movies Ġ= Ġit . value . results ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelated Adapter Ġ= ĠRelated Movies Adapter ( related Movies !! , Ġrv Related Movies , Ġthis @ Related Movies Fragment ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv Related Movies . adapter Ġ= Ġrelated Adapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv Related Movies . clip To Padding Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv Related Movies . clip Children Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv Related Movies . off screen Page Limit Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv Related Movies . getChild At ( 0 ). over Scroll Mode Ġ= ĠRecyclerView . OVER _ SCROLL _ NE VER ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposite Page Transformer Ġ= ĠComposite Page Transformer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposite Page Transformer . add Transformer ( Margin Page Transformer ( 4 0 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Trans Ġ= Ġobject Ġ: ĠView Pager 2 . Page Transformer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtransform Page ( page : ĠView , Ġposition : ĠFloat ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ: ĠFloat Ġ= Ġ 1 Ġ- ĠMath . abs ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage . scale Y Ġ= Ġ 0 . 8 5 f Ġ+ Ġr Ġ* Ġ 0 . 1 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposite Page Transformer . add Transformer ( page Trans ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv Related Movies . set Page Transformer ( composite Page Transformer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Click Ġ= Ġobject Ġ: ĠView Pager 2 . On Page Change Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Page Scroll StateChanged ( state : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Page Scroll StateChanged ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslider Handler . remove Callbacks ( slider Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslider Handler . post Delayed ( slider Runnable , Ġ 3 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv Related Movies . register On Page Change Callback ( page Click ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Failure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Response ( it . error Body , Ġerror Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġslider Runnable Ġ: ĠRunnable Ġ= ĠRunnable (){ ĊĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrv Related Movies . setCurrent Item ( rv Related Movies . currentItem Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġerror Response ( response Body : ĠResponse Body ?, Ġview : ĠTextView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror : ĠString Ġ= ĠRead Error (). read Error ( response Body ) ĊĠĠĠĠĠĠĠ Ġview . text Ġ= Ġerror ĊĠĠĠĠĠĠĠ Ġview . visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġslider Handler . remove Callbacks ( slider Runnable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġslider Handler . post Delayed ( slider Runnable , Ġ 3 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmovie Gen res () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . get Movies Genre () ĊĊĠĠĠĠĠĠĠ ĠviewModel . movie Genre Response . observe ( view Lifecycle Owner , Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Genre Ġ= Ġit . value . genres Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( genre Ġin Ġresult ?. genre _ ids !! ){ Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( genre Details Ġin Ġmovie Genre !! ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( genre Details . id . equals ( genre )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenre List . add ( genre Details . name ) Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" movie Gen res : Ġ$ genre List ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠMovie Genre Adapter ( genre List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Genre . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Genre . layout Manager Ġ= ĠLinearLayoutManager ( require Context (), ĠRecyclerView . HORIZONTAL , Ġfalse ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġ ĠResource . Failure Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Languages ( lang : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . get Languages () ĊĊĠĠĠĠĠĠĠ ĠviewModel . movie Languages . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" get Languages : Ġ${ it . value }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlanguage : ĠLanguage s Ġ= Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . iso _ 6 3 9 _ 1 Ġ== Ġlang ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal _ lang . text Ġ= Ġit . english _ name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Failure Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart Dialog ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsn ackBar Ġ= ĠSn ackbar . make ( view ," Video Ġtrail ers Ġis Ġstill Ġa ĠWork Ġin ĠProgress ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ LONG ĊĠĠĠĠĠĠĠ Ġ). setAction (" Action ", Ġnull ) ĊĠĠĠĠĠĠĠ Ġsn ackBar . setAction TextColor ( Color . WHITE ) ĊĠĠĠĠĠĠĠ Ġval Ġsn ackBar View Ġ= Ġsn ackBar . view ĊĠĠĠĠĠĠĠ Ġsn ackBar View . set BackgroundColor ( Color . BLACK ) ĊĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= Ġsn ackBar View . findViewById ( com . google . android . material . R . id . sn ackbar _ text ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ ĠtextView . setTextColor ( Color . WHITE ) ĊĠĠĠĠĠĠĠ Ġsn ackBar . show () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Custom Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Manager Ġ= Ġparent FragmentManager ĊĠĠĠĠĠĠĠ Ġval Ġfragment Transaction : ĠFragment Transaction Ġ= Ġfragment Manager . beginTransaction () ĊĊĠĠĠĠĠĠĠ Ġval Ġvideo Player Dialog Frag Ġ= ĠVideo Player Dialog Frag () ĊĠĠĠĠĠĠĠ Ġvideo Player Dialog Frag . show ( fragment Transaction , Ġ" Video _ Player ") ĊĊĊĠĠĠ Ġ} Ċ }