package Ġcom . dev _ vl ad . food recipes Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . widget . Search View Ċ import Ġandroidx . appcompat . widget . Toolbar Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . dev _ vl ad . food recipes . adapters . Recipe Recycler Adapter Ċ import Ġcom . dev _ vl ad . food recipes . interfaces . On Recipe ClickListener Ċ import Ġcom . dev _ vl ad . food recipes . models . Recipe Ċ import Ġcom . dev _ vl ad . food recipes . util . My Logger Ċ import Ġcom . dev _ vl ad . food recipes . util . Vertical Spacing Item Decorator Ċ import Ġcom . dev _ vl ad . food recipes . view models . Recipe List ViewModel Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ Ċ class ĠRecipe List Activity Ġ: ĠBase Activity () Ġ, ĠOn Recipe ClickListener Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG _ TAG Ġ= ĠRecipe List Activity :: class . java . simple Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrecipe List ViewModel Ġ: ĠRecipe List ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrecipe Recycler Adapter : ĠRecipe Recycler Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsearch View Ġ: ĠSearch View ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ recipe _ list ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( findViewById < Toolbar >( R . id . toolbar )) ĊĠĠĠĠĠĠĠ Ġre cyclerView Ġ= ĠfindViewById ( R . id . recipe _ rv ) ĊĠĠĠĠĠĠĠ Ġrecipe List ViewModel Ġ= ĠViewModel Provider ( this ). get ( Recipe List ViewModel :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġinit Recycler () ĊĠĠĠĠĠĠĠ Ġsubscribe To Observer s () ĊĠĠĠĠĠĠĠ Ġinit Search View () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġinit Recycler (){ ĊĠĠĠĠĠĠĠ Ġrecipe Recycler Adapter Ġ= ĠRecipe Recycler Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġvertical Spacing Item Decorator Ġ= ĠVertical Spacing Item Decorator ( 3 0 ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . addItem Decoration ( vertical Spacing Item Decorator ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ= ĠLinearLayoutManager ( this ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġrecipe Recycler Adapter ĊĊĠĠĠĠĠĠĠ Ġre cyclerView . add On Scroll Listener ( object Ġ: ĠRecyclerView . On Scroll Listener (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( rv : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! re cyclerView . can Scroll Vert ically ( 1 )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// this Ġif Ġwill Ġtrigger Ġif Ġit Ġis Ġat Ġthe Ġbottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe List ViewModel . search Next Page () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMy Logger . log This ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG _ TAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Scroll StateChanged ()", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" loading Ġfor Ġmore " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġprivate Ġfun Ġsubscribe To Observer s (){ ĊĠĠĠĠĠĠĠ Ġrecipe List ViewModel . getView State (). observe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( view State ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecipe List ViewModel . ViewState . DISPLAY ING _ CATEG ORIES Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Search Categories () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecipe List ViewModel . ViewState . DISPLAY ING _ REC IP ES Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġrecipes Ġwill Ġbe Ġdisplayed Ġfrom Ġanother Ġobserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdisplay Search Categories () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Recipe Click ( clicked Recipe Position Ġ: ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclicked Recipe Ġ= Ġrecipe Recycler Adapter . get Clicked If Recipe At Pos ( clicked Recipe Position ) ĊĠĠĠĠĠĠĠ Ġclicked Recipe ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMy Logger . log This ( LOG _ TAG , Ġ" on Recipe Click " Ġ, Ġ": Ġclicked Ġ$ clicked Recipe ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠRecipe Details Activity :: class . java ). putExtra ( Recipe Details Activity . RE CI PE _ INT ENT , Ġclicked Recipe )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Recipe Category Clicked ( category : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMy Logger . log This ( LOG _ TAG , Ġ" on Recipe Category Clicked " Ġ, Ġ" Ġ$ category ") ĊĠĠĠĠĠĠĠ Ġrecipe Recycler Adapter . display Loading () ĊĠĠĠĠĠĠĠ Ġrecipe List ViewModel . search Recipes Api ( category , Ġpage Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġsearch View . clear Focus () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay Search Categories (){ ĊĠĠĠĠĠĠĠ Ġrecipe Recycler Adapter . display Search Categories () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/ ******** *** ĠSEARCH ĠVIEW Ġ Ġ**/ ĊĠĠĠ Ġprivate Ġfun Ġinit Search View (){ ĊĠĠĠĠĠĠ Ġsearch View Ġ Ġ= ĠfindViewById ( R . id . search _ view ) ĊĊĠĠĠĠĠĠĠ Ġsearch View . setOn Query Text Listener ( object Ġ: ĠSearch View . On Query Text Listener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe Recycler Adapter . display Loading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe List ViewModel . search Recipes Api ( it , Ġpage Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch View . clear Focus () // so Ġwhen Ġuser Ġp resses Ġback Ġbutton , Ġthat Ġevent Ġis Ġnot Ġconsumed Ġby Ġthis Ġfocus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMy Logger . log This ( LOG _ TAG , Ġ" on Query Text Submit ", Ġ" query Ġ: Ġ$ query " Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( new Text : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse Ġ// not Ġinterested ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( recipe List ViewModel . is Perform ing Query ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// cancel Ġquery ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe List ViewModel . cancel Request () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( recipe List ViewModel . is View ing Recipes ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe List ViewModel . setIs View ing Recipes ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Search Categories () ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// they Ġare Ġviewing Ġcategories ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . recipe _ search _ menu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . onCreate Options Menu ( menu ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== ĠR . id . action _ categories ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recipe List ViewModel . is Perform ing Query ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// cancel Ġquery ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe List ViewModel . cancel Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Search Categories () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} Ċ Ċ }