package Ġle mo in . le mo in coin android Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġcom . android . vol ley . Request Ċ import Ġcom . android . vol ley . Response Ċ import Ġcom . android . vol ley . toolbox . JsonObject Request Ċ import Ġcom . android . vol ley . toolbox . Vol ley Ċ import Ġkotlinx . android . synt hetic . main . send _ coin .* Ċ import Ġkotlinx . android . synt hetic . main . toolbar .* Ċ import Ġorg . json . JSONObject Ċ import Ġcom . android . vol ley . Default Retry Policy Ċ import Ġcom . android . vol ley . Retry Policy Ċ import Ġjavax . xml . datatype . Datatype Constants . SECONDS Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġjava . math . BigInteger Ċ import Ġjava . text . Decimal Format Ċ import Ġjava . text . NumberFormat Ċ import Ġjava . util .* ĊĊ Ċ class ĠSend Coin Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġ// ĠDefine Ġrequest Ġcodes Ġfor Ġprivate Ġand Ġpublic Ġkey . ĊĠĠĠ Ġprivate Ġvar ĠCODE _ PUB _ KEY Ġ= Ġ 2 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshared Fun : ĠShared Fun ĊĠĠĠ Ġprivate Ġvar Ġs Db : ĠStored Data Base ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġs Db Worker Thread : ĠDb Worker Thread ĊĠĠĠ Ġprivate Ġval Ġs Ui Handler Ġ= ĠHandler () ĊĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . send _ coin ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar _ page ) ĊĊĠĠĠĠĠĠĠ Ġshared Fun Ġ= ĠShared Fun ( this , Ġthis @ Send Coin , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġshared Fun . set Drawer () ĊĠĠĠĠĠĠĠ Ġs Db Worker Thread Ġ= ĠDb Worker Thread (" db Worker Thread ") ĊĠĠĠĠĠĠĠ Ġs Db Worker Thread . start () ĊĠĠĠĠĠĠĠ Ġs Db Ġ= ĠStored Data Base . getInstance ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġaddress Ġfrom Ġaddress Ġbook Ġ( if Ġone Ġwas Ġsent ). ĊĠĠĠĠĠĠĠ Ġval Ġsend ToAdd Ġ= Ġintent . getString Extra (" contact Address ") ĊĊĠĠĠĠĠĠĠ Ġif ( send ToAdd Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtxt _ receiver _ address . setText ( send ToAdd ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtxt _ send _ to _ name . text Ġ= Ġ(" Send Ġcoins Ġto Ġ" Ġ+ Ġintent . getString Extra (" contact Name ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtxt _ receiver _ address . setText ( send ToAdd ) ĊĊĠĠĠĠĠĠĠ Ġsend _ coin _ amount . add TextChanged Listener ( on TextChanged Listener ()) ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠDefine Ġaction Ġfor Ġ" Send ĠCoin " Ġbutton . ĊĠĠĠĠĠĠĠ Ġbtn _ send _ coin . setOnClickListener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( txt _ receiver _ address . text . matches ("^ 0 x [ 0 - 9 a - fA - F ]{ 4 0 }". to Regex ())){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfer Coin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtxt _ send _ to _ name . text Ġ= Ġ" Invalid Ġaddress Ġformat Ġ(' x 0 ' Ġ+ Ġ 4 0 ĠHex )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġbtn _ qr _ pubkey _ sc . setOnClickListener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this @ Send Coin , ĠQ r Code Scanner :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStart Ġthe ĠQR Ġcode Ġscanner Ġto Ġget Ġa Ġkey . ĠThe Ġrequest Ġcode Ġdefines Ġweather Ġthe Ġqr Ġscanner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġscans Ġthe Ġprivate Ġkey Ġor Ġthe Ġpublic Ġkey Ġof Ġthe Ġreceiver . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , ĠCODE _ PUB _ KEY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ// ĠOver riding Ġthe Ġ" on Activity Result " Ġallows Ġto Ġcatch Ġresults Ġthat Ġcome Ġback Ġwhen Ġthe ĠQR Ġcode ĊĠĠĠ Ġ// Ġscanner Ġis Ġcalled . ĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠCODE _ PUB _ KEY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtxt _ receiver _ address . setText ( data ?. getString Extra (" Key ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĊĠĠĠ Ġ// ĠFunction Ġto Ġtransfer Ġcoins Ġfrom Ġan Ġaccount Ġdefined Ġby Ġthe Ġprivate Ġkey Ġto Ġanother Ġaccount . ĊĠĠĠ Ġprivate Ġfun Ġtransfer Coin () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġget Ġthe Ġprivate Ġkey Ġfrom Ġthe Ġdatabase . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= Ġs Db ?. stored Data Dao ()?. get PrivateKey () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen Ġmake Ġthe Ġtransfer Ġrequest . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ui Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġnew Ġqueue Ġfor ĠHTTP Ġrequests . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqueue Ġ= ĠVol ley . new Request Queue ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe ĠURL Ġof Ġthe Ġserver Ġto Ġtransfer Ġcoins . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Url : ĠString Ġ= ĠgetString ( R . string . server _ url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġserver Url . plus ("/ transfer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhile Ġthe Ġamount Ġof Ġcoins Ġis Ġentered Ġwith Ġtwo Ġdecimal Ġpoints Ġbut Ġis Ġhandled Ġby ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġsmart Ġcontract Ġas Ġan Ġint , Ġit Ġhas Ġto Ġbe Ġconverted . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġamount Of Coin Ġ= Ġsend _ coin _ amount . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Of Coin Ġ= Ġamount Of Coin . replace ("[ ., ] ". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġstarting Ġzeros Ġfrom Ġthe Ġamount Ġof Ġcoin Ġstring . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Of Coin Ġ= Ġamount Of Coin . replace ("^ 0 +". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" The Ġamount Ġof Ġcoins Ġto Ġsend Ġis ssss ssss ssss ssss ssss ssss ssss ssss ssss ssss s ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( amount Of Coin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa ĠJSON Ġobject Ġcontaining Ġthe Ġprivate Ġkey Ġof Ġthe Ġaccount Ġto Ġsend Ġmoney Ġfrom , Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpublic Ġkey Ġof Ġthe Ġaccount Ġto Ġsend Ġmoney Ġto Ġand Ġthe Ġamount Ġof Ġcoins Ġto Ġtransfer . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Param Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreq Param . put (" pri _ key ", ĠprivateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreq Param . put (" send _ to ", Ġtxt _ receiver _ address . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreq Param . put (" amount ", Ġamount Of Coin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe Ġrequest Ġobject . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĠJsonObject Request ( Request . Method . POST , Ġurl , Ġreq Param , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . Listener { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWrite Ġthe Ġstatus Ġin Ġthe Ġtext Ġbox Ġas Ġfeedback Ġfor Ġthe Ġuser . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtxt _ send _ status . hint Ġ= Ġresponse . getString (" status ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĠResponse . Error Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtxt _ send _ status . hint Ġ= Ġ" Transaction Ġfailed Ġ: (" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreq . set Retry Policy ( Default Retry Policy ( 1 0 0 0 0 0 , Ġ 0 , Ġ 1 f )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġrequest Ġobject Ġto Ġthe Ġqueue . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( req ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġs Db Worker Thread . post Task ( task ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon TextChanged Listener (): ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisplay Ġinput Ġnumbers Ġalways Ġin Ġthe Ġformat Ġ"# . ## ". ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend _ coin _ amount . remove TextChanged Listener ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoriginal String Ġ= Ġs . toString (). replace ("[ ,. ] ". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Ġ= Ġoriginal String . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber To Format : ĠNumber Format ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted String : ĠString ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parsed Ġ== Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformatted String Ġ= Ġ" 0 . 0 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumber To Format Ġ= ĠNumber Format . getNumber Instance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumber To Format . minimum Fraction Digits Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformatted String Ġ= Ġnumber To Format . format ( parsed / 1 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetting Ġformatted Ġtext Ġin Ġtext Ġbox . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend _ coin _ amount . setText ( formatted String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend _ coin _ amount . setSelection ( formatted String . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( n fe : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn fe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend _ coin _ amount . add TextChanged Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ