/* Ċ Ġ* Ġ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 . content . Context Ċ import Ġandroid . media . Ring tone Ċ import Ġandroid . media . Ring tone Manager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . activity . compose . setContent Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . compose . animation . Animated Visibility Ċ import Ġandroidx . compose . animation . Cross fade Ċ import Ġandroidx . compose . animation . Experimental Animation Api Ċ import Ġandroidx . compose . animation . core . animate Float As State Ċ import Ġandroidx . compose . foundation . Canvas Ċ import Ġandroidx . compose . foundation . layout . Arrange ment Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . Box With Constraints Ċ import Ġandroidx . compose . foundation . layout . Column Ċ import Ġandroidx . compose . foundation . layout . Row Ċ import Ġandroidx . compose . foundation . layout . fill Max Height Ċ import Ġandroidx . compose . foundation . layout . fill Max Width Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . foundation . layout . required Size Ċ import Ġandroidx . compose . foundation . layout . width Ċ import Ġandroidx . compose . foundation . text . Keyboard Actions Ċ import Ġandroidx . compose . foundation . text . Keyboard Options Ċ import Ġandroidx . compose . material . AlertDialog Ċ import Ġandroidx . compose . material . Button Ċ import Ġandroidx . compose . material . Extended Floating ActionButton Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . Outlined TextField Ċ import Ġandroidx . compose . material . Surface Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . material . Text Button Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . runtime . remember Coroutine Scope Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ 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 . Stroke Ċ import Ġandroidx . compose . ui . graphics . draw scope . in set Ċ import Ġandroidx . compose . ui . graphics . draw scope . with Transform Ċ import Ġandroidx . compose . ui . graphics . graphics Layer Ċ import Ġandroidx . compose . ui . platform . Local Context Ċ import Ġandroidx . compose . ui . text . TextStyle Ċ import Ġandroidx . compose . ui . text . font . Font Family Ċ import Ġandroidx . compose . ui . text . font . Font Weight Ċ import Ġandroidx . compose . ui . text . input . Keyboard Type Ċ import Ġandroidx . compose . ui . text . style . Text Align Ċ import Ġandroidx . compose . ui . tool ing . preview . Preview Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . compose . ui . unit . sp Ċ import Ġcom . example . android dev challenge . ui . theme . My Theme Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ Ċ @ Experimental Animation Api Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġset Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMy Theme ( dark Theme Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCount down Timer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ var Ġring Tone : ĠRing tone ? Ġ= Ġnull Ċ Ċ fun Ġget Ring Tone ( context : ĠContext ): ĠRing tone ? Ġ{ ĊĠĠĠ Ġif Ġ( ring Tone Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġalarm Uri : ĠUri ? Ġ= ĠRing tone Manager . getDefault Uri ( Ring tone Manager . TYPE _ ALARM ) ĊĠĠĠĠĠĠĠ Ġif Ġ( alarm Uri Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Uri Ġ= ĠRing tone Manager . getDefault Uri ( Ring tone Manager . TYPE _ RING T ONE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġring Tone Ġ= ĠRing tone Manager . get Ring tone ( context , Ġalarm Uri ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġring Tone Ċ } Ċ Ċ @ Opt In ( Experimental Animation Api :: class ) Ċ @ Composable Ċ fun ĠCount down Timer () Ġ{ ĊĠĠĠ Ġvar Ġdegree Ġby Ġremember Ġ{ Ġmutable State Of ( 0 F ) Ġ} ĊĠĠĠ Ġvar Ġuse Seconds Ġby Ġremember Ġ{ Ġmutable State Of ( true ) Ġ} ĊĠĠĠ Ġvar Ġstart Ġby Ġremember Ġ{ Ġmutable State Of ( false ) Ġ} ĊĠĠĠ Ġvar Ġshould Play Ring Tone Ġby Ġremember Ġ{ Ġmutable State Of ( true ) Ġ} ĊĠĠĠ Ġval Ġ( is Ring Ring Tone Playing , ĠsetIs Ring Tone Playing ) Ġ= Ġremember Ġ{ Ġmutable State Of ( false ) Ġ} ĊĠĠĠ Ġvar Ġ( seconds , Ġset Seconds ) Ġ= Ġremember Ġ{ Ġmutable State Of ("") Ġ} ĊĠĠĠ Ġvar Ġ( minutes , Ġset Minutes ) Ġ= Ġremember Ġ{ Ġmutable State Of ("") Ġ} ĊĠĠĠ Ġval Ġcoroutine Scope Ġ= Ġremember Coroutine Scope () ĊĠĠĠ Ġval Ġcontext Ġ= ĠLocal Context . current ĊĠĠĠ Ġval Ġrow Modifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠĠĠĠĠ Ġ. padding ( 1 0 . dp ) ĊĊĠĠĠ Ġif Ġ( seconds . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġdegree Ġ= Ġ( seconds . toInt () Ġ* Ġ 6 ). toFloat () ĊĠĠĠĠĠĠĠ Ġuse Seconds Ġ= Ġtrue ĊĠĠĠ Ġ} Ġelse Ġif Ġ( minutes . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġdegree Ġ= Ġ( minutes . toInt () Ġ* Ġ 6 ). toFloat () ĊĠĠĠĠĠĠĠ Ġuse Seconds Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( degree Ġ<= Ġ 0 ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġstart Ġ= Ġ! start ĊĠĠĠĠĠĠĠ Ġseconds Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġminutes Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġshould Play Ring Tone Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdegree Ġ= Ġupdate Degree ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdegree , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Seconds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( degree Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( degree Ġ== Ġ 0 f Ġ&& Ġshould Play Ring Tone ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetIs Ring Tone Playing ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ring Tone ( context )?. play () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġdegree Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġset Seconds ("") ĊĠĠĠĠĠĠĠ Ġset Minutes ("") ĊĠĠĠĠĠĠĠ Ġshould Play Ring Tone Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠsetIs Ring Tone Playing ( false ) ĊĠĠĠĠĠĠĠ Ġif Ġ( get Ring Tone ( context )?. is Playing !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ring Tone ( context )?. stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠSurface ( color Ġ= ĠMaterial Theme . colors . background ) Ġ{ ĊĠĠĠĠĠĠĠ ĠColumn ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Height () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 1 0 . dp ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Arrange ment Ġ= ĠArrange ment . Center ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAnimated Visibility ( visible Ġ= Ġis Ring Ring Tone Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn oo ze Dialog Ġ{ Ġreset () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAnimated Visibility ( visible Ġ= Ġ! start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Input Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseconds Ġ= Ġseconds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Seconds Ġ= Ġset Seconds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminutes Ġ= Ġminutes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Minutes Ġ= Ġset Minutes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Timer Ġ= Ġ{ Ġstart Timer () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Ġ= Ġ{ Ġreset () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġrow Modifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAnimated Visibility ( visible Ġ= Ġstart ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Modifier . fill Max Width (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Alignment Ġ= ĠAlignment . Center ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClock Face Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdegree Ġ= Ġdegree , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġrow Modifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSecond s Display ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Seconds Ġ= Ġuse Seconds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdegree Ġ= Ġdegree ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAnimated Visibility ( visible Ġ= Ġ! start Ġ&& Ġdegree Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Modifier . fill Max Width (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Alignment Ġ= ĠAlignment . Center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSecond s Display ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Seconds Ġ= Ġuse Seconds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdegree Ġ= Ġdegree ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠButton Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġstart , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġrow Modifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ Ġstart Timer () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Reset Ġ= Ġ{ Ġreset () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠSn oo ze Dialog ( on Dismiss : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ ĠAlertDialog ( ĊĠĠĠĠĠĠĠ Ġ// Ġtitle Ġ= Ġ{ ĠText ( text Ġ= Ġ" Sn oo ze ", ĠfontSize Ġ= Ġ 2 5 . sp , ĠfontWeight Ġ= ĠFontWeight . Bold ) Ġ}, ĊĠĠĠĠĠĠĠ Ġbuttons Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRow ( modifier Ġ= ĠModifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġon Dismiss , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( 4 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġ" Stop ", ĠfontSize Ġ= Ġ 2 5 . sp , ĠfontWeight Ġ= ĠFontWeight . Bold ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġon Dismiss Request Ġ= Ġon Dismiss ĊĠĠĠ Ġ) Ċ } Ċ Ċ fun Ġupdate Degree ( ĊĠĠĠ Ġdeg : ĠFloat , ĊĠĠĠ Ġuse Seconds : ĠBoolean , Ċ ): ĠFloat Ġ{ ĊĊĠĠĠ Ġreturn Ġif Ġ( use Seconds ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( deg Ġ<= Ġ 6 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 f ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeg Ġ- Ġ 6 F ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( deg Ġ<= Ġ 0 . 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 f ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeg Ġ- Ġ 0 . 1 F ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġparse Numeric ( num : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġif Ġ( num . isEmpty ()) Ġreturn Ġ"" ĊĊĠĠĠ Ġreturn Ġwhen Ġ( val Ġtemp Ġ= Ġnum . toInt OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ"" ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temp Ġ> Ġ 6 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 6 0 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Preview Ċ @ Composable Ċ fun ĠClock Face Row Preview () Ġ{ ĊĠĠĠ ĠClock Face Row ( 3 0 0 . 5 f , ĠModifier ) Ċ } Ċ Ċ @ Composable Ċ fun ĠClock Face Row ( degree : ĠFloat , Ġmodifier : ĠModifier ) Ġ{ ĊĠĠĠ ĠBox With Constraints Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwith Length Ġ= ĠmaxWidth . coerce At Most ( max Height ) ĊĠĠĠĠĠĠĠ ĠCanvas ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier . required Size ( with Length , Ġwith Length ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhalf Canvas Width Ġ= Ġsize . width Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradius Ġ= Ġsize . min Dimension Ġ/ Ġ 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Circle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . Black , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Ġ= ĠOffset ( x Ġ= Ġhalf Canvas Width , Ġy Ġ= Ġhalf Canvas Width ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius Ġ= Ġradius Ġ+ Ġ 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠSt roke ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġ 4 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Circle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . Red , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Ġ= ĠOffset ( x Ġ= Ġhalf Canvas Width , Ġy Ġ= Ġhalf Canvas Width ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius Ġ= Ġradius , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Down Brush Ġ= ĠBr ush . radial Gradient ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor . Blue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor . Yellow , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor . Gray , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor . C yan , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor . Blue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Transform ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotate ( degrees Ġ= Ġ- 9 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Arc ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbrush Ġ= Ġcount Down Brush , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġ= Ġ 0 . 5 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Angle Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsweep Angle Ġ= Ġdegree , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Center Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Transform ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotate ( degrees Ġ= Ġdegree ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinset ( 5 0 F , Ġ 5 0 F ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbrush Ġ= Ġcount Down Brush , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= ĠOffset ( x Ġ= Ġhalf Canvas Width Ġ- Ġ 5 0 , Ġy Ġ= Ġhalf Canvas Width Ġ- Ġ 5 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġhalf Canvas Width Ġ- Ġ 5 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġhalf Canvas Width Ġ- Ġradius Ġ- Ġ 5 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġ 6 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcap Ġ= ĠSt roke Cap . Round ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠUser Input Row ( ĊĠĠĠ Ġseconds : ĠString , ĊĠĠĠ Ġset Seconds : Ġ( String ) Ġ-> ĠUnit , ĊĠĠĠ Ġminutes : ĠString , ĊĠĠĠ Ġset Minutes : Ġ( String ) Ġ-> ĠUnit , ĊĠĠĠ Ġstart Timer : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġreset : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier Ċ ) Ġ{ ĊĊĠĠĠ Ġvar Ġis Seconds Ġby Ġremember Ġ{ Ġmutable State Of ( true ) Ġ} ĊĊĠĠĠ Ġfun Ġswitch Seconds Vs Minutes () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Seconds Ġ= Ġ! is Seconds ĊĠĠĠĠĠĠĠ Ġif Ġ( is Seconds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Minutes ("") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Seconds ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠRow ( ĊĠĠĠĠĠĠĠ Ġmodifier , ĊĠĠĠĠĠĠĠ Ġhorizontal Arrange ment Ġ= ĠArrange ment . Space Even ly , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbutton Modifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 5 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. width ( 1 0 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. align By Baseline () ĊĊĠĠĠĠĠĠĠ ĠCross fade ( target State Ġ= Ġis Seconds ) Ġ{ Ġscreen Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( screen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠNumber Input Field ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Text Ġ= Ġ" Seconds ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Value Ġ= Ġseconds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonStart Ġ= Ġstart Timer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue Ġ= Ġ{ Ġset Seconds ( parse Numeric ( it )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġbutton Modifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> ĠNumber Input Field ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Text Ġ= Ġ" Minutes ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Value Ġ= Ġminutes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonStart Ġ= Ġstart Timer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue Ġ= Ġ{ Ġset Minutes ( parse Numeric ( it )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġbutton Modifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠExtended Floating ActionButton ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCross fade ( target State Ġ= Ġis Seconds ) Ġ{ Ġbutton Text Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( button Text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠText (" Seconds ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> ĠText (" Minutes ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Seconds Vs Minutes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . padding ( top Ġ= Ġ 2 0 . dp ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠNumber Input Field ( ĊĠĠĠ Ġlabel Text : ĠString , ĊĠĠĠ Ġinitial Value : ĠString , ĊĠĠĠ ĠonStart : Ġ() Ġ-> ĠUnit , ĊĠĠĠ ĠsetValue : Ġ( String ) Ġ-> ĠUnit , ĊĠĠĠ Ġmodifier : ĠModifier Ċ ) Ġ{ ĊĠĠĠ ĠOut lined TextField ( ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġinitial Value , ĊĠĠĠĠĠĠĠ Ġkeyboard Options Ġ= ĠKeyboard Options ( keyboard Type Ġ= ĠKeyboard Type . Number ), ĊĠĠĠĠĠĠĠ Ġsingle Line Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ ĠsetValue ( parse Numeric ( it )) Ġ}, ĊĠĠĠĠĠĠĠ Ġtext Style Ġ= ĠTextStyle ( color Ġ= ĠColor . Blue , ĠfontWeight Ġ= ĠFontWeight . Bold ), ĊĠĠĠĠĠĠĠ Ġlabel Ġ= Ġ{ ĠText ( label Text ) Ġ}, ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier , ĊĠĠĠĠĠĠĠ Ġkeyboard Actions Ġ= ĠKeyboard Actions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Done Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonStart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ fun ĠSecond s Display ( ĊĠĠĠ Ġdegree : ĠFloat , ĊĠĠĠ Ġuse Seconds : ĠBoolean Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġtime Ġ= Ġif Ġ( use Seconds ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ(( degree Ġ/ Ġ 6 ). toInt ()). toString () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Long Ġ= Ġ( degree Ġ/ Ġ 0 . 1 ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= Ġ( time Long Ġ% Ġ 3 6 0 0 ) Ġ/ Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= Ġtime Long Ġ% Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġ"$ seconds :$ minutes " ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠ Ġtime , ĊĠĠĠĠĠĠĠ ĠfontWeight Ġ= ĠFontWeight . Bold , ĊĠĠĠĠĠĠĠ ĠfontFamily Ġ= ĠFont Family . Ser if , ĊĠĠĠĠĠĠĠ ĠtextAlign Ġ= ĠText Align . Center , ĊĠĠĠĠĠĠĠ ĠfontSize Ġ= Ġ 5 0 . sp , ĊĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . Light Gray ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Preview Ċ @ Composable Ċ fun ĠSecond s Display Preview () Ġ{ ĊĠĠĠ ĠMy Theme Ġ{ ĊĠĠĠĠĠĠĠ ĠSecond s Display ( 3 0 f , Ġfalse ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠButton Row ( ĊĠĠĠ Ġstart : ĠBoolean , ĊĠĠĠ ĠonClick : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġon Reset : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier Ċ ) Ġ{ ĊĊĠĠĠ ĠRow ( ĊĠĠĠĠĠĠĠ Ġmodifier , ĊĠĠĠĠĠĠĠ Ġhorizontal Arrange ment Ġ= ĠArrange ment . Space Even ly ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠButton ( onClick Ġ= ĠonClick , ĠModifier . width ( 1 0 0 . dp )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠCross fade ( target State Ġ= Ġstart ) Ġ{ Ġbutton Text Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( button Text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> ĠText (" Start ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠText (" Stop ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġalpha : ĠFloat Ġby Ġanimate Float As State ( if Ġ( start ) Ġ 0 . 5 f Ġelse Ġ 1 f ) ĊĠĠĠĠĠĠĠ ĠButton ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width ( 1 0 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. graphics Layer ( alpha Ġ= Ġalpha ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Reset ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Preview (" Light ĠTheme ", Ġwidth Dp Ġ= Ġ 3 6 0 , Ġheight Dp Ġ= Ġ 6 4 0 ) Ċ @ Composable Ċ fun ĠLight Preview () Ġ{ ĊĠĠĠ ĠMy Theme Ġ{ ĊĠĠĠĠĠĠĠ ĠCount down Timer () ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Preview (" Dark ĠTheme ", Ġwidth Dp Ġ= Ġ 3 6 0 , Ġheight Dp Ġ= Ġ 6 4 0 ) Ċ @ Composable Ċ fun ĠDark Preview () Ġ{ ĊĠĠĠ ĠMy Theme ( dark Theme Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCount down Timer () ĊĠĠĠ Ġ} Ċ } Ċ