/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 . Ċ Ġ* ĠJo Ã£o ĠP au lo ĠS ena Ġ< jo aop au lo 7 6 1 @ gmail . com > Ċ Ġ* Ċ Ġ* ĠThis Ġfile Ġis Ġpart Ġof Ġthe ĠUN ES ĠOpen ĠSource ĠProject . Ċ Ġ* Ċ Ġ* ĠUN ES Ġis Ġlicensed Ġunder Ġthe ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . for c et ower . ue fs . feature . event Ċ Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . recyclerview . widget . Async List Differ Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . for c et ower . ue fs . R Ċ import Ġcom . for c et ower . ue fs . core . model . service . Event Ċ import Ġcom . for c et ower . ue fs . databinding . Item Event Collapsed Binding Ċ import Ġcom . for c et ower . ue fs . feature . shared . in flater Ċ Ċ class ĠEvent Adapter ( ĊĠĠĠ Ġprivate Ġval Ġlifecycle Owner : ĠLifecycle Owner , ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠEvent ViewModel Ċ ) Ġ: ĠRecyclerView . Adapter < Event ViewHolder >() Ġ{ ĊĠĠĠ Ġvar Ġcurrent Events : ĠList < Event > Ġ= Ġempty List () ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġdiffer . submit List ( build Merged List ( events Ġ= Ġvalue )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdiffer Ġ= ĠAsync List Differ < Any >( this , ĠDiff Callback ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdiffer . submit List ( build Merged List ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠEvent ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= Ġparent . in flater () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( view Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . item _ event _ featured _ header Ġ-> ĠEvent ViewHolder . Feature d Header Holder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinflater . inflate ( view Type , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . item _ event _ common _ header Ġ-> ĠEvent ViewHolder . Common Header Holder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinflater . inflate ( view Type , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . item _ no _ events Ġ-> ĠEvent ViewHolder . No Event Holder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinflater . inflate ( view Type , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . item _ event _ collapsed Ġ-> ĠEvent ViewHolder . Event Holder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem Event Collapsed Binding . inflate ( in flater , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" View Ġwas Ġnot Ġdefined Ġfor Ġtype Ġ$ view Type ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠEvent ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent ViewHolder . Feature d Header Holder Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent ViewHolder . Common Header Holder Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent ViewHolder . No Event Holder Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent ViewHolder . Event Holder Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . event Ġ= Ġdiffer . current List [ position ] Ġas ĠEvent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . set Lifecycle Owner ( lifecycle Owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . listener Ġ= ĠviewModel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . execute Pending Bindings () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count () Ġ= Ġdiffer . current List . size ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( differ . current List [ position ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFeature Header Ġ-> ĠR . layout . item _ event _ featured _ header ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon Header Ġ-> ĠR . layout . item _ event _ common _ header ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNo Events Ġ-> ĠR . layout . item _ no _ events ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEvent Ġ-> ĠR . layout . item _ event _ collapsed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" View Ġtype Ġwas Ġnot Ġspecified Ġat Ġposition Ġ$ position ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Merged List ( ĊĠĠĠĠĠĠĠ Ġevents : ĠList < Event > Ġ= Ġcurrent Events ĊĠĠĠ Ġ): ĠList < Any >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmerged Ġ= Ġmutable ListOf < Any >() ĊĠĠĠĠĠĠĠ Ġif Ġ( events . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfeatured Ġ= Ġevents . filter Ġ{ Ġit . featured Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommon Ġ= Ġevents . filter Ġ{ Ġ! it . featured Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( featured . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerged Ġ+= ĠFeature Header ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerged . addAll ( featured ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( common . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerged Ġ+= ĠCommon Header ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerged . addAll ( common ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerged Ġ+= ĠNo Events ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmerged ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠEvent ViewHolder ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĠĠĠ Ġclass ĠFeature d Header Holder ( view : ĠView ) Ġ: ĠEvent ViewHolder ( view ) ĊĠĠĠ Ġclass ĠCommon Header Holder ( view : ĠView ) Ġ: ĠEvent ViewHolder ( view ) ĊĠĠĠ Ġclass ĠNo Event Holder ( view : ĠView ) Ġ: ĠEvent ViewHolder ( view ) ĊĠĠĠ Ġclass ĠEvent Holder ( val Ġbinding : ĠItem Event Collapsed Binding ) Ġ: ĠEvent ViewHolder ( binding . root ) Ċ } Ċ Ċ private Ġobject ĠDiff Callback Ġ: ĠDiff Util . Item Callback < Any >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠAny , Ġnew Item : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Item Ġ=== ĠFeature Header Ġ&& Ġnew Item Ġ=== ĠFeature Header Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Item Ġ=== ĠCommon Header Ġ&& Ġnew Item Ġ=== ĠCommon Header Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Item Ġ=== ĠNo Events Ġ&& Ġnew Item Ġ=== ĠNo Events Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Item Ġis ĠEvent Ġ&& Ġnew Item Ġis ĠEvent Ġ-> Ġold Item . id Ġ== Ġnew Item . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠAny , Ġnew Item : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Item Ġis ĠEvent Ġ&& Ġnew Item Ġis ĠEvent Ġ-> Ġold Item Ġ== Ġnew Item ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġobject ĠFeature Header Ċ private Ġobject ĠCommon Header Ċ private Ġobject ĠNo Events