package Ġdev . z ot ov . phot ot ime . solar ized Ċ Ċ import Ġandroidx . annotation . Float Range Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . Zone Id Ċ import Ġjava . time . Zone Offset Ċ import Ġjava . time . temporal . Temporal Unit Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . math .* Ċ Ċ /** Ċ Ġ* ĠThe Ġcore Ġof Ġthe Ġentire Ġlibrary . Ċ Ġ* ĠUsed Ġto Ġcalculate Ġeverything Ġusing Ġthe Ġpower Ġof Ġmath Ġand Ġa str onomy Ċ Ġ* Ċ Ġ* ĠThe Ġalgorithm Ġis Ġbased Ġon Ġthe ĠEd ĠW illi ams ĠSun rise / S unset Ġalgorithm Ċ Ġ* ĠMore Ġinfo Ġcan Ġbe Ġfound Ġ[ here ]( http :// ed w illi ams . org / sun rise _ sun set _ algorithm . html ) Ċ Ġ* Ċ Ġ* Ġ@ param Ġtime Ġwhich Ġdatetime Ġwill Ġused Ġto Ġcalculate Ċ Ġ* Ġ@ param Ġdate Ġthe Ġdate Ġon Ġwhich Ġthe Ġposition Ġof Ġthe Ġsun Ġshould Ġbe Ġcalculated Ċ Ġ* Ġ@ param Ġlatitude Ġof Ġthe Ġviewer Ġon Ġearth Ċ Ġ* Ġ@ param Ġlongitude Ġof Ġthe Ġviewer Ġon Ġearth Ċ Ġ* Ġ@ param Ġtw il ight Ġwhat Ġangle Ġsun Ġshould Ġreach Ċ Ġ*/ Ċ internal Ġfun Ġalgorithm ( ĊĠĠĠ Ġtime : ĠDateTime , ĊĠĠĠ Ġdate : ĠLocalDateTime , ĊĠĠĠ Ġ@ Float Range ( from Ġ= Ġ- 9 0 . 0 , Ġto Ġ= Ġ 9 0 . 0 ) Ġlatitude : ĠDouble , ĊĠĠĠ Ġ@ Float Range ( from Ġ= Ġ- 1 8 0 . 0 , Ġto Ġ= Ġ 1 8 0 . 0 ) Ġlongitude : ĠDouble , ĊĠĠĠ Ġtw il ight : ĠTw il ight , ĊĠĠĠ Ġtime Zone : ĠTime Zone Ċ ): ĠLocalDateTime ? Ġ{ ĊĊĠĠĠ Ġ// Ġfirst Ġcalculate Ġthe Ġday Ġof Ġthe Ġyear ĊĠĠĠ Ġval Ġday Ġ= Ġdate . at Zone ( Zone Offset . UTC ). day OfYear ĊĊĠĠĠ Ġ// Ġlongitude Ġto Ġhour Ġvalue Ġand Ġcalculate Ġan Ġapprox . Ġtime ĊĠĠĠ Ġval Ġlng Hour Ġ= Ġlongitude Ġ/ Ġ 1 5 ĊĠĠĠ Ġval Ġhour Time Ġ= Ġif Ġ( time Ġ== ĠDateTime . Mor ning ) Ġ 6 . 0 Ġelse Ġ 1 8 . 0 ĊĠĠĠ Ġval Ġt Ġ= Ġday Ġ+ Ġ( hour Time Ġ- Ġlng Hour ) Ġ/ Ġ 2 4 ĊĊĠĠĠ Ġ// ĠCalculate Ġthe Ġsun s Ġmean Ġanomaly ĊĠĠĠ Ġval ĠM Ġ= Ġ( 0 . 9 8 5 6 Ġ* Ġt ) Ġ- Ġ 3 . 2 8 9 ĊĊĠĠĠ Ġ// ĠCalculate Ġthe Ġsun 's Ġtrue Ġlongitude ĊĠĠĠ Ġval Ġsub expression 1 Ġ= Ġ 1 . 9 1 6 Ġ* Ġsin ( M . radians ) ĊĠĠĠ Ġval Ġsub expression 2 Ġ= Ġ 0 . 0 2 0 Ġ* Ġsin ( 2 Ġ* ĠM . radians ) ĊĠĠĠ Ġvar ĠL Ġ= ĠM Ġ+ Ġsub expression 1 Ġ+ Ġsub expression 2 Ġ+ Ġ 2 8 2 . 6 3 4 ĊĠĠĠ ĠL Ġ= ĠL . normal ise ( 3 6 0 . 0 ) ĊĊĠĠĠ Ġ// Ġsun 's Ġright Ġasc ension ĊĠĠĠ Ġvar ĠRA Ġ= Ġatan ( 0 . 9 1 7 6 4 Ġ* Ġtan ( L . radians )). degrees ĊĠĠĠ ĠRA Ġ= ĠRA . normal ise ( 3 6 0 . 0 ) ĊĊĠĠĠ Ġ// ĠRA Ġvalue Ġneeds Ġto Ġbe Ġin Ġthe Ġsame Ġquadr ant Ġas ĠL ĊĠĠĠ Ġval ĠL quadr ant Ġ= Ġfloor ( L Ġ/ Ġ 9 0 ) Ġ* Ġ 9 0 ĊĠĠĠ Ġval ĠRA quadr ant Ġ= Ġfloor ( RA Ġ/ Ġ 9 0 ) Ġ* Ġ 9 0 ĊĠĠĠ ĠRA Ġ+= Ġ( L quadr ant Ġ- ĠRA quadr ant ) ĊĠĠĠ Ġ// ĠRA Ġinto Ġhours ĊĠĠĠ ĠRA Ġ/= Ġ 1 5 ĊĊĠĠĠ Ġ// Ġdecl ination ĊĠĠĠ Ġval Ġsin Dec Ġ= Ġ 0 . 3 9 7 8 2 Ġ* Ġsin ( L . radians ) ĊĠĠĠ Ġval Ġcos Dec Ġ= Ġcos ( asin ( sin Dec )) ĊĊĠĠĠ Ġ// Ġcalculate Ġz en ith Ġ( point Ġright Ġabove Ġviewer ) ĊĠĠĠ Ġval Ġz en ith Ġ= Ġ- 1 Ġ* Ġtw il ight . degrees Ġ+ Ġ 9 0 ĊĊĠĠĠ Ġ// Ġlocal Ġhour Ġangle ĊĠĠĠ Ġval Ġcos H Ġ= ĊĠĠĠĠĠĠĠ Ġ( cos ( zen ith . radians ) Ġ- Ġ( sin Dec Ġ* Ġsin ( latitude . radians ))) Ġ/ Ġ( cos Dec Ġ* Ġcos ( latitude . radians )) ĊĊĠĠĠ Ġ// Ġno Ġtransition ĊĠĠĠ Ġif Ġ( cos H Ġ> Ġ 1 Ġ|| Ġcos H Ġ< Ġ- 1 ) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġtemp H Ġ= Ġif Ġ( time Ġ== ĠDateTime . Mor ning ) Ġ 3 6 0 Ġ- Ġa cos ( cos H ). degrees Ġelse Ġa cos ( cos H ). degrees ĊĠĠĠ Ġval ĠH Ġ= Ġtemp H Ġ/ Ġ 1 5 . 0 ĊĊĠĠĠ Ġ// Ġlocal Ġmean Ġtime Ġof Ġr ising ĊĠĠĠ Ġval ĠT Ġ= ĠH Ġ+ ĠRA Ġ- Ġ( 0 . 0 6 5 7 1 Ġ* Ġt ) Ġ- Ġ 6 . 6 2 2 ĊĊĠĠĠ Ġval ĠUT Ġ= Ġ( T Ġ- Ġlng Hour ). normal ise ( 2 4 . 0 ) ĊĊĠĠĠ Ġval Ġhour Ġ= Ġfloor ( UT ). toInt () ĊĠĠĠ Ġval Ġminute Ġ= Ġfloor (( UT Ġ- Ġhour ) Ġ* Ġ 6 0 . 0 ). toInt () ĊĠĠĠ Ġval Ġsecond Ġ= Ġ( ((( UT Ġ- Ġhour ) Ġ* Ġ 6 0 ) Ġ- Ġminute ) Ġ* Ġ 6 0 . 0 ). toInt () ĊĠĠĠ Ġval ĠshouldBe Y esterday Ġ= Ġlng Hour Ġ> Ġ 0 Ġ&& ĠUT Ġ> Ġ 1 2 Ġ&& Ġtime Ġ== ĠDateTime . Mor ning ĊĠĠĠ Ġval ĠshouldBe Tom orrow Ġ= Ġlng Hour Ġ< Ġ 0 Ġ&& ĠUT Ġ< Ġ 1 2 Ġ&& Ġtime Ġ== ĠDateTime . Even ing ĊĠĠĠ Ġval Ġset Date Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ ĠshouldBe Y esterday Ġ-> Ġdate . minus Days ( 1 ) ĊĠĠĠĠĠĠĠ ĠshouldBe Tom orrow Ġ-> Ġdate . plus Days ( 1 ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtimezone Offset Ġ= ĠTimeUnit . HOUR S . convert ( ĊĠĠĠĠĠĠĠ Ġtime Zone . get Offset ( date . at Zone ( Zone Id . of ( time Zone . id )). to Instant (). to Epoch Milli ()). to Long (), ĊĠĠĠĠĠĠĠ ĠTimeUnit . MILLISECONDS ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġreturn Ġset Date . with Hour ( hour ). with Minute ( minute ). with Second ( second ). plus Hours ( timezone Offset ) Ċ } ĊĊ Ċ /** Ċ Ġ* ĠEnum Ġused Ġto Ġref ine Ġthe Ġquery Ġand Ġdetermine Ġfor Ġwhat Ġtime Ġcalculations Ġare Ġrequired Ċ Ġ* ĠCalcul ations Ġsuch Ġas Ġgold en Ġhour , Ġsun rise / sun set , Ġblue Ġhour Ġoccur Ġtwice Ġa Ġday : Ġin Ġthe Ġmorning Ġand Ġin Ġthe Ġeven ing Ċ Ġ*/ Ċ internal Ġenum Ġclass ĠDateTime Ġ{ ĊĠĠĠ ĠMor ning , ĊĠĠĠ ĠEven ing , Ċ } Ċ Ċ /** ĠConvert Ġfrom Ġdegrees Ġto Ġradians Ġ*/ Ċ internal Ġval ĠDouble . radians : ĠDouble Ġget () Ġ= Ġthis Ġ* ĠPI Ġ/ Ġ 1 8 0 Ċ Ċ /** ĠConvert Ġfrom Ġradians Ġto Ġdegrees Ġ*/ Ċ internal Ġval ĠDouble . degrees : ĠDouble Ġget () Ġ= Ġthis Ġ* Ġ 1 8 0 Ġ/ ĠPI Ċ Ċ /** Ċ Ġ* ĠIf Ġ[ this ] Ġis Ġnegative , Ġadd Ġ[ maximum ] Ġto Ġ[ this ] Ġuntil Ġ[ this ] Ġwill Ġbe Ġpositive Ċ Ġ* Ġif Ġ[ this ] Ġ> Ġ[ maximum ], Ġsubtract Ġ[ maximum ] Ġfrom Ġ[ this ] Ġuntil Ġ[ this ] Ġwill Ġbe Ġless Ġthan Ġ[ maximum ] Ċ Ġ*/ Ċ internal Ġfun ĠDouble . normal ise ( maximum : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠ Ġvar Ġvalue Ġ= Ġthis ĊĠĠĠ Ġwhile Ġ( value Ġ< Ġ 0 ) Ġvalue Ġ+= Ġmaximum ĊĠĠĠ Ġwhile Ġ( value Ġ> Ġmaximum ) Ġvalue Ġ-= Ġmaximum ĊĠĠĠ Ġreturn Ġvalue Ċ } Ċ Ċ /** ĠDefine Ġwhat Ġposition Ġon Ġsky Ġrelative Ġto Ġthe Ġearth Ġsun Ġshould Ġreach Ġ*/ Ċ internal Ġsealed Ġclass ĠTw il ight Ġ{ ĊĠĠĠ Ġobject ĠOffic ial Ġ: ĠTw il ight () ĊĠĠĠ Ġobject ĠC ivil Ġ: ĠTw il ight () ĊĠĠĠ Ġobject ĠN aut ical Ġ: ĠTw il ight () ĊĠĠĠ Ġobject ĠA str onom ical Ġ: ĠTw il ight () ĊĠĠĠ Ġdata Ġclass ĠCustom ( val Ġvalue : ĠDouble ) Ġ: ĠTw il ight () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAngle , Ġformed Ġby Ġsun Ġposition , Ġviewer Ġand Ġa Ġray Ġ( eman ating Ġfrom Ġan Ġobserver Ġper pend icular Ġto Ġthe Ġz en ith ) ĊĠĠĠĠ Ġ* ĠIf Ġsun Ġunder Ġray Ġ( relative Ġto Ġviewer ) Ġthe Ġ[ degrees ] Ġ< Ġ 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġdegrees : ĠDouble ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOffic ial Ġ-> Ġ- 3 5 . 0 Ġ/ Ġ 6 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC ivil Ġ-> Ġ- 6 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠN aut ical Ġ-> Ġ- 1 2 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠA str onom ical Ġ-> Ġ- 1 5 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCustom Ġ-> Ġthis . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } ĊĊ