/* Ċ Ġ* Ġ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 . timer views Ċ Ċ import Ġandroidx . compose . animation . Animated Visibility Ċ import Ġandroidx . compose . animation . Experimental Animation Api Ċ import Ġandroidx . compose . foundation . Image Ċ import Ġandroidx . compose . foundation . click able Ċ 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 . fill Max Width Ċ import Ġandroidx . compose . foundation . layout . height Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . foundation . layout . width Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . graphics . p ainter . Painter Ċ import Ġandroidx . compose . ui . res . p ainter Resource Ċ import Ġandroidx . compose . ui . text . style . Text Align Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . constraint layout . compose . Constraint Layout Ċ import Ġandroidx . lifecycle . view model . compose . viewModel Ċ import Ġcom . example . android dev challenge . R Ċ import Ġcom . example . android dev challenge . Timer ViewModel Ċ import Ġcom . example . android dev challenge . ui . theme . typography Ċ Ċ @ Experimental Animation Api Ċ @ Composable Ċ fun ĠSet Timer View () Ġ{ ĊĠĠĠ Ġval ĠviewModel Ġ= ĠviewModel < Timer ViewModel >() ĊĠĠĠ ĠConstraint Layout ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 8 . dp ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtimer View Ġ= Ġcreate Ref () ĊĠĠĠĠĠĠĠ ĠRow ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. constr ain As ( timer View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop . link To ( parent . top ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom . link To ( parent . bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart . link To ( parent . start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend . link To ( parent . end ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhorizontal Arrange ment Ġ= ĠArrange ment . Space Even ly , Ġvertical Alignment Ġ= ĠAlignment . Center Vert ically ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( viewModel . started Ġ&& Ġ( viewModel . countdown Timer Ġ< Ġ 3 6 0 0 ))) ĠRow ( vertical Alignment Ġ= ĠAlignment . Center Vert ically ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimer Column ( multiplier Ġ= Ġ 3 6 0 0 0 , ĠviewModel Ġ= ĠviewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimer Column ( multiplier Ġ= Ġ 3 6 0 0 , ĠviewModel Ġ= ĠviewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( viewModel . started Ġ&& Ġ( viewModel . countdown Timer Ġ< Ġ 3 6 0 0 ))) ĠRow ( vertical Alignment Ġ= ĠAlignment . Center Vert ically ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġ": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( viewModel . started Ġ&& Ġ( viewModel . countdown Timer Ġ< Ġ 6 0 ))) Row ( vertical Alignment Ġ= ĠAlignment . Center Vert ically ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimer Column ( multiplier Ġ= Ġ 6 0 0 , ĠviewModel Ġ= ĠviewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimer Column ( multiplier Ġ= Ġ 6 0 , ĠviewModel Ġ= ĠviewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( viewModel . started Ġ&& Ġ( viewModel . countdown Timer Ġ< Ġ 6 0 ))) ĠRow ( vertical Alignment Ġ= ĠAlignment . Center Vert ically ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġ": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRow () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimer Column ( multiplier Ġ= Ġ 1 0 , ĠviewModel Ġ= ĠviewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimer Column ( multiplier Ġ= Ġ 1 , ĠviewModel Ġ= ĠviewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Experimental Animation Api Ċ @ Composable Ċ private Ġfun ĠTimer Column ( multiplier : ĠInt , ĠviewModel : ĠTimer ViewModel ) Ġ{ ĊĊĠĠĠ ĠColumn ( horizontal Alignment Ġ= ĠAlignment . Center H orizontally , Ġmodifier Ġ= ĠModifier . padding ( 8 . dp ), Ġvertical Arrange ment Ġ= ĠArrange ment . Center ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAnimated Visibility ( visible Ġ= Ġ! viewModel . started ,) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIncrease Timer ( multiplier Ġ= Ġmultiplier , ĠviewModel Ġ= ĠviewModel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTimer Display ( viewModel Ġ= ĠviewModel , Ġmultiplier Ġ= Ġmultiplier ) ĊĊĠĠĠĠĠĠĠ ĠAnimated Visibility ( visible Ġ= Ġ! viewModel . started ,) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDec re ase Timer ( multiplier Ġ= Ġmultiplier , ĠviewModel Ġ= ĠviewModel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠMax ĠValue ĠfÃ¼r Ġdie ses ĠElement ĊĠĠĠ Ġ// ĠUn ter ge ord net es ĠElement ĊĠĠĠ Ġ// ĠÃľber ge ord net es ĠElement Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠIncrease Timer ( multiplier : ĠInt , ĠviewModel : ĠTimer ViewModel ) Ġ{ ĊĠĠĠ ĠImage ( ĊĠĠĠĠĠĠĠ Ġpainter Ġ= Ġpainter Resource ( id Ġ= ĠR . drawable . add _ 2 4 ), Ġcontent Description Ġ= Ġ" increase ", ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. click able Ġ{ ĠviewModel . increase Time ( multiplier ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 8 . dp ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġ// ĠButton ( onClick Ġ= Ġ{ ĠviewModel . increase Time ( multiplier ) Ġ}) Ġ{ ĊĊĠĠĠ Ġ// Ġ} ĊĠĠĠ Ġ// ĠMax imal w ert Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠDec re ase Timer ( multiplier : ĠInt , ĠviewModel : ĠTimer ViewModel ) Ġ{ ĊĊĠĠĠ ĠImage ( ĊĠĠĠĠĠĠĠ Ġpainter Ġ= Ġpainter Resource ( id Ġ= ĠR . drawable . minus _ 2 4 ), Ġcontent Description Ġ= Ġ" decrease ", ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. click able Ġ{ ĠviewModel . decrease Time ( multiplier ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 8 . dp ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġ// ĠImage ( image Vector Ġ= ĠImage Vector (), Ġcontent Description Ġ= Ġ) ĊĠĠĠ Ġ// ĠButton ( onClick Ġ= Ġ{ ĠviewModel . decrease Time ( multiplier ) Ġ}) Ġ{ ĊĠĠĠ Ġ// Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠTimer Display ( multiplier : ĠInt , ĠviewModel : ĠTimer ViewModel ) Ġ{ ĊĠĠĠ Ġval Ġnumber Ġ= Ġevaluate Number ( viewModel . element Pairs . getValue ( multiplier ), Ġmultiplier , ĠviewModel . countdown Timer ) ĊĠĠĠ Ġif Ġ( viewModel . encoded Ġ&& ĠviewModel . started ) ĠImage ( ĊĠĠĠĠĠĠĠ Ġpainter Ġ= Ġencode Number ( number Ġ= Ġnumber ), Ġcontent Description Ġ= Ġ" Number ", ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. width ( 4 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( 4 0 . dp ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġelse ĠText ( ĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġnumber . toString (), ĠtextAlign Ġ= ĠText Align . Center , ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. width ( 4 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( 4 0 . dp ), ĊĠĠĠĠĠĠĠ Ġstyle Ġ= Ġty pography . body 2 ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun Ġevaluate Number ( high er Value : ĠInt , Ġmultiplier : ĠInt , Ġvalue : ĠInt ): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġ( value Ġ% Ġhigher Value ) Ġ/ Ġmultiplier Ċ } Ċ Ċ @ Composable Ċ private Ġfun Ġencode Number ( number : ĠInt ): ĠP ainter Ġ{ ĊĠĠĠ Ġval Ġimage ID Ġ= Ġwhen Ġ( number ) Ġ{ ĊĠĠĠĠĠĠĠĠ 0 Ġ-> ĠR . drawable . number 0 ĊĠĠĠĠĠĠĠĠ 1 Ġ-> ĠR . drawable . number 1 ĊĠĠĠĠĠĠĠĠ 2 Ġ-> ĠR . drawable . number 2 ĊĠĠĠĠĠĠĠĠ 3 Ġ-> ĠR . drawable . number 3 ĊĠĠĠĠĠĠĠĠ 4 Ġ-> ĠR . drawable . number 4 ĊĠĠĠĠĠĠĠĠ 5 Ġ-> ĠR . drawable . number 5 ĊĠĠĠĠĠĠĠĠ 6 Ġ-> ĠR . drawable . number 6 ĊĠĠĠĠĠĠĠĠ 7 Ġ-> ĠR . drawable . number 7 ĊĠĠĠĠĠĠĠĠ 8 Ġ-> ĠR . drawable . number 8 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠR . drawable . number 9 ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġpainter Resource ( image ID ) Ċ } Ċ