package Ġcom . example . sharing ang . ui . fragments Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . Adapter View Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġcom . example . sharing ang . R Ċ import Ġcom . example . sharing ang . databinding . Fragment Search Binding Ċ import Ġcom . example . sharing ang . view models . Items ViewModel Ċ import Ġcom . example . sharing ang . auth . CurrentUser Provider Ċ import Ġcom . example . sharing ang . models . Item Ċ import Ġcom . example . sharing ang . ui . adapters . Item Listener Ċ import Ġcom . example . sharing ang . ui . adapters . Items Adapter Ċ import Ġcom . example . sharing ang . view models . UserProfile ViewModel Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġjavax . inject . Inject Ċ Ċ @ Android EntryPoint Ċ class ĠSearch Fragment Ġ: ĠFragment (), ĠAdapter View . On ItemSelected Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠItems ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠ Ġprivate Ġval Ġuser ViewModel : ĠUser Profile ViewModel Ġby Ġactivity ViewModels () ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar ĠcurrentUser Provider : ĠCurrent User Provider ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Search Binding ĊĠĠĠ Ġprivate Ġvar Ġcontained : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠData Binding Util . inflate ( in flater , ĠR . layout . fragment _ search , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġsetup Item Adapter () ĊĠĠĠĠĠĠĠ Ġsetup Toolbar () ĊĠĠĠĠĠĠĠ Ġbinding . item Search List . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġbinding . item Search List . layout Manager Ġ= ĠGrid LayoutManager ( context , Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠviewModel . add Observer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠItems ViewModel . OB SERV ABLE S . SEARCH _ RESULTS ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġbinding . s fl Search Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . search Items ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Text . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Category Spinner . selected Item Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Discount . isChecked ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . setup Item Navigation ( view Lifecycle Owner , Ġthis . find Nav Controller (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġitem Ġ-> ĠSearch Fragment Directions . action Search Fragment To Detailed Item Fragment ( item ) Ġ}) ĊĠĠĠĠĠĠĠ Ġclear Search () ĊĠĠĠĠĠĠĠ Ġbinding . clear Search Button . setOnClickListener Ġ{ Ġclear Search () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Search () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . clear SearchResults () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate Options Menu ( menu , Ġinflater ) ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . menu _ search , Ġmenu ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Prepare Options Menu ( menu : ĠMenu ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Prepare Options Menu ( menu ) ĊĠĠĠĠĠĠĠ Ġval Ġsubscribe Ġ= Ġmenu . find Item ( R . id . menu Subscribe ) ĊĠĠĠĠĠĠĠ Ġval Ġunsubscribe Ġ= Ġmenu . find Item ( R . id . menu Un subscribe ) ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= ĠcurrentUser Provider . getCurrent UserId () ĊĠĠĠĠĠĠĠ Ġif Ġ( userId Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunsubscribe . isVisible Ġ= Ġcontained ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribe . isVisible Ġ= Ġ! contained ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunsubscribe . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribe . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu Subscribe , ĠR . id . menu Un subscribe Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Subscriptions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Sub scribed ( userId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġuser ViewModel . subscription Contains ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Category Spinner . selected Item . toString () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Subscriptions () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcategory Ġ= Ġbinding . search Category Spinner . selected Item . toString () ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= ĠcurrentUser Provider . getCurrent UserId () !! ĊĠĠĠĠĠĠĠ Ġuser ViewModel . subscription Set ( userId , Ġcategory ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon ItemSelected ( parent : ĠAdapter View < *> ?, Ġview : ĠView ?, Ġposition : ĠInt , Ġid : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= ĠcurrentUser Provider . getCurrent UserId () ĊĠĠĠĠĠĠĠ Ġif Ġ( userId Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Sub scribed ( userId ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Nothing Selected ( parent : ĠAdapter View < *> ?) Ġ{} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Toolbar () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= ĠcurrentUser Provider . getCurrent UserId () ĊĠĠĠĠĠĠĠ Ġif Ġ( userId Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Sub scribed ( userId ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . search Category Spinner . on ItemSelected Listener Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġuser ViewModel . subscriptions Contains . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontained Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. invalidate Options Menu () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠ Ġ* ĠSetup Ġthe Ġitem Ġadapter Ġfor Ġa Ġre cycler Ġview . ĊĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsetup Item Adapter (): ĠItems Adapter Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġon View Ġ= Ġ{ Ġitem : ĠItem Ġ-> ĠviewModel . on View Item ( item ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠItems Adapter ( Item Listener ( on View ), Ġrequire Context ()) ĊĠĠĠ Ġ} Ċ Ċ } Ċ