/* Ċ Ġ* Ġ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 Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġjava . util . Date Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠCount Down Life Cycle Observer Ġprovides Ġa Ġcount down Ġto Ġbe Ġused Ġin Ġconjunction Ġwith Ġa ĠLife Cycle Ċ Ġ*/ Ċ class ĠCount Down ViewModel Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġ// ĠTime ĊĠĠĠ Ġvar Ġtimer Properties Ġ= ĠMutable LiveData ( Count Down Time Props ()) ĊĊĠĠĠ Ġprivate Ġval Ġ_ count Down Status Ġ= ĠMutable LiveData < Count Down Status >() ĊĠĠĠ Ġval Ġcount Down Status : ĠLive Data < Count Down Status > Ġ= Ġ_ count Down Status ĊĊĠĠĠ Ġprivate Ġval ĠTIMER _ INTERVAL _ IN _ M ILL IS Ġ= Ġ 1 0 0 0 L ĊĠĠĠ Ġprivate Ġvar Ġcount Down Timer : ĠCount Down Timer ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġstart Count down () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġinterval Ġso Ġcount down Ġstarts Ġ 1 Ġsecond Ġafter Ġit 's Ġbeen Ġcalled ĊĠĠĠĠĠĠĠ Ġval ĠendTime Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Properties . value ?. generate Count Down End () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠDate (). time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ ĠTIMER _ INTERVAL _ IN _ M ILL IS ĊĠĠĠĠĠĠĠ Ġcount Down Timer Ġ= Ġobject Ġ: ĠCount Down Timer ( endTime Ġ- ĠDate (). time , ĠTIMER _ INTERVAL _ IN _ M ILL IS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tick ( millis Until Finished : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ count Down Status . post Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCount Down Status ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Remaining Ġ= Ġconvert Time ToString ( endTime Ġ- ĠDate (). time ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Count Down Finished Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Finish () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Count down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ count Down Status . post Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCount Down Status ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Remaining Ġ= Ġ" 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Count Down Finished Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Count down () Ġ{ ĊĠĠĠĠĠĠĠ Ġcount Down Timer ?. cancel () ĊĠĠĠĠĠĠĠ Ġ_ count Down Status . post Value ( Count Down Status ( time Remaining Ġ= Ġ" 0 ", Ġis Count Down Finished Ġ= Ġtrue )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCount Down Time Props . generate Count Down End (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠcurrentTime Ġ= ĠDate (). time ĊĠĠĠĠĠĠĠ Ġval ĠONE _ MINUTE _ IN _ M ILL IS : ĠLong Ġ= Ġ 6 0 0 0 0 Ġ// Ġmilli secs ĊĠĠĠĠĠĠĠ Ġval ĠONE _ HOUR _ IN _ M ILL IS : ĠLong Ġ= Ġ 3 6 0 0 0 0 0 Ġ// Ġmilli secs ĊĠĠĠĠĠĠĠ Ġval ĠONE _ SECOND _ IN _ M ILL IS : ĠLong Ġ= Ġ 1 0 0 0 Ġ// Ġmilli secs ĊĠĠĠĠĠĠĠ Ġval ĠendTime Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime Ġ+ Ġ( hours Entered Ġ* ĠONE _ HOUR _ IN _ M ILL IS ) Ġ+ Ġ( minutes Entered Ġ* ĠONE _ MINUTE _ IN _ M ILL IS ) Ġ+ Ġ+ ( seconds Entered Ġ* ĠONE _ SECOND _ IN _ M ILL IS ) ĊĠĠĠĠĠĠĠ Ġreturn ĠendTime ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Time ToString ( remaining Time : ĠLong ) Ġ= ĊĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS . convert ( remaining Time , ĠTimeUnit . MILLISECONDS ). toString () ĊĊĠĠĠ Ġfun Ġget Hours () Ġ= Ġtimer Properties . value ?. hours Entered . toString () ĊĠĠĠ Ġfun Ġget Minutes () Ġ= Ġtimer Properties . value ?. minutes Entered . toString () ĊĠĠĠ Ġfun Ġget Seconds () Ġ= Ġtimer Properties . value ?. seconds Entered . toString () ĊĠĠĠ Ġfun Ġset Hours ( hours : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhours Int Ġ= Ġhours . toInt OrNull () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġtimer Properties . post Value ( timer Properties . value ?. copy ( hours Entered Ġ= Ġhours Int )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Seconds ( seconds : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġseconds Int Ġ= Ġseconds . toInt OrNull () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġtimer Properties . post Value ( timer Properties . value ?. copy ( seconds Entered Ġ= Ġseconds Int )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Minutes ( minutes : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġminutes Int Ġ= Ġminutes . toInt OrNull () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġtimer Properties . post Value ( timer Properties . value ?. copy ( minutes Entered Ġ= Ġminutes Int )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠCount Down Status ( val Ġtime Remaining : ĠString , Ġval Ġis Count Down Finished : ĠBoolean ) ĊĠĠĠ Ġdata Ġclass ĠCount Down Time Props ( ĊĠĠĠĠĠĠĠ Ġvar Ġhours Entered : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġminutes Entered : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġseconds Entered : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ) Ċ } Ċ