package Ġcom . android . t ait asci ore . pri val i atest . feature . popular movies . view Ċ Ċ import Ġandroid . app . Search Manager Ċ import Ġandroid . arch . lifecycle . Observer Ċ import Ġandroid . arch . lifecycle . ViewModel Providers Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 4 . app . Fragment Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . support . v 7 . widget . Divider Item Decoration Ċ import Ġandroid . support . v 7 . widget . Linear LayoutManager Ċ import Ġandroid . support . v 7 . widget . Search View Ċ import Ġandroid . view .* Ċ import Ġcom . android . t ait asci ore . pri val i atest . R Ċ import Ġcom . android . t ait asci ore . pri val i atest . domain . model . Movie Ċ import Ġcom . android . t ait asci ore . pri val i atest . exception . Movie Query NotFoundException Ċ import Ġcom . android . t ait asci ore . pri val i atest . exception . No More Pages Exception Ċ import Ġcom . android . t ait asci ore . pri val i atest . feature . popular movies . Pop ular Movies Ui Event Ċ import Ġcom . android . t ait asci ore . pri val i atest . feature . popular movies . Pop ular Movies ViewState Ċ import Ġcom . android . t ait asci ore . pri val i atest . feature . popular movies . view . adapter . Movie Adapter Ċ import Ġcom . android . t ait asci ore . pri val i atest . feature . popular movies . view model . Pop ular Movies ViewModel Ċ import Ġcom . android . t ait asci ore . pri val i atest . feature . popular movies . view model . Pop ular Movies ViewModel Factory Ċ import Ġcom . android . t ait asci ore . pri val i atest . presentation . base . Base View Ċ import Ġcom . android . t ait asci ore . pri val i atest . utils .* Ċ import Ġcom . jak ew h art on . r xb ind ing 2 . support . v 7 . widget . Rx RecyclerView Ċ import Ġcom . jak ew h art on . r xb ind ing 2 . support . v 7 . widget . Rx Search View Ċ import Ġcom . jak ew h art on . r xb ind ing 2 . view . Rx View Ċ import Ġio . reactivex . Observable Ċ import Ġkotlinx . android . synt hetic . main . fragment _ popular _ movies .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠPop ular Movies Fragment Ġ: ĠFragment (), ĠBase View < Pop ular Movies Ui Event , ĠPop ular Movies ViewState > Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġquery : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġfactory : ĠPop ular Movies ViewModel Factory ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠPop ular Movies ViewModel Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠViewModel Providers . of ( this , Ġfactory )[ Pop ular Movies ViewModel :: class . java ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmovie Adapter Ġ= ĠMovie Adapter () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ popular _ movies , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġget Base Application (). component . inject ( this ) ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĠĠĠĠĠĠĠ Ġsetup RecyclerView () ĊĊĠĠĠĠĠĠĠ ĠviewModel . states (). observe ( this , ĠObserver Ġ{ Ġrender ( it !! ) Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . process Ui Events ( events ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?, Ġinflater : ĠMenu Inflater ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġoptions Ġmenu Ġfrom ĠXML ĊĠĠĠĠĠĠĠ Ġinflater !!. inflate ( R . menu . search , Ġmenu ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe ĠSearch View Ġand Ġset Ġthe Ġsearch able Ġconfiguration ĊĠĠĠĠĠĠĠ Ġval Ġsearch Manager Ġ= Ġactivity !!. getSystem Service ( Context . SEARCH _ SERVICE ) Ġas ĠSearch Manager ĊĠĠĠĠĠĠĠ Ġval Ġsearch View Ġ= Ġmenu !!. find Item ( R . id . search ). action View Ġas ĠSearch View ĊĠĠĠĠĠĠĠ Ġsearch View . setIcon ified ByDefault ( false ) Ġ// ĠDo Ġnot Ġicon ify Ġthe Ġwidget ; Ġexpand Ġit Ġby Ġdefault ĊĠĠĠĠĠĠĠ Ġsearch View . query Hint Ġ= ĠgetString ( R . string . search _ hint ) ĊĊĠĠĠĠĠĠĠ Ġset Search View Action ( search View ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Search View Action ( search View : ĠSearch View ) Ġ{ ĊĠĠĠĠĠĠĠ ĠRx Search View . query Text Changes ( search View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. skip Initial Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. de bounce ( 5 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isEmpty () Ġ|| Ġit . length Ġ> Ġ 3 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġquery Ġ= Ġit . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isEmpty ()) ĠviewModel . send Event ( Pop ular Movies Ui Event . Load First ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠviewModel . send Event ( Pop ular Movies Ui Event . Search ( it . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . add Divider ( context !! , ĠR . drawable . divider ) ĊĠĠĠĠĠĠĠ Ġlist . adapter Ġ= Ġmovie Adapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitial Event () Ġ= ĠObservable . just ( Pop ular Movies Ui Event . Initial ()) ĊĊĠĠĠ Ġprivate Ġfun Ġload Next Page Event (): ĠObservable < Pop ular Movies Ui Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRx RecyclerView . scroll Events ( list ). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġlist . layout Manager Ġas ĠLinearLayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager . find Last Comp let ely Visible Item Position () Ġ>= Ġlayout Manager . item Count Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. throttle First ( 1 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( query . isEmpty ()) Pop ular Movies Ui Event . Load Next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠPop ular Movies Ui Event . Load Next Search ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġretry Event (): ĠObservable < Pop ular Movies Ui Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRx View . click s ( button _ retry ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( query . isEmpty ()) ĠPop ular Movies Ui Event . Retry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠPop ular Movies Ui Event . Retry Search ( query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġevents (): ĠObservable < Pop ular Movies Ui Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . merge ( initial Event (), Ġload Next Page Event (), Ġretry Event ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrender ( state : ĠPop ular Movies ViewState ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state . loading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Loading State () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . movies Ġ!= Ġnull ) Ġrender Movies ( state . movies ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . error Ġ!= Ġnull ) Ġrender Error ( state ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Loading State () Ġ{ ĊĠĠĠĠĠĠĠ Ġshow View ( progress _ wheel ) ĊĠĠĠĠĠĠĠ Ġhide View ( layout _ error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Movies ( movies : ĠList < Movie >) Ġ{ ĊĠĠĠĠĠĠĠ Ġhide View ( progress _ wheel ) ĊĠĠĠĠĠĠĠ Ġhide View ( layout _ error ) ĊĠĠĠĠĠĠĠ Ġshow View ( list ) ĊĠĠĠĠĠĠĠ Ġmovie Adapter . set List ( movies ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Error ( state : ĠPop ular Movies ViewState ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhide View ( progress _ wheel ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( state . show Initial Error !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow View ( layout _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide View ( list ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . error Ġis ĠMovie Query NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide View ( button _ retry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext _ view _ error . text Ġ= ĠgetString ( R . string . error _ message _ not _ found ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow View ( button _ retry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext _ view _ error . text Ġ= ĠgetString ( R . string . error _ message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide View ( layout _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow View ( list ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( state . show Snackbar Error !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg : ĠString Ġ= Ġif Ġ( state . error Ġis ĠNo More Pages Exception ) Ġstate . error !!. message !! Ġelse ĠgetString ( R . string . error _ message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Snackbar ( activity ?. findViewById ( R . id . root _ layout ) !! , Ġmsg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }