/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 . best . desk clock . timer Ċ Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . IB inder Ċ Ċ import Ġcom . best . desk clock . Desk Clock Ċ import Ġcom . best . desk clock . R Ċ import Ġcom . best . desk clock . data . DataModel Ċ import Ġcom . best . desk clock . data . Timer Ċ import Ġcom . best . desk clock . events . Events Ċ import Ġcom . best . desk clock . uid ata . Ui DataModel Ċ Ċ /** Ċ Ġ* Ċ Ġ* ĠThis Ġservice Ġexists Ġsole ly Ġto Ġallow Ġ[ android . app . Alarm Manager ] Ġand Ġtimer Ġnotifications Ċ Ġ* Ġto Ġalter Ġthe Ġstate Ġof Ġtimers Ġwithout Ġdist ur bing Ġthe Ġnotification Ġsh ade . ĠIf Ġan Ġactivity Ġwere Ġused Ċ Ġ* Ġinstead Ġ( even Ġone Ġthat Ġis Ġnot Ġdisplayed ) Ġthe Ġnotification Ġmanager Ġimplicitly Ġcloses Ġthe Ċ Ġ* Ġnotification Ġsh ade Ġwhich Ġcl ashes Ġwith Ġthe Ġuse Ġcase Ġof Ġstarting / pa using / reset ting Ġtimers Ġwithout Ċ Ġ* Ġdist ur bing Ġthe Ġnotification Ġsh ade . Ċ Ġ* Ċ Ġ* ĠThe Ġservice Ġhas Ġa Ġsecond Ġbenefit . ĠIt Ġis Ġused Ġto Ġstart Ġheads - up Ġnotifications Ġfor Ġexpired Ċ Ġ* Ġtimers Ġin Ġthe Ġforeground . ĠThis Ġkeeps Ġthe Ġentire Ġapplication Ġin Ġthe Ġforeground Ġand Ġthus Ġprevents Ċ Ġ* Ġthe Ġoperating Ġsystem Ġfrom Ġk illing Ġit Ġwhile Ġexpired Ġtimers Ġare Ġf iring . Ċ Ġ*/ Ċ class ĠTimer Service Ġ: ĠService () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ): ĠI Binder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent , Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġintent . action ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= Ġintent . getInt Extra ( Events . EXTRA _ EVENT _ LABEL , ĠR . string . label _ intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ UPDATE _ NOTIFICATION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Model . data Model . update Timer Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ RESET _ EXPI RED _ TIM ERS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Model . data Model . reset Or Delete Expired Timers ( label ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ RESET _ UN EXPI RED _ TIM ERS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Model . data Model . reset Un expired Timers ( label ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ RESET _ MIS SED _ TIM ERS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Model . data Model . reset Mis sed Timers ( label ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLook Ġup Ġthe Ġtimer Ġin Ġquestion . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimer Id Ġ= Ġintent . getInt Extra ( EXTRA _ TIMER _ ID , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġtimer Ġcannot Ġbe Ġlocated , Ġignore Ġthe Ġaction . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimer : ĠTimer Ġ= ĠData Model . data Model . get Timer ( timer Id ) Ġ?: Ġreturn ĠSTART _ NOT _ STICK Y ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ SHOW _ TIMER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvents . send Timer Event ( R . string . action _ show , Ġlabel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠChange Ġto Ġthe Ġtimers Ġtab . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUi DataModel . ui DataModel . selected Tab Ġ= ĠUi DataModel . Tab . TIM ERS ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOpen ĠDes k Clock Ġwhich Ġis Ġnow Ġposition ed Ġon Ġthe Ġtimers Ġtab Ġand Ġshow Ġthe Ġtimer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġquestion . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshow Timers Ġ= ĠIntent ( this , ĠDes k Clock :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( EXTRA _ TIMER _ ID , Ġtimer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( show Timers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ START _ TIMER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvents . send Timer Event ( R . string . action _ start , Ġlabel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Model . data Model . start Timer ( this , Ġtimer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ PAUSE _ TIMER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvents . send Timer Event ( R . string . action _ pause , Ġlabel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Model . data Model . pause Timer ( timer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ ADD _ MINUTE _ TIMER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvents . send Timer Event ( R . string . action _ add _ minute , Ġlabel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Model . data Model . add Timer Minute ( timer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ RESET _ TIMER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Model . data Model . reset Or Delete Timer ( timer , Ġlabel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ TIMER _ EXPI RED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvents . send Timer Event ( R . string . action _ fire , Ġlabel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Model . data Model . expire Timer ( this , Ġtimer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġservice Ġis Ġforeground Ġwhen Ġexpired Ġtimers Ġexist Ġand Ġstopped Ġwhen Ġnone Ġexist . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DataModel . data Model . expired Timers . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ PREFIX Ġ= Ġ" com . best . desk clock . action ." ĊĊĠĠĠĠĠĠĠ Ġ/** ĠShows Ġthe Ġtab Ġwith Ġtimers ; Ġscroll s Ġto Ġa Ġspecific Ġtimer . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ SHOW _ TIMER Ġ= ĠACTION _ PREFIX Ġ+ Ġ" SHOW _ TIMER " ĊĠĠĠĠĠĠĠ Ġ/** ĠPause s Ġrunning Ġtimers ; Ġresets Ġexpired Ġtimers . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ PAUSE _ TIMER Ġ= ĠACTION _ PREFIX Ġ+ Ġ" PAUSE _ TIMER " ĊĠĠĠĠĠĠĠ Ġ/** ĠStarts Ġthe Ġsole Ġtimer . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ START _ TIMER Ġ= ĠACTION _ PREFIX Ġ+ Ġ" START _ TIMER " ĊĠĠĠĠĠĠĠ Ġ/** ĠRe sets Ġthe Ġtimer . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ RESET _ TIMER Ġ= ĠACTION _ PREFIX Ġ+ Ġ" RESET _ TIMER " ĊĠĠĠĠĠĠĠ Ġ/** ĠAdds Ġan Ġextra Ġminute Ġto Ġthe Ġtimer . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ ADD _ MINUTE _ TIMER Ġ= ĠACTION _ PREFIX Ġ+ Ġ" ADD _ MINUTE _ TIMER " ĊĠĠĠĠĠĠĠ Ġ/** ĠExtra Ġfor Ġmany Ġactions Ġspecific Ġto Ġa Ġgiven Ġtimer . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ TIMER _ ID Ġ= Ġ" com . best . desk clock . extra . TIMER _ ID " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ TIMER _ EXPI RED Ġ= ĠACTION _ PREFIX Ġ+ Ġ" TIMER _ EXPI RED " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ UPDATE _ NOTIFICATION Ġ= ĠACTION _ PREFIX Ġ+ Ġ" UPDATE _ NOTIFICATION " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ RESET _ EXPI RED _ TIM ERS Ġ= ĠACTION _ PREFIX Ġ+ Ġ" RESET _ EXPI RED _ TIM ERS " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ RESET _ UN EXPI RED _ TIM ERS Ġ= ĠACTION _ PREFIX Ġ+ Ġ" RESET _ UN EXPI RED _ TIM ERS " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ RESET _ MIS SED _ TIM ERS Ġ= ĠACTION _ PREFIX Ġ+ Ġ" RESET _ MIS SED _ TIM ERS " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Timer Expired Intent ( context : ĠContext , Ġtimer : ĠTimer ?): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimer Id Ġ= Ġtimer ?. id Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( context , ĠTimer Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( ACTION _ TIMER _ EXPI RED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( EXTRA _ TIMER _ ID , Ġtimer Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Reset Expired Timers Intent ( context : ĠContext ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( context , ĠTimer Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( ACTION _ RESET _ EXPI RED _ TIM ERS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Reset Un expired Timers Intent ( context : ĠContext ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( context , ĠTimer Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( ACTION _ RESET _ UN EXPI RED _ TIM ERS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Reset Mis sed Timers Intent ( context : ĠContext ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( context , ĠTimer Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( ACTION _ RESET _ MIS SED _ TIM ERS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Add Minute Timer Intent ( context : ĠContext , Ġtimer Id : ĠInt ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( context , ĠTimer Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( ACTION _ ADD _ MINUTE _ TIMER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( EXTRA _ TIMER _ ID , Ġtimer Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Update Notification Intent ( context : ĠContext ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( context , ĠTimer Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( ACTION _ UPDATE _ NOTIFICATION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }