package Ġat . r tr . r mb t . android . view model Ċ Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Service Connection Ċ import Ġandroid . os . IB inder Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġat . r mb t . util . exception . Handled Exception Ċ import Ġat . r tr . r mb t . android . config . AppConfig Ċ import Ġat . r tr . r mb t . android . ui . view state . Measurement ViewState Ċ import Ġat . r tr . r mb t . android . util . plus Assign Ċ import Ġat . r tr . r mb t . android . util . time String Ċ import Ġat . r tr . r mb t . client . v 2 . task . result . Qo ST est Result Enum Ċ import Ġat . spec ure . data . Terms And Conditions Ċ import Ġat . spec ure . data . entity . Graph Item Record Ċ import Ġat . spec ure . data . entity . Loop Mode Record Ċ import Ġat . spec ure . data . repository . TestData Repository Ċ import Ġat . spec ure . info . strength . Signal Strength LiveData Ċ import Ġat . spec ure . location . Location State Ċ import Ġat . spec ure . location . Location Watcher Ċ import Ġat . spec ure . measurement . Measurement Client Ċ import Ġat . spec ure . measurement . Measurement Producer Ċ import Ġat . spec ure . measurement . Measurement Service Ċ import Ġat . spec ure . measurement . Measurement State Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠMeasurement ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval ĠtestData Repository : ĠTest Data Repository , ĊĠĠĠ Ġprivate Ġval Ġlocation Watcher : ĠLocation Watcher , ĊĠĠĠ Ġval Ġsignal Strength LiveData : ĠSignal Strength LiveData , ĊĠĠĠ Ġval Ġconfig : ĠApp Config , ĊĠĠĠ Ġprivate Ġval Ġt ac : ĠTerms And Conditions Ċ ) Ġ: ĠBase ViewModel (), ĠMeasurement Client Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ measurement Finish LiveData Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġprivate Ġval Ġ_ measurement Cancelled LiveData Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġprivate Ġval Ġ_ is Tests Running LiveData Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġprivate Ġval Ġ_ measurement Error LiveData Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġprivate Ġval Ġ_ download Graph LiveData Ġ= ĠMutable LiveData < List < Graph Item Record >>() ĊĠĠĠ Ġprivate Ġval Ġ_ upload Graph LiveData Ġ= ĠMutable LiveData < List < Graph Item Record >>() ĊĠĠĠ Ġprivate Ġval Ġ_ qos Progress LiveData Ġ= ĠMutable LiveData < Map < Qo ST est Result Enum , ĠInt >>() ĊĠĠĠ Ġprivate Ġval Ġ_ loop UUID LiveData Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġprivate Ġval Ġ_ time To Next Test Elapsed LiveData Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġprivate Ġval Ġ_ time Progress Percent s LiveData Ġ= ĠMutable LiveData < Int >() ĊĊĠĠĠ Ġprivate Ġvar Ġproducer : ĠMeasurement Producer ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġstate Ġ= ĠMeasurement ViewState ( config ) ĊĊĠĠĠ Ġvar Ġtest UUID : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġval Ġlocation State LiveData : ĠLive Data < Location State ?> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġlocation Watcher . state LiveData ĊĊĠĠĠ Ġval Ġloop Uuid LiveData : ĠLive Data < String ?> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ loop UUID LiveData ĊĊĠĠĠ Ġval Ġtime To Next Test Elapsed LiveData : ĠLive Data < String > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ time To Next Test Elapsed LiveData ĊĊĠĠĠ Ġval Ġtime Progress Percent s LiveData : ĠLive Data < Int > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ time Progress Percent s LiveData ĊĊĠĠĠ Ġval Ġmeasurement Finish LiveData : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ measurement Finish LiveData ĊĊĠĠĠ Ġval Ġmeasurement Cancelled LiveData : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ measurement Cancelled LiveData ĊĊĠĠĠ Ġval Ġis Tests Running LiveData : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ is Tests Running LiveData ĊĊĠĠĠ Ġval Ġmeasurement Error LiveData : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ measurement Error LiveData ĊĊĠĠĠ Ġval Ġdownload Graph Source : ĠLive Data < List < Graph Item Record >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ download Graph LiveData ĊĊĠĠĠ Ġval Ġupload Graph Source : ĠLive Data < List < Graph Item Record >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ upload Graph LiveData ĊĊĠĠĠ Ġval Ġq os Progress LiveData : ĠLive Data < Map < Qo ST est Result Enum , ĠInt >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ qos Progress LiveData ĊĊĠĠĠ Ġval Ġis T ac Accepted : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġt ac . tac Accepted ĊĊĠĠĠ Ġlateinit Ġvar Ġloop Progress LiveData : ĠLive Data < Loop Mode Record ?> ĊĊĠĠĠ Ġprivate Ġval Ġservice Connection Ġ= Ġobject Ġ: ĠService Connection Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( component Name : ĠComponent Name ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproducer ?. remove Client ( this @ Measurement ViewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproducer Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" On Ġservice Ġdisconnected ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Connected ( component Name : ĠComponent Name ?, Ġbinder : ĠI Binder ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproducer Ġ= Ġbinder Ġas ĠMeasurement Producer ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloop Local Uuid Ġ= Ġproducer ?. loop Local UUID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest UUID Ġ= Ġproducer ?. test UUID ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Loop Data ( loop Local Uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Passed Ġlocal Ġloop ĠUUID : Ġ$ loop Local Uuid ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproducer ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add Client ( this @ Measurement ViewModel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasurement State . set ( it . measurement State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ loop UUID LiveData . post Value ( it . loop Local UUID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasurement Progress . set ( it . measurement Progress ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġping Nan os . set ( it . ping Nan os ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Speed B ps . set ( it . download Speed B ps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Speed B ps . set ( it . upload Speed B ps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Strength Info Result . set ( it . last Measurement Signal Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Ping Ġvalue Ġfrom : Ġ${ it . ping Nan os }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" On Ġservice Ġconnected :\ n Ġtest Ġrunning : Ġ Ġ${ producer ?. is Tests Running } Ġ\ n Ġmeasurement Ġstate : Ġ Ġ${ producer ?. measurement State } Ġ\ n Ġloop Ġstate : Ġ${ producer ?. loop Mode State } Ġ\ n loop Ġlocal Ġuuid : Ġ${ producer ?. loop Local UUID } Ġ\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinished Ġ= Ġproducer ?. is Tests Running Ġ!= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" FINISHED ?: Ġ$ finished ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Tests Running LiveData . post Value (! finished ) Ġ// Ġto Ġnotify Ġnew Ġopened Ġhome Ġactivity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ measurement Finish LiveData . post Value ( finished ) Ġ// Ġto Ġnotify Ġre created Ġmeasurement Ġactivity Ġto Ġshow Ġresults ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Null Binding ( name : ĠComponent Name ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Null Binding ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Measurement Ġbinding Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ measurement Finish LiveData . post Value ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Binding Di ed ( name : ĠComponent Name ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Binding Di ed ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Measurement Ġbinding Ġdi ed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ measurement Finish LiveData . post Value ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġadd State Save Handler ( state ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġattach ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbound Ġ= Ġcontext . bind Service ( Measurement Service . intent ( context ), Ġservice Connection , ĠContext . BIND _ AUTO _ CREATE ) ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Measurement Ġbinding Ġsuccess : Ġ$ bound ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! bound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ measurement Finish LiveData . post Value ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdetach ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproducer ?. remove Client ( this ) ĊĠĠĠĠĠĠĠ Ġcontext . unbind Service ( service Connection ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Progress Changed ( state : ĠMeasurement State , Ġprogress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . state . measurement State . set ( state ) ĊĠĠĠĠĠĠĠ Ġthis . state . measurement Progress . set ( progress ) ĊĠĠĠĠĠĠĠ Ġif Ġ( config . loop Mode Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state . signal Strength Info Result . set ( producer ?. last Measurement Signal Info ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measurement Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ measurement Error LiveData . post Value ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Download Speed Changed ( progress : ĠInt , Ġspeed B ps : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . download Speed B ps . set ( speed B ps ) ĊĠĠĠĠĠĠĠ Ġif Ġ( progress Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . measurement Download Upload Progress . set ( progress ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . measurement State . get () Ġ== ĠMeasurement State . DOWNLOAD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ download Graph LiveData Ġ+= ĠGraph Item Record ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest UUID Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġprogress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġspeed B ps , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠGraph Item Record . GRAPH _ ITEM _ TYPE _ DOWNLOAD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Upload Speed Changed ( progress : ĠInt , Ġspeed B ps : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . upload Speed B ps . set ( speed B ps ) ĊĠĠĠĠĠĠĠ Ġif Ġ( progress Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . measurement Download Upload Progress . set ( progress ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . measurement State . get () Ġ== ĠMeasurement State . UPLOAD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ upload Graph LiveData Ġ+= ĠGraph Item Record ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest UUID Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġprogress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġspeed B ps , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠGraph Item Record . GRAPH _ ITEM _ TYPE _ UPLOAD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġfun Ġset Measurement Results Shown () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġ_ measurement Result Shown LiveData . value Ġ= Ġtrue Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Ping Changed ( ping Nan os : ĠLong ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġ_ measurement Result Shown LiveData . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠTim ber . i (" Ping Ġvalue Ġfrom : Ġ$ ping Nan os ") ĊĠĠĠĠĠĠĠ Ġstate . ping Nan os . set ( ping Nan os ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon J itter Changed ( j itter Nan os : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Packet Loss Percent Changed ( packet Loss Percent : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Qo S Enabled ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . qos Enabled . set ( enabled ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonSubmit ted () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Test ĠData Ġsent ") ĊĠĠĠĠĠĠĠ Ġ_ measurement Finish LiveData . post Value ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Result Submitted () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing , Ġbecause Ġit Ġis Ġdone Ġin ĠonSubmit ted ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Submission Error ( exception : ĠHand led Exception ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Test ĠData Ġsubmission Ġfailed ") ĊĠĠĠĠĠĠĠ Ġ_ measurement Finish LiveData . post Value ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Loop Count Down Timer ( time Passed Millis : ĠLong , Ġtime Total Millis : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ time To Next Test Elapsed LiveData . post Value (( time Total Millis Ġ- Ġtime Passed Millis ). time String ()) ĊĠĠĠĠĠĠĠ Ġ_ time Progress Percent s LiveData . post Value ((( time Passed Millis Ġ* Ġ 1 0 0 ) Ġ/ Ġtime Total Millis ). toInt ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcancel Measurement () Ġ{ ĊĠĠĠĠĠĠĠ Ġproducer ?. stop Tests () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measurement Cancelled () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ measurement Cancelled LiveData . post Value ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Client Ready ( test UUID : ĠString , Ġloop Local UUID : ĠString ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġthis . test UUID Ġ= Ġtest UUID ĊĠĠĠĠĠĠĠ Ġ_ loop UUID LiveData . post Value ( loop Local UUID ) ĊĠĠĠĠĠĠĠ Ġinitialize Loop Data ( loop Local UUID ) ĊĊĠĠĠĠĠĠĠ ĠTim ber . d (" loop UUID : Ġ$ loop Local UUID ") ĊĊĠĠĠĠĠĠĠ ĠtestData Repository . get Download Graph Items LiveData ( test UUID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ download Graph LiveData . post Value ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠtestData Repository . get Upload Graph Items LiveData ( test UUID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ upload Graph LiveData . post Value ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Loop Data ( loop Local UUID : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( loop Local UUID Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Loop ĠUUID Ġnot Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop Progress LiveData Ġ= ĠtestData Repository . get Loop Mode By Local ( loop Local UUID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ loop UUID LiveData . post Value ( loop Local UUID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state . loop Local UUID . set ( loop Local UUID ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Qo ST est Progress Updated ( tasks Passed : ĠInt , Ġtasks Total : ĠInt , Ġprogress Map : ĠMap < Qo ST est Result Enum , ĠInt >) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . set Qo ST ask Progress ( tasks Passed , Ġtasks Total ) ĊĠĠĠĠĠĠĠ Ġ_ qos Progress LiveData . post Value ( progress Map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Loop Distance Changed ( distance Passed : ĠInt , Ġdistance Total : ĠInt , Ġlocation Available : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . meters Left . set (( distance Total Ġ- Ġdistance Passed ). toString ()) ĊĠĠĠĠĠĠĠ Ġstate . location Available . set ( location Available ) ĊĠĠĠ Ġ} Ċ }