package Ġcat . xo jan . random 1 . feature . home Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 4 . media . Media Browser Compat Ċ import Ġandroid . support . v 4 . media . Media Description Compat Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View . GONE Ċ import Ġandroid . view . View . VISIBLE Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcat . xo jan . random 1 . R Ċ import Ġcat . xo jan . random 1 . domain . model . Crash Reporter Ċ import Ġcat . xo jan . random 1 . feature . Base Fragment Ċ import Ġcat . xo jan . random 1 . feature . Is Media Browser Fragment Ċ import Ġcat . xo jan . random 1 . feature . Media Browser Provider Ċ import Ġcat . xo jan . random 1 . feature . MediaPlayer Base Activity Ċ import Ġcat . xo jan . random 1 . injection . component . Home Component Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġkotlinx . android . synt hetic . main . fragments _ programs .* Ċ import Ġjavax . inject . Inject ĊĊ Ċ class ĠProgram Fragment : ĠBase Fragment (), ĠIs Media Browser Fragment Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠTAG : ĠString Ġ= ĠProgram Fragment :: class . simple Name . toString () ĊĠĠĠĠĠĠĠ Ġval ĠMED IA _ ID _ ROOT Ġ= Ġ"__ PROGRAM S __ " ĊĠĠĠĠĠĠĠ Ġval ĠMED IA _ ID _ EMPTY _ ROOT Ġ= Ġ"__ EMPTY _ ROOT __ " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Inject Ġinternal Ġlateinit Ġvar Ġcrash Reporter : ĠCrash Reporter ĊĊĠĠĠ Ġprivate Ġval Ġm Composite Disposable Ġ= ĠComposite Disposable () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠProgram ListAdapter ĊĠĠĠ Ġprivate Ġvar Ġmedia Browser Provider : ĠMedia Browser Provider ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġrefresh Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġon Attach ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attach ( context ) ĊĠĠĠĠĠĠĠ Ġmedia Browser Provider Ġ= Ġcontext Ġas ĠMedia Player Base Activity ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġget Component ( Home Component :: class . java ). inject ( this ) ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragments _ programs , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġprograms _ progress _ bar . visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠ Ġprograms _ load _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Media Controller Connected () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠProgram ListAdapter () ĊĠĠĠĠĠĠĠ Ġprograms _ recycler _ view . add On Scroll Listener ( object : ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newState Ġ== ĠRecyclerView . SCROLL _ STATE _ SET TL ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprograms _ recycler _ view . stop Scroll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġprograms _ recycler _ view . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġset LayoutManager ( resources . configuration . orientation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġm Composite Disposable . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset LayoutManager ( orientation : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcolumns Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġif Ġ( orientation Ġ== ĠConfiguration . OR IENTATION _ LAND SC APE ) Ġcolumns Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġprograms _ recycler _ view . layout Manager Ġ= ĠGrid LayoutManager ( activity , Ġcolumns ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Programs () Ġ{ ĊĠĠĠĠĠĠĠ Ġprograms _ empty _ view . visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ Ġprograms _ progress _ bar . visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ Ġprograms _ recycler _ view . visibility Ġ= ĠVIS IBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Error ( d : ĠMedia Description Compat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrash Reporter . log Exception ( d . description . toString ()) ĊĠĠĠĠĠĠĠ Ġprograms _ empty _ view . visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠ Ġprograms _ progress _ bar . visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ Ġprograms _ recycler _ view . visibility Ġ= ĠG ONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Media Controller Connected () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Detached ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( adapter . programs . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprograms _ empty _ view . visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprograms _ progress _ bar . visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprograms _ recycler _ view . visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġmedia Id Ġ= Ġget Media Id () ĊĠĠĠĠĠĠĠ Ġval Ġmedia Browser Ġ= Ġmedia Browser Provider ?. get Media Browser () ĊĊĠĠĠĠĠĠĠ Ġ// ĠUn sub scri bing Ġbefore Ġsub scri bing Ġis Ġrequired Ġif Ġthis Ġmedia Id Ġalready Ġhas Ġa Ġsubscriber ĊĠĠĠĠĠĠĠ Ġ// Ġon Ġthis ĠMedia Browser Ġinstance . ĠSub scri bing Ġto Ġan Ġalready Ġsubscribed Ġmedia Id Ġwill Ġreplace ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġcallback , Ġbut Ġwon 't Ġtrigger Ġthe Ġinitial Ġcallback . on Children Loaded . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġtemporary : ĠA Ġbug Ġis Ġbeing Ġfixed Ġthat Ġwill Ġmake Ġsubscribe ĊĠĠĠĠĠĠĠ Ġ// Ġconsistently Ġcall Ġon Children Loaded Ġinitially , Ġno Ġmatter Ġif Ġit Ġis Ġreplacing Ġan Ġexisting ĊĠĠĠĠĠĠĠ Ġ// Ġsubscriber Ġor Ġnot . ĠCurrently Ġthis Ġonly Ġhappens Ġif Ġthe Ġmedia ID Ġhas Ġno Ġprevious ĊĠĠĠĠĠĠĠ Ġ// Ġsubscriber Ġor Ġif Ġthe Ġmedia Ġcontent Ġchanges Ġon Ġthe Ġservice Ġside , Ġso Ġwe Ġneed Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġunsubscribe Ġfirst . ĊĠĠĠĠĠĠĠ Ġmedia Browser ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Browser . unsubscribe ( media Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Browser . subscribe ( media Id , Ġmedia Browser Subscription Callback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġ// Ġfetch Ġb rowsing Ġinformation Ġto Ġfill Ġthe Ġre cycler Ġview ĊĠĠĠĠĠĠĠ Ġval Ġmedia Browser Ġ= Ġ Ġmedia Browser Provider ?. get Media Browser () ĊĠĠĠĠĠĠĠ Ġmedia Browser ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onStart , Ġon Connected =" Ġ+ Ġmedia Browser . isConnected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media Browser . isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onStart , Ġmedia Id =" Ġ+ Ġmedia Browser . root ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Media Controller Connected () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġval Ġmedia Browser Ġ= Ġ Ġmedia Browser Provider ?. get Media Browser () ĊĠĠĠĠĠĠĠ Ġmedia Browser ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media Browser . isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Browser . unsubscribe ( media Browser . root ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detach () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detach () ĊĠĠĠĠĠĠĠ Ġmedia Browser Provider Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Media Id (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmedia Id Ġ= ĠMED IA _ ID _ ROOT Ġ+ Ġ"/" Ġ+ Ġrefresh . toString () ĊĠĠĠĠĠĠĠ Ġrefresh Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġmedia Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmedia Browser Subscription Callback Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠMedia Browser Compat . Subscription Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Children Loaded ( parentId : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren : ĠList < Media Browser Compat . Media Item >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Children Error ( children )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Error ( children [ 0 ]. description ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Children Loaded , ĠparentId =" Ġ+ ĠparentId Ġ+ Ġ" Ġ Ġcount =" Ġ+ Ġchildren . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . programs Ġ= Ġchildren ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Programs () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" program Ġfragment Ġsubscription ĠonError , Ġid =$ id " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrash Reporter . log Exception ( msg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }