/* Ċ Ġ* Ġ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 . mx al bert . compose . count d ow nt imer Ċ Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . save able . Saver Ċ import Ġandroidx . compose . runtime . save able . list Saver Ċ import Ġandroidx . compose . runtime . save able . remember Save able Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġkotlin . math . abs Ċ Ċ enum Ġclass ĠScreen Ġ{ ĠEdit , ĠTimer Ġ} Ċ Ċ const Ġval ĠSegment Count Ġ= Ġ 3 Ċ const Ġval ĠDig it Count Ġ= Ġ 6 Ċ Ċ class ĠApp State ( ĊĠĠĠ Ġscreen : ĠScreen Ġ= ĠScreen . Edit , ĊĠĠĠ Ġcount down Time : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġmillis Passed : ĠInt Ġ= Ġ 0 Ċ ) Ġ{ ĊĠĠĠ Ġvar Ġscreen : ĠScreen Ġby Ġmutable State Of ( screen ) ĊĠĠĠ Ġvar Ġis Count ing Down : ĠBoolean Ġby Ġmutable State Of ( false ) ĊĠĠĠ Ġvar Ġcount down Time : ĠInt Ġby Ġmutable State Of ( countdown Time ) ĊĊĠĠĠ Ġprivate Ġvar Ġ_ millis Passed : ĠInt Ġby Ġmutable State Of ( millis Passed ) ĊĠĠĠ Ġvar Ġmillis Passed : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ millis Passed ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ millis Passed Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġupdated Time : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġ// ĠTo Ġreset Ġmillis Passed / countdown Time Ġafter Ġtimer Ġcoroutine Ġis Ġcanceled ĊĠĠĠ Ġvar Ġreset Millis Passed : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġvar Ġreset Count down Time : ĠBoolean Ġ= Ġfalse Ċ } Ċ Ċ private Ġval ĠS aver : ĠS aver < AppState , Ġ*> Ġ= Ġlist Saver ( ĊĠĠĠ Ġsave Ġ= Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . screen . ordinal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . countdown Time , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . millis Passed ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ}, ĊĠĠĠ Ġrestore Ġ= Ġ{ ĊĠĠĠĠĠĠĠ ĠApp State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Ġ= ĠScreen . values ()[ it [ 0 ]], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount down Time Ġ= Ġit [ 1 ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmillis Passed Ġ= Ġit [ 2 ] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ ) Ċ Ċ @ Composable Ċ fun Ġremember AppState () Ġ= Ġremember Save able ( sa ver Ġ= ĠS aver ) Ġ{ ĠApp State () Ġ} Ċ Ċ val ĠApp State . currentTime : ĠInt ĊĠĠĠ Ġget () Ġ= Ġcount down Time Ġ- Ġmillis Passed Ġ/ Ġ 1 0 0 0 Ċ Ċ val ĠApp State . time Segments : ĠList < Int > ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtime Ġ= Ġabs ( currentTime ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmutable ListOf < Int >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( Segment Count ) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsegment Ġ= Ġif Ġ( i Ġ== ĠSegment Count Ġ- Ġ 1 ) Ġtime Ġelse Ġtime Ġ% Ġ 6 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( 0 , Ġsegment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ/= Ġ 6 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ fun ĠApp State . setTime From ( segments : ĠList < Int >) Ġ{ ĊĠĠĠ Ġvar Ġtime Ġ= Ġ 0 ĊĠĠĠ Ġsegments . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġtime Ġ= Ġtime Ġ* Ġ 6 0 Ġ+ Ġit ĊĠĠĠ Ġ} ĊĠĠĠ Ġcount down Time Ġ= Ġtime Ċ } Ċ Ċ val ĠApp State . progress : ĠFloat ĊĠĠĠ Ġget () Ġ= Ġ( millis Passed Ġ/ Ġ 1 0 0 0 f Ġ/ Ġcount down Time ). coerce At Most ( 1 f ) Ċ