package Ġid . ze yn eler di . info od . recipe . presenter . list Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . widget . Search View Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . navigation . fragment . nav Args Ċ import Ġid . ze yn eler di . info od . In Food Application Ċ import Ġid . ze yn eler di . info od . core . R Ġas Ġcore R Ċ import Ġid . ze yn eler di . info od . core . data . Resource Ċ import Ġid . ze yn eler di . info od . core . domain . model . Food Category Ċ import Ġid . ze yn eler di . info od . core . domain . model . Recipe Ċ import Ġid . ze yn eler di . info od . core . util . auto Cle ared Ċ import Ġid . ze yn eler di . info od . core . util . set AppBar Elevation Listener Ċ import Ġid . ze yn eler di . info od . recipe . databinding . Fragment Recipe List Binding Ċ import Ġid . ze yn eler di . info od . recipe . di . D agger Recipe Component Ċ import Ġid . ze yn eler di . info od . recipe . presenter . filter . Recipe Filter Fragment Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Flow Preview Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* ĠA Ġsimple Ġ[ Fragment ] Ġsubclass . Ċ Ġ* ĠUse Ġthe Ġ[ Recipe List Fragment . newInstance ] Ġfactory Ġmethod Ġto Ċ Ġ* Ġcreate Ġan Ġinstance Ġof Ġthis Ġfragment . Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ @ Flow Preview Ċ class ĠRecipe List Fragment Ġ: ĠFragment (), ĠRecipe List ActionListener Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar ĠviewModel Factory : ĠViewModel Provider . Factory ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠRecipe List ViewModel Ġby Ġview Models Ġ{ ĠviewModel Factory Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġbinding Ġby Ġauto Cle ared < Fragment Recipe List Binding >() ĊĠĠĠ Ġprivate Ġval Ġargs : ĠRecipe List Fragment Args Ġby Ġnav Args () ĊĊĠĠĠ Ġprivate Ġval Ġrecipe Section Adapter : ĠRecipe List Section Adapter Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠRecipe List Section Adapter ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġfilter Dialog : ĠRecipe Filter Fragment Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠRecipe Filter Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Filter Apply Ġ= Ġ{ ĠviewModel . update Food Categories Filter ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attach ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attach ( context ) ĊĠĠĠĠĠĠĠ Ġinit DependencyInjection () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġlayout Ġfor Ġthis Ġfragment ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Recipe List Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġinit View () ĊĠĠĠĠĠĠĠ Ġinit Observer () ĊĠĠĠĠĠĠĠ Ġinit Data () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Refresh Recipes () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . get Recipes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Ġ= ĠviewModel . query . value ?. query , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Food Categories Ġ= ĠviewModel . query . value ?. filter Food Categories ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Open Recipe Filter () Ġ{ ĊĠĠĠĠĠĠĠ Ġfilter Dialog . setSelected Food Categories ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . filter Food Category List . value Ġ?: ĠArrayList () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfilter Dialog . show ( child FragmentManager , ĠRecipe Filter Fragment . TAG ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Remove Filter Food Category ( food Category : ĠFood Category ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . remove Food Category Filter ( food Category ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Open Recipe Detail ( recipe : ĠRecipe ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠRecipe List Fragment Directions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. action Recipe List Fragment To Recipe Detail Fragment ( recipe ) ĊĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonUpdate Favorite Recipe ( favorite : ĠBoolean , Ġrecipe : ĠRecipe ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . set Favorite ( recipe , Ġfavorite ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit DependencyInjection () Ġ{ ĊĠĠĠĠĠĠĠ ĠD agger Recipe Component . factory () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create ( In Food Application . core Component ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. inject ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit View () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . root . findViewById < TextView >( android x . appcompat . R . id . search _ src _ text ). type face Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResources Compat . getFont ( require Context (), Ġcore R . font . r ale way _ medium ) ĊĠĠĠĠĠĠĠ Ġbinding . toolbar . set Navigation OnClickListener Ġ{ Ġfind Nav Controller (). pop Back Stack () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . search View . setOn Query Text Listener ( binding . search View . on Query Text Listener ()) ĊĠĠĠĠĠĠĠ Ġbinding . btn Filter . setOnClickListener Ġ{ Ġon Open Recipe Filter () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . swipe Refresh . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Color Scheme Colors ( Context Compat . getColor ( context , Ġcore R . color . color Primary )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Refresh Listener Ġ{ Ġon Refresh Recipes () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . sv Recipes . set AppBar Elevation Listener ( binding . app Bar ) ĊĠĠĠĠĠĠĠ Ġbinding . rv Recipes . adapter Ġ= Ġrecipe Section Adapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Observer () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . recipes . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . swipe Refresh . is Refresh ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . swipe Refresh . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe Section Adapter . set Recipe List ( it . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . swipe Refresh . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . filter Food Category List . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe Section Adapter . set Filter Food Categories ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get Recipes ( binding . search View . query . toString (), Ġit ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġargs . String Argument Food Category ?. food Categories ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Food Categories Filter ( ArrayList < Food Category >(). apply Ġ{ Ġadd All ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠSearch View . on Query Text Listener (): ĠSearch View . On Query Text Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠSearch View . On Query Text Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get Recipes ( query , ĠviewModel . query . value ?. filter Food Categories ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( new Text : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Text . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get Recipes ( new Text , ĠviewModel . query . value ?. filter Food Categories ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠUse Ġthis Ġfactory Ġmethod Ġto Ġcreate Ġa Ġnew Ġinstance Ġof ĊĠĠĠĠĠĠĠĠ Ġ* Ġthis Ġfragment Ġusing Ġthe Ġprovided Ġparameters . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠA Ġnew Ġinstance Ġof Ġfragment ĠRecipe Fragment . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance () Ġ= ĠRecipe List Fragment () ĊĠĠĠ Ġ} Ċ }