package Ġcom . example . chess clock . clock Ċ Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . media . Audio Attributes Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . media . Sound Pool Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . navigation . fragment . nav Args Ċ import Ġcom . example . chess clock . R Ċ import Ġcom . example . chess clock . databinding . Fragment Clock Binding Ċ import Ġjava . util .* Ċ Ċ class ĠClock Fragment Ġ: ĠFragment ( R . layout . fragment _ clock ) Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Clock Binding ĊĠĠĠ Ġprivate Ġval Ġargs : ĠClock Fragment Args Ġby Ġnav Args () ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠClock ViewModel Ġby Ġview Models () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsound Pool : ĠSound Pool ĊĠĠĠ Ġprivate Ġvar Ġtap Sound : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġfinish Sound : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġtimer Status Ġ= ĠStatus . INIT ĊĠĠĠ Ġprivate Ġvar Ġtoggle Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Clock Binding . bind ( view ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinitial Time Ġ= Ġargs . initial TimeIn Millisecond ĊĠĠĠĠĠĠĠ Ġval Ġbonus Time Ġ= Ġargs . bonus TimeIn Millisecond ĊĠĠĠĠĠĠĠ ĠviewModel . initialize ( initial Time , Ġbonus Time ) ĊĊĠĠĠĠĠĠĠ Ġinit Sound Pool () ĊĊĠĠĠĠĠĠĠ Ġbinding . player 1 Timer . text Ġ= Ġget Formatted Time ( viewModel . player 1 Time . value !! ) ĊĠĠĠĠĠĠĠ Ġbinding . player 2 Timer . text Ġ= Ġget Formatted Time ( viewModel . player 2 Time . value !! ) ĊĊĠĠĠĠĠĠĠ Ġbinding . apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 1 . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timer Status Ġ== ĠStatus . RUNNING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( toggle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . switch () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . start Timer ( Player . PLAYER 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsound Pool . play ( tap Sound , Ġ 1 f , Ġ 1 f , Ġ 0 , Ġ 0 , 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bonus Time Ġ!= Ġ 0 L ) ĠviewModel . add Bonus Time ( Player . PLAYER 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . start Timer ( Player . PLAYER 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Status Ġ= ĠStatus . RUNNING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsound Pool . play ( tap Sound , Ġ 1 f , Ġ 1 f , Ġ 0 , Ġ 0 , 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Color () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer 2 . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timer Status Ġ== ĠStatus . RUNNING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! toggle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . switch () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . start Timer ( Player . PLAYER 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsound Pool . play ( tap Sound , Ġ 1 f , Ġ 1 f , Ġ 0 , Ġ 0 , 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bonus Time Ġ!= Ġ 0 L ) ĠviewModel . add Bonus Time ( Player . PLAYER 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . start Timer ( Player . PLAYER 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Status Ġ= ĠStatus . RUNNING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsound Pool . play ( tap Sound , Ġ 1 f , Ġ 1 f , Ġ 0 , Ġ 0 , 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Color () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpause Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timer Status Ġ== ĠStatus . RUNNING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . pause Btn . setImage Resource ( R . drawable . resume ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . pause Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timer Status Ġ!= ĠStatus . FIN ISH Ġ&& Ġtimer Status Ġ!= ĠStatus . INIT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . pause Btn . setImage Resource ( R . drawable . pause ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( toggle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . start Timer ( Player . PLAYER 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . start Timer ( Player . PLAYER 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Color () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timer Status Ġ!= ĠStatus . INIT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . reset Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhome Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( R . id . action _ clock Fragment _ to _ dashboard Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . player 1 Time . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Time Ġ= Ġget Formatted Time ( viewModel . player 1 Time . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . player 1 Timer . text Ġ= Ġformatted Time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . side Clock P Layer 1 . text Ġ= Ġformatted Time ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . player 2 Time . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Time Ġ= Ġget Formatted Time ( viewModel . player 2 Time . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . player 2 Timer . text Ġ= Ġformatted Time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . side Clock P Layer 2 . text Ġ= Ġformatted Time ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . timer Status . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Status Ġ= ĠviewModel . timer Status . value !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( viewModel . timer Status . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . RUNNING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Clock BTN () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . timeout Text . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . timer Lot ti . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . PA USED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Color () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Clock BTN () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . timeout Text . text Ġ= Ġ" Paused " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . timeout Text . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . timer Lot ti . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . FIN ISH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Color () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Clock BTN () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsound Pool . play ( finish Sound , Ġ 1 f , Ġ 1 f , Ġ 0 , Ġ 0 , 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . timeout Text . text Ġ= Ġ" Time ĠOut : ĠIf Ġyou Ġw anna Ġcontinue Ġreset Ġthe Ġclock " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . timeout Text . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . timer Lot ti . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . INIT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Color () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Clock BTN () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . pause Btn . setImage Resource ( R . drawable . pause ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . timeout Text . text Ġ= Ġ" All Ġthe Ġbest " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . timeout Text . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . timer Lot ti . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġswitch Color () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( toggle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . player 1 . set BackgroundColor ( Color . parse Color ("# 3 8 7 0 c 9 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . side Clock P Layer 1 . setTextColor ( Color . parse Color ("# 3 8 7 0 c 9 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . player 2 . set BackgroundColor ( Color . parse Color ("# 3 6 3 6 3 6 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . side Clock P Layer 2 . setTextColor ( Color . parse Color ("# ffffff ")) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . player 1 . set BackgroundColor ( Color . parse Color ("# 3 6 3 6 3 6 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . side Clock P Layer 1 . setTextColor ( Color . parse Color ("# ffffff ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . player 2 . set BackgroundColor ( Color . parse Color ("# 3 8 7 0 c 9 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . side Clock P Layer 2 . setTextColor ( Color . parse Color ("# 3 8 7 0 c 9 ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Color () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . player 1 . set BackgroundColor ( Color . parse Color ("# 3 6 3 6 3 6 ")) ĊĠĠĠĠĠĠĠ Ġbinding . player 2 . set BackgroundColor ( Color . parse Color ("# 3 6 3 6 3 6 ")) ĊĠĠĠĠĠĠĠ Ġbinding . side Clock P Layer 1 . setTextColor ( Color . parse Color ("# ffffff ")) ĊĠĠĠĠĠĠĠ Ġbinding . side Clock P Layer 2 . setTextColor ( Color . parse Color ("# ffffff ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Sound Pool () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaudio Attributes Ġ= ĠAudio Attributes . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Usage ( Audio Attributes . USAGE _ AS SIST ANCE _ SON IFICATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ContentType ( Audio Attributes . CONTENT _ TYPE _ SON IFICATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġsound Pool Ġ= ĠSound Pool . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMax Streams ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Audio Attributes ( audio Attributes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġtap Sound Ġ= Ġsound Pool . load ( context , ĠR . raw . tap _ sound , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġfinish Sound Ġ= Ġsound Pool . load ( context , ĠR . raw . finish , Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Formatted Time ( time Left : ĠLong ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= Ġ(( time Left Ġ/ Ġ 1 0 0 0 ) Ġ/ Ġ 6 0 ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= Ġ(( time Left Ġ/ Ġ 1 0 0 0 ) Ġ% Ġ 6 0 ). toInt () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠString . format ( Locale . getDefault (), Ġ"% 0 2 d :% 0 2 d ", Ġminutes , Ġseconds ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable Clock BTN () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . player 1 . is Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġbinding . player 2 . is Clickable Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisable Clock BTN () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . player 1 . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġbinding . player 2 . is Clickable Ġ= Ġfalse ĊĠĠĠ Ġ} Ċ Ċ }