/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 . example . android dev challenge . ui . timer Ċ Ċ import Ġandroid . os . Count Down Timer Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ Ċ class ĠTimer ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Counter : ĠCount Down Timer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġ_ hour Ġ= ĠMutable State Flow ( 0 ) ĊĠĠĠ Ġval Ġhour : ĠState Flow < Int > Ġ= Ġ_ hour ĊĊĠĠĠ Ġprivate Ġval Ġ_ minute Ġ= ĠMutable State Flow ( 0 ) ĊĠĠĠ Ġval Ġminute : ĠState Flow < Int > Ġ= Ġ_ minute ĊĊĠĠĠ Ġprivate Ġval Ġ_ second Ġ= ĠMutable State Flow ( 0 ) ĊĠĠĠ Ġval Ġsecond : ĠState Flow < Int > Ġ= Ġ_ second ĊĊĠĠĠ Ġprivate Ġval Ġ_ is Start Ġ= ĠMutable State Flow ( false ) ĊĠĠĠ Ġval Ġis Start : ĠState Flow < Boolean > Ġ= Ġ_ is Start ĊĊĠĠĠ Ġprivate Ġval Ġ_ is Playing Ġ= ĠMutable State Flow ( false ) ĊĠĠĠ Ġval Ġis Playing : ĠState Flow < Boolean > Ġ= Ġ_ is Playing ĊĊĠĠĠ Ġprivate Ġvar Ġinit Hour Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġinit Minute Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġinit Second Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġduration : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġcurrent Progress : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġon Hour Changed ( h : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Hour Ġ= Ġh ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Minute Changed ( m : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Minute Ġ= Ġm ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Second Changed ( s : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Second Ġ= Ġs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġcancel Counter () ĊĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" wave ver _ tag ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" start (), Ġinit Hour =$ init Hour , Ġinit Minute =$ init Minute , Ġinit Second =$ init Second " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( init Hour Ġ<= Ġ 0 Ġ&& Ġinit Minute Ġ<= Ġ 0 Ġ&& Ġinit Second Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ_ is Playing . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ_ is Start . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġstart Counter ( init Hour , Ġinit Minute , Ġinit Second ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Counter ( h : ĠInt , Ġm : ĠInt , Ġs : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġduration Ġ= Ġh . hour 2 Millis () Ġ+ Ġm . minute 2 Millis () Ġ+ Ġs . second 2 Millis () ĊĠĠĠĠĠĠĠ ĠLog . d (" wave ver _ tag ", Ġ" start , Ġduration =$ duration ") ĊĠĠĠĠĠĠĠ Ġm Counter Ġ= Ġobject Ġ: ĠCount Down Timer ( duration , Ġ 1 _ 0 0 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tick ( millis : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ hour . value Ġ= Ġ( millis Ġ/ Ġ 1 . hour 2 Millis ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ minute . value Ġ= Ġ(( millis Ġ- Ġ_ hour . value . hour 2 Millis ()) Ġ/ Ġ 1 . minute 2 Millis ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ second . value Ġ= Ġ(( millis Ġ- Ġ_ hour . value . hour 2 Millis () Ġ- Ġ_ minute . value . minute 2 Millis ()) Ġ/ Ġ 1 . second 2 Millis ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Progress Ġ= Ġhour . value . hour 2 Millis () Ġ+ Ġminute . value . minute 2 Millis () Ġ+ Ġsecond . value . second 2 Millis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Finish () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Counter Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Hour Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Minute Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Second Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ hour . value Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ minute . value Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ second . value Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Counter ?. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcancel Counter () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Counter Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġm Counter ?. cancel () ĊĠĠĠĠĠĠĠ Ġm Counter Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġend () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d (" wave ver _ tag ", Ġ" end () ") ĊĠĠĠĠĠĠĠ Ġ_ is Start . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ_ is Playing . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġcancel Counter () ĊĠĠĠĠĠĠĠ Ġinit Hour Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġinit Minute Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġinit Second Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ_ hour . value Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ_ minute . value Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ_ second . value Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplay () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Start . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Playing . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Playing . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Counter ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Counter Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Playing . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Counter ( hour . value , Ġminute . value , Ġsecond . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreplay () Ġ{ ĊĠĠĠĠĠĠĠ Ġcancel Counter () ĊĠĠĠĠĠĠĠ Ġif Ġ( init Hour Ġ<= Ġ 0 Ġ&& Ġinit Minute Ġ<= Ġ 0 Ġ&& Ġinit Second Ġ<= Ġ 0 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġ_ hour . value Ġ= Ġinit Hour ĊĠĠĠĠĠĠĠ Ġ_ minute . value Ġ= Ġinit Minute ĊĠĠĠĠĠĠĠ Ġ_ second . value Ġ= Ġinit Second ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠInt . hour 2 Millis (): ĠLong Ġ= Ġ( this Ġ* Ġ 6 0 Ġ* Ġ 6 0 ). second 2 Millis () ĊĠĠĠ Ġfun ĠInt . minute 2 Millis (): ĠLong Ġ= Ġ( this Ġ* Ġ 6 0 ). second 2 Millis () ĊĠĠĠ Ġfun ĠInt . second 2 Millis (): ĠLong Ġ= Ġthis Ġ* Ġ 1 _ 0 0 0 L Ċ } Ċ