/* Ċ Ġ* ĠĠĠĠ ĠThis Ġfile Ġis Ġpart Ġof ĠL awn ch air ĠLaunch er . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠL awn ch air ĠLaunch er Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ċ Ġ* ĠĠĠĠ Ġit Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ċ Ġ* ĠĠĠĠ Ġthe ĠFree ĠSoftware ĠFoundation , Ġeither Ġversion Ġ 3 Ġof Ġthe ĠLicense , Ġor Ċ Ġ* ĠĠĠĠ Ġ( at Ġyour Ġoption ) Ġany Ġlater Ġversion . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠL awn ch air ĠLaunch er Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ċ Ġ* ĠĠĠĠ Ġbut ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof Ċ Ġ* ĠĠĠĠ ĠMERCHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe Ċ Ġ* ĠĠĠĠ ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ Ġ* ĠĠĠĠ Ġalong Ġwith ĠL awn ch air ĠLaunch er . Ġ ĠIf Ġnot , Ġsee Ġ< https :// www . gnu . org / licenses />. Ċ Ġ*/ Ċ Ċ package Ġog . zim mob . zim lx . tw il ight Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Alarm Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . location . Criteria Ċ import Ġandroid . location . Location Ċ import Ġandroid . location . Location Listener Ċ import Ġandroid . location . Location Manager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . os . Message Ċ import Ġandroid . util . Array Map Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . android . launcher 3 . Build Config Ċ import Ġorg . zim mob . zim lx . check Location Access Ċ import Ġorg . zim mob . zim lx . ensure On MainThread Ċ import Ġorg . zim mob . zim lx . tw il ight . Sun rise S unset Calculator Compat Ċ import Ġorg . zim mob . zim lx . tw il ight . Tw il ight Listener Ċ import Ġorg . zim mob . zim lx . tw il ight . Tw il ight State Ċ import Ġorg . zim mob . zim lx . use ApplicationContext Ċ import Ġorg . zim mob . zim lx . util . Singleton Holder Ċ import Ġjava . util .* Ċ Ċ @ Suppress Lint (" Missing Permission ") Ċ class ĠTw il ight Manager ( private Ġval Ġcontext : ĠContext ) Ġ: ĠHandler . Callback , ĠLocation Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġhandler Ġ= ĠHandler ( Looper . get Main Looper (), Ġthis ) ĊĊĠĠĠ Ġprivate Ġval Ġalarm Manager Ġ= ĠContext Compat . getSystem Service ( context , ĠAlarm Manager :: class . java ) !! ĊĠĠĠ Ġprivate Ġval Ġlocation Manager Ġ= ĠContext Compat . getSystem Service ( context , ĠLocation Manager :: class . java ) !! ĊĊĠĠĠ Ġprivate Ġval Ġlisteners Ġ= ĠArray Map < Tw il ight Listener , ĠHandler >() ĊĠĠĠ Ġprivate Ġvar Ġhas Listeners Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġtime Changed Receiver : ĠBroadcast Receiver ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlast Location : ĠLocation ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġlast Tw il ight State : ĠTw il ight State ? Ġ= Ġcalculate Tw il ight State ( null , Ġnull , ĠSystem . currentTimeMillis ()) ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsynchronized ( listeners ) Ġ{ Ġfield Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( listeners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġlisteners . size Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisteners . key At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= Ġlisteners . value At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Ġ{ Ġlistener . on Tw il ight StateChanged ( value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Available Ġget () Ġ= Ġcontext . check Location Access () ĊĊĠĠĠ Ġprivate Ġval Ġupdate Intent Ġ= ĠIntent ( ACTION _ UPDATE _ TW IL IGHT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Package ( Build Config . APPLICATION _ ID ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . register Receiver ( object Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// d (" on Alarm ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Tw il ight State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĠIntent Filter ( ACTION _ UPDATE _ TW IL IGHT )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister Listener ( listener : ĠTw il ight Listener , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler : ĠHandler ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Available ) Ġthrow ĠIllegalStateException (" location Ġaccess Ġnot Ġavailable ") ĊĠĠĠĠĠĠĠ Ġsynchronized ( listeners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwas Empty Ġ= Ġlisteners . isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners [ listener ] Ġ= Ġhandler ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( was Empty Ġ&& Ġ! listeners . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . handler . send Empty Message ( MSG _ START _ LIST EN ING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunregister Listener ( listener : ĠTw il ight Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( listeners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwas Empty Ġ= Ġlisteners . isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . remove ( listener ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! was Empty Ġ&& Ġlisteners . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . send Empty Message ( MSG _ STOP _ LIST EN ING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( msg . what ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMSG _ START _ LIST EN ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Listeners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Listeners Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Listening () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMSG _ STOP _ LIST EN ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Listeners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Listeners Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Listening () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Listening () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" start Listening ") ĊĊĠĠĠĠĠĠĠ Ġval Ġlocation Provider Ġ= Ġlocation Manager . get Best Provider ( Criteria (), Ġtrue ) ĊĠĠĠĠĠĠĠ Ġif Ġ( location Provider Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Manager . request Location Updates ( location Provider , Ġ 0 , Ġ 0 f , Ġthis , ĠL ooper . get Main Looper ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( location Manager . getLast Known Location ( location Provider ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Manager . request Single Update ( location Provider , Ġthis , ĠL ooper . get Main Looper ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġwhenever Ġthe Ġsystem Ġclock Ġis Ġchanged . ĊĠĠĠĠĠĠĠ Ġif Ġ( time Changed Receiver Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Changed Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Receive : Ġ$ intent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Tw il ight State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Filter Ġ= ĠIntent Filter ( Intent . ACTION _ TIME _ CHANGED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Filter . addAction ( Intent . ACTION _ TIME ZONE _ CHANGED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . register Receiver ( time Changed Receiver , Ġintent Filter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠForce Ġan Ġupdate Ġnow Ġthat Ġwe Ġhave Ġlisteners Ġregistered . ĊĠĠĠĠĠĠĠ Ġupdate Tw il ight State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Listening () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" stop Listening ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( time Changed Receiver Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . unregister Receiver ( time Changed Receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Changed Receiver Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( last Tw il ight State Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Manager . cancel ( Pending Intent . get Broadcast ( context , Ġ 0 , Ġupdate Intent , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlocation Manager . remove Updates ( this ) ĊĠĠĠĠĠĠĠ Ġlast Location Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Tw il ight State () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġthe Ġtw il ight Ġstate Ġbased Ġon Ġthe Ġcurrent Ġtime Ġand Ġlocation . ĊĠĠĠĠĠĠĠ Ġval ĠcurrentTime Millis Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġlast Location Ġ?: Ġlocation Manager . get Best Provider ( Criteria (), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġlocation Manager . getLast Known Location ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġcalculate Tw il ight State ( location ?. latitude , Ġlocation ?. longitude , ĠcurrentTime Millis ) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" update Tw il ight State : Ġ$ state ") ĊĊĠĠĠĠĠĠĠ Ġlast Tw il ight State Ġ= Ġstate ĊĊĠĠĠĠĠĠĠ Ġ// ĠSchedule Ġan Ġalarm Ġto Ġupdate Ġthe Ġstate Ġat Ġthe Ġnext Ġsun rise Ġor Ġsun set . ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrigger At Millis Ġ= Ġif Ġ( state . is Night ) Ġstate . sun rise Time Millis Ġelse Ġstate . sun setTime Millis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Manager . set Exact ( Alarm Manager . RTC , Ġtrigger At Millis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . get Broadcast ( context , Ġ 0 , Ġupdate Intent , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Location Changed ( location : ĠLocation ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLocation Ġproviders Ġmay Ġerr one ously Ġreturn Ġ( 0 . 0 , Ġ 0 . 0 ) Ġwhen Ġthey Ġfail Ġto Ġdetermine Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġdevice 's Ġlocation . ĠThese Ġlocation Ġupdates Ġcan Ġbe Ġsafely Ġignored Ġsince Ġthe Ġchance Ġof Ġa ĊĠĠĠĠĠĠĠ Ġ// Ġuser Ġactually Ġbeing Ġat Ġthese Ġcoordinates Ġis Ġquite Ġlow . ĊĠĠĠĠĠĠĠ Ġif Ġ( location Ġ!= Ġnull Ġ&& Ġ!( location . longitude Ġ== Ġ 0 . 0 Ġ&& Ġlocation . latitude Ġ== Ġ 0 . 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Location Changed :" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġprovider =" Ġ+ Ġlocation . provider ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġaccuracy =" Ġ+ Ġlocation . accuracy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġtime =" Ġ+ Ġlocation . time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Location Ġ= Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Tw il ight State () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Status Changed ( provider : ĠString ?, Ġstatus : ĠInt , Ġextras : ĠBundle ?) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Provider Enabled ( provider : ĠString ?) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Provider Disabled ( provider : ĠString ?) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠSingleton Holder < Tw il ight Manager , ĠContext >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure On MainThread ( use ApplicationContext (:: Tw il ight Manager ))) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Tw il ight Manager " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ UPDATE _ TW IL IGHT Ġ= Ġ"${ Build Config . APPLICATION _ ID }. action . UPDATE _ TW IL IGHT " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ START _ LIST EN ING Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ STOP _ LIST EN ING Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġfun Ġcalculate Tw il ight State ( latitude : ĠDouble ?, Ġlongitude : ĠDouble ?, Ġtime Millis : ĠLong ): ĠTw il ight State ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= ĠCalendar . getInstance (). apply Ġ{ Ġtime In Millis Ġ= Ġtime Millis Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalc Ġ= ĠSun rise S unset Calculator Compat ( latitude , Ġlongitude , Ġc . time Zone ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsun rise Ġ= Ġcalc . get Official Sun rise Calendar For Date ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadjusted S unset : ĠCalendar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadjusted Sun rise : ĠCalendar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sun rise . before ( c )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjusted S unset Ġ= Ġcalc . get Official S unset Calendar For Date ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . add ( Calendar . DATE , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjusted Sun rise Ġ= Ġcalc . get Official Sun rise Calendar For Date ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjusted Sun rise Ġ= Ġsun rise ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . add ( Calendar . DATE , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjusted S unset Ġ= Ġcalc . get Official S unset Calendar For Date ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTw il ight State ( adjusted Sun rise . time In Millis , Ġadjusted S unset . time In Millis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ