/* Ċ Ġ* Ġ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 Ċ Ċ import Ġandroid . os . Count Down Timer Ċ import Ġandroid . util . Log Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠCount down ViewModel Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġseconds In Hour Ġ= ĠTimeUnit . HOUR S . to Seconds ( 1 ) ĊĠĠĠ Ġprivate Ġval Ġseconds In Minute Ġ= ĠTimeUnit . MIN UTES . to Seconds ( 1 ) ĊĊĠĠĠ Ġenum Ġclass ĠStatus Ġ{ ĊĠĠĠĠĠĠĠ ĠINPUT , ĠRUN NING , ĠPA USE , ĠFIN ISHED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINPUT _ MAX _ SIZE Ġ= Ġ 6 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġremaining Time Ġby Ġmutable State Of ( 0 L ) ĊĠĠĠ Ġvar Ġtimer Label Ġby Ġmutable State Of (" 0 0 h Ġ 0 0 m Ġ 0 0 s ") ĊĠĠĠ Ġvar Ġstatus Ġby Ġmutable State Of ( Status . INPUT ) ĊĠĠĠ Ġprivate Ġvar Ġtimer Inputs Ġ= Ġmutable ListOf < Int >() ĊĠĠĠ Ġprivate Ġval Ġtime Multip liers Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠ 1 0 , ĊĠĠĠĠĠĠĠ Ġseconds In Minute , ĊĠĠĠĠĠĠĠ Ġseconds In Minute Ġ* Ġ 1 0 , ĊĠĠĠĠĠĠĠ Ġseconds In Hour , ĊĠĠĠĠĠĠĠ Ġseconds In Hour Ġ* Ġ 1 0 , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġvar Ġcount Down Timer : ĠCount Down Timer ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġformat Time (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠStatus . INPUT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= ĠINPUT _ MAX _ SIZE Ġ- Ġtimer Inputs . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Components Ġ= Ġmutable ListOf < Int >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠINPUT _ MAX _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġoffset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Components . add ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Components . add ( timer Inputs [ i Ġ- Ġoffset ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"% d % dh Ġ% d % dm Ġ% d % ds ". format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Components [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Components [ 1 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Components [ 2 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Components [ 3 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Components [ 4 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Components [ 5 ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtime Ġ= Ġremaining Time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhours Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġminutes Ġ= Ġ 0 L ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( time Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhours Ġ= Ġtime Ġ/ Ġseconds In Hour ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ-= Ġhours Ġ* Ġseconds In Hour ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( time Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminutes Ġ= Ġtime Ġ/ Ġseconds In Minute ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ-= Ġminutes Ġ* Ġseconds In Minute ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"% 0 2 dh Ġ% 0 2 dm Ġ% 0 2 ds ". format ( hours , Ġminutes , Ġtime ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Num Pad Button Clicked ( number : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( timer Inputs . size Ġ== Ġ 0 Ġ&& Ġnumber Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( timer Inputs . size Ġ< Ġ 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Inputs . add ( number ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Label Ġ= Ġformat Time () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠonDelete Button Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( timer Inputs . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Inputs . remove Last () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Label Ġ= Ġformat Time () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġstatus Ġ= ĠStatus . RUNNING ĊĠĠĠĠĠĠĠ Ġremaining Time Ġ= Ġcalculate Time From Input () ĊĊĠĠĠĠĠĠĠ Ġcount Down Timer Ġ= Ġobject Ġ: ĠCount Down Timer ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS . to Millis ( remaining Time ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS . to Millis ( 1 ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tick ( p 0 : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Time Ġ-= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Label Ġ= Ġformat Time () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" countdown ", Ġtimer Label ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Finish () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Timer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcount Down Timer ?. start () ĊĠĠĠĠĠĠĠ Ġstatus Ġ= ĠStatus . RUNNING ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtoggle Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġstatus Ġ= Ġif Ġ( status Ġ== ĠStatus . RUNNING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Down Timer ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . PAUSE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Down Timer ?. start () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . RUNNING ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġcount Down Timer ?. cancel () ĊĠĠĠĠĠĠĠ Ġcount Down Timer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġremaining Time Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġtimer Label Ġ= Ġ" 0 0 h Ġ 0 0 m Ġ 0 0 s " ĊĠĠĠĠĠĠĠ Ġtimer Inputs Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġstatus Ġ= ĠStatus . INPUT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Time From Input (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Time Ġ= Ġ 0 L ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġtimer Inputs . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġtimer Inputs [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Time Ġ+= Ġinput Ġ* Ġtime Multip liers [ timer Inputs . size Ġ- Ġi Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtotal Time ĊĠĠĠ Ġ} Ċ } Ċ