package Ġcom . kp stv . y ts . ui . fragments Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . PopupMenu Ċ import Ġandroidx . core . view . Gravity Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . navigation . nav Graph ViewModels Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . kp stv . common _ movies y . extensions . view Binding Ċ import Ġcom . kp stv . y ts . App Interface . Companion . MOV IE _ ID Ċ import Ġcom . kp stv . y ts . R Ċ import Ġcom . kp stv . y ts . adapters . Library Download Adapter Ċ import Ġcom . kp stv . y ts . databinding . Fragment Library Binding Ċ import Ġcom . kp stv . y ts . extensions . delete Recursive Ċ import Ġcom . kp stv . common _ movies y . extensions . hide Ċ import Ġcom . kp stv . common _ movies y . extensions . show Ċ import Ġcom . kp stv . y ts . AppSettings Ċ import Ġcom . kp stv . y ts . data . models . response . Model Ċ import Ġcom . kp stv . y ts . extensions . common . Custom Tip Layout Ċ import Ġcom . kp stv . y ts . ui . activities . Final Activity Ċ import Ġcom . kp stv . y ts . ui . activities . MainActivity Ċ import Ġcom . kp stv . y ts . ui . activities . Search Activity Ċ import Ġcom . kp stv . y ts . ui . dialogs . Alert No Icon Dialog Ċ import Ġcom . kp stv . y ts . ui . fragments . sheets . Bottom Sheet Library Download Ċ import Ġcom . kp stv . y ts . ui . fragments . sheets . Playback Type Ċ import Ġcom . kp stv . y ts . ui . view models . Main ViewModel Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġes . dm oral . toast y . Toast y Ċ import Ġjava . io . File Ċ import Ġjava . lang . ref . Weak Reference Ċ Ċ @ Android EntryPoint Ċ class ĠLibrary Fragment Ġ: ĠFragment ( R . layout . fragment _ library ) Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Library Fragment " ĊĊĠĠĠ Ġprivate Ġval ĠviewModel Ġby Ġactivity ViewModels < Main ViewModel >() ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmain Activity : ĠMainActivity ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdownload Adapter : ĠWeak Reference < Library Download Adapter > ĊĠĠĠ Ġprivate Ġvar Ġmedia Route MenuItem : ĠWeak Reference < MenuItem ?> ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġbinding Ġby Ġview Binding ( Fragment Library Binding :: bind ) ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġmain Activity Ġ= Ġrequire Activity () Ġas ĠMainActivity ĊĊĠĠĠĠĠĠĠ Ġset ToolBar () ĊĊĠĠĠĠĠĠĠ Ġset RecyclerView () ĊĊĠĠĠĠĠĠĠ Ġbind UI () ĊĊĠĠĠĠĠĠĠ Ġadd Download Tip () ĊĊĠĠĠĠĠĠĠ Ġmain Activity . cast Helper . init ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Ġ= Ġmain Activity , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Session Disconnected Ġ= Ġ{ Ġmodel , Ġlast Saved Position Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( model Ġ== Ġnull ) Ġreturn @ init ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Download ( model . hash , Ġtrue , Ġlast Saved Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Need To Show Intro duct ory Overlay Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Activity . cast Helper . show Intro duct ory Overlay ( media Route MenuItem ?. get ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmedia Route MenuItem Ġ= ĠWeak Reference ( main Activity . cast Helper . set Media Route Menu ( require Context (), Ġbinding . toolbar . menu )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġmain Activity . cast Helper . un Init () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . re cyclerView Download . layout Manager Ġ= ĠLinearLayoutManager ( require Context ()) ĊĠĠĠĠĠĠĠ Ġdownload Adapter Ġ= ĠWeak Reference ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLibrary Download Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Listener Ġ= Ġ{ Ġmodel , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter OnClickListener ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon More ClickListener Ġ= Ġ{ Ġinner View , Ġmodel , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter On More Listener ( inner View , Ġmodel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġbinding . re cyclerView Download . adapter Ġ= Ġdownload Adapter . get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind UI () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . download Movie Ids . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Adapter . get ()?. submit List ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . fragment Library No Download . root . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . fl Download Layout . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . fragment Library No Download . root . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . fl Download Layout . hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠRestore Ġprevious Ġstate Ġof Ġre cyclerView Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewModel . library Fragment State . re cyclerView State Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . re cyclerView Download . layout Manager ?. on Restore InstanceState ( viewModel . library Fragment State . re cyclerView State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . library Fragment State . re cyclerView State Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset ToolBar () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . toolbar . title Ġ= ĠgetString ( R . string . library ) ĊĠĠĠĠĠĠĠ Ġbinding . toolbar . set Navigation Icon ( R . drawable . ic _ menu ) ĊĠĠĠĠĠĠĠ Ġbinding . toolbar . set Navigation OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Activity . drawer Layout . open Drawer ( Gravity Compat . START ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . toolbar . inflate Menu ( R . menu . fragment _ library _ menu ) ĊĊĠĠĠĠĠĠĠ Ġbinding . toolbar . setOn MenuItem ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . itemId Ġ== ĠR . id . action _ search ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( main Activity , ĠSearch Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn MenuItem ClickListener Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadapter OnClickListener ( model : ĠModel . response _ download ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsheet Ġ= Ġif Ġ( main Activity . cast Helper . is Cast Active ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠShow Ġcast Ġto Ġdevice Ġbutton Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Library Download ( main Activity . cast Helper , ĠPlay back Type . REMOTE ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠShow Ġlocal Ġplay Ġbutton Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Library Download ( main Activity . cast Helper , ĠPlay back Type . LOCAL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= ĠBundle () ĊĠĠĠĠĠĠĠ Ġbundle . put Serializable (" model ", Ġmodel ) ĊĠĠĠĠĠĠĠ Ġsheet . arguments Ġ= Ġbundle ĊĠĠĠĠĠĠĠ Ġsheet . show ( main Activity . support FragmentManager , Ġ"") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadapter On More Listener ( inner View : ĠView , Ġmodel : ĠModel . response _ download ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpopup Menu Ġ= ĠPopup Menu ( require Context (), Ġinner View ) ĊĠĠĠĠĠĠĠ Ġpopup Menu . inflate ( R . menu . library _ menu ) ĊĠĠĠĠĠĠĠ Ġpopup Menu . setOn MenuItem ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ details Ġ-> ĠstartActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( require Context (), ĠFinal Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( MOV IE _ ID , Ġmodel . movie Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ show _ location Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlert No Icon Dialog . Companion . Builder ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle ( getString ( R . string . location )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Message ("${ model . download Path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Positive Button (" OK ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ delete Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlert No Icon Dialog . Companion . Builder ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle (" Delete ?") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Message ( getString ( R . string . delete _ und one )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Negative Button ( getString ( R . string . no )) Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Positive Button ( getString ( R . string . yes )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= ĠFile ( model . download Path !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . delete Recursive () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . remove Download ( model . hash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast y . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . error _ path _ exist ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast y . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn MenuItem ClickListener Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpopup Menu . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Download Tip () Ġ{ ĊĠĠĠĠĠĠĠ ĠCustom Tip Layout . Builder ( binding . add Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle (" Existing Ġdownloads ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage (" In Ġany Ġcase , Ġyour Ġexisting Ġdownload Ġdoesn 't Ġshow Ġup Ġhere Ġyou Ġcan Ġgo Ġto ĠSettings Ġ> ĠStorage Ġ> ĠScan Ġexisting Ġdownloads .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show ( AppSettings . SHOW _ DOWNLOAD _ TIP _ PRE F ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSave Ġall Ġyour Ġstate Ġhere ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ ĠviewModel . library Fragment State . re cyclerView State Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . re cyclerView Download . layout Manager ?. on Save InstanceState () ĊĠĠĠ Ġ} Ċ } Ċ