package Ġcom . g scan lon 2 1 . reversed ictionary . ui . search Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . android . vol ley . Network Error Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . g scan lon 2 1 . reversed ictionary . R Ċ import Ġcom . g scan lon 2 1 . reversed ictionary . adapter . search . SearchResult Adapter Ċ import Ġcom . g scan lon 2 1 . reversed ictionary . core . repository . Api Type Ċ import Ġcom . g scan lon 2 1 . reversed ictionary . core . repository . View Resource Ċ import Ġcom . g scan lon 2 1 . reversed ictionary . core . search . SearchResult Item Ċ import Ġcom . g scan lon 2 1 . reversed ictionary . core . ui . Ui View Ċ import Ġcom . g scan lon 2 1 . reversed ictionary . databinding . Fragment SearchResult Binding Ċ import Ġcom . g scan lon 2 1 . reversed ictionary . databinding . Recycler E lev ated Binding Ċ import Ġcom . g scan lon 2 1 . reversed ictionary . utility . Injector Util Ċ import Ġcom . g scan lon 2 1 . reversed ictionary . vm . Main ViewModel Ċ import Ġcom . g scan lon 2 1 . reversed ictionary . vm . search . Search Term ViewModel Ċ import Ġcom . g scan lon 2 1 . reversed ictionary . vm . search . Search ViewModel Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . launch Ċ Ċ @ Experimental Cor outines Api Ċ class ĠSearch Result Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsearch Result Adapter : ĠSearch Result Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cycler Binding : ĠRe cycler E lev ated Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment SearchResult Binding ĊĊĠĠĠ Ġprivate Ġval Ġsearch Term ViewModel : ĠSearch Term ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠ Ġprivate Ġval Ġmain ViewModel : ĠMain ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠ Ġprivate Ġval Ġsearch ViewModel : ĠSearch ViewModel Ġby Ġview Models Ġ{ ĊĠĠĠĠĠĠĠ ĠInject or Util . provide Search ViewModel Factory ( require Activity (). application ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġui View : ĠUi View Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠUi View . valueOf ( arguments ?. getString ( EXTRA _ TYPE ) Ġ?: ĠUi View . None . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment SearchResult Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġre cycler Binding Ġ= ĠRe cycler E lev ated Binding . bind ( binding . root ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ui View Ġ== ĠUi View . None ) Ġ{ Ġreturn Ġbinding . root Ġ} ĊĊĠĠĠĠĠĠĠ Ġre cycler Binding . recycler E lev ated . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= ĠSearch Result Adapter ( search ViewModel . results ). also Ġ{ Ġsearch Result Adapter Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ui View Ġ== ĠUi View . SearchResult . An agram ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch ViewModel . find An agrams ( search Term ViewModel . search Word . value !! ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserve ( view Lifecycle Owner , Ġresource Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserve ( view Lifecycle Owner , Ġsearch Result Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Type . values (). single OrNull Ġ{ Ġit . name Ġ== Ġui View . name Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch ViewModel . result List ( it , Ġsearch Term ViewModel . search Word . value !! ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserve ( view Lifecycle Owner , Ġresource Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserve ( view Lifecycle Owner , Ġsearch Result Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsearch Result Observer Ġ= ĠObserver < View Resource < List < SearchResult Item >? >> Ġ{ Ġresource Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( resource ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! is ĠView Resource . WithData . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain ViewModel . loading Jobs [ ui View ]?. complete ( resource ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġresource Observer Ġ= ĠObserver < View Resource < List < SearchResult Item >? >> Ġ{ Ġresource Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġfragment Ġwas Ġre created Ġand Ġview Ġmodel Ġstill Ġhas Ġdata , Ġskip Ġloading Ġresults ĊĠĠĠĠĠĠĠ Ġif Ġ( resource Ġis ĠView Resource . WithData . Loading Ġ&& Ġsearch ViewModel . results . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Observer ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġwhen Ġ( resource ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠView Resource . WithData . Success Ġ-> ĠonSuccess ( resource ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠView Resource . WithData . Loading Ġ-> Ġon Loading ( resource ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠView Resource . Error Ġ-> ĠonError ( resource ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( main ViewModel . view Pager Scrolling . value Ġ!= Ġtrue Ġ|| Ġresource Ġ! is ĠView Resource . WithData . Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Results ( results ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay Results While ViewPager Scrolling ( results ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Results ( results : ĠList < SearchResult Item >) Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch ViewModel . results . clear () ĊĠĠĠĠĠĠĠ Ġsearch ViewModel . results . addAll ( results ) ĊĠĠĠĠĠĠĠ Ġsearch Result Adapter . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonSuccess ( resource : ĠView Resource . WithData . Success < List < SearchResult Item > ?> ): ĠList < SearchResult Item > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresource . data Ġ?: ĠlistOf ( SearchResult Item ( getString ( R . string . placeholder _ success ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Loading ( resource : ĠView Resource . WithData . Loading < List < SearchResult Item > ?> ): ĠList < SearchResult Item > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresource . data Ġ?: ĠlistOf ( SearchResult Item ( getString ( R . string . placeholder _ loading ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonError ( resource : ĠView Resource . Error ): ĠList < SearchResult Item > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resource . exception Ġis ĠNetwork Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( require View (), ĠgetString ( R . string . error _ network _ disconnected ), ĠSn ackbar . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( SearchResult Item ( getString ( R . string . placeholder _ error ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelay Results While ViewPager Scrolling ( results : ĠList < SearchResult Item >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmain ViewModel . view Pager Scrolling . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠObserver < Boolean > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( t : ĠBoolean ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Results ( results ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain ViewModel . view Pager Scrolling . remove Observer ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ TYPE Ġ= Ġ" EXTRA _ TYPE " ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( type : ĠUi View ): ĠSearch Result Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSearch Result Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( EXTRA _ TYPE , Ġtype . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ