package Ġorg . the mov ied b . ui . detail Ċ Ċ import Ġandroid . content . Activity NotFoundException Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . view . is G one Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . navigation . fragment . nav Args Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġorg . the mov ied b . R Ċ import Ġorg . the mov ied b . adapters . Detail Genre ListAdapter Ċ import Ġorg . the mov ied b . adapters . Detail List Cast Adapter Ċ import Ġorg . the mov ied b . adapters . Detail Review ListAdapter Ċ import Ġorg . the mov ied b . adapters . Detail Video ListAdapter Ċ import Ġorg . the mov ied b . data . local . models . Review Ċ import Ġorg . the mov ied b . data . local . provider . F avorites Provider Ċ import Ġorg . the mov ied b . databinding . Fragment Detail Binding Ċ import Ġorg . the mov ied b . ui . base . Base Fragment Ċ import Ġorg . the mov ied b . ui . detail . Detail ViewModel . Favorite Action . Action Favorite Added Ċ import Ġorg . the mov ied b . ui . detail . Detail ViewModel . Favorite Action . Action Favorite Removed Ċ import Ġorg . the mov ied b . ui . main . MainActivity Ċ import Ġorg . the mov ied b . ui . main . WebView Activity Ċ import Ġorg . the mov ied b . utils . Custom Dialog Ċ import Ġorg . the mov ied b . utils . ext . observe Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠDetail Fragment Ġ: ĠBase Fragment < Fragment Detail Binding >( R . layout . fragment _ detail ) Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar ĠviewModel Factory : ĠViewModel Provider . Factory ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġcustom Dialog : ĠCustom Dialog ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠDetail ViewModel Ġby Ġview Models Ġ{ ĠviewModel Factory Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmovie Args : ĠDetail Fragment Args Ġby Ġnav Args () ĊĊĠĠĠ Ġprivate Ġval Ġis Movie Detail : ĠBoolean Ġby Ġlazy Ġ{ Ġmovie Args . is Movie Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdetail Id : ĠInt Ġby Ġlazy Ġ{ Ġmovie Args . id Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcast Adapter Ġby Ġlazy Ġ{ ĠDetail List Cast Adapter () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġvideo Adapter Ġby Ġlazy Ġ{ ĠDetail Video ListAdapter ( this :: open Y outube ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġgenre Adapter Ġby Ġlazy Ġ{ ĠDetail Genre ListAdapter () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġreview Adapter Ġby Ġlazy Ġ{ ĠDetail Review ListAdapter ( this :: view Full Review ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġactivity : ĠMainActivity Ġby Ġlazy Ġ{ ĠgetActivity () Ġas ĠMainActivity Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġinit Binding () ĊĠĠĠĠĠĠĠ Ġsubscribe UI () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Binding () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġthis @ Detail Fragment . viewModel . apply Ġ{ Ġset Movie Detail ( detail Id , Ġis Movie Detail ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Button . setOnClickListener Ġ{ Ġrequire Activity (). on Back Pressed () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Cast . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayoutManager . HORIZONTAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġcast Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Video . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayoutManager . HORIZONTAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġvideo Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Genre . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayoutManager . HORIZONTAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġgenre Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Review . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( require Activity ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġreview Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġactivity . support ActionBar ?. hide () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġactivity . support ActionBar ?. show () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġsubscribe UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġobserve ( viewModel . get Detail Genre (), Ġgenre Adapter :: load Items ) ĊĠĠĠĠĠĠĠ Ġobserve ( viewModel . get Movie Cast s (), Ġcast Adapter :: load Items ) ĊĠĠĠĠĠĠĠ Ġobserve ( viewModel . get Detail Videos (), Ġvideo Adapter :: load Items ) ĊĠĠĠĠĠĠĠ Ġobserve ( viewModel . on Review LiveData Ready , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve ( viewModel . get Detail Review (), Ġreview Adapter :: submit List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve ( viewModel . isError Review , Ġ{ Ġis Error Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . container Review . is G one Ġ= Ġis Error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve ( viewModel . detail Review Loading , Ġ{ ĠisLoading Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . shim mer View Review . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis G one Ġ= Ġ! isLoading ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isLoading ) Ġstart Sh im mer () Ġelse Ġstop Sh im mer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . review View . is G one Ġ= ĠisLoading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġobserve ( viewModel . get Favorite Button Action ()) Ġ{ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (). content Resolver . notify Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action . type Ġ== Ġ" movie ") ĠF avorites Provider . MOV IE _ URI Ġelse ĠF avorites Provider . TV _ SHOW _ URI , Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAction Favorite Added Ġ-> Ġcustom Dialog . show AddTo Favorite Dialog ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAction Favorite Removed Ġ-> Ġcustom Dialog . show Remove From Favorite Dialog ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġview Full Review ( review : ĠReview ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= ĠIntent ( activity , ĠWebView Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra (" url ", Ġreview . url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra (" title ", Ġ" Review ĠDetail Ġby Ġ${ review . author }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠstartActivity ( i ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Y outube ( key : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Intent Ġ= ĠIntent ( Intent . ACTION _ VIEW , ĠUri . parse (" vnd . youtube :$ key ")) ĊĠĠĠĠĠĠĠ Ġval Ġweb Intent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" http :// www . youtube . com / watch ? v =$ id ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (). startActivity ( app Intent ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠActivity NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (). startActivity ( web Intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }