/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠThanks M ister ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ġdistributed Ċ Ġ* Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . th ank sm ister . iot . mqtt . alar mp anel . ui . views Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . persistence . Forecast Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . persistence . Weather Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . ui . adapters . Forecast Card Adapter Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Date Utils Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . StringUtils Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Weather Utils Ċ Ċ import Ġkotlinx . android . synt hetic . main . dialog _ extended _ forecast . view .* Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util .* Ċ Ċ class ĠExtended Forecast View Ġ: ĠFrame Layout Ġ{ ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġon Finish Inf late () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Finish Inf late () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Extended Forecast ( weather : ĠWeather ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġforecast List Ġ= Ġweather . forecast ĊĠĠĠĠĠĠĠ Ġif ( forecast List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrouped Forecast List Ġ= ĠArrayList < Forecast Display >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġgroup Day Ġ= ĠDate Utils . day OfWeek ( forecast List [ 0 ]. datetime ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Ġgroup Ġday Ġstart Ġ${ forecast List [ 0 ]. datetime }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Ġforecast Ġlist Ġ${ forecast List . size }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġgroup Ġ= ĠArrayList < Forecast >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( forecast Ġin Ġforecast List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġday Ġ= ĠDate Utils . day OfWeek ( forecast . datetime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( day Ġ== Ġgroup Day ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup . add ( forecast ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! group . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoday Ġ= Ġ( count Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġforecast Display Ġ= Ġgroup Forecast sBy Day ( today , Ġgroup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Ġadd Ġtoday Ġ${ today }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Ġadd Ġforecast Display Ġ${ forecast Display . day }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrouped Forecast List . add ( forecast Display ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Day Ġ= Ġday ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup . add ( forecast ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! group . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġforecast Display Ġ= Ġgroup Forecast sBy Day ( false , Ġgroup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Ġadd Ġforecast Display Ġ${ forecast Display . day }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrouped Forecast List . add ( forecast Display ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cycle View . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlinear LayoutManager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinear LayoutManager . orientation Ġ= ĠLinearLayoutManager . HORIZONTAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= Ġlinear LayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforecast List . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġforecast Card Adapter Ġ= ĠFore cast Card Adapter ( grouped Forecast List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cycle View . adapter Ġ= Ġforecast Card Adapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgroup Forecast sBy Day ( today : ĠBoolean Ġ= Ġfalse , Ġgroup : ĠArrayList < Forecast >): ĠFore cast Display Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġforecast Display Ġ= ĠFore cast Display () ĊĠĠĠĠĠĠĠ Ġif ( group . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforecast Display . condition Ġ= Ġcalculate Current Condition String ( today , Ġgroup , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforecast Display . condition Image Ġ= Ġcalculate Current Condition Image ( today , Ġgroup ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforecast Display . day Ġ= ĠDate Utils . day OfWeek ( group [ 0 ]. datetime ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforecast Display . prec ip itation Ġ= Ġcalculate Pre cip itation ( group ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforecast Display . temperature Low Ġ= Ġcalculate Low Temperature ( group ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforecast Display . temperature High Ġ= Ġcalculate High Temperature ( group ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġforecast Display ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Pre cip itation ( forecast List : ĠArrayList < Forecast >): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpre cip Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġfor ( forecast Ġin Ġforecast List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforecast . prec ip itation ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdouble Value Ġ= ĠStringUtils . string ToDouble ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( doubleValue Ġ> Ġpre cip ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre cip Ġ= Ġdouble Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpre cip ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Low Temperature ( forecast List : ĠArrayList < Forecast >): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtemp Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġfor ( forecast Ġin Ġforecast List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforecast . temperature ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( temp Ġ== Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it Ġ< Ġtemp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtemp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate High Temperature ( forecast List : ĠArrayList < Forecast >): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtemp Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġfor ( forecast Ġin Ġforecast List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforecast . temperature ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it Ġ> Ġtemp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtemp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Current Condition String ( today : ĠBoolean Ġ= Ġfalse , Ġforecast List : ĠArrayList < Forecast >, Ġcontext : ĠContext ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( forecast List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" calculate Current Condition String Ġ------------------- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcondition Ġ= Ġget Condition ( today , Ġforecast List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠWeather Utils . get Outlook For Weather Condition ( condition , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠWeather Utils . get Outlook For Weather Condition ( forecast List [ 0 ]. condition , Ġcontext ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Current Condition Image ( today : ĠBoolean Ġ= Ġfalse , Ġforecast List : ĠArrayList < Forecast >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( forecast List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" calculate Current Condition Image Ġ------------------- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcondition Ġ= Ġget Condition ( today , Ġforecast List ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Current Ġcondition Ġ${ condition } Ġ---------------- ------- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠWeather Utils . get Icon For Weather Condition ( condition ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠWeather Utils . get Icon For Weather Condition ( forecast List [ 0 ]. condition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Condition ( today : ĠBoolean , Ġforecast List : ĠArrayList < Forecast >): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġright Now Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Hour In 2 4 Format Ġ= Ġif Ġ( today ) Ġ( right Now . get ( Calendar . HOUR _ OF _ DAY ) Ġ+ Ġ. 5 ) Ġelse Ġ 1 4 . 5 ĊĠĠĠĠĠĠĠ ĠTim ber . d (" current Hour In 2 4 Format Ġ$ current Hour In 2 4 Format ") ĊĠĠĠĠĠĠĠ Ġvar Ġcondition Ġ= Ġforecast List [ forecast List . size Ġ- Ġ 1 ]. condition ĊĠĠĠĠĠĠĠ Ġfor ( forecast Ġin Ġforecast List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġday Ġ= ĠDate Utils . day OfWeek ( forecast . datetime ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Current ĠDay Ġ$ day ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhour Ġ= ĠDate Utils . hour OfDay ( forecast . datetime ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Current ĠHour Ġ$ hour ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( current Hour In 2 4 Format Ġ<= Ġhour ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Current ĠCondition Ġ${ forecast . condition }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcondition Ġ= Ġforecast . condition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcondition ĊĠĠĠ Ġ} Ċ }