package Ġcom . synt ak ks . time fight er Ċ Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Count Down Timer Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . ContextMenu Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . view . animation . Animation Ċ import Ġandroid . view . animation . Animation Utils Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġ// ĠData ĊĠĠĠ Ġprivate Ġvar Ġscore Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtime Remaining Ġ: ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġ// ĠTimer ĊĠĠĠ Ġprivate Ġvar Ġgame Started Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcount Down Timer : ĠCount Down Timer ĊĠĠĠ Ġinternal Ġval Ġdefault Count down : ĠLong Ġ= Ġ 5 0 0 0 ĊĠĠĠ Ġinternal Ġval Ġcount Down Interval : ĠLong Ġ= Ġ 1 0 0 0 ĊĠĠĠ Ġ// ĠUI ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġroot View : ĠConstraint Layout ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġscore Label : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtime Label : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtap Button : ĠButton ĊĠĠĠ Ġ// ĠAnimation ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbo unce Animation : ĠAnimation ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġblink Animation : ĠAnimation ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠMainActivity :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠGAME _ STARTED Ġ= Ġ" GAME _ STARTED " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCURRENT _ SCORE Ġ= Ġ" CURRENT _ SCORE " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTIME _ RE MAIN ING Ġ= Ġ" TIME _ RE MAIN ING " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġbo unce Animation Ġ= ĠAnimation Utils . load Animation ( this , ĠR . anim . bounce ) ĊĠĠĠĠĠĠĠ Ġblink Animation Ġ= ĠAnimation Utils . load Animation ( this , ĠR . anim . blink ) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onCreate Ġcalled . ĠScore Ġis : Ġ$ score ") ĊĠĠĠĠĠĠĠ Ġroot View Ġ= ĠfindViewById ( R . id . root ) ĊĠĠĠĠĠĠĠ Ġscore Label Ġ= ĠfindViewById ( R . id . score Label ) ĊĠĠĠĠĠĠĠ Ġtime Label Ġ= ĠfindViewById ( R . id . time Label ) ĊĠĠĠĠĠĠĠ Ġtap Button Ġ= ĠfindViewById ( R . id . tap Button ) ĊĊĠĠĠĠĠĠĠ Ġtap Button . setOnClickListener Ġ{ Ġview Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Game () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( increment Score ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Score Animations ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ!= Ġnull Ġ&& ĠsavedInstanceState . getBoolean ( GAME _ STARTED , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ= ĠsavedInstanceState . getInt ( CURRENT _ SCORE , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Remaining Ġ= ĠsavedInstanceState . getLong ( TIME _ RE MAIN ING , Ġdefault Count down ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestore Game () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Game () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate Options Menu ( menu ) ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . menu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== ĠR . id . action About ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Info () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Info () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdialog Title Ġ= ĠgetString ( R . string . about _ title ) ĊĠĠĠĠĠĠĠ Ġval Ġdialog Message Ġ= ĠgetString ( R . string . about _ message ) ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠ Ġbuilder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( dialog Title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( dialog Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create (). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġout State . put Boolean ( GAME _ STARTED , Ġgame Started ) ĊĠĠĠĠĠĠĠ Ġout State . put Int ( CURRENT _ SCORE , Ġscore ) ĊĠĠĠĠĠĠĠ Ġout State . put Long ( TIME _ RE MAIN ING , Ġtime Remaining ) ĊĠĠĠĠĠĠĠ Ġcount Down Timer . cancel () ĊĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Save InstanceState : ĠS aving ĠCurrent ĠScore : Ġ$ score Ġ& ĠTime ĠRem aining Ġ$ time Remaining ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Game () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! game Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Down Timer . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame Started Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgame Over () Ġ{ ĊĠĠĠĠĠĠĠ Ġtap Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġshow Snackbar () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrestore Game () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠScore ĊĠĠĠĠĠĠĠ Ġscore Label . text Ġ= ĠgetString ( R . string . current _ score , Ġscore ) ĊĠĠĠĠĠĠĠ Ġ// ĠTime ĊĠĠĠĠĠĠĠ Ġval Ġrestored Time Ġ= Ġtime Remaining Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġtime Label . text Ġ= ĠgetString ( R . string . time _ remaining , Ġrestored Time ) ĊĠĠĠĠĠĠĠ Ġif Ġ( time Remaining Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Down Timer Ġ= Ġget Count down Timer ( time Remaining ). start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Game () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRestore ĠButton ĊĠĠĠĠĠĠĠ Ġtap Button . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ// ĠReset ĠScore Ġ/ ĠLabel ĊĠĠĠĠĠĠĠ Ġscore Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġscore Label . text Ġ= ĠgetString ( R . string . current _ score , Ġscore ) ĊĠĠĠĠĠĠĠ Ġ// ĠReset ĠTime Ġ/ ĠLabel ĊĠĠĠĠĠĠĠ Ġvar Ġinitial Time Left Ġ= Ġdefault Count down Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġtime Label . text Ġ= ĠgetString ( R . string . time _ remaining , Ġinitial Time Left ) ĊĠĠĠĠĠĠĠ Ġ// ĠRest ĠTimer ĊĠĠĠĠĠĠĠ Ġcount Down Timer Ġ= Ġget Count down Timer ( default Count down ) ĊĊĠĠĠĠĠĠĠ Ġgame Started Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Count down Timer ( total Time : ĠLong ) Ġ: ĠCount Down Timer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠCount Down Timer ( total Time , Ġcount Down Interval ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tick ( millis Until Finished : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Remaining Ġ= Ġmillis Until Finished ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Label . text Ġ= ĠgetString ( R . string . time _ remaining , Ġtime Remaining Ġ/ Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Finish () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Over () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġincrement Score () Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( game Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Score Ġ= ĠgetString ( R . string . current _ score , Ġscore ) Ġ// Ġ% 1 $ d Ġin Ġthe Ġplaceholder Ġtext Ġis Ġthe Ġscore , Ġne at . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscore Label . text Ġ= Ġnew Score ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Snackbar () Ġ{ ĊĠĠĠĠĠĠĠ ĠSn ackbar . make ( findViewById ( R . id . root ), ĠgetString ( R . string . game _ over _ text , Ġscore ), ĠSn ackbar . LENGTH _ IN DEFIN ITE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction (" Dismiss ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Game () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay Score Animations ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview . start Animation ( bounce Animation ) ĊĠĠĠĠĠĠĠ Ġscore Label . start Animation ( blink Animation ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ