package Ġcom . coin ninja . coin keeper . ui . payment . create Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġapp . coin ninja . cn . th under d ome . model . Request Invoice Ċ import Ġapp . coin ninja . cn . th under d ome . repository . Th under D ome Repository Ċ import Ġapp . drop bit . annotations . Mock able Ċ import Ġapp . drop bit . commons . currency . BT CC urrency Ċ import Ġcom . coin ninja . coin keeper . service . callbacks . Basic Callback Handler Ċ import Ġcom . coin ninja . coin keeper . service . callbacks . B ip 7 0 Callback Ċ import Ġcom . coin ninja . coin keeper . service . client . B ip 7 0 Client Ċ import Ġcom . coin ninja . coin keeper . service . client . model . Merchant Response Ċ import Ġcom . coin ninja . coin keeper . util . Drop bit Intent s Ċ import Ġcom . coin ninja . coin keeper . util . android . Clipboard Util Ċ import Ġcom . coin ninja . coin keeper . util . crypto . Bitcoin Uri Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjavax . inject . Inject ĊĊ Ċ @ Mock able Ċ class ĠRaw Input ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġth under D ome Repository : ĠTh under D ome Repository , ĊĠĠĠĠĠĠĠ Ġval Ġclipboard Util : ĠClip board Util , ĊĠĠĠĠĠĠĠ Ġval Ġbitcoin Uri Builder : ĠBitcoin Uri . Builder , ĊĠĠĠĠĠĠĠ Ġval Ġb ip 7 0 Client : ĠB ip 7 0 Client Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġvar Ġinvalid Raw Input : ĠMutable LiveData < String > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġvar Ġvalid Raw Input : ĠMutable LiveData < Bitcoin Uri > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġvar Ġvalid Request Invoice : ĠMutable LiveData < Request Invoice > Ġ= ĠMutable LiveData () ĊĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġinvalid Raw Input Ġ= ĠMutable LiveData () ĊĠĠĠĠĠĠĠ Ġvalid Raw Input Ġ= ĠMutable LiveData () ĊĠĠĠĠĠĠĠ Ġvalid Request Invoice Ġ= ĠMutable LiveData () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Qr Scan Result ( data : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . getString Extra ( Drop bit Intent s . EXTRA _ SCAN N ED _ DATA )?. let Ġ{ Ġcrypto Uri Input Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Crypto Uri Input ( crypto Uri Input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinput From Paste () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġclipboard Util . raw ĊĠĠĠĠĠĠĠ Ġif Ġ( value . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid Raw Input . value Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Crypto Uri Input ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprocess Crypto Uri Input ( crypto Uri String : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( crypto Uri String . startsWith (" ln ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġcrypto Uri String . startsWith (" lightning :" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassume Lightning ( crypto Uri String ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassume Blockchain ( crypto Uri String ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassume Lightning ( crypto Uri String : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġif Ġ( crypto Uri String . startsWith (" lightning :" )) Ġcrypto Uri String . split (": ")[ 1 ] Ġelse Ġcrypto Uri String ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġvalidate Ġlocally Ġvalidity Ġof Ġencoded Ġvalue Ġbefore Ġunpack ing Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprefix : Ġln Ġ+ ĠB IP - 0 1 7 3 Ġcurrency Ġprefix Ġ( e . g . Ġl nb c Ġfor ĠBitcoin Ġmain net , Ġl nt b Ġfor ĠBitcoin Ġtest net , Ġand Ġl nb crt Ġfor ĠBitcoin Ġreg test ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġconsider Ġbe ch 3 2 Ġvalidation Ġon Ġpattern ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Invoice Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġth under D ome Repository . decode ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Invoice ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Request Invoice . value Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassume Blockchain ( crypto Uri String : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbitcoin Uri Ġ= Ġbitcoin Uri Builder . parse ( crypto Uri String ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( bitcoin Uri . isValid Payment Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Crypto Uri ( bitcoin Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid Raw Input . value Ġ= Ġcrypto Uri String ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġprocess Crypto Uri ( bitcoin Uri : ĠBitcoin Uri ) Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bitcoin Uri . is B ip 7 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb ip 7 0 Client . get Merchant Information ( bitcoin Uri . merchant Uri , Ġb ip 7 0 Callback ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( bitcoin Uri . isValid Payment Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid ( bitcoin Uri ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( bitcoin Uri . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġvalid ( bitcoin Uri : ĠBitcoin Uri ) Ġ= Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalid Raw Input . value Ġ= Ġbitcoin Uri ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġerror ( error Text : ĠString ) Ġ= Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinvalid Raw Input . value Ġ= Ġerror Text ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġval Ġb ip 7 0 Callback Ġ= ĠB ip 7 0 Callback ( object Ġ: ĠBasic Callback Handler < Merchant Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfailure ( errorMessage : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" invalid Ġpayment Ġuri ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsuccess ( response : ĠMer chant Response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . payment Address ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitcoin Uri Builder . set Address ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitcoin Uri Builder . set Fee ( response . required Fee ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitcoin Uri Builder . set Amount ( BT CC urrency ( response . payment Amount )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitcoin Uri Builder . set Memo ( response . memo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġbitcoin Uri Builder . build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri . isValid Payment Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" invalid Ġpayment Ġuri ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ}) Ċ }