package Ġco . net guru . b aby . monitor . client . common . view Ċ Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ Ċ class ĠSt icky Header Decorator ( ĊĠĠĠ Ġprivate Ġval Ġlistener : ĠSt icky Header Interface Ċ ) Ġ: ĠRecyclerView . Item Decoration () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġsticky Header Height Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw Over ( canvas : ĠCanvas , Ġparent : ĠRecyclerView , Ġstate : ĠRecyclerView . State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw Over ( canvas , Ġparent , Ġstate ) ĊĠĠĠĠĠĠĠ Ġval Ġtop Child Ġ= Ġparent . getChild At ( 0 ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġtop Child Position Ġ= Ġparent . getChild Adapter Position ( top Child ) ĊĠĠĠĠĠĠĠ Ġif Ġ( top Child Position Ġ== ĠRecyclerView . NO _ POSITION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġheader Pos Ġ= Ġlistener . getHeader Position For Item ( top Child Position ) ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Header Ġ= Ġget Header View For Item ( header Pos , Ġparent ) ĊĠĠĠĠĠĠĠ Ġfix Layout Size ( parent , Ġcurrent Header ) ĊĠĠĠĠĠĠĠ Ġval Ġcontact Point Ġ= Ġcurrent Header . bottom ĊĠĠĠĠĠĠĠ Ġval Ġchild In Contact Ġ= Ġget Child In Contact ( parent , Ġcontact Point , Ġheader Pos ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( child In Contact Ġ!= Ġnull Ġ&& Ġis Header ( parent , Ġchild In Contact )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Header ( canvas , Ġcurrent Header , Ġchild In Contact ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmove Header ( canvas , Ġcurrent Header ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Header View For Item ( header Position : ĠInt , Ġparent : ĠRecyclerView ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Res Id Ġ= Ġlistener . getHeader Layout ( header Position ) ĊĠĠĠĠĠĠĠ Ġval Ġheader Ġ= ĠLayoutInflater . from ( parent . context ). inflate ( layout Res Id , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġlistener . bind Header Data ( header , Ġheader Position ) ĊĠĠĠĠĠĠĠ Ġreturn Ġheader ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmove Header ( canvas : ĠCanvas , Ġcurrent Header : ĠView , Ġnext Header : ĠView ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠ Ġcanvas . translate ( 0 f , Ġnext Header ?. let Ġ{ Ġit . top . toFloat () Ġ- Ġcurrent Header . height Ġ} Ġ?: Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġcurrent Header . draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Child In Contact ( ĊĠĠĠĠĠĠĠ Ġparent : ĠRecyclerView , ĊĠĠĠĠĠĠĠ Ġcontact Point : ĠInt , ĊĠĠĠĠĠĠĠ Ġcurrent Header Pos : ĠInt ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġparent . child Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġparent . getChild At ( i ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Tolerance Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Header Pos Ġ!= Ġi Ġ&& Ġis Header ( parent , Ġchild )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsticky Header Height Ġ- Ġchild . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Bottom Position Ġ= Ġif Ġ( child . top Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . bottom Ġ+ Ġheight Tolerance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Bottom Position Ġ> Ġcontact Point Ġ&& Ġchild . top Ġ<= Ġcontact Point ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Header ( ĊĠĠĠĠĠĠĠ Ġparent : ĠRecyclerView , ĊĠĠĠĠĠĠĠ Ġchild In Contact : ĠView ĊĠĠĠ Ġ) Ġ= Ġlistener . is Header ( ĊĠĠĠĠĠĠĠ Ġparent . getChild Adapter Position ( child In Contact ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro per ly Ġmeasures Ġand Ġlayouts Ġthe Ġtop Ġsticky Ġheader . ĊĠĠĠĠ Ġ* Ġ@ param Ġparent ĠViewGroup : ĠRecyclerView Ġin Ġthis Ġcase . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfix Layout Size ( parent : ĠViewGroup , Ġview : ĠView ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠSpec s Ġfor Ġparent Ġ( RecyclerView ) ĊĠĠĠĠĠĠĠ Ġval Ġwidth Spec Ġ= ĠView . Measure Spec . make Measure Spec ( parent . width , ĠView . Measure Spec . EX ACT LY ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Spec Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView . Measure Spec . make Measure Spec ( parent . height , ĠView . Measure Spec . UNSPECIFIED ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSpec s Ġfor Ġchildren Ġ( headers ) ĊĠĠĠĠĠĠĠ Ġval Ġchild Width Spec Ġ= ĠViewGroup . getChild Measure Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Spec , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . padding Left Ġ+ Ġparent . padding Right , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . layout Params . width ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġchild Height Spec Ġ= ĠViewGroup . getChild Measure Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Spec , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . padding Top Ġ+ Ġparent . padding Bottom , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . layout Params . height ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġview . measure ( child Width Spec , Ġchild Height Spec ) ĊĠĠĠĠĠĠĠ Ġsticky Header Height Ġ= Ġview . meas ured Height ĊĠĠĠĠĠĠĠ Ġview . layout ( 0 , Ġ 0 , Ġview . meas ured Width , Ġsticky Header Height ) ĊĠĠĠ Ġ} Ċ } Ċ