/** Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠIn drag a ĠMart iy ana ĠD Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* Ġhttp :// 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 Ġedu . up i . cs . dr ake . t ict aco . view model Ċ Ċ import Ġandroid . arch . lifecycle . LiveData Ċ import Ġandroid . arch . lifecycle . Mutable LiveData Ċ import Ġandroid . arch . lifecycle . ViewModel Ċ import Ġandroid . util . Log Ċ import Ġedu . up i . cs . dr ake . t ict aco . firestore . Fire Store Constants Ċ import Ġedu . up i . cs . dr ake . t ict aco . firestore . Fire store Helper Ċ import Ġedu . up i . cs . dr ake . t ict aco . model . Game Data Ċ import Ġedu . up i . cs . dr ake . t ict aco . model . GameState Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠGame ViewModel Ġ@ Inject Ġconstructor ( private Ġval Ġfire store Helper : ĠFire store Helper ): ĠViewModel (){ ĊĠĠĠ Ġprivate Ġvar Ġgame State : ĠMutable LiveData < GameState < Game Data >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġprivate Ġvar Ġcomposite Disposable Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġ// player Ġ 1 Ġor Ġ 2 Ġdefault Ġis Ġ 0 ĊĠĠĠ Ġvar Ġplayer Ġ= Ġ 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġgame State . value Ġ= ĠGameState . Loading ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// subscribe Ġdata Ġfrom Ġfire store Ġhelper Ġand Ġput Ġit Ġon Ġthe Ġappropriate Ġgame Ġstate Ġ( LOADING , ĠWIN , ĠLO SE , Ġetc ) ĊĠĠĠ Ġfun Ġsubscribe Game (): ĠLive Data < GameState < Game Data >> { ĊĠĠĠĠĠĠĠ Ġval Ġdis posable Ġ= Ġfire store Helper . getCurrent Document Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgame Data Ġ= Ġit Ġas ĠGame Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( game Data . total Player . toInt () Ġ< Ġ 2 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame State . value Ġ= ĠGameState . Cancelled ( game Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwinner Ġ= Ġcheck Win ( game Data . state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( winner Ġ> Ġ 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Score ( winner , Ġgame Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( winner ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ-> Ġgame State . value Ġ= ĠGameState . Win ( game Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġgame State . value Ġ= ĠGameState . Lo se ( game Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( game Data . player 1 Ready . to Boolean () Ġ&& Ġgame Data . player 2 Ready . to Boolean ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( game Data . turn . toInt () Ġ== Ġplayer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame State . value Ġ= ĠGameState . Your Turn ( game Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame State . value Ġ= ĠGameState . Enemy Turn ( game Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame State . value Ġ= ĠGameState . Loading ( game Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" error ", Ġ" Game ViewModel Ġ" Ġ+ Ġit . message )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcomposite Disposable . add ( dis posable ) ĊĠĠĠĠĠĠĠ Ġreturn Ġgame State ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// handle Ġplayer Ġmovement Ġby Ġupdating Ġboard state Ġin Ġthe Ġfire store ĊĠĠĠ Ġfun Ġmove ( position : ĠInt ): ĠString { ĊĠĠĠĠĠĠĠ Ġ// create Ġnew Ġboard Ġstate ĊĠĠĠĠĠĠĠ Ġval Ġboard State : ĠMutable List < Int > Ġ= Ġgame State . value ?. data ?. state Ġas ĠMutable List < Int > ĊĠĠĠĠĠĠĠ Ġboard State [ position ] Ġ= Ġplayer ĊĊĠĠĠĠĠĠĠ Ġval ĠnewState : ĠMutable Map < String , ĠAny > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ ĠnewState [ Fire Store Constants . T URN ] Ġ= Ġif ( player Ġ== Ġ 1 ) Ġ 2 Ġelse Ġ 1 ĊĠĠĠĠĠĠĠ ĠnewState [ Fire Store Constants . NEW _ MOVE ] Ġ= Ġposition ĊĠĠĠĠĠĠĠ ĠnewState [ Fire Store Constants . STATE ] Ġ= Ġboard State ĊĠĠĠĠĠĠĠ Ġfire store Helper . update ( newState ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif ( player Ġ== Ġ 1 ) Ġ" X " Ġelse Ġ" O " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// set Ġplayer Ġready Ġto Ġtrue ĊĠĠĠ Ġfun Ġplayer Ready (){ ĊĠĠĠĠĠĠĠ Ġval ĠnewState : ĠMutable Map < String , ĠAny > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġif ( player Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewState [ Fire Store Constants . PLAYER 1 _ READY ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewState [ Fire Store Constants . PLAYER 2 _ READY ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfire store Helper . update ( newState ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// this Ġmethod Ġhandle Ġgame Ġcancellation Ġand Ġupdate Ġdata Ġaccordingly ĊĠĠĠ Ġfun Ġcancel Game (){ ĊĠĠĠĠĠĠĠ Ġval ĠnewVal : ĠMutable Map < String , ĠAny > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ ĠnewVal [ Fire Store Constants . TOTAL _ PLAYER ] Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġfire store Helper . update ( new Val ) ĊĠĠĠĠĠĠĠ Ġunsubscribe () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplay Again (){ ĊĠĠĠĠĠĠĠ Ġval ĠnewState : ĠMutable Map < String , ĠAny > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ ĠnewState [ if ( player Ġ== Ġ 1 ) ĠFire Store Constants . PLAYER 1 _ READY Ġelse ĠFire Store Constants . PLAYER 2 _ READY ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfire store Helper . update ( newState ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquit Game (){ ĊĠĠĠĠĠĠĠ Ġfire store Helper . delete () ĊĠĠĠĠĠĠĠ Ġunsubscribe () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Win ( board : ĠList < Int >): ĠInt { ĊĠĠĠĠĠĠĠ Ġvar Ġwinner Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Horizontal ( board ) Ġ> Ġ 0 Ġ-> Ġwinner Ġ= Ġcheck Horizontal ( board ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Vertical ( board ) Ġ> Ġ 0 Ġ-> Ġwinner Ġ= Ġcheck Vertical ( board ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Diag onal ( board ) Ġ> Ġ 0 Ġ-> Ġwinner Ġ= Ġcheck Diag onal ( board ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwinner ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// these Ġmethods Ġcheck Ġif Ġa Ġplayer Ġwin Ġthe Ġgame ĊĠĠĠ Ġprivate Ġfun Ġcheck Horizontal ( board : ĠList < Int >): ĠInt { ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( board [ 0 ] Ġ== Ġboard [ 1 ] Ġ&& Ġboard [ 1 ] Ġ== Ġboard [ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif ( board [ 3 ] Ġ== Ġboard [ 4 ] Ġ&& Ġboard [ 4 ] Ġ== Ġboard [ 5 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif ( board [ 6 ] Ġ== Ġboard [ 7 ] Ġ&& Ġboard [ 7 ] Ġ== Ġboard [ 8 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ 6 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Vertical ( board : ĠList < Int >): ĠInt { ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( board [ 0 ] Ġ== Ġboard [ 3 ] Ġ&& Ġboard [ 3 ] Ġ== Ġboard [ 6 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif ( board [ 1 ] Ġ== Ġboard [ 4 ] Ġ&& Ġboard [ 4 ] Ġ== Ġboard [ 7 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif ( board [ 2 ] Ġ== Ġboard [ 5 ] Ġ&& Ġboard [ 5 ] Ġ== Ġboard [ 8 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Diag onal ( board : ĠList < Int >): ĠInt { ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( board [ 0 ] Ġ== Ġboard [ 4 ] Ġ&& Ġboard [ 4 ] Ġ== Ġboard [ 8 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif ( board [ 2 ] Ġ== Ġboard [ 4 ] Ġ&& Ġboard [ 4 ] Ġ== Ġboard [ 6 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard [ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Score ( winner : ĠInt , Ġgame Data : ĠGame Data ){ ĊĠĠĠĠĠĠĠ Ġval ĠnewState : ĠMutable Map < String , ĠAny > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ ĠnewState [ Fire Store Constants . PLAYER 1 _ READY ] Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠnewState [ Fire Store Constants . PLAYER 2 _ READY ] Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠnewState [ Fire Store Constants . STATE ] Ġ= Ġarray ListOf ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) ĊĠĠĠĠĠĠĠ Ġwhen ( winner ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠnewState [ Fire Store Constants . PLAYER 1 _ SCORE ] Ġ= Ġgame Data . player 1 Score . toInt () Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠnewState [ Fire Store Constants . PLAYER 2 _ SCORE ] Ġ= Ġgame Data . player 2 Score . toInt () Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfire store Helper . update ( newState ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunsubscribe (){ ĊĠĠĠĠĠĠĠ Ġcomposite Disposable . clear () ĊĠĠĠĠĠĠĠ Ġfire store Helper . unsubscribe () ĊĠĠĠ Ġ} Ċ }