/* ĊĠ ĠCopyright Ġ( c ) Ġ 2 0 2 0 , ĠSur f Studio ĠLLC . ĠO leg ĠZ hi lo ĊĊĠ Ġ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 Ġru . surf studio . android . recycler . decorator Ċ Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . view . View Ċ import Ġandroidx . recyclerview . widget . RecyclerView ĊĊ Ċ object ĠDecor ator Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConst Ġuse Ġwhen Ġdecor Ġmust Ġdraw Ġfor Ġevery ĠViewHolder ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconst Ġval ĠE ACH _ VIEW Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilder Ġfor Ġ[ android x . recyclerview . widget . RecyclerView . Item Decoration ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠBuilder Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠScope Ġof Ġunder lay Ġdec ors Ġfor ĠViewHolder ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġunder lay ViewHolder Scope : ĠMutable List < Decor Drawer < ViewHolder Decor >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠScope Ġof Ġoverlay Ġdec ors Ġfor ĠViewHolder ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġoverlay ViewHolder Scope : ĠMutable List < Decor Drawer < ViewHolder Decor >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠScope Ġof Ġunder lay Ġdec ors Ġfor ĠRecyclerView ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġunder lay Recycler Scope : ĠMutable List < RecyclerView Decor > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠScope Ġof Ġoverlay Ġdec ors Ġfor ĠRecyclerView ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġoverlay Recycler Scope : ĠMutable List < RecyclerView Decor > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠScope Ġof Ġoffsets Ġdec ors Ġfor ĠViewHolder ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġoffsets Scope : ĠMutable List < Decor Drawer < Offset Decor >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd ĠViewHolder Ġdecor Ġfor Ġspecial ĠViewHolder Ġto Ġunder lay ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpair ĠPair Ġof ĠViewHolder 's ĠView Type Ġand Ġ[ ru . surf studio . android . recycler . decorator . base . ViewHolder Decor ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġunder lay ( pair : ĠPair < Int , ĠViewHolder Decor >): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunder lay ViewHolder Scope . add ( Decor Drawer ( pair . first , Ġpair . second )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd ĠViewHolder Ġdecor , Ġfor Ġeach ĠViewHolder Ġunder lay ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdecor Ġ[ ru . surf studio . android . recycler . decorator . base . ViewHolder Decor ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġunder lay ( decor : ĠViewHolder Decor ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunder lay ViewHolder Scope . add ( Decor Drawer ( EACH _ VIEW , Ġdecor )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd ĠRecyclerView Ġdecor Ġunder lay ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdecor Ġ[ ru . surf studio . android . recycler . decorator . base . RecyclerView Decor ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġunder lay ( decor : ĠRecyclerView Decor ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunder lay Recycler Scope . add ( decor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd ĠRecyclerView Ġdecor Ġoverlay ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdecor Ġ[ ru . surf studio . android . recycler . decorator . base . RecyclerView Decor ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġoverlay ( decor : ĠRecyclerView Decor ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay Recycler Scope . add ( decor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd ĠViewHolder Ġdecor Ġfor Ġspecial ĠViewHolder Ġto Ġoverlay ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpair ĠPair Ġof ĠViewHolder 's ĠView Type Ġand Ġ[ ru . surf studio . android . recycler . decorator . base . ViewHolder Decor ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġoverlay ( pair : ĠPair < Int , ĠViewHolder Decor >): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay ViewHolder Scope . add ( Decor Drawer ( pair . first , Ġpair . second )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd ĠViewHolder Ġdecor , Ġfor Ġeach ĠViewHolder Ġto Ġoverlay ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdecor Ġ[ ru . surf studio . android . recycler . decorator . base . ViewHolder Decor ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġoverlay ( decor : ĠViewHolder Decor ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay ViewHolder Scope . add ( Decor Drawer ( EACH _ VIEW , Ġdecor )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd Ġoffset Ġdecor Ġfor Ġspecial ĠViewHolder ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpair ĠPair Ġof ĠViewHolder 's ĠView Type Ġand Ġ[ ru . surf studio . android . recycler . decorator . base . Offset Decor ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġoffset ( pair : ĠPair < Int , ĠOffset Decor >): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffsets Scope . add ( Decor Drawer ( pair . first , Ġpair . second )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdd Ġoffset Ġfor Ġeach ĠViewHolder ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdecor Ġ[ ru . surf studio . android . recycler . decorator . base . Offset Decor ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġoffset ( decor : ĠOffset Decor ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffsets Scope . add ( Decor Drawer ( EACH _ VIEW , Ġdecor )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBuilds Ġthe Ġmain Ġdecorator ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠMaster Decorator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffsets Scope . grouping By Ġ{ Ġit . view ItemType Ġ}. each Count (). all Ġ{ Ġit . value Ġ== Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ" Any ĠViewHolder Ġcan Ġhave Ġonly Ġa Ġsingle ĠOffset Drawer " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMaster Decorator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDec ors Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunder lay ViewHolder Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunder lay Recycler Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay ViewHolder Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay Recycler Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffsets Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInterface Ġfor Ġimplementation Ġown ĠOffset Drawer ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠOffset Decor Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠgetItem Offsets ( out Rect : ĠRect , Ġview : ĠView , Ġre cyclerView : ĠRecyclerView , Ġstate : ĠRecyclerView . State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInterface Ġfor Ġimplementation Ġown ĠRecyclerView Decor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠRecyclerView Decor Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġdraw ( canvas : ĠCanvas , Ġre cyclerView : ĠRecyclerView , Ġstate : ĠRecyclerView . State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInterface Ġfor Ġimplementation Ġown ĠViewHolder Decor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠViewHolder Decor Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġdraw ( canvas : ĠCanvas , Ġview : ĠView , Ġre cyclerView : ĠRecyclerView , Ġstate : ĠRecyclerView . State ) ĊĠĠĠ Ġ} Ċ }