package Ġcy . ag or ise . bits y bit shares wallet . activities Ċ Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . AsyncTask Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . preference . Preference Manager Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . content . pm . Package Info Compat Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Providers Ċ import Ġcom . google . firebase . crash ly t ics . Firebase Crash ly t ics Ċ import Ġcy . ag or ise . bits y bit shares wallet . database . entities . Balance Ċ import Ġcy . ag or ise . bits y bit shares wallet . database . entities . Transfer Ċ import Ġcy . ag or ise . bits y bit shares wallet . processors . Trans fers Loader Ċ import Ġcy . ag or ise . bits y bit shares wallet . repositories . Asset Repository Ċ import Ġcy . ag or ise . bits y bit shares wallet . utils . Constants Ċ import Ġcy . ag or ise . bits y bit shares wallet . utils . Helper Ċ import Ġcy . ag or ise . bits y bit shares wallet . view models . Balance ViewModel Ċ import Ġcy . ag or ise . bits y bit shares wallet . view models . Connected Activity ViewModel Ċ import Ġcy . ag or ise . bits y bit shares wallet . view models . Transfer ViewModel Ċ import Ġcy . ag or ise . bits y bit shares wallet . view models . User Account ViewModel Ċ import Ġcy . ag or ise . graph ene j . Asset Ċ import Ġcy . ag or ise . graph ene j . Asset Amount Ċ import Ġcy . ag or ise . graph ene j . Build Config Ċ import Ġcy . ag or ise . graph ene j . User Account Ċ import Ġcy . ag or ise . graph ene j . api . Api Access Ċ import Ġcy . ag or ise . graph ene j . api . Connection Status Update Ċ import Ġcy . ag or ise . graph ene j . api . android . Network Service Ċ import Ġcy . ag or ise . graph ene j . api . android . Rx Bus Ċ import Ġcy . ag or ise . graph ene j . api . calls .* Ċ import Ġcy . ag or ise . graph ene j . models .* Ċ import Ġcy . ag or ise . graph ene j . network . Full Node Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjava . text . ParseException Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . collections . HashMap Ċ import Ġkotlin . concurrent . thread Ċ Ċ /** Ċ Ġ* ĠThe Ġapp Ġuses Ġthe Ġsingle ĠActivity Ġmethod ology , Ġbut Ġthis Ġactivity Ġwas Ġcreated Ġso Ġthat ĠMainActivity Ġcan Ġextend Ġfrom Ġit . Ċ Ġ* ĠThis Ġclass Ġmanages Ġeverything Ġrelated Ġto Ġkeeping Ġthe Ġinformation Ġin Ġthe Ġdatabase Ġupdated Ġusing Ġgraph ene j 's Ċ Ġ* ĠNetwork Service , Ġleaving Ġto ĠMainActivity Ġonly Ġthe ĠNavigation Ġwork Ġand Ġsome Ġother ĠUI Ġfeatures . Ċ Ġ*/ Ċ abstract Ġclass ĠConnected Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Connected Activity " ĊĊĠĠĠĠĠĠĠ Ġ// ĠDelay Ġbetween Ġbest Ġnode Ġconnection Ġver ifications ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNODE _ CHECK _ DELAY Ġ= Ġ 6 0 0 0 0 L ĠĠ Ġ// Ġ 6 0 Ġseconds ĊĊĠĠĠĠĠĠĠ Ġ// ĠW or st Ġacceptable Ġposition Ġof Ġthe Ġnode Ġthe Ġapp Ġis Ġcurrently Ġconnected Ġto ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠB EST _ NODE _ THRESHOLD Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRESP ONSE _ GET _ FULL _ ACCOUNT S Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRESP ONSE _ GET _ ACCOUNT S Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRESP ONSE _ GET _ ACCOUNT _ BAL AN CES Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRESP ONSE _ GET _ AS SETS Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRESP ONSE _ GET _ BLOCK _ HEADER Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRESP ONSE _ GET _ MARK ET _ HISTORY Ġ= Ġ 6 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm User Account ViewModel : ĠUser Account ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Balance ViewModel : ĠBalance ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Transfer ViewModel : ĠTransfer ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Connected Activity ViewModel : ĠConnected Activity ViewModel ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Asset Repository : ĠAsset Repository ĊĊĠĠĠ Ġ/* ĠCurrent Ġuser Ġaccount Ġ*/ ĊĠĠĠ Ġprotected Ġvar ĠmCurrent Account : ĠUser Account ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġm Handler Ġ= ĠHandler () ĊĊĠĠĠ Ġ// ĠComposite Ġdis posable Ġused Ġto Ġclear Ġall Ġdis pos ables Ġonce Ġthe Ġactivity Ġis Ġdestroyed ĊĠĠĠ Ġprivate Ġval Ġm Composite Disposable Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġprivate Ġvar Ġstored Op Count : ĠLong Ġ= Ġ- 1 ĊĊĠĠĠ Ġprivate Ġvar Ġmissing User Accounts Ġ= ĠArrayList < User Account >() ĊĠĠĠ Ġprivate Ġvar Ġmissing Assets Ġ= ĠArrayList < Asset >() ĊĊĠĠĠ Ġ/* ĠNetwork Ġservice Ġconnection Ġ*/ ĊĠĠĠ Ġprotected Ġvar Ġm Network Service : ĠNetwork Service ? Ġ= ĠNetwork Service . getInstance () ĊĊĠĠĠ Ġ// ĠMap Ġused Ġto Ġkeep Ġtrack Ġof Ġrequest Ġand Ġresponse Ġid Ġpairs ĊĠĠĠ Ġprivate Ġval Ġresponse Map Ġ= ĠHashMap < Long , ĠInt >() ĊĊĠĠĠ Ġ/** ĠMap Ġused Ġto Ġkeep Ġtrack Ġof Ġrequest Ġid Ġand Ġblock Ġnumber Ġpairs Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠrequestId To Block Number Map Ġ= ĠHashMap < Long , ĠLong >() ĊĊĠĠĠ Ġprivate Ġvar Ġblock Number With Missing Time Ġ= Ġ 0 L ĊĊĠĠĠ Ġ// ĠVariable Ġused Ġto Ġhold Ġa Ġreference Ġto Ġthe Ġspecific ĠTransfer Ġinstance Ġwhich Ġwe 're Ġcurrently Ġtrying ĊĠĠĠ Ġ// Ġto Ġresolve Ġan Ġequivalent ĠB TS Ġvalue ĊĠĠĠ Ġvar Ġtransfer : ĠTransfer ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ ĠFirebase Crash ly t ics . getInstance (). set Crash ly t ics Collection Enabled (! Build Config . DEBUG ) ĊĊĠĠĠĠĠĠĠ ĠgetUser Account () ĊĊĠĠĠĠĠĠĠ Ġm Asset Repository Ġ= ĠAsset Repository ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠConfigure ĠConnected Activity ViewModel Ġto Ġobtain Ġmissing Ġequivalent Ġvalues ĊĠĠĠĠĠĠĠ Ġm Connected Activity ViewModel Ġ= ĠViewModel Providers . of ( this ). get ( Connected Activity ViewModel :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrency Code Ġ= ĠHelper . get Co inge cko Supported Currency ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Using Ġcurrency : Ġ${ currency Code . toUpperCase ( Locale . ROOT )} ") ĊĠĠĠĠĠĠĠ Ġm Connected Activity ViewModel . observe Missing Equivalent Values In ( currency Code ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠConfigure ĠUser Account ViewModel Ġto Ġobtain Ġthe Ġmissing Ġaccount Ġids ĊĠĠĠĠĠĠĠ Ġm User Account ViewModel Ġ= ĠViewModel Providers . of ( this ). get ( User Account ViewModel :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġm User Account ViewModel . get Missing User Account Ids (). observe ( this , ĠObserver < List < String >> { Ġuser Account Ids Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user Account Ids . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmissing User Accounts . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( user AccountId Ġin Ġuser Account Ids ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmissing User Accounts . add ( User Account ( user AccountId )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler . post Delayed ( m Request Missing User Accounts Task , ĠConstants . NETWORK _ SERVICE _ RETRY _ PERIOD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠConfigure ĠUser Account ViewModel Ġto Ġobtain Ġthe Ġmissing Ġaccount Ġids ĊĠĠĠĠĠĠĠ Ġm Balance ViewModel Ġ= ĠViewModel Providers . of ( this ). get ( Balance ViewModel :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġm Balance ViewModel . get Missing Asset Ids (). observe ( this , ĠObserver < List < String >> { Ġasset Ids Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( asset Ids . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmissing Assets . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( asset Id Ġin Ġasset Ids ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmissing Assets . add ( Asset ( asset Id )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler . post Delayed ( m Request Missing Assets Task , ĠConstants . NETWORK _ SERVICE _ RETRY _ PERIOD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// Configure ĠTransfer ViewModel Ġto Ġobtain Ġthe ĠTransfer 's Ġblock Ġnumbers Ġwith Ġmissing Ġtime Ġinformation , Ġone Ġby Ġone ĊĠĠĠĠĠĠĠ Ġm Transfer ViewModel Ġ= ĠViewModel Providers . of ( this ). get ( Transfer ViewModel :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġm Transfer ViewModel . get Transfer Block Number With Missing Time (). observe ( this , ĠObserver < Long >{ Ġblock Number Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block Number Ġ!= Ġnull Ġ&& Ġblock Number Ġ!= Ġblock Number With Missing Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Number With Missing Time Ġ= Ġblock Number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler . post ( m Request Block Missing Time Task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġdis posable Ġ= ĠRx Bus . get Bus Instance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Flow able () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . handle Incoming Message ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . handleError ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġm Composite Disposable . add ( dis posable ) ĊĊĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġthis . package Manager . get Package Info ( this . packageName , ĠPackage Manager . GET _ ACTIV ITIES ) ĊĠĠĠĠĠĠĠ Ġval Ġversion Code Ġ= ĠPackage Info Compat . getLong Version Code ( info ) ĊĠĠĠĠĠĠĠ Ġval Ġhas Pur ged Equivalent Values Ġ= ĠPreference Manager . getDefault SharedPreferences ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getBoolean ( Constants . KEY _ HAS _ PUR GED _ EQUI VAL ENT _ VALUES , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġif ( version Code Ġ> Ġ 1 1 Ġ&& Ġ! has Pur ged Equivalent Values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Connected Activity ViewModel . purge Equivalent Values () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPreference Manager . getDefault SharedPreferences ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Boolean ( Constants . KEY _ HAS _ PUR GED _ EQUI VAL ENT _ VALUES , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOb t ains Ġthe ĠuserId Ġfrom Ġthe Ġshared Ġpreferences Ġand Ġcreates Ġa Ġ[ User Account ] Ġinstance . ĊĠĠĠĠ Ġ* ĠCreated Ġas Ġa Ġpublic Ġfunction , Ġso Ġthat Ġit Ġcan Ġbe Ġcalled Ġfrom Ġits ĠF rag ments . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetUser Account () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= ĠPreference Manager . getDefault SharedPreferences ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getString ( Constants . KEY _ CURRENT _ ACCOUNT _ ID , Ġ"") Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( userId Ġ!= Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Account Ġ= ĠUser Account ( userId ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġcrash ly t ics Ġreports Ġcontains Ġthe Ġaccount ĠID ĊĠĠĠĠĠĠĠ Ġval Ġcrash ly t ics Ġ= ĠFirebase Crash ly t ics . getInstance () ĊĠĠĠĠĠĠĠ Ġcrash ly t ics . set Custom Key ( Constants . CR ASH LY T ICS _ KEY _ ACCOUNT _ ID , ĠuserId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠError Ġconsumer Ġused Ġto Ġhandle Ġpotential Ġerrors Ġcaused Ġby Ġthe ĠNetwork Service Ġwhile Ġprocessing ĊĠĠĠĠ Ġ* Ġincoming Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle Error ( throwable : ĠThrowable ){ ĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġwhile Ġprocessing Ġreceived Ġmessage . ĠMsg : Ġ" Ġ+ Ġthrowable . message ) ĊĠĠĠĠĠĠĠ Ġval Ġstack Ġ= Ġthrowable . stack Trace ĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġstack ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠString . format ("% s # % s :% d ", Ġe . className , Ġe . methodName , Ġe . line Number )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcrash ly t ics Ġ= ĠFirebase Crash ly t ics . getInstance () ĊĠĠĠĠĠĠĠ Ġcrash ly t ics . log (" E /$ TAG : ĠConnected Activity Ġreporting Ġerror . ĠMsg : Ġ${ throwable . message }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Incoming Message ( message : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( message Ġis ĠJson Rpc Response <* >) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . error Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Map . containsKey ( message . id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response Map [ message . id ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRESP ONSE _ GET _ FULL _ ACCOUNT S ĠĠĠĠĠ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Account Details (( message . result Ġas ĠList <* >) [ 0 ] Ġas ĠFull Account Details ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRESP ONSE _ GET _ ACCOUNT S ĠĠĠĠĠĠĠĠĠĠ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Account Properties ( message . result Ġas ĠList < Account Properties >) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRESP ONSE _ GET _ ACCOUNT _ BAL AN CES ĠĠ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Balance Update ( message . result Ġas ĠList < Asset Amount >) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRESP ONSE _ GET _ AS SETS ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Assets ( message . result Ġas ĠList < Asset >) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRESP ONSE _ GET _ BLOCK _ HEADER ĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Number Ġ= ĠrequestId To Block Number Map [ message . id ] Ġ?: Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Block Header ( message . result Ġas ĠBlock Header , Ġblock Number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId To Block Number Map . remove ( message . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRESP ONSE _ GET _ MARK ET _ HISTORY ĠĠĠĠ Ġ-> Ġhandle Market Data ( message . result Ġas ĠList < Bucket Object >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Map . remove ( message . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġcase Ġof Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Got Ġerror Ġmessage Ġfrom Ġfull Ġnode . ĠMsg : Ġ" Ġ+ Ġmessage . error . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Connected Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format (" Error Ġfrom Ġfull Ġnode . ĠMsg : Ġ% s ", Ġmessage . error . message ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( message Ġis ĠConnection Status Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . update Code Ġ== ĠConnection Status Update . CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthe ĠCrash ly t ics Ġreport Ġcontains Ġthe Ġcurrently Ġselected Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Node Url Ġ= Ġm Network Service ?. selected Node ?. url Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrash ly t ics Ġ= ĠFirebase Crash ly t ics . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrash ly t ics . set Custom Key ( Constants . CR ASH LY T ICS _ KEY _ CURRENT _ NODE , Ġselected Node Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( message . update Code Ġ== ĠConnection Status Update . DIS CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġgot Ġa Ġdis connection Ġnotification , Ġwe Ġshould Ġclear Ġour Ġresponse Ġmap , Ġsince ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġall Ġits Ġstored Ġrequest Ġids Ġwill Ġnow Ġbe Ġreset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Map . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( message . update Code Ġ== ĠConnection Status Update . API _ UPDATE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġgot Ġan ĠAPI Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( message . api Ġ== ĠApi Access . API _ HISTORY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStarts Ġthe Ġprocedure Ġthat Ġwill Ġobtain Ġthe Ġmissing Ġequivalent Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Transfer ViewModel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Trans fers With Missing B ts Value (). observe ( this , ĠObserver < Transfer > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it Ġ!= Ġnull ) Ġhandle Trans fers With Missing B ts Value ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMethod Ġcalled Ġwhenever Ġwe Ġget Ġa Ġlist Ġof Ġtransfers Ġwith Ġtheir Ġb ts Ġvalue Ġmissing . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle Trans fers With Missing B ts Value ( transfer : ĠTransfer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( m Network Service ?. isConnected Ġ== Ġtrue ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Ġ= ĠAsset ( transfer . transfer Asset Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquote Ġ= ĠAsset (" 1 . 3 . 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbucket : ĠLong Ġ= ĠTimeUnit . SECONDS . convert ( 1 , ĠTimeUnit . DAYS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend : ĠLong Ġ= Ġtransfer . timestamp Ġ* Ġ 1 0 0 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart : ĠLong Ġ= Ġ( transfer . timestamp Ġ- Ġbucket ) Ġ* Ġ 1 0 0 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġm Network Service !!. sendMessage ( Get Market History ( base , Ġquote , Ġbucket , Ġstart , Ġend ), ĠGet Market History . REQUIRED _ API ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Map [ id ] Ġ= ĠRESP ONSE _ GET _ MARK ET _ HISTORY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . transfer Ġ= Ġtransfer ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMethod Ġcalled Ġwhenever Ġa Ġresponse Ġto Ġthe Ġ' get _ full _ accounts ' ĠAPI Ġcall Ġhas Ġbeen Ġdetected . ĊĠĠĠĠ Ġ* Ġ@ param Ġaccount Details ĠĠĠ ĠDe - serialized Ġaccount Ġdetails Ġobject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle Account Details ( account Details : ĠFull Account Details ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlatest Op Count Ġ= Ġaccount Details . statistics . total _ ops ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" handle Account Details . Ġprev Ġcount : Ġ$ stored Op Count , Ġcurrent Ġcount : Ġ$ latest Op Count ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( latest Op Count Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" The Ġnode Ġreturned Ġ 0 Ġtotal _ ops Ġfor Ġcurrent Ġaccount Ġand Ġmay Ġnot Ġhave Ġinstalled Ġthe Ġhistory Ġplugin . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n Ask Ġthe ĠNetwork Service Ġto Ġremove Ġthe Ġnode Ġfrom Ġthe Ġlist Ġand Ġconnect Ġto Ġanother Ġone .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Network Service ?. reconnect Node () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( stored Op Count Ġ== Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInitial Ġcase Ġwhen Ġthe Ġapp Ġstarts ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstored Op Count Ġ= Ġlatest Op Count ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPreference Manager . getDefault SharedPreferences ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. edit (). put Long ( Constants . KEY _ ACCOUNT _ OPERATION _ COUNT , Ġlatest Op Count ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTrans fers Loader ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Balances () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( latest Op Count Ġ> Ġstored Op Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstored Op Count Ġ= Ġlatest Op Count ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTrans fers Loader ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Balances () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe ceiv es Ġa Ġlist Ġof Ġmissing Ġ[ Account Properties ] Ġfrom Ġwhich Ġit Ġextract s Ġthe Ġrequired Ġinformation Ġto ĊĠĠĠĠ Ġ* Ġcreate Ġa Ġlist Ġof ĠBi TS y 's ĠUser Account Ġobjects Ġand Ġstores Ġthem Ġinto Ġthe Ġdatabase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle Account Properties ( account Properties List : ĠList < Account Properties >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Accounts Ġ= ĠArrayList < cy . ag or ise . bits y bit shares wallet . database . entities . User Account >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( account Properties Ġin Ġaccount Properties List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Account Ġ= Ġcy . ag or ise . bits y bit shares wallet . database . entities . User Account ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Properties . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Properties . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Properties . membership _ expiration _ date Ġ== ĠConstants . LI F ETIME _ EXPI RATION _ DATE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Accounts . add ( user Account ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm User Account ViewModel . insert All ( user Accounts ) ĊĠĠĠĠĠĠĠ Ġmissing User Accounts . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Balance Update ( asset Amount List : ĠList < Asset Amount >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġbalances Ġ= ĠArrayList < Balance >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( asset Amount Ġin Ġasset Amount List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbalance Ġ= ĠBalance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset Amount . asset . objectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset Amount . amount . to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbalances . add ( balance ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Balance ViewModel . insert All ( balances ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe ceiv es Ġa Ġlist Ġof Ġmissing Ġ[ Asset ] Ġfrom Ġwhich Ġit Ġextract s Ġthe Ġrequired Ġinformation Ġto ĊĠĠĠĠ Ġ* Ġcreate Ġa Ġlist Ġof ĠBi TS y 's ĠAsset Ġobjects Ġand Ġstores Ġthem Ġinto Ġthe Ġdatabase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle Assets (_ assets : ĠList < Asset >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġassets Ġ= ĠArrayList < cy . ag or ise . bits y bit shares wallet . database . entities . Asset >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(_ asset Ġin Ġ_ assets ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġasset Ġ= Ġcy . ag or ise . bits y bit shares wallet . database . entities . Asset ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ asset . objectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ asset . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ asset . precision , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ asset . description Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ asset . issuer Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassets . add ( asset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Asset Repository . insert All ( assets ) ĊĠĠĠĠĠĠĠ Ġmissing Assets . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe ceiv es Ġthe Ġ[ Block Header ] Ġrelated Ġto Ġa ĠTransfer 's Ġmissing Ġtime Ġand Ġsaves Ġit Ġinto Ġthe Ġdatabase . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle Block Header ( block Header : ĠBlock Header , Ġblock Number : ĠLong ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval ĠdateFormat Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ' T ' HH : mm : ss ", ĠLocale . US ) ĊĠĠĠĠĠĠĠ ĠdateFormat . time Zone Ġ= ĠTime Zone . getTime Zone (" GMT ") ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠdateFormat . parse ( block Header . timestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Transfer ViewModel . set Block Time ( block Number , Ġdate . time Ġ/ Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠParseException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" ParseException . ĠMsg : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Market Data ( buckets : ĠList < Bucket Object >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( buckets . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG ," handle Market Data . ĠBucket Ġis Ġnot Ġempty ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbucket Ġ= Ġbuckets [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= ĠPair ( transfer , Ġbucket ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdis posable Ġ= ĠObservable . just ( pair ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . computation ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġm Transfer ViewModel . update B ts Value ( it . first !! , Ġit . second ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ },{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG ," Error Ġat Ġupdate B ts Value . ĠMsg : Ġ${ it . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( line Ġin Ġit . stack Trace ) ĠLog . e ( TAG , Ġ"${ line . className } # ${ line . methodName }:${ line . line Number }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Composite Disposable . add ( dis posable ) ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG ," handle Market Data . ĠBucket ĠIS Ġempty ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAsync Task . execute Ġ{ Ġm Transfer ViewModel . update B ts Value ( transfer !! , ĠTransfer . ERROR ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Balances () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Network Service ?. isConnected Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġm Network Service !!. sendMessage ( Get Account Balances ( m Current Account , ĠArrayList ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGet Account Balances . REQUIRED _ API ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Map [ id ] Ġ= ĠRESP ONSE _ GET _ ACCOUNT _ BAL AN CES ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTask Ġused Ġto Ġverify Ġthat Ġthe Ġapp Ġis Ġcurrently Ġconnected Ġto Ġone Ġof Ġthe Ġbest Ġnodes , ĊĠĠĠĠ Ġ* Ġand Ġask Ġfor Ġa Ġre connection Ġif Ġit Ġis Ġnot Ġthe Ġcase . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġverify Connection ToS uit able Node Task Ġ= Ġobject Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Verify ing Ġapp Ġis Ġconnected Ġto Ġone Ġof Ġthe Ġbest Ġnodes ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Network Service ?. nodes ?. let Ġ{ Ġnodes Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( counter , Ġnode ) Ġin Ġnodes . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( counter Ġ>= ĠB EST _ NODE _ THRESHOLD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor cing Ġre connection Ġto Ġa Ġbetter Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Network Service ?. reconnect Node () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠApp Ġis Ġconnected Ġto Ġone Ġof Ġthe Ġbest Ġnodes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler . post Delayed ( this , ĠNODE _ CHECK _ DELAY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTask Ġused Ġto Ġobtain Ġthe Ġmissing ĠUser Accounts Ġfrom ĠGraph ene j 's ĠNetwork Service . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm Request Missing User Accounts Task Ġ= Ġobject Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Network Service ?. isConnected Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġm Network Service !!. sendMessage ( Get Accounts ( missing User Accounts ), ĠGet Accounts . REQUIRED _ API ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Map [ id ] Ġ= ĠRESP ONSE _ GET _ ACCOUNT S ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( missing User Accounts . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler . post Delayed ( this , ĠConstants . NETWORK _ SERVICE _ RETRY _ PERIOD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTask Ġused Ġto Ġobtain Ġthe Ġmissing ĠAssets Ġfrom ĠGraph ene j 's ĠNetwork Service . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm Request Missing Assets Task Ġ= Ġobject Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Network Service ?. isConnected Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġm Network Service !!. sendMessage ( Get Assets ( missing Assets ), ĠGet Assets . REQUIRED _ API ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Map [ id ] Ġ= ĠRESP ONSE _ GET _ AS SETS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( missing Assets . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler . post Delayed ( this , ĠConstants . NETWORK _ SERVICE _ RETRY _ PERIOD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTask Ġused Ġto Ġperform Ġa Ġredundant Ġpayment Ġcheck . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm Check Missing Payments Task Ġ= Ġobject Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Network Service ?. isConnected Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Current Account Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Accounts Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Accounts . add ( m Current Account !!. objectId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġm Network Service !!. sendMessage ( Get Full Accounts ( user Accounts , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGet Full Accounts . REQUIRED _ API ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Map [ id ] Ġ= ĠRESP ONSE _ GET _ FULL _ ACCOUNT S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Network Service Ġis Ġnull Ġor Ġis Ġnot Ġconnected . Ġm Network Service : Ġ$ m Network Service ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler . post Delayed ( this , ĠConstants . MISSING _ PAYMENT _ CHECK _ PERIOD ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTask Ġused Ġto Ġobtain Ġthe Ġmissing Ġtime Ġfrom Ġa Ġblock Ġfrom ĠGraph ene j 's ĠNetwork Service . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm Request Block Missing Time Task Ġ= Ġobject Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Network Service ?. isConnected Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġm Network Service !!. sendMessage ( Get Block Header ( block Number With Missing Time ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGet Block Header . REQUIRED _ API ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Map [ id ] Ġ= ĠRESP ONSE _ GET _ BLOCK _ HEADER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId To Block Number Map [ id ] Ġ= Ġblock Number With Missing Time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler . post Delayed ( this , ĠConstants . MISSING _ PAYMENT _ CHECK _ PERIOD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠĠĠĠĠ Ġm Handler . post Delayed ( m Check Missing Payments Task , ĠConstants . MISSING _ PAYMENT _ CHECK _ PERIOD ) ĊĠĠĠĠĠĠĠ Ġm Handler . post Delayed ( verify Connection ToS uit able Node Task , ĠNODE _ CHECK _ DELAY ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġm Network Service ?. node Latency Verifier ?. node List ?. let Ġ{ Ġnodes Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Connected Activity ViewModel . update Node Lat encies ( nodes Ġas ĠList < Full Node >) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Handler . remove Callbacks ( m Check Missing Payments Task ) ĊĠĠĠĠĠĠĠ Ġm Handler . remove Callbacks ( m Request Missing User Accounts Task ) ĊĠĠĠĠĠĠĠ Ġm Handler . remove Callbacks ( m Request Missing Assets Task ) ĊĠĠĠĠĠĠĠ Ġm Handler . remove Callbacks ( m Request Block Missing Time Task ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġif (! m Composite Disposable . is Disposed ) Ġm Composite Disposable . dispose () ĊĠĠĠ Ġ} Ċ }