package Ġio . github . v ish num ad . nb as cores . ui . details Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . squareup . inject . ass isted . Ass isted Ċ import Ġcom . squareup . inject . ass isted . Ass isted Inject Ċ import Ġio . github . v ish num ad . nb as cores . data . models . Game Details Ċ import Ġio . github . v ish num ad . nb as cores . data . models . Live Score Ċ import Ġio . github . v ish num ad . nb as cores . data . repositories . Game Details Repository Ċ import Ġio . github . v ish num ad . nb as cores . data . repositories . Live Scores Repository Ċ import Ġio . github . v ish num ad . nb as cores . di . MAIN _ THREAD Ċ import Ġio . github . v ish num ad . nb as cores . ui . common . Polling Ċ import Ġio . github . v ish num ad . nb as cores . utils . Event Ċ import Ġio . github . v ish num ad . nb as cores . utils . log Error Ċ import Ġio . reactivex . Scheduler Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . rx kotlin . plus Assign Ċ import Ġio . reactivex . rx kotlin . subscribe By Ċ import Ġretrofit 2 . HttpException Ċ import Ġjavax . inject . Named Ċ Ċ private Ġconst Ġval ĠREF RESH _ INTERVAL _ MS : ĠLong Ġ= Ġ 2 0 Ġ* Ġ 1 0 0 0 Ċ Ċ class ĠGame Details ViewModel Ġ@ Ass isted Inject Ġconstructor ( ĊĠĠĠ Ġ@ Ass isted Ġprivate Ġval Ġgame Id : ĠString , ĊĠĠĠ Ġ@ Ass isted Ġprivate Ġval Ġseason Year : ĠString , ĊĠĠĠ Ġprivate Ġval Ġscores Repo : ĠLive Scores Repository , ĊĠĠĠ Ġprivate Ġval Ġdetails Repo : ĠGame Details Repository , ĊĠĠĠ Ġ@ Named ( MAIN _ THREAD ) Ġprivate Ġval Ġmain Scheduler : ĠScheduler Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġ@ Ass isted Inject . Factory ĊĠĠĠ Ġinterface ĠFactory Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( game Id : ĠString , Ġseason Year : ĠString ): ĠGame Details ViewModel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġscore State Ġ= ĠMutable LiveData < Live Score >() ĊĠĠĠ Ġprivate Ġval Ġdetails State Ġ= ĠMutable LiveData < Game Details ViewState >() ĊĊĠĠĠ Ġprivate Ġval Ġtoast Events Ġ= ĠMutable LiveData < Event < String >>() ĊĊĠĠĠ Ġprivate Ġval Ġdetails Polling : ĠPol ling ĊĊĠĠĠ Ġprivate Ġval Ġdis pos ables Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdetails Polling Ġ= ĠPol ling ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterval Ms Ġ= ĠREF RESH _ INTERVAL _ MS , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Delay Ġ= ĠREF RESH _ INTERVAL _ MS , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Ġ= Ġdetails Repo . fetch Game Details ( season Year , Ġgame Id ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Scheduler Ġ= Ġmain Scheduler , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Poll Error Ġ= Ġ{ Ġhandle Error ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSubscribe Ġto Ġlive Ġscore Ġfrom Ġdatabase ĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= Ġscores Repo . get Score ( game Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe By Ġ{ Ġscore State . value Ġ= Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= Ġdetails Repo . get Game Details ( game Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe By ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Next Ġ= Ġ{ Ġdetails Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetails State . value Ġ= ĠGame Details ViewState . Success ( details ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġpoll Ġif Ġthis Ġis Ġan Ġongoing Ġgame ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( details Ġis ĠGame Details . O ngo ing Game Details ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetails Polling . enable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetails Polling . disable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Error ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġdetails State . value Ġ= ĠGame Details ViewState . Loading ĊĠĠĠĠĠĠĠ Ġfetch Game Details () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Score State (): ĠLive Data < Live Score > Ġ= Ġscore State ĊĊĠĠĠ Ġfun Ġget Details State (): ĠLive Data < Game Details ViewState > Ġ= Ġdetails State ĊĊĠĠĠ Ġfun Ġget Toast Events (): ĠLive Data < Event < String >> Ġ= Ġtoast Events ĊĊĠĠĠ Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġdetails Polling . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġdetails Polling . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Swipe Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġfetch Game Details () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Reload Button Click () Ġ{ ĊĠĠĠĠĠĠĠ Ġdetails State . value Ġ= ĠGame Details ViewState . Loading ĊĠĠĠĠĠĠĠ Ġfetch Game Details () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Game Details () Ġ{ ĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= Ġdetails Repo . fetch Game Details ( season Year , Ġgame Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe By ( onError Ġ= Ġ{ Ġhandle Error ( it ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ Ġdis pos ables . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠerrorMessage For ( error : ĠThrowable ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHttp Exception Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Error Ġ${ error . code () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error . message (). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (": Ġ${ error . message () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Could Ġnot Ġload Ġgame Ġdetails " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Error ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Error ( throwable ) ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠerrorMessage For ( throwable ) ĊĠĠĠĠĠĠĠ Ġif Ġ( details State . value Ġis ĠGame Details ViewState . Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShow Ġtoast Ġinstead Ġof Ġerror Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast Events . value Ġ= ĠEvent ( message ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetails State . value Ġ= ĠGame Details ViewState . Failure ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }