package Ġcom . te j pr at ap sing h . recycler calendar . adapter Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Handler Thread Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . te j pr at ap sing h . recycler calendar . model . Recycler Calendar Configuration Ċ import Ġcom . te j pr at ap sing h . recycler calendar . model . Recycler Cal ender View Item Ċ import Ġjava . util .* ĊĊ Ċ abstract Ġclass ĠRe cycler Calendar Base Adapter ( ĊĠĠĠ ĠstartDate : ĠDate , ĊĠĠĠ ĠendDate : ĠDate , ĊĠĠĠ Ġprivate Ġval Ġconfiguration : ĠRe cycler Calendar Configuration Ċ ) Ġ: ĠRecyclerView . Adapter < RecyclerView . ViewHolder >() Ġ{ ĊĊĠĠĠ Ġvar Ġm Handler Thread : ĠMy Handler Thread Ġ= ĊĠĠĠĠĠĠĠ ĠMy Handler Thread ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRe cycler Calendar Base Adapter :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġhandler Ġ= ĠHandler () ĊĊĠĠĠ Ġprivate Ġvar Ġcalendar ItemList : ĠLinkedList < Recycler Cal ender View Item > Ġ= ĠLinkedList () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Calendar Ġ= ĠCalendar . getInstance ( configuration . calendar Locale ) ĊĠĠĠĠĠĠĠ Ġval Ġend Calendar Ġ= ĠCalendar . getInstance ( configuration . calendar Locale ) ĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . cal ender ViewType Ġ== ĠRe cycler Calendar Configuration . Cal ender ViewType . HORIZONTAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Calendar . time Ġ= ĠstartDate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġthis DayOfWeek : ĠInt Ġ= Ġstart Calendar . get ( Calendar . DAY _ OF _ WEEK ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this DayOfWeek Ġ- Ġ 1 Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis DayOfWeek Ġ= Ġ 7 Ġ+ Ġ( this DayOfWeek Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Calendar . add ( Calendar . DATE , Ġ- 1 Ġ* Ġthis DayOfWeek ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Calendar . add ( Calendar . DATE , Ġ- 1 Ġ* Ġ( this DayOfWeek Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Calendar [ Calendar . HOUR _ OF _ DAY ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Calendar [ Calendar . MINUTE ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Calendar [ Calendar . SECOND ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Calendar [ Calendar . MILLI SECOND ] Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Calendar . time Ġ= ĠendDate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Calendar [ Calendar . DAY _ OF _ MONTH ] Ġ= Ġend Calendar . get Actual Maximum ( Calendar . DAY _ OF _ MONTH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Calendar [ Calendar . HOUR _ OF _ DAY ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Calendar [ Calendar . MINUTE ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Calendar [ Calendar . SECOND ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Calendar [ Calendar . MILLI SECOND ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Calendar . time Ġ= ĠstartDate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Calendar [ Calendar . DAY _ OF _ MONTH ] Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Calendar [ Calendar . HOUR _ OF _ DAY ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Calendar [ Calendar . MINUTE ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Calendar [ Calendar . SECOND ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Calendar [ Calendar . MILLI SECOND ] Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Calendar . time Ġ= ĠendDate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Calendar [ Calendar . DAY _ OF _ MONTH ] Ġ= Ġend Calendar . get Actual Maximum ( Calendar . DAY _ OF _ MONTH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Calendar [ Calendar . HOUR _ OF _ DAY ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Calendar [ Calendar . MINUTE ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Calendar [ Calendar . SECOND ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Calendar [ Calendar . MILLI SECOND ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrunnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( start Calendar . time . before ( end Calendar . time ) Ġ|| Ġstart Calendar . time Ġ== Ġend Calendar . time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġday OfMonth : ĠInt Ġ= Ġstart Calendar . get ( Calendar . DAY _ OF _ MONTH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġday OfWeek : ĠInt Ġ= Ġstart Calendar . get ( Calendar . DAY _ OF _ WEEK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configuration . cal ender ViewType Ġ== ĠRe cycler Calendar Configuration . Cal ender ViewType . VERTICAL Ġ&& Ġday OfMonth Ġ== Ġ 1 ) Ġ{ Ġ// ĠFirst ĠDay Ġof Ġmonth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configuration . include Month Header ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar Empty Header : ĠRe cycler Cal ender View Item Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe cycler Cal ender View Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ= Ġstart Calendar . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspan Size Ġ= Ġ 7 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisEmpty Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Header Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar ItemList . add ( calendar Empty Header ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar Empty Week : ĠRe cycler Cal ender View Item Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe cycler Cal ender View Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ= Ġstart Calendar . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspan Size Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisEmpty Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Header Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( day OfWeek Ġ- Ġ 1 Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġday OfWeek Ġ= Ġ 7 Ġ+ Ġ( day OfWeek Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar Empty Week . span Size Ġ= Ġday OfWeek ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar Empty Week . span Size Ġ= Ġday OfWeek Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( calendar Empty Week . span Size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIs Ġspan Ġsize Ġis Ġgreater Ġthen Ġ 0 , Ġthen Ġadd Ġempty Ġcell ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar ItemList . add ( calendar Empty Week ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar Date Item : ĠRe cycler Cal ender View Item Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe cycler Cal ender View Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ= Ġstart Calendar . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspan Size Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisEmpty Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Header Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar ItemList . add ( calendar Date Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Calendar . add ( Calendar . DATE , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Handler Thread . start () ĊĠĠĠĠĠĠĠ Ġm Handler Thread . prepare Handler () ĊĠĠĠĠĠĠĠ Ġm Handler Thread . post Task ( run nable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcalendar ItemList . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView . ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Bind ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder Ġ= Ġholder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġposition , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar Item Ġ= Ġcalendar ItemList [ position ] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġon Bind ViewHolder ( ĊĠĠĠĠĠĠĠ Ġholder : ĠRecyclerView . ViewHolder , ĊĠĠĠĠĠĠĠ Ġposition : ĠInt , ĊĠĠĠĠĠĠĠ Ġcalendar Item : ĠRe cycler Cal ender View Item ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun ĠgetItem ( position : ĠInt ): ĠRe cycler Cal ender View Item ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( position Ġ< Ġcalendar ItemList . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar ItemList [ position ]; ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet ĠLayout Manager Ġof Ġre cycler Ġview Ġto ĠGrid LayoutManager Ġwith Ġspan Ġof Ġ 7 Ġ( week ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Attached To RecyclerView ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attached To RecyclerView ( re cyclerView ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . cal ender ViewType Ġ== ĠRe cycler Calendar Configuration . Cal ender ViewType . HORIZONTAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ= ĠLinearLayoutManager ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayoutManager . HORIZONTAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrid LayoutManager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGrid LayoutManager ( re cyclerView . context , Ġ 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrid LayoutManager . span Size Lookup Ġ= Ġobject Ġ: ĠGrid LayoutManager . Span Size Lookup () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Span Size ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspan Size : ĠInt ? Ġ= ĠgetItem ( position )?. span Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( span Size Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġspan Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ= Ġgrid LayoutManager ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From RecyclerView ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From RecyclerView ( re cyclerView ) ĊĠĠĠĠĠĠĠ Ġm Handler Thread . quit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThread Ġhandler ĊĠĠĠ Ġclass ĠMy Handler Thread Ġconstructor ( name : ĠString ) Ġ: ĊĠĠĠĠĠĠĠ ĠHandler Thread ( name ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġhandler : ĠHandler ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfun Ġpost Task ( task : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler !!. post ( task ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġprepare Handler () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Ġ= ĠHandler ( lo oper ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }