package Ġcom . example . andro idth ings . lan tern . channels Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . animation . Animator Listener Adapter Ċ import Ġandroid . animation . Animator Set Ċ import Ġandroid . animation . Object Animator Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . os . AsyncTask Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Accel erate De cel erate Interpolator Ċ import Ġandroid . widget . Relative Layout Ċ import Ġandroid . widget . TextView Ċ import Ġbi weekly . Bi weekly Ċ import Ġbi weekly . component . V Event Ċ import Ġcom . example . andro idth ings . lan tern . Channel Ċ import Ġcom . example . andro idth ings . lan tern . R Ċ import Ġjava . io . InputStream Ċ import Ġjava . net . URL Ċ import Ġjava . util .* Ċ import Ġjavax . net . ssl . Https URLConnection Ċ import Ġkotlin . concurrent . fixed Rate Timer Ċ import Ġkotlin . math . PI Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . sin Ċ import Ġkotlin . properties . Deleg ates Ċ import Ġkotlinx . android . synt hetic . main . calendar _ clock _ channel .* Ċ Ċ /** Ċ Ġ* ĠShows Ġa Ġday 's Ġapp ointments Ġaround Ġa Ġreal - world Ġclock . Ċ Ġ* Ċ Ġ* ĠConfig Ġparameters : Ċ Ġ* ĠĠ Ġ- Ġ" url " Ċ Ġ* ĠĠĠĠĠĠ ĠThe ĠURL Ġto Ġa Ġpublic Ġcalendar Ġin Ġthe Ġi Cal Ġformat . Ċ Ġ*/ Ċ @ Suppress Lint (" R tl Hard coded ") Ċ class ĠCalendar Channel Ġ: ĠChannel () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġevents Ġby ĠDeleg ates . observable < List < Event >? >( null ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_, Ġold , Ġnew Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( old Ġ!= Ġnew ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecreate Event Views () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġrefresh Error : ĠException ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġtext Views Ġ= Ġmutable ListOf < TextView >() ĊĠĠĠ Ġprivate Ġval Ġnot ch Views Ġ= Ġmutable ListOf < View >() ĊĠĠĠ Ġprivate Ġvar Ġvisibility Animations Ġ= ĠlistOf < Over lapping Visibility Animation >() ĊĊĠĠĠ Ġprivate Ġvar Ġrefresh Events Timer : ĠTimer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġi Cal URL : ĠURL ? Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl String Ġ= Ġconfig . secrets ?. opt (" url ") Ġas ? ĠString ĊĠĠĠĠĠĠĠ Ġurl String ?. let Ġ{ ĠURL ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . calendar _ clock _ channel , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġrecreate Event Views () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġrefresh Events Timer Ġ= Ġfixed Rate Timer ("$ this Ġrefresh ", Ġfalse , ĠDate (), Ġ 1 0 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Events () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh Events Timer ?. cancel () ĊĠĠĠĠĠĠĠ Ġrefresh Events Timer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh Events () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi Cal URL Ġ= Ġi Cal URL ĊĊĠĠĠĠĠĠĠ Ġif Ġ( i Cal URL Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Error Ġ= ĠIllegalArgumentException (" Calendar ĠURL Ġrequired ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠRefresh Events Task (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . onComplete Ġ= Ġ{ Ġevents , Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Error Ġ= Ġerror ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( events Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" null Ġresult Ġfrom ĠRefresh Events Task . Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . events Ġ= Ġevents ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. execute ( i Cal URL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrecreate Event Views () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Events : Ġ$ events ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( events View Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġnot ch Radius Ġ= Ġevents View . height / 2 . 0 f Ġ* Ġ 0 . 7 3 f ĊĠĠĠĠĠĠĠ Ġval Ġtext Radius Ġ= Ġevents View . height / 2 . 0 f Ġ* Ġ 0 . 7 8 f ĊĊĠĠĠĠĠĠĠ Ġevents View . removeAll Views () ĊĠĠĠĠĠĠĠ Ġtext Views . clear () ĊĠĠĠĠĠĠĠ Ġnot ch Views . clear () ĊĠĠĠĠĠĠĠ Ġvisibility Animations . forEach Ġ{ Ġit . stop () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġevents Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġevents ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= ĠTextView ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype face Ġ= Ġresources . getFont ( R . font . pt _ sans ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size Ġ= Ġ 2 4 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset TextColor ( Color . WHITE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Lines Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġevent . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgravity Ġ= Ġgravity For Angle ( event . angle Deg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot ch View Ġ= ĠView ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset BackgroundColor ( Color . WHITE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents View . addView ( textView , ĠRelative Layout . LayoutParams ( TEXT _ VIEW _ WIDTH , ĠTEXT _ VIEW _ HEIGHT ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Rule ( Relative Layout . CENTER _ IN _ PARENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents View . addView ( not ch View , ĠRelative Layout . LayoutParams ( 3 , Ġ 2 2 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Rule ( Relative Layout . CENTER _ IN _ PARENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Offset Ġ= Ġwhen ( horizontal Gravity For Angle ( event . angle Deg )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGr avity . LEFT Ġ-> Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGr avity . RIGHT Ġ-> Ġ- 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Offset Ġ= Ġwhen ( vertical Gravity For Angle ( event . angle Deg )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGr avity . TOP Ġ-> Ġ 3 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGr avity . BOTTOM Ġ-> Ġ- 3 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . translation X Ġ= Ġtext Radius Ġ* Ġsin ( event . angle ) Ġ+ Ġwidth Offset ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . translation Y Ġ= Ġtext Radius Ġ* Ġ- cos ( event . angle ) Ġ+ Ġheight Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot ch View . translation X Ġ= Ġnot ch Radius Ġ* Ġsin ( event . angle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot ch View . translation Y Ġ= Ġnot ch Radius Ġ* Ġ- cos ( event . angle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot ch View . rotation Ġ= Ġevent . angle Deg ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Views . add ( textView ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot ch Views . add ( not ch View ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvisibility Animations Ġ= Ġanimations For Over lapping Groups Of Views ( text Views ) ĊĠĠĠĠĠĠĠ Ġvisibility Animations . forEach Ġ{ Ġit . start () Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġevents ĊĊĠĠĠĠĠĠĠ Ġif Ġ( events Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġstrike though Ġto Ġtext views Ġwhose Ġevents Ġare Ġin Ġthe Ġpast ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠDate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġevent ) Ġin Ġevents . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= Ġtext Views [ index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . startDate Ġ< Ġnow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġstrike through Ġflag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . paint Flags Ġ= ĠtextView . paint Flags Ġor ĠPaint . STRI KE _ TH RU _ TEXT _ FLAG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremove Ġstrike through Ġflag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . paint Flags Ġ= ĠtextView . paint Flags Ġand ĠPaint . STRI KE _ TH RU _ TEXT _ FLAG . inv () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġupdate Ġstatus Ġtext ĊĠĠĠĠĠĠĠ Ġstatus TextView . text Ġ= Ġif Ġ( events Ġ== Ġnull Ġ&& Ġrefresh Error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" An Ġerror Ġoccurred Ġwhile Ġgetting Ġcalendar Ġevents .\ n \ n $ refresh Error " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( events Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Loading ..." ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( events . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġevents ." ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgravity For Angle ( deg : ĠFloat ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhorizontal Ġ= Ġhorizontal Gravity For Angle ( deg ) ĊĠĠĠĠĠĠĠ Ġval Ġvertical Ġ= Ġvertical Gravity For Angle ( deg ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ( horizontal Ġor Ġvertical ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvertical Gravity For Angle ( deg : ĠFloat ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( deg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 0 .. 6 0 Ġ-> ĠGr avity . BOTTOM ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 6 0 .. 1 2 0 Ġ-> ĠGr avity . CENTER _ VERTICAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 2 0 .. 2 4 0 Ġ-> ĠGr avity . TOP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 2 4 0 .. 3 0 0 Ġ-> ĠGr avity . CENTER _ VERTICAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 3 0 0 .. 3 6 0 Ġ-> ĠGr avity . BOTTOM ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠGr avity . CENTER _ VERTICAL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhorizontal Gravity For Angle ( deg : ĠFloat ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( deg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 0 .. 3 0 Ġ-> ĠGr avity . CENTER _ HORIZONTAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 3 0 .. 1 5 0 Ġ-> ĠGr avity . LEFT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 5 0 .. 2 1 0 Ġ-> ĠGr avity . CENTER _ HORIZONTAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 2 1 0 .. 3 3 0 Ġ-> ĠGr avity . RIGHT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠGr avity . CENTER _ HORIZONTAL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanimations For Over lapping Groups Of Views ( views : ĠCollection < View >): ĠList < Over lapping Visibility Animation > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSplit Ġthe Ġviews Ġinto Ġgroups Ġthat Ġare Ġ' touch ing ' Ġ- Ġthat Ġoverlap . ĠFor Ġexample : ĊĠĠĠĠĠĠĠ Ġ// ĠâĶ Į --------- âĶ Ĳ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠâĶ Į --------- âĶ Ĳ ĊĠĠĠĠĠĠĠ Ġ// ĠâĶĤ ĠĠĠ ĠA ĠâĶ Į -- âĶ¼ ------ âĶ Ĳ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠâĶ Į --------- âĶ Ĳ ĠâĶĤ ĠĠĠ ĠG ĠĠĠ ĠâĶĤ ĊĠĠĠĠĠĠĠ Ġ// ĠâĶĶ ------ âĶ¼ -- âĶ ĺ ĠB ĠâĶ Į -- âĶ¼ ------ âĶ Ĳ ĠĠĠĠĠĠĠ ĠâĶ Į ------- âĶ¼ - âĶ Ĳ Ġ ĠF ĠĠĠ ĠâĶĤ ĠâĶĶ --------- âĶ ĺ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ ĠâĶĶ ------ âĶ¼ -- âĶ ĺ ĠC ĠâĶ Į -- âĶ¼ ------ âĶ Ĳ ĠâĶĤ ĠĠĠ ĠE Ġ ĠâĶĶ - âĶ¼ ------- âĶ ĺ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠâĶĶ ------ âĶ¼ -- âĶ ĺ ĠD ĠĠĠ ĠâĶĤ ĠâĶĶ --------- âĶ ĺ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠâĶĶ --------- âĶ ĺ ĊĠĠĠĠĠĠĠ Ġ// ĠIn Ġthis Ġexample , Ġthe Ġgroups Ġare Ġ[ A , B , C , D ] Ġand Ġ[ E , F ]. Ġ' G ' Ġis Ġignored ĊĠĠĠĠĠĠĠ Ġ// Ġbecause Ġit Ġdoesn 't Ġoverlap Ġanything , Ġso Ġdoesn 't Ġneed Ġanim ating . ĊĊĠĠĠĠĠĠĠ Ġval Ġun grouped Text Views Ġ= Ġviews . to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġoverlapping Groups Ġ= Ġmutable ListOf < Set < View >>() ĊĊĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġthe Ġviews Ġknow Ġtheir Ġsizes ĊĠĠĠĠĠĠĠ Ġtext Views . forEach Ġ{ Ġit . measure ( TEXT _ VIEW _ WIDTH , ĠTEXT _ VIEW _ HEIGHT ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( un grouped Text Views . count () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= Ġmutable Set Of ( un grouped Text Views . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( textView Ġin Ġun grouped Text Views ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( group . any Ġ{ Ġviews Intersect ( it , ĠtextView ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġview Ġintersect s Ġwith Ġone Ġof Ġthe Ġviews Ġin Ġthis Ġgroup , Ġso Ġmake Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpart Ġof Ġthe Ġgroup . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup . add ( textView ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun grouped Text Views . removeAll ( group ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverlapping Groups . add ( group ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġgroups Ġwith Ġjust Ġone Ġview Ġcan Ġbe Ġignored , Ġno Ġanimations Ġnecessary ĊĠĠĠĠĠĠĠ Ġoverlapping Groups . removeAll Ġ{ Ġit . count () Ġ< Ġ 2 Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġoverlapping Groups . map Ġ{ ĠOver lapping Visibility Animation ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠOver lapping Visibility Animation ( private Ġval Ġviews : ĠCollection < View >) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġvisible Sets : ĠList < Set < View >> ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSepar ate Ġthe Ġviews Ġinto Ġvisible Ġsets . Ġ' Visible Ġsets ' Ġare Ġsets Ġof Ġviews ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthat Ġdon 't Ġintersect . ĠFor Ġexample : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠâĶ Į --------- âĶ Ĳ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠâĶĤ ĠĠĠ ĠA ĠâĶ Į -- âĶ¼ ------ âĶ Ĳ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠâĶĶ ------ âĶ¼ -- âĶ ĺ ĠB ĠâĶ Į -- âĶ¼ ------ âĶ Ĳ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ ĠâĶĶ ------ âĶ¼ -- âĶ ĺ ĠC ĠâĶ Į -- âĶ¼ ------ âĶ Ĳ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠâĶĶ ------ âĶ¼ -- âĶ ĺ ĠD ĠĠĠ ĠâĶĤ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠâĶĶ --------- âĶ ĺ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġthis Ġexample , Ġthe Ġsets Ġare Ġ[ A , C ] Ġand Ġ[ B , D ]. ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEach Ġview Ġmust Ġbe Ġin Ġat Ġleast Ġone Ġset . ĠThe Ġsets Ġare Ġthe Ġvisible Ġviews Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġeach Ġstep Ġof Ġthe Ġanimation . ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisible Sets Ġ= Ġmutable ListOf < Set < View >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiteration Complete Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġeach Ġtext Ġview Ġis Ġin Ġat Ġleast Ġone Ġvisible Ġset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġviews . all Ġ{ Ġview Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Sets . any Ġ{ Ġit . contains ( view ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! iteration Complete ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisible Set Ġ= Ġmutable Set Of < View >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġviews Ġ= Ġthis . views . to Mutable List () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsort Ġthe Ġlist Ġsuch Ġthat Ġviews Ġnot Ġalready Ġin Ġa Ġvisible Ġset Ġare Ġfirst , Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgive Ġthem Ġpriority ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġviews . sortBy Ġ{ Ġview Ġ-> Ġvisible Sets . count Ġ{ Ġit . contains ( view ) Ġ} Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbuild Ġthe Ġset Ġby Ġtaking Ġan Ġelement Ġfrom Ġthe Ġlist Ġone - by - one Ġand Ġadding Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġit Ġdoesn 't Ġoverlap Ġanything Ġalready Ġin Ġthe Ġset . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( view Ġin Ġviews ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintersect s A View InThe Set Ġ= Ġvisible Set . any Ġ{ Ġviews Intersect ( it , Ġview ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! intersect s A View InThe Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Set . add ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Sets . add ( visible Set ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . visible Sets Ġ= Ġvisible Sets ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġstep Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġanim ator : ĠAn imator ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġvisible Set Ġget () Ġ= Ġvisible Sets [ step ] ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġviews . forEach Ġ{ ĠtextView Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . alpha Ġ= Ġif Ġ( visible Set . contains ( textView )) Ġ 1 f Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate To Next Step () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġanimate To Next Step () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( step Ġ>= Ġvisible Sets . count ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator Ġ= ĠAn imator Set (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Delay Ġ= Ġ 5 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay To gether ( views . flatMap Ġ{ ĠtextView Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Visible Ġ= Ġvisible Set . contains ( textView ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Alpha Ġ= Ġif Ġ( textView Visible ) Ġ 1 f Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot ch View Ġ= Ġnot ch View For TextView ( textView ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot ch View Alpha Ġ= Ġif Ġ( textView Visible ) Ġ 1 f Ġelse Ġ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObject Animator . of Float ( textView , Ġ" alpha ", ĠtextView Alpha ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 3 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= ĠAccel erate De cel erate Interpolator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObject Animator . of Float ( not ch View , Ġ" alpha ", Ġnot ch View Alpha ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 3 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= ĠAccel erate De cel erate Interpolator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Listener ( object Ġ: ĠAn imator Listener Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( p 0 : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate To Next Step () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator ?. removeAll Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator ?. end () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠEvent ( val Ġname : ĠString , Ġval ĠstartDate : ĠDate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar : ĠCalendar Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġangle : ĠFloat ĊĠĠĠĠĠĠĠ Ġval Ġangle Deg : ĠFloat ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . time Ġ= ĠstartDate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhour Ġ= Ġcalendar . get ( Calendar . HOUR _ OF _ DAY ) Ġ% Ġ 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminute Ġ= Ġcalendar . get ( Calendar . MINUTE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġangle Ġ= Ġ( hour Ġ+ Ġminute / 6 0 . 0 f ) Ġ* Ġ 2 . 0 f * PI . toFloat () Ġ/ Ġ 1 2 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġangle Deg Ġ= Ġangle Ġ* Ġ 1 8 0 f / PI . toFloat () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġviews Intersect ( view 1 : ĠView , Ġview 2 : ĠView ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview 1 Position Ġ= ĠInt Array ( 2 ) ĊĠĠĠĠĠĠĠ Ġview 1 . getLocation On Screen ( view 1 Position ) ĊĠĠĠĠĠĠĠ Ġval Ġview 2 Position Ġ= ĠInt Array ( 2 ) ĊĠĠĠĠĠĠĠ Ġview 2 . getLocation On Screen ( view 2 Position ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠRect . intersect s ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview 1 Position [ 0 ], Ġview 1 Position [ 1 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview 1 Position [ 0 ] Ġ+ ĠTEXT _ VIEW _ WIDTH , Ġview 1 Position [ 1 ] Ġ+ ĠTEXT _ VIEW _ HEIGHT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview 2 Position [ 0 ], Ġview 2 Position [ 1 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview 2 Position [ 0 ] Ġ+ ĠTEXT _ VIEW _ WIDTH , Ġview 2 Position [ 1 ] Ġ+ ĠTEXT _ VIEW _ HEIGHT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnot ch View For TextView ( view : ĠView ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġtext Views . indexOf ( view ) ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnot ch Views . get OrNull ( index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠRefresh Events Task Ġ: ĠAsync Task < URL , ĠVoid , ĠList < Event > ?> () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġerror : ĠException ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar ĠonComplete : Ġ(( List < Event > ?, ĠException ?) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġparams : ĠURL ?): ĠList < Event >? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġparams . first () !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġdownload Events From URL ( url ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfiltered Events Within A 1 2 Hour Period ( events , ĠDate ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Post Execute ( result : ĠList < Event > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete ?. invoke ( result , Ġerror ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfiltered Events Within A 1 2 Hour Period ( events : ĠList < V Event >, Ġdate : ĠDate ): ĠList < Event > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Event >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstart Ġthe Ġ 1 2 Ġhour Ġperiod Ġat Ġ 8 am Ġor Ġ 8 pm , Ġwh iche ver Ġis Ġpreceding Ġ` date ` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . time Ġ= Ġdate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( calendar . get ( Calendar . HOUR _ OF _ DAY )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 0 .. 8 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġkn ock Ġit Ġback Ġto Ġ 8 pm Ġthe Ġprevious Ġday ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . time In Millis Ġ-= Ġ 1 2 * 6 0 * 6 0 * 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . HOUR _ OF _ DAY , Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 8 .. 2 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . HOUR _ OF _ DAY , Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . HOUR _ OF _ DAY , Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . MINUTE , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . SECOND , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartDate Ġ= Ġcalendar . time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠendDate Ġ= ĠDate ( calendar . time In Millis Ġ+ Ġ 1 2 * 6 0 * 6 0 * 1 0 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġevents ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Iterator Ġ= Ġevent . getDate Iterator ( TimeZone . getDefault ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Iterator . advance To ( startDate ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġnext Ġoccurrence Ġis Ġbefore Ġthe ĠendDate , Ġinclude Ġthis Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( date Iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Occurrence Ġ= Ġdate Iterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Occurrence . before ( endDate )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( Event ( event . summary . value , Ġnext Occurrence )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdownload Events From URL ( url : ĠURL ): ĠList < V Event >? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġconnection : ĠHttp s URLConnection ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠinputStream : ĠInputStream ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Ġ= Ġurl . open Connection () Ġas ĠHttp s URLConnection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . connect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connection . response Code Ġ! in Ġ 2 0 0 .. 2 9 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" HTTP Ġerror Ġ${ connection . response Code }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream Ġ= Ġconnection . inputStream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar Ġ= ĠBi weekly . parse ( inputStream ). first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcalendar . events ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection ?. disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTEXT _ VIEW _ HEIGHT Ġ= Ġ 9 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTEXT _ VIEW _ WIDTH Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġthis :: class . java . simple Name ĊĠĠĠ Ġ} Ċ } Ċ