package Ġcom . jon as wan ke . calendar Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . text . format . Date Utils Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Context Theme Wrapper Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . annotation . Attr Res Ċ import Ġandroidx . annotation . Style Res Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . content . with Styled Attributes Ċ import Ġandroidx . core . view . children Ċ import Ġandroidx . core . view . get Ċ import Ġcom . jon as wan ke . calendar . Range View . Companion . show As All Day Ċ import Ġcom . jon as wan ke . calendar . utils . DAY _ IN _ HOUR S Ċ import Ġcom . jon as wan ke . calendar . utils . Day Ċ import Ġcom . jon as wan ke . calendar . utils . time OfDay Ċ import Ġcom . jon as wan ke . calendar . utils . to Calendar Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . util .* Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ /** Ċ Ġ* ĠTODO : Ġdocument Ġyour Ġcustom Ġview Ġclass . Ċ Ġ*/ Ċ @ Suppress (" Large Class ", Ġ" Too Many Functions ") Ċ class ĠDay Events View Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġ@ Attr Res Ġprivate Ġval Ġdef Style Attr : ĠInt Ġ= ĠR . attr . day Events View Style , ĊĠĠĠ Ġ@ Style Res Ġprivate Ġval Ġdef Style Res : ĠInt Ġ= ĠR . style . Calendar _ Day Events View Style , ĊĠĠĠ Ġ_ day : ĠDay ? Ġ= Ġnull Ċ ) Ġ: ĠViewGroup ( Context Theme Wrapper ( context , Ġdef Style Res ), Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEVENT _ POSITION ING _ DE BOUN CE Ġ= Ġ 5 0 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠCor outine Scope ( Job () Ġ+ ĠDispatch ers . Main ) ĊĊĠĠĠ Ġprivate Ġvar Ġ_ on Event ClickListener : Ġ(( Event ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġvar Ġon Event ClickListener : Ġ(( Event ) Ġ-> ĠUnit )? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ on Event ClickListener ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ on Event ClickListener Ġ== Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ on Event ClickListener Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Listeners () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġ_ on Event Long ClickListener : Ġ(( Event ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġvar Ġon Event Long ClickListener : Ġ(( Event ) Ġ-> ĠUnit )? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ on Event Long ClickListener ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ on Event Long ClickListener Ġ== Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ on Event Long ClickListener Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Listeners () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġinternal Ġvar Ġon Add Event View Listener : Ġ(( Add Event ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġ_ on Add EventListener : Ġ(( Add Event ) Ġ-> ĠBoolean )? Ġ= Ġnull ĊĠĠĠ Ġvar Ġon Add EventListener : Ġ(( Add Event ) Ġ-> ĠBoolean )? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ on Add EventListener ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Add Event () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ on Add EventListener Ġ== Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ on Add EventListener Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Listeners () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġday : ĠDay Ġ= Ġ_ day Ġ?: ĠDay () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġvar Ġevents : ĠList < Event > Ġ= Ġempty List () ĊĠĠĠ Ġprivate Ġval Ġevent Data : ĠMutable Map < Event , ĠEvent Data > Ġ= Ġmutable Map Of () ĊĠĠĠ Ġprivate Ġvar Ġadd Event View : ĠEvent View ? Ġ= Ġnull ĊĊĊĠĠĠ Ġprivate Ġvar Ġtime Circle Radius : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtime Line Size : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtime Paint : ĠPaint ĊĊĠĠĠ Ġprivate Ġvar Ġ_ hour Height : ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġhour Height : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ hour Height ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġvalue . coerce In ( if Ġ( hour Height Min Ġ> Ġ 0 ) Ġhour Height Min Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hour Height Max Ġ> Ġ 0 ) Ġhour Height Max Ġelse Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ hour Height Ġ== Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ hour Height Ġ= Ġv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Position Events And Layout () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġhour Height Min : ĠFloat Ġby ĠDeleg ates . observable ( 0 f ) Ġ{ Ġ_, Ġ_, Ġnew Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( new Ġ> Ġ 0 Ġ&& Ġhour Height Ġ< Ġnew ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhour Height Ġ= Ġnew ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġhour Height Max : ĠFloat Ġby ĠDeleg ates . observable ( 0 f ) Ġ{ Ġ_, Ġ_, Ġnew Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( new Ġ> Ġ 0 Ġ&& Ġhour Height Ġ> Ġnew ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhour Height Ġ= Ġnew ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġevent Position Required : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġevent Position Job : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġdivider Padding : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġevent Spacing : ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġevent Stack Overlap : ĠFloat Ġ= Ġ 0 f ĊĊĠĠĠ Ġinternal Ġvar Ġdivider Ġby ĠDeleg ates . observable < Drawable ? >( null ) Ġ{ Ġ_, Ġ_, Ġnew Ġ-> ĊĠĠĠĠĠĠĠ Ġdivider Height Ġ= Ġnew ?. intrinsic Height Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġvar Ġdivider Height : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval Ġcal : ĠCalendar ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġset Will Not Draw ( false ) ĊĊĠĠĠĠĠĠĠ Ġcontext . with Styled Attributes ( attrs , ĠR . style able . Day Events View , Ġdef Style Attr , Ġdef Style Res ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ hour Height Ġ= Ġget Dimension ( R . style able . Day Events View _ hour Height , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhour Height Min Ġ= Ġget Dimension ( R . style able . Day Events View _ hour Height Min , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhour Height Max Ġ= Ġget Dimension ( R . style able . Day Events View _ hour Height Max , Ġ 0 f ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdivider Padding Ġ= Ġget Dimension Pixel Offset ( R . style able . Day Events View _ divider Padding , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Spacing Ġ= Ġget Dimension ( R . style able . Day Events View _ event Spacing , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stack Overlap Ġ= Ġget Dimension ( R . style able . Day Events View _ event Stack Overlap , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠonUpdate Day ( day ) ĊĠĠĠĠĠĠĠ Ġcal Ġ= Ġday . start . to Calendar () ĊĊĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdivider Ġ= ĠContext Compat . get Drawable ( context , Ġandroid . R . drawable . divider _ horizontal _ bright ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġset On Touch Listener Ġ{ Ġ_, Ġmotion Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( on Add EventListener Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Touch Listener Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( motion Event . action Ġ== ĠMotion Event . ACTION _ UP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġhour To Time ( hour : ĠInt ) Ġ= Ġday . start Ġ+ Ġhour Ġ* ĠDate Utils . HOUR _ IN _ M ILL IS ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhour Ġ= Ġ( motion Event . y Ġ/ Ġhour Height ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠAdd Event ( hour To Time ( hour ), Ġhour To Time ( hour Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Data [ event ] Ġ= ĠEvent Data (( hour Ġ* ĠDate Utils . HOUR _ IN _ M ILL IS ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( hour Ġ+ Ġ 1 ) Ġ* ĠDate Utils . HOUR _ IN _ M ILL IS ). toInt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġadd Event View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( Event View ( context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Style Attr Ġ= ĠR . attr . event View Add Style , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Style Res Ġ= ĠR . style . Calendar _ Event View Style _ Add , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ event Ġ= Ġevent ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( on Add EventListener ?. invoke ( event ) Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Add Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . event Ġ= Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Add Event View Listener ?. invoke ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Touch Listener Ġmotion Event . action Ġin ĠlistOf ( Motion Event . ACTION _ DOWN , ĠMotion Event . ACTION _ UP ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠView ĊĠĠĠ Ġoverride Ġfun Ġadd View ( child : ĠView ?, Ġindex : ĠInt , Ġparams : ĠLayout Params ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( child Ġ! is ĠEvent View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Only ĠEvent Views Ġmay Ġbe Ġchildren Ġof ĠDay Events View ") ĊĠĠĠĠĠĠĠ Ġif Ġ( child . event Ġis ĠAdd Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add Event View Ġ!= Ġnull Ġ&& Ġadd Event View Ġ!= Ġchild ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġ ĠIllegalStateException (" Day Events View Ġmay Ġonly Ġcontain Ġone Ġadd - Event View ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Event View Ġ= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Add Event View Listener ?. invoke ( child . event Ġas ĠAdd Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . addView ( child , Ġindex , Ġparams ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġpadding Top Ġ+ Ġpadding Bottom Ġ+ Ġmax ( suggest ed Minimum Height , Ġ(_ hour Height Ġ* ĠDAY _ IN _ HOUR S ). toInt ()) ĊĠĠĠĠĠĠĠ Ġset Measured Dimension ( View . getDefault Size ( suggest ed Minimum Width , Ġwidth Measure Spec ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġl : ĠInt , Ġt : ĠInt , Ġr : ĠInt , Ġb : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġpadding Left ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġpadding Top ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġr Ġ- Ġl Ġ- Ġpadding Right ĊĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġb Ġ- Ġt Ġ- Ġpadding Bottom ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġbottom Ġ- Ġtop ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġright Ġ- Ġleft ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Pos For Time ( time : ĠLong ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ< Ġday . start Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ>= Ġday . end Ġ-> Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ( height Ġ* Ġcal . apply Ġ{ Ġtime In Millis Ġ= Ġtime Ġ}. time OfDay Ġ/ ĠDate Utils . DAY _ IN _ M ILL IS ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( view Ġin Ġchildren ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent View Ġ= Ġview Ġas ĠEvent View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġevent View . event Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġevent Data [ event ] Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Top Ġ= Ġmin ( top Ġ+ Ġget Pos For Time ( event . start ), Ġbottom Ġ- Ġevent View . min Height ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFix Ġif Ġevent Ġends Ġon Ġnext Ġday ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Bottom Ġ= Ġif Ġ( event . end Ġ>= Ġday . next Day . start ) Ġbottom . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġmax ( top Ġ+ Ġget Pos For Time ( event . end ) Ġ- Ġevent Spacing , Ġevent Top Ġ+ Ġevent View . min Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Group Width Ġ= Ġwidth Ġ/ Ġdata . parallel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Group Left Ġ= Ġleft Ġ+ Ġsub Group Width Ġ* Ġdata . index Ġ+ Ġevent Spacing ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent View . layout (( sub Group Left Ġ+ Ġdata . sub Index Ġ* Ġevent Spacing ). toInt (), Ġevent Top . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( sub Group Left Ġ+ Ġsub Group Width Ġ- Ġevent Spacing ). toInt (), Ġevent Bottom . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdraw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġif Ġ( canvas Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġ( divider Padding Ġ- Ġtime Circle Radius ). coerce At Least ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġpadding Top ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġwidth Ġ- Ġpadding Right ĊĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġheight Ġ- Ġpadding Bottom ĊĊĠĠĠĠĠĠĠ Ġif Ġ( day . is Today ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠCalendar . getInstance (). time OfDay ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Y Ġ= Ġtop Ġ+ Ġ( bottom . toFloat () Ġ- Ġtop ) Ġ* Ġtime Ġ/ ĠDate Utils . DAY _ IN _ M ILL IS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( left . toFloat (), Ġpos Y , Ġtime Circle Radius . toFloat (), Ġtime Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( left . toFloat (), Ġpos Y Ġ- Ġtime Line Size Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright . toFloat (), Ġpos Y Ġ+ Ġtime Line Size Ġ/ Ġ 2 , Ġtime Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġif Ġ( canvas Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġdivider Padding ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġpadding Top ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġwidth Ġ- Ġdivider Padding ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( hour Ġin Ġ 1 Ġuntil ĠDAY _ IN _ HOUR S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdivider ?. setBounds ( left , Ġ( top Ġ+ Ġ_ hour Height Ġ* Ġhour ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright , Ġ( top Ġ+ Ġ_ hour Height Ġ* Ġhour Ġ+ Ġdivider Height ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdivider ?. draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠCustom ĊĠĠĠ Ġfun Ġset Day ( day : ĠDay , Ġevents : ĠList < Event > Ġ= Ġempty List ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . day Ġ= Ġday ĊĠĠĠĠĠĠĠ ĠonUpdate Day ( day ) ĊĊĠĠĠĠĠĠĠ Ġremove Add Event () ĊĠĠĠĠĠĠĠ Ġset Events ( events ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Events ( events : ĠList < Event >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Events ( events ) ĊĊĠĠĠĠĠĠĠ Ġre generate Base EventData ( events ) ĊĠĠĠĠĠĠĠ Ġthis . events Ġ= Ġevents . sorted With ( compare By ({ Ġevent Data [ it ]?. start Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ-( event Data [ it ]?. end Ġ?: ĠInt . MIN _ VALUE ) Ġ})) ĊĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" NAME _ SH ADO WING ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġthis @ Day Events View . events ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Events () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add Event View Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove View ( add Event View ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġchild Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġevents . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġevents [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Ġ> Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this @ Day Events View [ i ] Ġas ĠEvent View ). event Ġ= Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( Event View ( this @ Day Events View . context ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . event Ġ= Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( events . size Ġ< Ġexisting ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Views ( events . size , Ġexisting Ġ- Ġevents . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add Event View Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( add Event View ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Add Event () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Event View ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove View ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Event View Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Listeners ( ĊĠĠĠĠĠĠĠ Ġon Event ClickListener : Ġ(( Event ) Ġ-> ĠUnit )? , ĊĠĠĠĠĠĠĠ Ġon Event Long ClickListener : Ġ(( Event ) Ġ-> ĠUnit )? , ĊĠĠĠĠĠĠĠ Ġon Add EventListener : Ġ(( Add Event ) Ġ-> ĠBoolean )? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ on Event ClickListener Ġ= Ġon Event ClickListener ĊĠĠĠĠĠĠĠ Ġ_ on Event Long ClickListener Ġ= Ġon Event Long ClickListener ĊĠĠĠĠĠĠĠ Ġ_ on Add EventListener Ġ= Ġon Add EventListener ĊĠĠĠĠĠĠĠ Ġupdate Listeners () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġset Listeners ( ĊĠĠĠĠĠĠĠ Ġon Event ClickListener : Ġ(( Event ) Ġ-> ĠUnit )? , ĊĠĠĠĠĠĠĠ Ġon Event Long ClickListener : Ġ(( Event ) Ġ-> ĠUnit )? , ĊĠĠĠĠĠĠĠ Ġon Add Event View Listener : Ġ(( Add Event ) Ġ-> ĠUnit )? , ĊĠĠĠĠĠĠĠ Ġon Add EventListener : Ġ(( Add Event ) Ġ-> ĠBoolean )? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ on Event ClickListener Ġ= Ġon Event ClickListener ĊĠĠĠĠĠĠĠ Ġ_ on Event Long ClickListener Ġ= Ġon Event Long ClickListener ĊĠĠĠĠĠĠĠ Ġthis . on Add Event View Listener Ġ= Ġon Add Event View Listener ĊĠĠĠĠĠĠĠ Ġ_ on Add EventListener Ġ= Ġon Add EventListener ĊĠĠĠĠĠĠĠ Ġupdate Listeners () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠHelpers ĊĠĠĠ Ġprivate Ġfun Ġre generate Base EventData ( events : ĠList < Event >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġif Ġ( child Count Ġ> Ġ 0 ) Ġ( this [ 0 ] Ġas ĠEvent View ) Ġelse ĠEvent View ( context ) ĊĠĠĠĠĠĠĠ Ġval Ġmin Length Ġ= Ġ( view . min Height Ġ/ Ġhour Height Ġ* ĠDate Utils . HOUR _ IN _ M ILL IS ). to Long () ĊĊĠĠĠĠĠĠĠ Ġevent Data . clear () ĊĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġevents Ġ+ Ġadd Event View ?. event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġ( event . start Ġ- Ġday . start ). coerce In ( 0 , ĠDate Utils . DAY _ IN _ M ILL IS Ġ- Ġmin Length ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Data [ event ] Ġ= ĠEvent Data ( start , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( event . end Ġ- Ġday . start ). coerce In ( start Ġ+ Ġmin Length , ĠDate Utils . DAY _ IN _ M ILL IS ). toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Complex Method ", Ġ" Nested Block Depth ") ĊĠĠĠ Ġprivate Ġfun Ġposition Events () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġif Ġ( child Count Ġ> Ġ 0 ) Ġ( this [ 0 ] Ġas ĠEvent View ) Ġelse ĠEvent View ( context ) ĊĠĠĠĠĠĠĠ Ġval Ġmin Length Ġ= Ġ( view . min Height Ġ/ Ġhour Height Ġ* ĠDate Utils . HOUR _ IN _ M ILL IS ). to Long () ĊĠĠĠĠĠĠĠ Ġval Ġspacing Ġ= Ġevent Spacing Ġ/ Ġhour Height Ġ* ĠDate Utils . HOUR _ IN _ M ILL IS ĊĠĠĠĠĠĠĠ Ġval Ġstack Overlap Ġ= Ġevent Stack Overlap Ġ/ Ġhour Height Ġ* ĠDate Utils . HOUR _ IN _ M ILL IS ĊĊĠĠĠĠĠĠĠ Ġre generate Base EventData ( events ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġend Of No Spacing ( event : ĠEvent ) Ġ= Ġ( event . end Ġ- Ġday . start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. coerce In (( event Data [ event ]?. start Ġ?: Ġ 0 ) Ġ+ Ġmin Length Ġ- Ġspacing . to Long (), ĠDate Utils . DAY _ IN _ M ILL IS ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Group Ġ= Ġmutable ListOf < Event >() ĊĠĠĠĠĠĠĠ Ġfun Ġend Group () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( current Group . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġmutable ListOf < Mutable List < Event >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġcurrent Group ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġevent Data [ event ] Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmin Index Ġ= ĠInt . MIN _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmin Sub Index Ġ= ĠInt . MAX _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmin Top Ġ= ĠInt . MAX _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmin Is Stack ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġcolumns . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn Ġ= Ġcolumns [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( sub Index Ġin Ġcolumn . indices . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Ġ= Ġcolumn [ sub Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Data Ġ= Ġevent Data [ other ] Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġspace Ġin Ġcurrent Ġsub group ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Data . start Ġ+ Ġstack Overlap Ġ> Ġdata . start Ġ&& Ġend Of No Spacing ( other ) Ġ>= Ġdata . start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStack ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( top , Ġis Stack ing ) Ġ= Ġif Ġ( other Data . start Ġ+ Ġstack Overlap Ġ<= Ġdata . start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġend Of No Spacing ( other ) Ġ>= Ġdata . start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( other Data . start Ġ+ Ġstack Overlap ). toInt () Ġto Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBelow Ġother ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( other Data . end Ġ<= Ġdata . start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Data . end Ġto Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠToo Ġclose ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠW ider Ġand Ġfurther Ġat Ġthe Ġtop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( min Sub Index Ġ>= Ġsub Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Index Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Sub Index Ġ= Ġsub Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Top Ġ= Ġtop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Is Stack ing Ġ= Ġis Stack ing ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Data . end Ġ>= Ġdata . start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġno Ġcolumn Ġfits ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( min Top Ġ== ĠInt . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Data [ event ]?. index Ġ= Ġcolumns . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns . add ( mutable ListOf ( event )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Index Ġ= Ġif Ġ( min Is Stack ing ) Ġmin Sub Index Ġ+ Ġ 1 Ġelse Ġmin Sub Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Data [ event ]?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . index Ġ= Ġmin Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . sub Index Ġ= Ġsub Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn Ġ= Ġcolumns [ min Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column . size Ġ> Ġsub Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn [ sub Index ] Ġ= Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn . add ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġcurrent Group ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Data [ e ]?. parallel Ġ= Ġcolumns . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent End Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġloop @ Ġfor Ġ( event Ġin Ġevents ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġevent Data [ event ] Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġis ĠAdd Event Ġ-> Ġcontinue @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . start Ġ<= Ġcurrent End Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Group . add ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent End Ġ= Ġmax ( current End , Ġdata . end ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Group () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Group Ġ= Ġmutable ListOf ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent End Ġ= Ġdata . end ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġend Group () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Position Events And Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Layout () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( event Position Job Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Position Job Ġ= Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Position Required Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( EVENT _ POSITION ING _ DE BOUN CE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Events () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Position Job Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event Position Required ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Position Events And Layout () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Position Required Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Throws Count ") ĊĠĠĠ Ġprivate Ġfun Ġcheck Events ( events : ĠList < Event >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( events . any Ġ{ Ġshow As All Day ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" all - day Ġevents Ġcannot Ġbe Ġshown Ġinside ĠDay Events View ") ĊĠĠĠĠĠĠĠ Ġif Ġ( events . any Ġ{ Ġit Ġis ĠAdd Event Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" add Ġevents Ġcurrently Ġcannot Ġbe Ġset Ġfrom Ġthe Ġoutside ") ĊĠĠĠĠĠĠĠ Ġif Ġ( events . any Ġ{ Ġit . end Ġ< Ġday . start Ġ|| Ġit . start Ġ>= Ġday . end Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" event Ġstarts Ġmust Ġall Ġbe Ġinside Ġthe Ġset Ġday ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( view Ġin Ġchildren ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent View Ġ= Ġview Ġas ĠEvent View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġevent View . event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent View . setOnClickListener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent View . setOn Long ClickListener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Event ClickListener ?. let Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġevent View . setOnClickListener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Event Long ClickListener ?. let Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent View . setOn Long ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġevent View . setOn Long ClickListener ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonUpdate Day ( day : ĠDay ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . with Styled Attributes ( attrs , ĠR . style able . Day Events View , Ġdef Style Attr , Ġdef Style Res ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Ġ= Ġif Ġ( day . is Today ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Drawable ( R . style able . Day Events View _ date Current Background ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( day . is Today Ġ&& Ġ! this @ Day Events View :: time Paint . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Circle Radius Ġ= Ġget Dimension Pixel Size ( R . style able . Day Events View _ time Circle Radius , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Line Size Ġ= Ġget Dimension Pixel Size ( R . style able . Day Events View _ time Line Size , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Color Ġ= Ġget Color ( R . style able . Day Events View _ time Color , ĠColor . BLACK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Paint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġtime Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠEvent Data ( ĊĠĠĠĠĠĠĠ Ġval Ġstart : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġend : ĠInt , ĊĠĠĠĠĠĠĠ Ġvar Ġparallel : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġvar Ġindex : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġsub Index : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ) Ċ } Ċ