package Ġj utt . com . z cal ender view Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġkotlin . jvm . Jvm Over loads Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġj utt . com . z cal ender view . Simple Month Adapter Ċ import Ġj utt . com . z cal ender view . DatePicker Controller Ċ import Ġandroid . content . res . Typed Array Ċ import Ġj utt . com . z cal ender view . Simple Month View Ċ import Ġj utt . com . z cal ender view . Resize Animation Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġj utt . com . z cal ender view . Simple Month Adapter . Selected Days Ċ import Ġj utt . com . z cal ender view . Simple Month Adapter . Calendar Day Ċ import Ġj utt . com . z cal ender view . Z Cal ender View Ċ import Ġj utt . com . z cal ender view . R Ċ import Ġandroid . view . animation . Animation Ċ import Ġj utt . com . z cal ender view . Simple Month View . On Day ClickListener Ċ import Ġandroid . text . format . Date Utils Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . graphics . Type face Ċ import Ġandroid . graphics . Paint . Align Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View . Measure Spec Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Abs ListView Ċ import Ġjava . util .* Ċ Ċ @ Suppress Lint (" Re cycle ") Ċ class ĠZ Cal ender View Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠRecyclerView ( context , Ġattrs , Ġdef Style ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar ĠmContext : ĠContext ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġm Adapter : ĠSimple Month Adapter ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Controller : ĠDate Picker Controller ? Ġ= Ġnull ĊĠĠĠ Ġvar ĠmCurrent Scroll State Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġm Previous Scroll Position : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġm Previous Scroll State Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġis Single Month Height Adjust Ġ= Ġfalse ĊĠĠĠ Ġvar Ġtyped Array : ĠTyped Array ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġscroll Listener : ĠOn Scroll Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġscroll To Today () Ġ{ ĊĠĠĠĠĠĠĠ Ġsmooth Scroll To Position ( 1 2 Ġ+ ĠCalendar . getInstance ()[ Calendar . MONTH ]) ĊĠĠĠĠĠĠĠ Ġadjust Height () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit ( param Context : ĠContext ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġscroll Listener Ġ= Ġobject Ġ: ĠOn Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġre cyclerView . getChild At ( 0 ) Ġas ĠSimple Month View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Previous Scroll Position Ġ= Ġdy . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Previous Scroll State Ġ= ĠmCurrent Scroll State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newState Ġ== ĠSC ROLL _ STATE _ DR AG GING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter ?. set Dragging ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( newState Ġ== ĠSC ROLL _ STATE _ IDLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Delayed ({ Ġm Adapter ?. set Dragging ( false ) Ġ}, Ġ 1 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Child Ġ= Ġget Child At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġy Ġ- Ġfirst Child . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ> Ġfirst Child . meas ured Height Ġ/ Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Scroll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Scroll By ( 0 , Ġ( getChild At ( 1 ). y Ġ- Ġy ). toInt () Ġ+ Ġ 7 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Scroll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Scroll By ( 0 , Ġ(- offset ). toInt () Ġ+ Ġ 7 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Single Month Height Adjust ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Item Height Ġ= Ġget Child At ( 0 ). meas ured Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meas ured Height Ġ!= Ġfirst Item Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresize Animation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResize Animation ( this @ Z Cal ender View , Ġfirst Item Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresize Animation . duration Ġ= Ġ 3 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Animation ( resize Animation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 4 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( param Context ) ĊĠĠĠĠĠĠĠ ĠmContext Ġ= Ġparam Context ĊĠĠĠĠĠĠĠ ĠsetUp ListView () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Adapter () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Adapter Ġ== Ġnull Ġ&& Ġtyped Array Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter Ġ= ĠSimple Month Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Controller , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Array !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadapter Ġ= Ġm Adapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Enable Height Resize ( b : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Single Month Height Adjust Ġ= Ġb ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Height () Ġ{ ĊĠĠĠĠĠĠĠ Ġpost Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getChild At ( 0 ) Ġ!= Ġnull Ġ&& Ġis Single Month Height Adjust ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Item Height Ġ= Ġget Child At ( 0 ). meas ured Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresize Animation Ġ= ĠResize Animation ( this @ Z Cal ender View , Ġfirst Item Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresize Animation . duration Ġ= Ġ 3 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Animation ( resize Animation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 2 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp ListView () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Vertical ScrollBar Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġscroll Listener ?. let Ġ{ Ġadd On Scroll Listener ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġset F ading Edge Length ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġselected Days : ĠSelected Days < Calendar Day ?> ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm Adapter ?. selected Days ĊĊĠĠĠ Ġfun Ġclear Selected Days () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Adapter ?. setSelected Day ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġsetting ĠHash map Ġfor Ġevents Ġin Ġcal ender ĊĠĠĠĠ Ġ* Ġfor Ġexample : ĊĠĠĠĠ Ġ* Ġevents Map . put ( new ĠSimple Month Adapter . Calendar Day ( 2 0 1 7 , 7 , 2 0 ), 1 ); Ġ// Ġwill Ġset Ġevent Ġcircle Ġat Ġdate Ġ 1 Ġ, Ġaug ust Ġ, Ġ 2 0 1 7 ĊĠĠĠĠ Ġ* ĠNote : Ġsecond Ġparameter Ġhere Ġis Ġnumber Ġof Ġevent Ġcircles Ġlike Ġin Ġthis Ġcase Ġits Ġ 1 Ġ, Ġit Ġcan Ġbe Ġfrom Ġ 1 Ġ- Ġ 3 ĊĠĠĠĠ Ġ* Ġ@ param Ġcount Map ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Events HashMap ( count Map : ĠHashMap < Calendar Day ?, ĠInt ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Adapter ?. set Count Map ( count Map ) ĊĠĠĠĠĠĠĠ Ġthis . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcontroller : ĠDate Picker Controller ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm Controller ĊĠĠĠĠĠĠĠ Ġset ( m Controller ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m Controller Ġ= Ġm Controller ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetUp Adapter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġm Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll To Position ( 1 2 Ġ+ ĠCalendar . getInstance ()[ Calendar . MONTH ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isIn Edit Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Array Ġ= Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . Z Cal ender View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params Ġ= ĠLayout Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayout Params . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayout Params . MATCH _ PARENT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . over Scroll Mode Ġ= ĠOVER _ SCROLL _ NE VER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit ( context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }