/* Ċ Ġ* Ġ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 Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġjava . util . Timer Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . concurrent . fixed Rate Timer Ċ Ċ class ĠTimer ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġ_ is Playing Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġprivate Ġvar Ġ_ remaining Seconds Ġ= ĠMutable LiveData ( 0 ) ĊĠĠĠ Ġprivate Ġvar Ġtimer : ĠTimer ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġtoggle Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ is Playing . value Ġ= Ġ!_ is Playing . value !! ĊĠĠĠĠĠĠĠ Ġif Ġ(_ is Playing . value !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Ġ= Ġfixed Rate Timer ( period Ġ= ĠTimeUnit . SECONDS . to Millis ( 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġ_ remaining Seconds . value !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Playing . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Timer ViewModel . timer Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ remaining Seconds . post Value ( current Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Seconds ( seconds : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ remaining Seconds . value Ġ= Ġ_ remaining Seconds . value !! Ġ+ Ġseconds ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġminus Seconds ( seconds : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ remaining Seconds . value Ġ= Ġ(_ remaining Seconds . value !! Ġ- Ġseconds ). coerce At Least ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Playing : ĠLive Data < Boolean > Ġ= Ġ_ is Playing ĊĠĠĠ Ġval Ġremaining Seconds : ĠLive Data < Int > Ġ= Ġ_ remaining Seconds Ċ } Ċ