/* Ċ Ġ* Ġ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 . ui Ċ Ċ import Ġandroidx . compose . animation . Experimental Animation Api Ċ import Ġandroidx . compose . animation . core . Repeat Mode Ċ import Ġandroidx . compose . animation . core . animate Float Ċ import Ġandroidx . compose . animation . core . animate Float As State Ċ import Ġandroidx . compose . animation . core . infinite Repeat able Ċ import Ġandroidx . compose . animation . core . keyframes Ċ import Ġandroidx . compose . animation . core . remember Infinite Transition Ċ import Ġandroidx . compose . foundation . layout . Arrange ment Ċ import Ġandroidx . compose . foundation . layout . Column Ċ import Ġandroidx . compose . foundation . layout . Row Ċ import Ġandroidx . compose . foundation . layout . fill MaxSize Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . material . Icon Ċ import Ġandroidx . compose . material . IconButton Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . Sca ffold Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . material . Top AppBar Ċ import Ġandroidx . compose . material . icons . Icons Ċ import Ġandroidx . compose . material . icons . filled . Edit Ċ import Ġandroidx . compose . material . icons . filled . Hour glass Full Ċ import Ġandroidx . compose . material . icons . filled . Keyboard Arrow Down Ċ import Ġandroidx . compose . material . icons . filled . Keyboard Arrow Up Ċ import Ġandroidx . compose . material . icons . filled . Pause Ċ import Ġandroidx . compose . material . icons . filled . Play Arrow Ċ import Ġandroidx . compose . material . icons . filled . Stop Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Mutable State Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . draw . alpha Ċ import Ġandroidx . compose . ui . draw . rotate Ċ import Ġandroidx . compose . ui . tool ing . preview . Preview Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ @ Composable Ċ fun ĠHour glass ( ĊĠĠĠ ĠisActive : ĠBoolean Ċ ) Ġ{ ĊĠĠĠ Ġval Ġinfinite Transition Ġ= Ġremember Infinite Transition () ĊĠĠĠ Ġval Ġalpha Animation Ġby Ġinfinite Transition . animate Float ( ĊĠĠĠĠĠĠĠ Ġinitial Value Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠ Ġtarget Value Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠ Ġanimation Spec Ġ= Ġinfinite Repeat able ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Ġ= Ġkey frames Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Millis Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 7 f Ġat Ġ 5 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat Mode Ġ= ĠRepeat Mode . Reverse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġangle Animation Ġby Ġinfinite Transition . animate Float ( ĊĠĠĠĠĠĠĠ Ġinitial Value Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠ Ġtarget Value Ġ= Ġ 1 8 0 f , ĊĠĠĠĠĠĠĠ Ġanimation Spec Ġ= Ġinfinite Repeat able ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Ġ= Ġkey frames Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Millis Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 7 f Ġat Ġ 5 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat Mode Ġ= ĠRepeat Mode . Restart ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġalpha Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( isActive ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Animation ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 F ĊĠĠĠ Ġval Ġangle Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġangle Animation ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 0 F ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ ĠIcon ( ĊĠĠĠĠĠĠĠ Ġimage Vector Ġ= ĠIcons . Default . Hour glass Full , ĊĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġ" Hour glass ", ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize (. 3 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. alpha ( alpha Ġ= Ġalpha ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. rotate ( degrees Ġ= Ġangle ) ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ fun ĠClock Timer ( ĊĠĠĠ Ġremaining Time : ĠLong Ċ ) Ġ{ ĊĠĠĠ Ġval Ġhour Ġ= ĠTimeUnit . MILLISECONDS . to Hours ( remaining Time ) ĊĠĠĠ Ġval Ġmin Ġ= ĠTimeUnit . MILLISECONDS . to Minutes ( remaining Time ) Ġ% ĠConst . CH RON O _ DI VIDER ĊĠĠĠ Ġval Ġsec Ġ= ĠTimeUnit . MILLISECONDS . to Seconds ( remaining Time ) Ġ% ĠConst . CH RON O _ DI VIDER ĊĠĠĠ Ġval Ġmilli Ġ= Ġremaining Time Ġ% ĠConst . MILLI SECOND _ RE MA IND ER _ DI VIDER ĊĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġ"% 0 2 d :% 0 2 d :% 0 2 d .% 0 3 d ". format ( hour , Ġmin , Ġsec , Ġmilli ), ĊĠĠĠĠĠĠĠ Ġstyle Ġ= ĠMaterial Theme . typography . h 2 , ĊĠĠĠĠĠĠĠ Ġmax Lines Ġ= Ġ 1 ĊĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ fun ĠClock Editor ( ĊĠĠĠ Ġcount Down Object : ĠCount Down Object Ċ ) Ġ{ ĊĠĠĠ Ġval Ġhour Ġ= Ġremember Ġ{ Ġmutable State Of ( 0 L ) Ġ} ĊĠĠĠ Ġval Ġmin Ġ= Ġremember Ġ{ Ġmutable State Of ( 0 L ) Ġ} ĊĠĠĠ Ġval Ġsec Ġ= Ġremember Ġ{ Ġmutable State Of ( 0 L ) Ġ} ĊĠĠĠ Ġcount Down Object . remaining Time Ġ= ĊĠĠĠĠĠĠĠ ĠTimeUnit . HOUR S . to Millis ( hour . value ) Ġ+ ĊĠĠĠĠĠĠĠ ĠTimeUnit . MIN UTES . to Millis ( min . value ) Ġ+ ĊĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS . to Millis ( sec . value ) ĊĠĠĠ ĠRow ( vertical Alignment Ġ= ĠAlignment . Center Vert ically ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTime Field ( time Ġ= Ġhour , Ġmax Ġ= Ġ 9 9 L ) ĊĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" :", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠMaterial Theme . typography . h 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠTime Field ( min ) ĊĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" :", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠMaterial Theme . typography . h 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠTime Field ( sec ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠTime Field ( ĊĠĠĠ Ġtime : ĠMutable State < Long >, ĊĠĠĠ Ġmax : ĠLong Ġ= Ġ 6 0 L Ċ ) Ġ{ ĊĠĠĠ ĠColumn Ġ{ ĊĠĠĠĠĠĠĠ ĠIcon Button ( onClick Ġ= Ġ{ Ġif Ġ( time . value Ġ< Ġmax ) Ġtime . value ++ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( image Vector Ġ= ĠIcons . Default . Keyboard Arrow Up , Ġcontent Description Ġ= Ġ" Plus ĠHour ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ"% 0 2 d ". format ( time . value ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠMaterial Theme . typography . h 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠIcon Button ( onClick Ġ= Ġ{ Ġif Ġ( time . value Ġ> Ġ 0 L ) Ġtime . value -- Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( image Vector Ġ= ĠIcons . Default . Keyboard Arrow Down , Ġcontent Description Ġ= Ġ" Plus ĠHour ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Experimental Animation Api Ċ @ Composable Ċ private Ġfun ĠClock Controls ( ĊĠĠĠ Ġcount Down Object : ĠCount Down Object , ĊĠĠĠ Ġpause : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġstart : Ġ( Long ) Ġ-> ĠUnit , ĊĠĠĠ Ġstop : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġediting : ĠMutable State < Boolean > Ċ ) Ġ{ ĊĠĠĠ ĠRow Ġ{ ĊĠĠĠĠĠĠĠ ĠIcon Button ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Down Object . isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġediting . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart ( count Down Object . remaining Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Vector Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Down Object . isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcons . Default . Pause ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcons . Default . Play Arrow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( image Vector Ġ= Ġimage Vector , Ġcontent Description Ġ= Ġ" Play ĠPause ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġalpha Ġby Ġanimate Float As State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Down Object . isRunning ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. 5 f ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠIcon Button ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ Ġstop () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . alpha ( alpha Ġ= Ġalpha ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ= Ġcount Down Object . isRunning ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( image Vector Ġ= ĠIcons . Default . Stop , Ġcontent Description Ġ= Ġ" Stop ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠIcon Button ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ Ġediting . value Ġ= Ġ! editing . value Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . alpha ( alpha Ġ= Ġ 1 Ġ/ Ġ( 2 Ġ* Ġalpha )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ= Ġ! count Down Object . isRunning ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( image Vector Ġ= ĠIcons . Default . Edit , Ġcontent Description Ġ= Ġ" Edit ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Experimental Animation Api Ċ @ Composable Ċ fun ĠClock Screen ( ĊĠĠĠ Ġcount Down Object : ĠCount Down Object , ĊĠĠĠ Ġstart : Ġ( Long ) Ġ-> ĠUnit , ĊĠĠĠ Ġpause : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġstop : Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġediting Ġ= Ġremember Ġ{ Ġmutable State Of ( false ) Ġ} ĊĠĠĠ ĠScaffold ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . fill MaxSize (), ĊĠĠĠĠĠĠĠ Ġtop Bar Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTop AppBar ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĠText ( text Ġ= Ġ" Simple st ĠCount down ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠColumn ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( bottom Ġ= Ġ 1 5 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhorizontal Alignment Ġ= ĠAlignment . Center H orizontally , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Arrange ment Ġ= ĠArrange ment . Space Between ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHour glass ( isActive Ġ= Ġcount Down Object . isRunning ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( editing . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClock Editor ( count Down Object Ġ= Ġcount Down Object ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! editing . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClock Timer ( remaining Time Ġ= Ġcount Down Object . remaining Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClock Controls ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Down Object Ġ= Ġcount Down Object , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause Ġ= Ġpause , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġstart , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Ġ= Ġstop , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġediting Ġ= Ġediting ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Experimental Animation Api Ċ @ Preview Ċ @ Composable Ċ fun ĠPreview () Ġ{ ĊĠĠĠ ĠClock Screen ( ĊĠĠĠĠĠĠĠ Ġcount Down Object Ġ= ĠCount Down Object ( 3 6 0 0 L ), ĊĠĠĠĠĠĠĠ Ġstart Ġ= Ġ{ Ġ}, ĊĠĠĠĠĠĠĠ Ġpause Ġ= Ġ{ Ġ}, ĊĠĠĠĠĠĠĠ Ġstop Ġ= Ġ{ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ object ĠConst Ġ{ ĊĠĠĠ Ġconst Ġval ĠC HR ON O _ DI VIDER Ġ= Ġ 6 0 L ĊĠĠĠ Ġconst Ġval ĠMIL LI SECOND _ RE MA IND ER _ DI VIDER Ġ= Ġ 1 0 0 0 L Ċ } Ċ