package Ġxyz . s ang com z . sticky timeline view . decoration Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . graphics . Type face Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . graphics . drawable . Gradient Drawable Ċ import Ġandroid . view . View Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġxyz . s ang com z . sticky timeline view . Time Line RecyclerView . Companion . MODE _ TO _ DOT Ċ import Ġxyz . s ang com z . sticky timeline view . Time Line RecyclerView . Companion . MODE _ TO _ TIME _ LINE Ċ import Ġxyz . s ang com z . sticky timeline view . callback . Section Callback Ċ import Ġxyz . s ang com z . sticky timeline view . ext . DP Ċ import Ġxyz . s ang com z . sticky timeline view . model . RecyclerView Attr Ċ import Ġxyz . s ang com z . sticky timeline view . model . Section Info Ċ Ċ class ĠHorizontal Section Item Decoration ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġsection Callback : ĠSection Callback , ĊĠĠĠ Ġprivate Ġval Ġre cyclerView Attr : ĠRecyclerView Attr Ċ ) Ġ: ĠRecyclerView . Item Decoration () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġdefault Offset : ĠInt Ġ= Ġ 8 . DP ( context ). toInt () ĊĊĠĠĠ Ġprivate Ġval Ġheader Section Background Paint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcolor Ġ= Ġre cyclerView Attr . section BackgroundColor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġline Paint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcolor Ġ= Ġre cyclerView Attr . section Line Color ĊĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġre cyclerView Attr . section LineWidth ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġheader Title Paint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtext Size Ġ= Ġre cyclerView Attr . section Title Text Size ĊĠĠĠĠĠĠĠ Ġcolor Ġ= Ġre cyclerView Attr . section Title TextColor ĊĠĠĠĠĠĠĠ Ġtype face Ġ= ĠType face . create ( FONT _ FAMILY , ĠType face . BOLD ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġheader Sub Title Paint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtext Size Ġ= Ġre cyclerView Attr . section Sub Title Text Size ĊĠĠĠĠĠĠĠ Ġcolor Ġ= Ġre cyclerView Attr . section Sub Title TextColor ĊĠĠĠĠĠĠĠ Ġtype face Ġ= ĠType face . create ( FONT _ FAMILY , ĠType face . NORMAL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Offsets ( ĊĠĠĠĠĠĠĠ Ġout Rect : ĠRect , ĊĠĠĠĠĠĠĠ Ġview : ĠView , ĊĠĠĠĠĠĠĠ Ġparent : ĠRecyclerView , ĊĠĠĠĠĠĠĠ Ġstate : ĠRecyclerView . State ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . getItem Offsets ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġout Rect . top Ġ= Ġget Top Space (). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġleft Margin Ġ= Ġdefault Offset ĊĠĠĠĠĠĠĠ Ġval Ġright Margin Ġ= Ġdefault Offset ĊĊĠĠĠĠĠĠĠ Ġout Rect . bottom Ġ= Ġdefault Offset Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġout Rect . left Ġ= Ġleft Margin ĊĠĠĠĠĠĠĠ Ġout Rect . right Ġ= Ġright Margin ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Draw Over ( canvas : ĠCanvas , Ġparent : ĠRecyclerView , Ġstate : ĠRecyclerView . State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw Over ( canvas , Ġparent , Ġstate ) ĊĊĠĠĠĠĠĠĠ Ġdraw Background ( canvas , Ġparent ) ĊĠĠĠĠĠĠĠ Ġdraw Line ( canvas , Ġparent ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġprevious Header : ĠSection Info ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( re cyclerView Attr . is Sticky ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Child Ġ= Ġparent . getChild At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Header Section Info Ġ= ĠgetCurrent Top Section Info ( parent ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Header Width Ġ= ĠgetCurrent Header View Width ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Header View Ġ= ĠgetNext Header View ( parent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Contact Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Header View ?. left Ġin Ġ 0 .. current Header Width . toInt () Ġ+ Ġdefault Offset Ġ* Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Left Offset Ġ= Ġ-( top Child . left ). toFloat () Ġ+ Ġdefault Offset ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Header Ġ= Ġtop Header Section Info ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Contact ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġcurrent Header Width Ġ- Ġ(( next Header View ?. left Ġ?: Ġ 0 ) Ġ- Ġdefault Offset Ġ* Ġ 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Header ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Child , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Header Section Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Left Offset Ġ- Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Header ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Child , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Header Section Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Left Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġparent . child Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġparent . getChild At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġparent . getChild Adapter Position ( child ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsection Callback . get Section Header ( position )?. let Ġ{ Ġsection Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( previous Header ?. title Ġ!= Ġsection Info . title ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getIs Section ( position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Header ( canvas , Ġchild , Ġsection Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Header Ġ= Ġsection Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġa Ġline Ġin Ġthe Ġtimeline . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdraw Line ( canvas : ĠCanvas , Ġparent : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġy Value Ġ= Ġget Top Space () Ġ- Ġ( default Offset Ġ* Ġ 2 ) Ġ- Ġ( default Offset Ġ/ Ġ 4 ) ĊĊĠĠĠĠĠĠĠ Ġcanvas . draw Lines ( float ArrayOf ( 0 f , Ġy Value , Ġparent . width . toFloat (), Ġy Value ), Ġline Paint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Background ( canvas : ĠCanvas , Ġparent : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbottom Ġ= Ġget Top Space () Ġ- Ġdefault Offset ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( re cyclerView Attr . section BackgroundColor Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMODE _ TO _ DOT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ-= Ġ( default Offset Ġ* Ġ 2 Ġ+ Ġdefault Offset Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMODE _ TO _ TIME _ LINE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ-= Ġif Ġ( re cyclerView Attr . section LineWidth Ġ> Ġdefault Offset Ġ* Ġ 2 Ġ+ Ġdefault Offset Ġ/ Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Attr . section LineWidth Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( default Offset Ġ+ Ġdefault Offset Ġ/ Ġ 4 ) Ġ- Ġ( re cyclerView Attr . section LineWidth Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠRect ( parent . left , Ġ 0 , Ġparent . width , Ġbottom . toInt ()) ĊĊĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect , Ġheader Section Background Paint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġo val Ġdot Drawable Ġof Ġthe Ġtimeline . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget O val Drawable (): ĠDrawable Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstrokeWidth Ġ= Ġdefault Offset Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġround Radius Ġ= Ġdefault Offset Ġ* Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġstroke Color Ġ= Ġre cyclerView Attr . section Dot Stroke Color ĊĠĠĠĠĠĠĠ Ġval Ġfill Color Ġ= Ġre cyclerView Attr . section Dot Color ĊĊĠĠĠĠĠĠĠ Ġval Ġgd Ġ= ĠGradient Drawable () ĊĠĠĠĠĠĠĠ Ġgd . setColor ( fill Color ) ĊĠĠĠĠĠĠĠ Ġgd . corner Radius Ġ= Ġround Radius . toFloat () ĊĠĠĠĠĠĠĠ Ġgd . set Stroke ( stroke Width , Ġstroke Color ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġgd ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġa Ġheader ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdraw Header ( c : ĠCanvas , Ġchild : ĠView , Ġsection Info : ĠSection Info , Ġoffset : ĠFloat Ġ= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠ Ġc . save () ĊĠĠĠĠĠĠĠ Ġc . translate (( child . left ). toFloat () Ġ+ Ġoffset , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġdraw Dot Drawable ( c , Ġsection Info ) ĊĠĠĠĠĠĠĠ Ġdraw Header Title ( c , Ġsection Info ) ĊĠĠĠĠĠĠĠ Ġdraw Header Sub Title ( c , Ġsection Info ) ĊĠĠĠĠĠĠĠ Ġc . restore () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Dot Drawable ( canvas : ĠCanvas , Ġsection Info : ĠSection Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdot Drawable Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsection Info . dot Drawable Ġ?: Ġre cyclerView Attr . custom Dot Drawable Ġ?: Ġget O val Drawable () ĊĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠ Ġcanvas . translate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Attr . section Title Text Size Ġ+ Ġre cyclerView Attr . section Sub Title Text Size Ġ+ Ġdefault Offset ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdot Drawable . draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Header Title ( canvas : ĠCanvas , Ġsection Info : ĠSection Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsub Title Height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( section Info . sub Title . isNull OrEmpty ()) Ġre cyclerView Attr . section Sub Title Text Size Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠ Ġcanvas . draw Text ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsection Info . title , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Attr . section Title Text Size Ġ- Ġsub Title Height , Ġheader Title Paint ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Header Sub Title ( canvas : ĠCanvas , Ġsection Info : ĠSection Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsub Title Ġ= Ġsection Info . sub Title Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġcanvas . draw Text ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Attr . section Title Text Size Ġ+ Ġre cyclerView Attr . section Sub Title Text Size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Sub Title Paint ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetCurrent Header View Width ( parent : ĠRecyclerView ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprev Header Section Info Ġ= ĠgetCurrent Top Section Info ( parent ) Ġ?: Ġreturn Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġval Ġtitle Width Ġ= Ġheader Title Paint . measure Text ( prev Header Section Info . title ) ĊĠĠĠĠĠĠĠ Ġval Ġsub Title Width Ġ= Ġheader Sub Title Paint . measure Text ( prev Header Section Info . sub Title Ġ?: Ġ"") ĊĠĠĠĠĠĠĠ Ġreturn Ġtitle Width . coerce At Least ( sub Title Width ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Is Section ( position : ĠInt ): ĠBoolean Ġ= Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ- 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsection Callback . is Section ( position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Top Space (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġre cyclerView Attr . section Title Text Size Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Attr . section Sub Title Text Size Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( default Offset Ġ* Ġ 4 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( default Offset Ġ/ Ġ 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetCurrent Top Section Info ( parent : ĠRecyclerView ): ĠSection Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġparent . getChild At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġsection Callback . get Section Header ( parent . getChild Adapter Position ( it )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetNext Header View ( parent : ĠRecyclerView ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Top Section Info Ġ= ĠgetCurrent Top Section Info ( parent ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( 0 Ġuntil Ġparent . child Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . getChild At ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsection Callback . get Section Header ( parent . getChild Adapter Position ( it )) Ġ!= Ġcurrent Top Section Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Dot Radius () Ġ= Ġdefault Offset Ġ+ Ġdefault Offset Ġ/ Ġ 4 ĊĊĊĠĠĠ Ġprivate Ġfun Ġis Line Big ger Then Dot (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġre cyclerView Attr . section LineWidth Ġ> Ġ( get Dot Radius () Ġ* Ġ 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠF ONT _ FAMILY Ġ= Ġ" sans - serif - light " ĊĠĠĠ Ġ} Ċ }