/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠA bd ul - M uje eb ĠAli u Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . al ium uj ib . art ic . categories . ui Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . al ium uj ib . art ic . views . models . Category UI Model Ċ import Ġcom . al ium uj ib . art ic . articles . models . Category UI Model Mapper Ċ import Ġcom . al ium uj ib . art ic . categories . databinding . Fragment Categories Binding Ċ import Ġcom . al ium uj ib . art ic . categories . di . Category List Module Ċ import Ġcom . al ium uj ib . art ic . categories . di . D agger Category List Component Ċ import Ġcom . al ium uj ib . art ic . categories . presentation . Category List Intent Ċ import Ġcom . al ium uj ib . art ic . categories . presentation . Category List ViewModel Ċ import Ġcom . al ium uj ib . art ic . categories . presentation . Category ListView State Ċ import Ġcom . al ium uj ib . art ic . categories . ui . adapter . Category ClickListener Ċ import Ġcom . al ium uj ib . art ic . categories . ui . adapter . Category ListAdapter Ċ import Ġcom . al ium uj ib . art ic . mobile _ ui . Application Class Ċ import Ġcom . al ium uj ib . art ic . views . ext .* Ċ import Ġcom . al ium uj ib . art ic . views . m vi . M VI View Ċ import Ġcom . al ium uj ib . art ic . views . recyclerview . List Spacing Item Decorator Ċ import Ġcom . al ium uj ib . art ic . views . cleanup . auto Dispose Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . channels . Con fl ated Broadcast Channel Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġjavax . inject . Inject Ċ Ċ @ Experimental Cor outines Api Ċ class ĠCategory List Fragment Ġ: ĠFragment (), ĠM VI View < Category List Intent , ĠCategory ListView State >, ĠCategory ClickListener Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġcategory ListAdapter : ĠCategory ListAdapter ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar ĠviewModel : ĠCategory List ViewModel ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġcategory UI Model Mapper : ĠCategory UI Model Mapper ĊĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠFragment Categories Binding Ġby Ġauto Dispose () ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding ĊĊĠĠĠ Ġprivate Ġval Ġ_ load Initial Intent Ġ= ĠCon fl ated Broadcast Channel < Category List Intent >() ĊĠĠĠ Ġprivate Ġval Ġload Initial Intent Ġ= Ġ_ load Initial Intent . as Flow (). take ( 1 ) ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠFragment Categories Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ binding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . process Intent ( int ents ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attach ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attach ( context ) ĊĠĠĠĠĠĠĠ Ġinit DependencyInjection () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġinitialize Views () ĊĊĠĠĠĠĠĠĠ Ġnon Null Ob serve ( viewModel . states (), Ġ:: render ) ĊĊĠĠĠĠĠĠĠ Ġ_ load Initial Intent . offer ( Category List Intent . Load Categories List Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlinear LayoutManager Ġ= ĠLinearLayoutManager ( require Context ()) ĊĠĠĠĠĠĠĠ Ġbinding . categories . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove All Decor ations () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Spacing Item Decorator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . dp To Px ( 3 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . dp To Px ( 1 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= Ġlinear LayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġcategory ListAdapter ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġinit DependencyInjection () Ġ{ ĊĠĠĠĠĠĠĠ ĠD agger Category List Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. core Component ( Application Class . core Component ( require Context ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. category List Module ( Category List Module ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. inject ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrender ( state : ĠCategory ListView State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! state . isLoading Ġ&& Ġ( state . error Ġ== Ġnull ) Ġ-> Ġpresent Success State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory UI Model Mapper . map To UI List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . error Ġ!= Ġnull Ġ-> Ġpresent Error State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . isLoading Ġ-> Ġpresent Loading State () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpresent Success State ( data : ĠList < Category UI Model >) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . loading . hide () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( data . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . empty View . hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . error View . hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . categories . show () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . empty View . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . error View . hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . categories . hide () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcategory ListAdapter . submit List ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpresent Error State ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . empty View . hide () ĊĠĠĠĠĠĠĠ Ġbinding . loading . hide () ĊĠĠĠĠĠĠĠ Ġbinding . categories . hide () ĊĠĠĠĠĠĠĠ Ġbinding . error View . show () ĊĠĠĠĠĠĠĠ Ġerror . message ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . error View . setError View Text ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġerror . message , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpresent Loading State () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . loading . show () ĊĠĠĠĠĠĠĠ Ġbinding . categories . hide () ĊĠĠĠĠĠĠĠ Ġbinding . empty View . hide () ĊĠĠĠĠĠĠĠ Ġbinding . error View . hide () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġintent s (): ĠFlow < Category List Intent > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġload Initial Intent . filter Ġ{ Ġcategory ListAdapter . isEmpty () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Category Click ( category UI Model : ĠCategory UI Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( Category List Fragment Directions . action Category List Fragment To Category Details Fragment ( category UI Model )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ binding . categories . adapter Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} Ċ } Ċ