package Ġcom . blo vote . sur veys . data Ċ Ċ import Ġandroid . arch . lifecycle . Lifecycle Owner Ċ import Ġandroid . arch . lifecycle . Observer Ċ import Ġcom . blo vote . account . data . Account Storage Ċ import Ġcom . blo vote . contracts . Contracts _ B lo God Impl _ sol _ B lo God Impl Ċ import Ġcom . blo vote . contracts . Contracts _ B lo vote Impl _ sol _ B lo vote Impl Ċ import Ġcom . blo vote . sur veys . data . entities .* Ċ import Ġcom . blo vote . sur veys . domain . Sur veys Repository Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġorg . web 3 j . protocol . Web 3 j Ċ import Ġorg . web 3 j . tx . Contract Ċ import Ġjava . math . BigInteger Ċ import Ġjava . nio . charset . Charset Ċ Ċ class ĠSur veys Repository Impl ( private Ġval Ġsur veys Storage : ĠSur veys Storage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġweb 3 j Ġ: ĠWeb 3 j , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġgod Contract Address Ġ: ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġaccount Storage : ĠAccount Storage ) Ġ: ĠSur veys Repository Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġgas Price Ġby Ġlazy Ġ{ Ġweb 3 j . eth Gas Price (). send (). gas Price . multiply ( BigInteger . valueOf ( 5 L )) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcontract B lo God Impl Ġby Ġlazy Ġ{ ĠContract s _ B lo God Impl _ sol _ B lo God Impl . load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgod Contract Address , Ġweb 3 j , Ġaccount Storage . get Credentials (), Ġgas Price , ĠContract . G AS _ LIMIT ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Sur veys (): ĠList < Survey > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsur veys Storage . getAll Sur veys (). value Ġ?: ĠlistOf () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġobserve All Sur veys ( lifecycle Owner : ĠLifecycle Owner ) Ġ: ĠObservable < List < Survey >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . create < List < Survey >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsur veys Storage . getAll Sur veys (). observe ( lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObserver < List < Survey >> Ġ{ Ġt Ġ-> Ġit . onNext ( t !! ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġobserve Creators Questions ( lifecycle Owner : ĠLifecycle Owner , Ġaddress : ĠString ): ĠObservable < List < Survey >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . create < List < Survey >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsur veys Storage . get Creators Sur veys ( address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe ( lifecycle Owner , ĠObserver < List < Survey >> Ġ{ Ġt Ġ-> Ġit . onNext ( t !! ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Sur veys (): ĠList < Survey > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsur veys Num der Ġ= Ġcontract B lo God Impl . sur veys Number . send () ĊĠĠĠĠĠĠĠ Ġval Ġlast Index Ġ= Ġsur veys Storage . getLast Survey Index () ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Addresses Ġ= Ġcontract B lo God Impl . getB lo vote Addresses ( BigInteger . valueOf ( last Index Ġ+ Ġ 1 L ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsur veys Num der ). send () ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Survey >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġnew Addresses . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsurvey Ġ= Ġload B lo vote ( new Addresses [ i ]. toString (), Ġlast Index Ġ+ Ġ 1 Ġ+ Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( survey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsur veys Storage . save Survey ( survey ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Survey Question Info ( survey : ĠSurvey , Ġcategory : ĠQuestion Category , Ġindex : ĠInt ): ĠSingle < Survey > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Success ( load Question ( survey , Ġcategory , Ġindex )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġupdate Survey All Questions Info ( survey : ĠSurvey ) Ġ: ĠSingle < Survey > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġupdated Survey : ĠSurvey Ġ= Ġsurvey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsurvey . questions Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( updated Survey . questions . size Ġ<= Ġi Ġ|| Ġupdated Survey . questions [ i ]. title . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Survey Ġ= Ġload Question ( survey , ĠQuestion Category . Main Question , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Success ( updated Survey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Survey ( title : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Respond ents Count : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreward Size : ĠBigInteger , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Questions Ġ: ĠList < Question >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Questions : ĠList < Question >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġprev Sur veys Number Ġ= Ġcontract B lo God Impl . sur veys Number . send () ĊĠĠĠĠĠĠĠ Ġcontract B lo God Impl . createNew Survey ( title . toByteArray ( Charset . forName (" UTF - 8 ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger . valueOf ( required Respond ents Count . to Long ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreward Size . multiply ( BigInteger . valueOf ( required Respond ents Count . to Long ())) ). send () ĊĠĠĠĠĠĠĠ Ġval Ġcurr Sur veys Number Ġ= Ġcontract B lo God Impl . sur veys Number . send () ĊĠĠĠĠĠĠĠ Ġval Ġsurvey Contract Ġ= Ġget B lo vote Contract ( contract B lo God Impl . getB lo vote Addresses ( prev Sur veys Number , Ġcurr Sur veys Number ). send ()[ 0 ]. toString ()) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġfilter Questions . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquestion Ġ= Ġfilter Questions [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurvey Contract . add Filter Question ( BigInteger . valueOf ( question . type . get Contract Question Type (). to Long ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquestion . title . toByteArray ( Charset . forName (" UTF - 8 ")) ). send () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġquestion . points . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsurvey Contract . add Filter Question Point ( BigInteger . valueOf ( i . to Long ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquestion . points [ j ]. toByteArray ( Charset . forName (" UTF - 8 ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquestion . answers . contains ( j )). send () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmain Questions . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquestion Ġ= Ġmain Questions [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurvey Contract . add Question ( BigInteger . valueOf ( question . type . get Contract Question Type (). to Long ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquestion . title . toByteArray ( Charset . forName (" UTF - 8 ")) ). send () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġquestion . points . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsurvey Contract . add Question Point ( BigInteger . valueOf ( i . to Long ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquestion . points [ j ]. toByteArray ( Charset . forName (" UTF - 8 "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. send () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsurvey Contract . update State ( BigInteger . valueOf ( Survey State . Active . ordinal . to Long ())). send () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġget Survey ( address : ĠString ): ĠSingle < Survey > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsurvey Ġ= Ġsur veys Storage . get Survey ( address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( survey Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Success ( survey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġtest Ġwith Ġsurvey Ġexternal Ġlink ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Success ( load B lo vote ( address , Ġ- 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Survey Info ( survey : ĠSurvey ) Ġ: ĠSingle < Survey > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Survey Ġ= Ġload B lo vote ( survey . address , Ġsurvey . index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsur veys Storage . save Survey ( new Survey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Success ( new Survey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcheck Answer ( survey : ĠSurvey , Ġquestion Index : ĠInt , Ġanswers : ĠList < String >) Ġ: ĠSingle < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquestion Ġ= Ġsurvey . filter Q ues ions [ question Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Answers Ġ= Ġquestion . answers . map Ġ{ Ġit . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġanswers . size Ġ== Ġright Answers . size Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanswers . all Ġ{ Ġright Answers . contains ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Success ( right ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupload Answer ( survey : ĠSurvey , Ġquestion Index : ĠInt , Ġanswers : ĠList < String >): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . create ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblo vote Ġ= Ġget B lo vote Contract ( survey . address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquestion Ġ= Ġsurvey . questions [ question Index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceipt Ġ= Ġif Ġ( question . type Ġ== ĠQuestion Type . Text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblo vote . respond Text ( answers [ 0 ]. toByteArray ( Charset . forName (" UTF - 8 ")) ). send () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblo vote . respond Numbers ( answers . map Ġ{ Ġit Ġ-> Ġit . to BigInteger () Ġ}). send () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onComplete () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġload Respond Info ( survey Address : ĠString , Ġindex : ĠInt ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . create Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrespond Ġ= Ġsur veys Storage . get Respond ( survey Address , Ġindex ). value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( respond Ġ== Ġnull Ġ|| Ġrespond . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblo vote Ġ= Ġget B lo vote Contract ( survey Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsur veys Storage . save Respond ( survey Address , Ġindex , Ġload Respond Answers ( blo vote , Ġindex )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload All Resp on ds Info ( survey Address : ĠString ) Ġ: ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . create Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblo vote Ġ= Ġget B lo vote Contract ( survey Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp s Count Ġ= Ġblo vote . current Respond ents Count (). send (). toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġresp s Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrespond Ġ= Ġsur veys Storage . get Respond ( survey Address , Ġi ). value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( respond Ġ== Ġnull Ġ|| Ġrespond . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsur veys Storage . save Respond ( survey Address , Ġi , Ġload Respond Answers ( blo vote , Ġi )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Respond Answers ( blo vote : ĠContract s _ B lo vote Impl _ sol _ B lo vote Impl , Ġindex : ĠInt ) Ġ: ĠList < Answers > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ: ĠMutable List < Answers > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġquestions Count Ġ= Ġblo vote . questions Count . send (). toInt () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġquestions Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanswers Array Ġ= Ġblo vote . get Respond Data ( i . to BigInteger (), Ġindex . to BigInteger ()). send () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquestion Info Ġ= Ġblo vote . get Question Info ( i . to BigInteger ()). send () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠQuestion Type . from Contract Question Type ( question Info . value 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanswer Ġ= Ġif Ġ( type Ġ== ĠQuestion Type . Text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( answers Array . value 2 . toString ( Charset . forName (" UTF - 8 "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanswers Array . value 2 . map Ġ{ Ġit . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . add ( Answers ( answer )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Resp on ds ( lifecycle Owner : ĠLifecycle Owner , Ġsurvey Address : ĠString ): ĠObservable < List < Respond >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . create Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsur veys Storage . get Resp on ds ( survey Address ). observe ( lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObserver < List < Respond >> Ġ{ Ġr Ġ-> Ġit . onNext ( r !! ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Respond ( lifecycle Owner : ĠLifecycle Owner , Ġsurvey Address : ĠString , Ġindex : ĠInt ) Ġ: ĠObservable < Respond > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . create Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsur veys Storage . get Respond ( survey Address , Ġindex ). observe ( lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObserver < List < Respond >> Ġ{ Ġr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r Ġ!= Ġnull Ġ&& Ġ! r . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onNext ( r [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġload B lo vote ( address Ġ: ĠString , Ġindex Ġ: ĠInt ) Ġ: ĠSurvey Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprev Survey Ġ= Ġsur veys Storage . get Survey ( address ) ĊĊĠĠĠĠĠĠĠ Ġval Ġblo vote Ġ= Ġget B lo vote Contract ( address ) ĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġblo vote . title (). send (). toString ( Charset . forName (" UTF - 8 ")) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcreator Ġfield Ġwas Ġadded Ġlater Ġand Ġmay Ġnot Ġbe Ġpresented Ġat Ġold Ġsur veys ĊĠĠĠĠĠĠĠ Ġval Ġcreator Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblo vote . creator (). send () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ġ"" Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠSurvey State . values ()[ blo vote . state . send (). toInt ()] ĊĠĠĠĠĠĠĠ Ġval Ġcreation Time Ġ= Ġblo vote . creation Timestamp (). send (). to Long () ĊĠĠĠĠĠĠĠ Ġval Ġrequired Resp Cnt Ġ= Ġblo vote . required Respond ents Count (). send (). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Resp Cnt Ġ= Ġblo vote . current Respond ents Count (). send (). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġreward Size Ġ Ġ= Ġblo vote . reward Size (). send (). toString () ĊĠĠĠĠĠĠĠ Ġval Ġfilter Questions Count Ġ= Ġblo vote . filter Questions Count . send (). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġquestions Count Ġ= Ġblo vote . questions Count . send (). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġsurvey Ġ= ĠSurvey ( address , Ġindex , Ġcreator , Ġtitle , Ġstate , Ġcreation Time , Ġrequired Resp Cnt , Ġcurrent Resp Cnt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreward Size , Ġfilter Questions Count , Ġquestions Count ) ĊĠĠĠĠĠĠĠ Ġif Ġ( prev Survey Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurvey . filter Q ues ions Ġ= Ġprev Survey . filter Q ues ions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurvey . questions Ġ= Ġprev Survey . questions ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsurvey . loaded Time Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsurvey ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Question ( survey : ĠSurvey , Ġcategory : ĠQuestion Category , Ġindex : ĠInt ) Ġ: ĠSurvey Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblo vote Ġ= Ġget B lo vote Contract ( survey . address ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ: ĠQuestion Type ĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ: ĠString ĊĠĠĠĠĠĠĠ Ġval Ġpoints Ġ: ĠMutable List < String > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġanswers Ġ: ĠList < Int > ĊĠĠĠĠĠĠĠ Ġval Ġnew Questions Ġ: ĠMutable List < Question > ĊĊĠĠĠĠĠĠĠ Ġif Ġ( category Ġ== ĠQuestion Category . Main Question ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Tuple Ġ= Ġblo vote . get Question Info ( BigInteger . valueOf ( index . to Long ())). send () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠQuestion Type . from Contract Question Type ( info Tuple . value 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġinfo Tuple . value 2 . toString ( Charset . forName (" UTF - 8 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanswers Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Questions Ġ= ĠArrayList ( survey . questions ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoints Count Ġ= Ġblo vote . get Question Points Count ( index . to BigInteger ()). send (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġpoints Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( blo vote . get Question Point Info ( BigInteger . valueOf ( index . to Long ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . to BigInteger ()). send (). toString ( Charset . forName (" UTF - 8 "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Typ le Ġ= Ġblo vote . get Filter Question Info ( BigInteger . valueOf ( index . to Long ())). send () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠQuestion Type . from Contract Question Type ( info Typ le . value 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġinfo Typ le . value 2 . toString ( Charset . forName (" UTF - 8 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanswers Ġ= Ġinfo Typ le . value 3 . map Ġ{ Ġit Ġ-> Ġit . toInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Questions Ġ= ĠArrayList ( survey . filter Q ues ions ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoints Count Ġ= Ġblo vote . get Filter Question Points Count ( index . to BigInteger ()). send (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġpoints Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( blo vote . get Filter Question Point Info ( BigInteger . valueOf ( index . to Long ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi . to BigInteger ()). send (). toString ( Charset . forName (" UTF - 8 "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( new Questions . size Ġ<= Ġindex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Questions . add ( Question ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnew Questions [ index ] Ġ= ĠQuestion ( title , Ġtype , Ġpoints , Ġanswers ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( category Ġ== ĠQuestion Category . Main Question ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurvey . questions Ġ= Ġnew Questions ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurvey . filter Q ues ions Ġ= Ġnew Questions ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsur veys Storage . save Survey ( survey ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsurvey ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġget B lo vote Contract ( address : ĠString ) Ġ: ĠContract s _ B lo vote Impl _ sol _ B lo vote Impl Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠContract s _ B lo vote Impl _ sol _ B lo vote Impl . load ( address , Ġweb 3 j , Ġaccount Storage . get Credentials (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgas Price , ĠContract . G AS _ LIMIT ) ĊĠĠĠ Ġ} Ċ Ċ }