package Ġcom . github . m ue ller ma . table to pt ools . ui . fragments Ċ Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Count Down Timer Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . util . Log Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . core . content . edit Ċ import Ġandroidx . core . view . isIn visible Ċ import Ġandroidx . core . view . isVisible Ċ import Ġcom . github . m ue ller ma . table to pt ools . R Ċ import Ġcom . github . m ue ller ma . table to pt ools . ui . dialog . Timer Picker Dialog Ċ import Ġcom . github . m ue ller ma . table to pt ools . utils . preferences Ċ import Ġjava . util . concurrent . TimeUnit ĊĊ Ċ class ĠTimer Fragment Ġ: ĠAbstract Base Fragment () Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtimer View 1 : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtimer View 2 : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstart Button : ĠButton ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġreset Button : ĠButton ĊĠĠĠ Ġprivate Ġvar Ġtimer : ĠCount Down Timer ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġoriginal Time : ĠLong Ġ= ĠDEFAULT _ TIMER ĊĠĠĠ Ġprivate Ġvar Ġremaining Time : ĠLong Ġ= Ġoriginal Time ĊĠĠĠ Ġprivate Ġvar Ġtimer Running Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġplayer : ĠMedia Player ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= Ġactivity ?. preferences () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġprevious Time Millis Ġ= Ġprefs . getLong ( PREVIOUS _ M ILL IS , ĠDEFAULT _ TIMER ) ĊĠĠĠĠĠĠĠ Ġoriginal Time Ġ= Ġprevious Time Millis ĊĠĠĠĠĠĠĠ Ġremaining Time Ġ= Ġoriginal Time ĊĠĠĠĠĠĠĠ Ġchild FragmentManager . set Fragment Result Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimer Picker Dialog . RESULT _ KEY , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġbundle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminute Ġ= Ġbundle . getInt ( Timer Picker Dialog . MINUTE _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= Ġbundle . getInt ( Timer Picker Dialog . SECOND _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange Timer Time ( get Millis From Minutes And Seconds ( minute , Ġseconds )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange Timer Time ( time : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( time Ġ<= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoriginal Time Ġ= Ġtime ĊĠĠĠĠĠĠĠ Ġremaining Time Ġ= Ġoriginal Time ĊĠĠĠĠĠĠĠ Ġactivity ?. preferences ()?. edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Long ( PREVIOUS _ M ILL IS , Ġtime ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Timer View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Millis From Minutes And Seconds ( minutes : ĠInt , Ġseconds : ĠInt ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ġ= ĠTimeUnit . MIN UTES . to Millis ( minutes . to Long ()) ĊĠĠĠĠĠĠĠ Ġtotal Ġ+= ĠTimeUnit . SECONDS . to Millis ( seconds . to Long ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġtotal ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onCreate View () ") ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġinflater . inflate ( R . layout . fragment _ timer , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġtimer View 1 Ġ= Ġroot . findViewById ( R . id . timer _ view 1 ) ĊĠĠĠĠĠĠĠ Ġtimer View 2 Ġ= Ġroot . findViewById ( R . id . timer _ view 2 ) ĊĠĠĠĠĠĠĠ Ġstart Button Ġ= Ġroot . findViewById ( R . id . start _ button ) ĊĠĠĠĠĠĠĠ Ġreset Button Ġ= Ġroot . findViewById ( R . id . reset _ button ) ĊĊĠĠĠĠĠĠĠ Ġstart Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Timer () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreset Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Timer () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠsavedInstanceState ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Time Ġ= Ġit . getLong (" time ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . getBoolean (" running ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Timer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate Timer View () ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġroot ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer ?. stop () ĊĠĠĠĠĠĠĠ Ġif Ġ( timer Running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Timer () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġremaining Time Ġ= Ġoriginal Time ĊĠĠĠĠĠĠĠ Ġupdate Timer View () ĊĠĠĠĠĠĠĠ Ġstart Button . isEnabled Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Start Ġbutton Ġis Ġ${ start Button . height } Ġhigh ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer View 1 . isVisible Ġ= Ġstart Button . height Ġ> Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( timer Running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Button . text Ġ= ĠgetString ( R . string . timer _ start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Button . isIn visible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Timer ( remaining Time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Button . text Ġ= ĠgetString ( R . string . timer _ pause ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Button . isIn visible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Timer ( millis : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" start Timer () ") ĊĠĠĠĠĠĠĠ Ġtimer ?. cancel () ĊĠĠĠĠĠĠĠ Ġtimer Ġ= Ġobject Ġ: ĠCount Down Timer ( millis , Ġ 5 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tick ( millis Until Finished : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Time Ġ= Ġmillis Until Finished ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Timer View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Finish () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Timer Ġfinished ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Time Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Timer View () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ= ĠMedia Player . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . System . DEFAULT _ RING T ONE _ URI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Timer View () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġtime ToString () ĊĠĠĠĠĠĠĠ Ġtimer View 1 . text Ġ= Ġtext ĊĠĠĠĠĠĠĠ Ġtimer View 2 . text Ġ= Ġtext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtime ToString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremaining InSeconds Ġ= Ġremaining Time Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= Ġremaining InSeconds Ġ/ Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= Ġremaining InSeconds Ġ% Ġ 6 0 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ"% d :% 0 2 d ". format ( minutes , Ġseconds ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Destroy () ") ĊĠĠĠĠĠĠĠ Ġtimer ?. cancel () ĊĠĠĠĠĠĠĠ Ġplayer ?. stop () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout State . put Long (" time ", Ġremaining Time ) ĊĠĠĠĠĠĠĠ Ġout State . put Boolean (" running ", Ġtimer Running ) ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . menu _ timer , Ġmenu ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . edit _ time Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrigger Timer Picker Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtrigger Timer Picker Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġreset Timer () ĊĠĠĠĠĠĠĠ ĠTimer Picker Dialog (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠTimer Picker Dialog . create Bundle ( original Time ) ĊĠĠĠĠĠĠĠ Ġ}. show ( child FragmentManager , ĠTimer Picker Dialog . TAG ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠTAG Ġ= ĠTimer Fragment :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPRE V IOUS _ M ILL IS Ġ= Ġ" PREVIOUS _ M ILL IS " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ TIMER Ġ= Ġ 5 Ġ* Ġ 6 0 Ġ* Ġ 1 0 0 0 L ĊĠĠĠ Ġ} Ċ }