package Ġred . pad raig . tw ot app . timer čĊč Ċ import Ġandroid . content . Context č Ċ import Ġandroid . os . Count Down Timer č Ċ import Ġandroid . widget . Number Picker č Ċ import Ġio . reactivex . Flow able č Ċ import Ġio . reactivex . functions . Function 3 č Ċ import Ġio . reactivex . subjects . Behavior Subject č Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* č Ċ import Ġred . pad raig . tw ot app . R č Ċ import Ġred . pad raig . tw ot app . alarm . Alarm Broadcast Setter č Ċ import Ġred . pad raig . tw ot app . ui . activities . MainActivity čĊč Ċ /** čĊ Ġ* ĠCreated Ġby ĠRed Ġon Ġ 2 6 / 0 9 / 2 0 1 7 . čĊ Ġ*/ č Ċ class ĠTimer Controller ( private Ġval Ġcontext : ĠContext ) Ġ{ čĊčĊĠĠĠ Ġprivate Ġval ĠT ICK _ INTERVAL Ġ= Ġ 1 0 L čĊčĊĠĠĠ Ġprivate Ġval Ġtimer Model : ĠTimer Model Ġ= ĠTimer Model ( context . get SharedPreferences ( context . getString ( R . string . app _ name ), ĠContext . MODE _ PRIVATE ) Ġ) čĊĠĠĠ Ġprivate Ġval Ġalarm Setter Ġ= ĠAlarm Broadcast Setter . Impl () čĊčĊĠĠĠ Ġprivate Ġval Ġhours Picker : ĠNumber Picker Ġ= Ġ( context Ġas ĠMainActivity ). number picker _ main _ hours čĊĠĠĠ Ġprivate Ġval Ġminutes Picker : ĠNumber Picker Ġ= Ġ( context Ġas ĠMainActivity ). number picker _ main _ minutes čĊĠĠĠ Ġprivate Ġval Ġseconds Picker : ĠNumber Picker Ġ= Ġ( context Ġas ĠMainActivity ). number picker _ main _ seconds čĊčĊĠĠĠ Ġprivate Ġvar Ġtimer : ĠCount Down Timer ? Ġ= Ġnull čĊĠĠĠ Ġprivate Ġvar Ġmillis Remaining : ĠLong Ġ= Ġ- 1 Ġ// Ġ- 1 Ġwhen Ġno Ġtimer Ġactive čĊčĊĠĠĠ Ġvar Ġtimer Tick : ĠBehavior Subject < Long > Ġ= ĠBehavior Subject . create () čĊčĊĠĠĠ Ġval Ġtimer Active : ĠBoolean čĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( timer Model . getActive Timer Due Time () Ġ!= Ġ- 1 L ) čĊčĊĠĠĠ Ġval Ġtimer Paused : ĠBoolean čĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( timer Model . get Paused Timer () Ġ!= Ġ- 1 L ) čĊčĊĠĠĠ Ġinit Ġ{ čĊĠĠĠĠĠĠĠ Ġtimer Model . hours Changed . subscribe Ġ{ Ġhours Picker . value Ġ= Ġit Ġ} čĊĠĠĠĠĠĠĠ Ġtimer Model . minutes Changed . subscribe Ġ{ Ġminutes Picker . value Ġ= Ġit } čĊĠĠĠĠĠĠĠ Ġtimer Model . seconds Changed . subscribe Ġ{ Ġseconds Picker . value Ġ= Ġit } čĊčĊĠĠĠĠĠĠĠ Ġhours Picker . setOn ValueChanged Listener Ġ{ Ġ_, Ġ_, Ġhours Ġ-> Ġtimer Model . hours Ġ= Ġhours Ġ} čĊĠĠĠĠĠĠĠ Ġminutes Picker . setOn ValueChanged Listener Ġ{ Ġ_, Ġ_, Ġminutes Ġ-> Ġtimer Model . minutes Ġ= Ġminutes Ġ} čĊĠĠĠĠĠĠĠ Ġseconds Picker . setOn ValueChanged Listener Ġ{ Ġ_, Ġ_, Ġseconds Ġ-> Ġtimer Model . seconds Ġ= Ġseconds Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġstart Timer () Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġmillis : ĠLong čĊĠĠĠĠĠĠĠ Ġif Ġ( timer Active ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmillis Ġ= Ġtimer Model . getActive Timer Due Time () Ġ- ĠSystem . currentTimeMillis () čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( timer Paused ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmillis Ġ= Ġtimer Model . get Paused Timer () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmillis Remaining Ġ= Ġmillis čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Tick . onNext ( millis ) čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmillis Ġ= Ġtimer Model . millis čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġtimer Ġ= Ġcreate Timer ( millis ). start () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġpause Timer () Ġ{ čĊĠĠĠĠĠĠĠ Ġcancel Timer () čĊĠĠĠĠĠĠĠ Ġtimer Model . save Paused Timer ( millis Remaining ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġresume Timer () Ġ{ čĊĠĠĠĠĠĠĠ Ġtimer Ġ= Ġcreate Timer ( millis Remaining ). start () čĊĠĠĠĠĠĠĠ Ġtimer Model . clear Paused Timer () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġreset Timer () Ġ{ čĊĠĠĠĠĠĠĠ Ġcancel Timer () čĊĠĠĠĠĠĠĠ Ġtimer Model . clear Paused Timer () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġrestore Settings () Ġ= Ġtimer Model . restore Settings () čĊčĊĠĠĠ Ġfun Ġsave Settings () Ġ= Ġtimer Model . save Settings () čĊčĊĠĠĠ Ġfun Ġcreate Enable Start Button Flow able (): ĠFlow able < Boolean > Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn ĠFlow able . combine Latest ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Model . hours Changed , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Model . minutes Changed , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Model . seconds Changed , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFunction 3 < Int , ĠInt , ĠInt , ĠBoolean > Ġ{ Ġhours , Ġminutes , Ġseconds Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! (( hours Ġ== Ġ 0 ) Ġ&& Ġ( minutes Ġ== Ġ 0 ) Ġ&& Ġ( seconds Ġ== Ġ 0 )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġcreate Timer ( timer Millis : ĠLong ): ĠCount Down Timer Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġdue Time Ġ= ĠSystem . currentTimeMillis () Ġ+ Ġtimer Millis čĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġbroadcast Ġwith ĠOS čĊĠĠĠĠĠĠĠ Ġalarm Setter . set ( context , Ġdue Time ) čĊĠĠĠĠĠĠĠ Ġ// ĠStore Ġtimer Ġin Ġpersistent Ġstorage čĊĠĠĠĠĠĠĠ Ġtimer Model . save Active Timer Due Time ( due Time ) čĊčĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠCount Down Timer ( timer Millis , ĠT ICK _ INTERVAL ) Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Finish () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Tick . onNext ( 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmillis Remaining Ġ= Ġ- 1 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tick ( millis Remaining : ĠLong ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Tick . onNext ( millis Remaining ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Timer Controller . millis Remaining Ġ= Ġmillis Remaining čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġcancel Timer () Ġ{ čĊĠĠĠĠĠĠĠ Ġalarm Setter . cancel ( context ) čĊĠĠĠĠĠĠĠ Ġtimer ?. cancel () čĊĠĠĠĠĠĠĠ Ġtimer Model . clear Active Timer Due Time () čĊĠĠĠ Ġ} č Ċ } čĊ