/* Ċ Ġ* Ġ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 . final countdown Ċ Ċ import Ġandroidx . compose . animation . animate Color As State Ċ import Ġandroidx . compose . animation . core . animate Dp As State Ċ import Ġandroidx . compose . animation . core . animate Float As State Ċ import Ġandroidx . compose . foundation . Canvas Ċ import Ġandroidx . compose . foundation . Scroll State Ċ import Ġandroidx . compose . foundation . gest ures . Orientation Ċ import Ġandroidx . compose . foundation . gest ures . scroll able Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . fill Max Height Ċ import Ġandroidx . compose . foundation . layout . fill MaxSize Ċ import Ġandroidx . compose . foundation . layout . fill Max Width Ċ import Ġandroidx . compose . foundation . remember Scroll State Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . Surface Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . La unched Effect Ċ import Ġandroidx . compose . runtime . Mutable State Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . runtime . remember Coroutine Scope Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . geometry . Size Ċ import Ġandroidx . compose . ui . geometry . center Ċ import Ġandroidx . compose . ui . graphics . Brush Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . graphics . Stroke Cap Ċ import Ġandroidx . compose . ui . graphics . draw scope . Draw Scope Ċ import Ġandroidx . compose . ui . graphics . draw scope . Stroke Ċ import Ġandroidx . compose . ui . tool ing . preview . Preview Ċ import Ġandroidx . compose . ui . unit . Dp Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġcom . example . android dev challenge . ui . theme . My Theme Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . math . sin Ċ Ċ sealed Ġclass ĠCount Down State Ġ{ ĊĠĠĠ Ġclass ĠIn Progress ( val Ġtotal Amount : ĠFloat , Ġval Ġstarted At : ĠLong Ġ= ĠSystem . currentTimeMillis ()) Ġ: ĊĠĠĠĠĠĠĠ ĠCount Down State () ĊĊĠĠĠ Ġobject ĠNot Started Ġ: ĠCount Down State () Ċ } Ċ Ċ @ Composable Ċ fun ĠFinal Count Down () Ġ{ ĊĠĠĠ ĠSurface Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscroll State Ġ= Ġremember Scroll State () ĊĠĠĠĠĠĠĠ Ġval Ġtimer Value Ġ= Ġscroll State . value Ġ/ Ġ 2 0 0 f ĊĠĠĠĠĠĠĠ Ġval Ġcount down State : ĠMutable State < Count Down State > Ġ= Ġremember Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable State Of ( Count Down State . Not Started ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠUpdate Count down State By Scroll ( countdown State , Ġscroll State ) ĊĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Height () ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimer Gauge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Value Ġ= Ġtimer Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . fill MaxSize (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount down State . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimer GUI ( timer Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoroutine Scope Ġ= Ġremember Coroutine Scope () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToggle Button ( countdown State . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( countdown State . value Ġis ĠCount Down State . Not Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timer Value Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount down State . value Ġ= ĠCount Down State . InProgress ( timer Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount down State . value Ġ= ĠCount Down State . Not Started ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll State . animate Scroll To ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠTimer Gauge ( ĊĠĠĠ Ġscroll State : ĠScroll State , ĊĠĠĠ Ġdiameter Percentage : ĠFloat , ĊĠĠĠ Ġcurrent Value : ĠFloat , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġcount down State : ĠCount Down State , Ċ ) Ġ{ ĊĠĠĠ Ġval Ġseconds : ĠFloat Ġ= Ġcurrent Value ĊĠĠĠ Ġval Ġticks Color : ĠColor Ġ= ĠMaterial Theme . colors . on Background ĊĠĠĠ Ġval Ġhandle Color : ĠColor Ġ= ĠMaterial Theme . colors . secondary ĊĠĠĠ Ġval Ġprimary Color : ĠColor Ġ= ĠMaterial Theme . colors . primary ĊĠĠĠ Ġval Ġprimary Variant : ĠColor Ġ= ĠMaterial Theme . colors . primary Variant ĊĠĠĠ ĠTimer Handles ( modifier , Ġdiameter Percentage , Ġhandle Color , Ġseconds , Ġticks Color ) ĊĊĠĠĠ ĠTimer Line ( ĊĠĠĠĠĠĠĠ Ġmodifier , ĊĠĠĠĠĠĠĠ Ġscroll State , ĊĠĠĠĠĠĠĠ Ġcount down State , ĊĠĠĠĠĠĠĠ Ġdiameter Percentage , ĊĠĠĠĠĠĠĠ Ġseconds , ĊĠĠĠĠĠĠĠ Ġprimary Color , ĊĠĠĠĠĠĠĠ Ġprimary Variant ĊĠĠĠ Ġ) ĊĠĠĠ ĠClock Background ( modifier , Ġdiameter Percentage , Ġcurrent Value , Ġcount down State ) Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠTimer Line ( ĊĠĠĠ Ġmodifier : ĠModifier , ĊĠĠĠ Ġscroll State : ĠScroll State , ĊĠĠĠ Ġtimer State : ĠCount Down State , ĊĠĠĠ Ġdiameter Percentage : ĠFloat , ĊĠĠĠ Ġseconds : ĠFloat , ĊĠĠĠ Ġprimary Color : ĠColor , ĊĠĠĠ Ġprimary Variant : ĠColor , Ċ ) Ġ{ ĊĠĠĠ ĠCanvas ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. scroll able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠOrientation . Vertical , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ= Ġtimer State Ġ== ĠCount Down State . Not Started ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġon Draw Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradius Ġ= Ġget Clock Size ( diameter Percentage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġget Clock Offset ( radius ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcenter Ġ= Ġget Center ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstroke Size Ġ= Ġ 2 0 . dp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Left Ġ= Ġget Clock Top Left ( center , Ġradius , Ġstroke Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠSize (( 2 Ġ* Ġradius ) Ġ+ Ġ( stroke Size . to Px ()), Ġ( 2 Ġ* Ġradius ) Ġ+ Ġ( stroke Size . to Px ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġticks Count Ġ= Ġticks Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseconds Per Tick Ġ= Ġ 6 0 Ġ/ Ġticks Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdegree Ġ= Ġ 3 6 0 Ġ/ Ġticks Count ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġseconds Ġ* Ġ( degree Ġ/ Ġseconds Per Tick ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Ġ= Ġ( seconds Ġ/ Ġ 6 0 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . range To ( total ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Modifier Ġ= Ġ 0 . 5 f . pow ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Arc ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBr ush . vertical Gradient ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprimary Color . copy ( alpha Ġ= Ġ 0 . 7 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprimary Variant . copy ( alpha Ġ= Ġ 0 . 7 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 8 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ< Ġtotal ) Ġ- value Ġelse Ġ- value Ġ% Ġ 3 6 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= Ġgauge Stroke ( stroke Size Ġ* Ġsize Modifier , ĠSt roke Cap . Round ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠClock Background ( ĊĠĠĠ Ġmodifier : ĠModifier , ĊĠĠĠ Ġdiameter Percentage : ĠFloat , ĊĠĠĠ Ġsecond : ĠFloat , ĊĠĠĠ Ġstate : ĠCount Down State , Ċ ) Ġ{ ĊĠĠĠ Ġval Ġsecondary Color Ġ= Ġanimate Color As State ( ĊĠĠĠĠĠĠĠ Ġtarget Value Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġis ĠCount Down State . Not Started Ġ|| Ġsecond Ġ% Ġ 1 Ġ> Ġ 0 . 2 f Ġ-> ĠMaterial Theme . colors . secondary Variant ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠMaterial Theme . colors . secondary ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ). value ĊĠĠĠ Ġval Ġradius Modifier Ġ= Ġanimate Float As State ( ĊĠĠĠĠĠĠĠ Ġtarget Value Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġis ĠCount Down State . Not Started Ġ|| Ġsecond Ġ% Ġ 1 Ġ> Ġ 0 . 2 f Ġ-> Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 . 0 5 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ). value ĊĊĠĠĠ Ġval ĠbackgroundColor Ġ= ĠMaterial Theme . colors . background ĊĊĠĠĠ ĠCanvas ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier , ĊĠĠĠĠĠĠĠ Ġon Draw Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradius Ġ= Ġget Clock Size ( diameter Percentage ) Ġ* Ġradius Modifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġget Clock Offset ( radius ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcenter Ġ= Ġget Center ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Circle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBr ush . radial Gradient ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbackgroundColor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecondary Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Ġ= Ġcenter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius , Ġcenter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠTimer Handles ( ĊĠĠĠ Ġmodifier : ĠModifier , ĊĠĠĠ Ġdiameter Percentage : ĠFloat , ĊĠĠĠ Ġhandle Color : ĠColor , ĊĠĠĠ Ġseconds : ĠFloat , ĊĠĠĠ Ġticks Color : ĠColor , Ċ ) Ġ{ ĊĠĠĠ Ġval Ġline Length State Ġ= Ġremember Ġ{ Ġmutable State Of ( 2 4 . dp ) Ġ} ĊĠĠĠ ĠLa unched Effect ( ĊĠĠĠĠĠĠĠ Ġkey 1 Ġ= Ġseconds , ĊĠĠĠĠĠĠĠ Ġblock Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Length State . value Ġ= Ġ 2 8 . dp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 3 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Length State . value Ġ= Ġ 2 0 . dp ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġline Length Ġ= Ġanimate Dp As State ( target Value Ġ= Ġline Length State . value ). value ĊĊĠĠĠ ĠCanvas ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier , ĊĠĠĠĠĠĠĠ Ġon Draw Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradius Ġ= Ġget Clock Size ( diameter Percentage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġget Clock Offset ( radius ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcenter Ġ= Ġget Center ( offset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġticks Count Ġ= Ġticks Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseconds Per Tick Ġ= Ġ 6 0 Ġ/ Ġticks Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdegree Ġ= Ġ 3 6 0 Ġ/ Ġticks Count ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( line Start , Ġline End ) Ġ= Ġget Tick Position ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 8 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcenter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Length . to Px (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Length . to Px () Ġ+ Ġ 8 . dp . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Color , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Start , Ġline End , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 . dp . to Px (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSt roke Cap . Round , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadded Ticks Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( seconds Ġ/ Ġseconds Per Tick ). round ToInt () Ġ+ Ġ( ticks Count Ġ/ Ġ 4 ) Ġ+ Ġ 1 ). coerce At Most ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġticks Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhighlighted Ticks Count Ġ= Ġseconds Ġ/ Ġseconds Per Tick . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġadded Ticks ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Until Highlight ed Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( it . toFloat () Ġ- Ġhighlighted Ticks Count ) Ġ* Ġ- 1 ). coerce In ( 0 f , Ġ 1 f ) Ġ* Ġ 2 Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ( seconds Ġ% Ġ 6 0 ) Ġ* Ġ( degree Ġ/ Ġseconds Per Tick ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheta Ġ= Ġ 1 8 0 Ġ+ Ġ- value Ġ+ Ġit Ġ* Ġdegree ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( tick Start , Ġtick End ) Ġ= Ġget Tick Position ( theta , Ġcenter , Ġradius , Ġline Length . to Px ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġticks Color , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtick Start , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtick End , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 . dp . to Px () Ġ* Ġdistance Until Highlight ed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSt roke Cap . Round ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun Ġticks Count () Ġ= Ġ 3 0 Ċ Ċ private Ġfun ĠDraw Scope . get Clock Top Left ( ĊĠĠĠ Ġcenter : ĠOffset , ĊĠĠĠ Ġradius : ĠFloat , ĊĠĠĠ Ġstroke Size : ĠD p , Ċ ) Ġ= Ġcenter . copy ( ĊĠĠĠ Ġcenter . x Ġ- Ġradius Ġ- Ġ( stroke Size . to Px () Ġ/ Ġ 2 ), ĊĠĠĠ Ġcenter . y Ġ- Ġradius Ġ- Ġ( stroke Size . to Px () Ġ/ Ġ 2 ) Ċ ) Ċ Ċ private Ġfun ĠDraw Scope . get Center ( offset : ĠFloat ) Ġ= ĊĠĠĠ Ġsize . center . copy ( x Ġ= Ġsize . width Ġ+ Ġoffset ) Ċ Ċ private Ġfun Ġget Clock Offset ( radius : ĠFloat ) Ġ= Ġradius Ġ* Ġ 0 . 2 f Ċ Ċ private Ġfun ĠDraw Scope . get Clock Size ( diameter Percentage : ĠFloat ) Ġ= ĊĠĠĠ Ġ( size . height Ġ* Ġdiameter Percentage ) Ġ/ Ġ 2 Ċ Ċ private Ġfun Ġget Tick Position ( ĊĠĠĠ Ġtheta : ĠFloat , ĊĠĠĠ Ġcenter : ĠOffset , ĊĠĠĠ Ġradius : ĠFloat , ĊĠĠĠ Ġline Length : ĠFloat , ĊĠĠĠ Ġline Start : ĠFloat Ġ= Ġ 0 f , Ċ ): ĠPair < Offset , ĠOffset > Ġ{ ĊĠĠĠ Ġval Ġx 1 Ġ= Ġcenter . x Ġ+ Ġ( radius Ġ+ Ġline Start ) Ġ* Ġcos ( Math . to Radians ( theta . toDouble ())) ĊĠĠĠ Ġval Ġy 1 Ġ= Ġcenter . y Ġ+ Ġ( radius Ġ+ Ġline Start ) Ġ* Ġsin ( Math . to Radians ( theta . toDouble ())) ĊĠĠĠ Ġval Ġx 2 Ġ= Ġcenter . x Ġ+ Ġ( radius Ġ+ Ġline Start Ġ+ Ġline Length ) Ġ* Ġcos ( Math . to Radians ( theta . toDouble ())) ĊĠĠĠ Ġval Ġy 2 Ġ= Ġcenter . y Ġ+ Ġ( radius Ġ+ Ġline Start Ġ+ Ġline Length ) Ġ* Ġsin ( Math . to Radians ( theta . toDouble ())) ĊĠĠĠ Ġval Ġo 1 Ġ= ĠOffset ( x 1 . toFloat (), Ġy 1 . toFloat ()) ĊĠĠĠ Ġval Ġo 2 Ġ= ĠOffset ( x 2 . toFloat (), Ġy 2 . toFloat ()) ĊĠĠĠ Ġreturn ĠPair ( o 1 , Ġo 2 ) Ċ } Ċ Ċ private Ġfun ĠDraw Scope . gauge Stroke ( stroke Size : ĠD p , Ġcap : ĠSt roke Cap ) Ġ= ĠSt roke ( ĊĠĠĠ Ġstroke Size . to Px (), Ġcap Ġ= Ġcap Ċ ) Ċ Ċ @ Composable Ċ @ Preview Ċ fun ĠRegular Preview () Ġ{ ĊĠĠĠ ĠMy Theme ( dark Theme Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ ĠFinal Count Down () ĊĠĠĠ Ġ} Ċ } Ċ