package Ġcom . est z he . timer . activities čĊč Ċ import Ġandroid . content . Intent č Ċ import Ġandroid . graphics . Color č Ċ import Ġandroid . media . Audio Attributes č Ċ import Ġandroid . os . Bundle č Ċ import Ġandroid . os . V ibration Effect č Ċ import Ġandroid . os . V ibr ator č Ċ import Ġandroid . view . View č Ċ import Ġandroidx . lifecycle . Lifecycle č Ċ import Ġandroidx . lifecycle . Lifecycle Observer č Ċ import Ġandroidx . we ar . ambient . Ambient Mode Support č Ċ import Ġcom . est z he . timer .* č Ċ import Ġcom . est z he . timer . activities . utility .* č Ċ import Ġcom . est z he . timer . activities . utility . Ambient Callback č Ċ import Ġcom . est z he . timer . views . Dial View č Ċ import Ġjava . time . Instant č Ċ import Ġkotlin . math . ceil č Ċ import Ġkotlin . math . round ToInt čĊč Ċ // ĠTODO : Ġambient Ġburn - in Ġprotection č Ċ // ĠTODO : Ġambient Ġant ialias ing Ġon Ġfor Ġlow bit Ġ/ Ġoff Ġotherwise č Ċ // ĠTODO : Ġsound čĊč Ċ class ĠTimer Activity čĊĠĠĠĠĠ Ġ: ĠBase Timer Activity (), čĊĠĠĠĠĠĠĠ ĠAmb ient Mode Support . Ambient Callback Provider , čĊĠĠĠĠĠĠĠ ĠAmb ient Callback . On Ambient Listener , čĊĠĠĠĠĠĠĠ ĠView . On Long ClickListener č Ċ { čĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ IS _ ALARM Ġ= Ġ" is _ alarm " čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġambient Mode Controller : ĠAmb ient Mode Support . Ambient Controller čĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdial : ĠD ial View čĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpause Overlay : ĠView čĊčĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġscheduler : ĠPeriod ic Routine čĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġactive Mode Scheduler : ĠHandler Periodic Routine čĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġambient Mode Scheduler : ĠAlarm Manager Periodic Routine čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠIndicates Ġwhether Ġan Ġalarm Ġnotification Ġwas Ġreceived . čĊĠĠĠĠ Ġ* ĠIf Ġtrue , Ġthis Ġactivity Ġis Ġshowing Ġalarm Ġanimation Ġ( blink ing , Ġvi br ating , Ġetc ). čĊĠĠĠĠ Ġ* ĠIf Ġfalse , Ġthis Ġactivity Ġis Ġshowing Ġvisual Ġcount down Ġtimer . čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġval Ġalarm Received : ĠBoolean Ġget () Ġ= Ġintent . extras ?. getBoolean ( EXTRA _ IS _ ALARM ) Ġ?: Ġfalse čĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġalarm Animation : ĠAlarm Animation čĊčĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) čĊčĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ timer ) čĊĠĠĠĠĠĠĠ Ġambient Mode Controller Ġ= ĠAmb ient Mode Support . attach ( this ) čĊĠĠĠĠĠĠĠ Ġdial Ġ= ĠfindViewById < Dial View >( R . id . dial ). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Long ClickListener ( this @ Timer Activity ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġpause Overlay Ġ= ĠfindViewById ( R . id . pause Overlay ) čĊčĊĠĠĠĠĠĠĠ Ġactive Mode Scheduler Ġ= ĠHandler Periodic Routine ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 0 0 , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠPeriod ic Routine . On Trigger Listener Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Trigger () Ġ= Ġon Scheduler Trigger () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) čĊĠĠĠĠĠĠĠ Ġambient Mode Scheduler Ġ= ĠAlarm Manager Periodic Routine ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 5 0 0 0 , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠPeriod ic Routine . On Trigger Listener Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Trigger () Ġ= Ġon Scheduler Trigger () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) čĊĠĠĠĠĠĠĠ Ġscheduler Ġ= Ġactive Mode Scheduler čĊčĊĠĠĠĠĠĠĠ Ġalarm Animation Ġ= ĠAlarm Animation ( this , Ġdial ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . on Resume () čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( alarm Received ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Animation . start () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġscheduler . start () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . on Pause () čĊĠĠĠĠĠĠĠ Ġscheduler . stop () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon New Intent ( intent : ĠIntent ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . on New Intent ( intent ) čĊĠĠĠĠĠĠĠ Ġset Intent ( intent ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Long Click ( v : ĠView ): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( alarm Received ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġon User Action () čĊčĊĠĠĠĠĠĠĠ Ġval Ġtimer : ĠTimer Ġ= Ġtimer Manager . active Timer Ġ?: Ġreturn Ġfalse čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( timer . is Paused ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpause Overlay . visibility Ġ= ĠView . IN VISIBLE čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Manager . start Timer ( timer ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpause Overlay . visibility Ġ= ĠView . VISIBLE čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Manager . pause Active Timer () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġreturn Ġtrue čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ čĊĠĠĠĠĠĠĠ Ġalarm Animation . end () čĊĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Enter Ambient ( ambient Details : ĠBundle ) Ġ{ čĊĠĠĠĠĠĠĠ Ġscheduler . stop () čĊĠĠĠĠĠĠĠ Ġscheduler Ġ= Ġambient Mode Scheduler čĊčĊĠĠĠĠĠĠĠ Ġ// Ġon Enter Ambient / on Exit Ambient Ġcan Ġget Ġcalled Ġwhen Ġstate Ġis ĠPA USED . čĊĠĠĠĠĠĠĠ Ġif Ġ( lifecycle . currentState Ġ== ĠLifecycle . State . RE SU MED ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġscheduler . start () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Exit Ambient () Ġ{ čĊĠĠĠĠĠĠĠ Ġscheduler . stop () čĊĠĠĠĠĠĠĠ Ġscheduler Ġ= Ġactive Mode Scheduler čĊčĊĠĠĠĠĠĠĠ Ġ// Ġon Enter Ambient / on Exit Ambient Ġcan Ġget Ġcalled Ġwhen Ġstate Ġis ĠPA USED . čĊĠĠĠĠĠĠĠ Ġif Ġ( lifecycle . currentState Ġ== ĠLifecycle . State . RE SU MED ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġscheduler . start () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġget Ambient Callback (): ĠAmb ient Mode Support . Ambient Callback Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn ĠAmb ient Callback ( this ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġon Scheduler Trigger () Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( alarm Received ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdial . value Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpause Overlay . visibility Ġ= ĠView . IN VISIBLE čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimer Ġ= Ġtimer Manager . active Timer čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġdial . value Ġ= Ġwhen Ġ( timer ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġceil ( dial . max Value Ġ* Ġtimer . time Left . seconds Ġ/ Ġ 3 6 0 0 . 0 ). round ToInt () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġpause Overlay . visibility Ġ= Ġwhen Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Ġ== Ġnull Ġ-> ĠView . IN VISIBLE čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . isRunning Ġ-> ĠView . IN VISIBLE čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠView . VISIBLE čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġalarm Animation . animate Once If Started () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġclass ĠAlarm Animation ( čĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontext : ĠTimer Activity , čĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdial : ĠD ial View ) čĊĠĠĠ Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġstarted : ĠBoolean Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset čĊčĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġanimation EndTime : ĠInstant ? Ġ= Ġnull čĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġvi br ator : ĠV ibr ator Ġ= Ġcontext . getSystem Service ( V ibr ator :: class . java ) !! čĊčĊĠĠĠĠĠĠĠ Ġinit Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdial . setOnClickListener Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( started ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . on User Action () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġfun Ġstart () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( started ) Ġreturn čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġstarted Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation EndTime Ġ= ĠInstant . now (). plus Seconds ( 6 0 ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvi br ator . vi br ate ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ibration Effect . create Wave form ( long ArrayOf ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , čĊč ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 0 , Ġ 2 0 0 , Ġ 1 0 0 , Ġ 2 0 0 , Ġ 1 0 0 , Ġ 2 0 0 , Ġ 1 0 0 , Ġ 2 0 0 , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 0 , Ġ 1 0 0 , Ġ 1 0 0 , Ġ 1 0 0 , Ġ 1 0 0 , Ġ 2 0 0 , Ġ 1 0 0 , Ġ 2 0 0 , Ġ 1 0 0 , Ġ 2 0 0 , Ġ 1 0 0 , Ġ 2 0 0 , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 0 , Ġ 1 0 0 , Ġ 1 0 0 , Ġ 1 0 0 , Ġ 1 0 0 , Ġ 2 0 0 , Ġ 1 0 0 , Ġ 2 0 0 , Ġ 1 0 0 , Ġ 2 0 0 , Ġ 1 0 0 , Ġ 2 0 0 , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 0 , Ġ 1 0 0 , Ġ 1 0 0 , Ġ 1 0 0 , Ġ 1 0 0 , Ġ 1 0 0 , Ġ 1 0 0 , Ġ 1 0 0 , Ġ 1 0 0 , Ġ 1 0 0 , ĠĠ 5 0 , ĠĠ 5 0 , Ġ 1 0 0 , Ġ 8 0 0 ), Ġ- 1 ), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Attributes . Builder (). set Flags ( Audio Attributes . USAGE _ ALARM ). build ()) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġfun Ġanimate Once If Started () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! started ) Ġreturn čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġdial . rim Color Ġ= ĠColor . GREEN čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( animation EndTime !! Ġ< ĠInstant . now ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġfun Ġend () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! started ) Ġreturn čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvi br ator . cancel () čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠSelect Timer Activity :: class . java ). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ ACTIVITY _ RE ORDER _ TO _ FRONT čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . finish () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ }