package Ġcash . z . ecc . android . sdk . internal . transaction Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . paging . Paged List Ċ import Ġandroidx . room . Room Ċ import Ġandroidx . room . Room Database Ċ import Ġcash . z . ecc . android . sdk . db . entity . Confirmed Transaction Ċ import Ġcash . z . ecc . android . sdk . ext . Z cash Sdk Ċ import Ġcash . z . ecc . android . sdk . internal . Sdk Dispatch ers Ċ import Ġcash . z . ecc . android . sdk . internal . Sdk Executors Ċ import Ġcash . z . ecc . android . sdk . internal . db . Derived Data Db Ċ import Ġcash . z . ecc . android . sdk . internal . ext . android . to Flow Paged List Ċ import Ġcash . z . ecc . android . sdk . internal . ext . android . to Refresh able Ċ import Ġcash . z . ecc . android . sdk . internal . ext . try Warn Ċ import Ġcash . z . ecc . android . sdk . internal . twig Ċ import Ġcash . z . ecc . android . sdk . jni . Rust Backend Ċ import Ġcash . z . ecc . android . sdk . type . Unified View ing Key Ċ import Ġcash . z . ecc . android . sdk . type . Wallet Birth day Ċ import Ġkotlinx . coroutines . flow . emit All Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ /** Ċ Ġ* ĠExample Ġof Ġa Ġrepository Ġthat Ġleverage s Ġthe ĠRoom Ġpaging Ġlibrary Ġto Ġreturn Ġa Ġ[ Paged List ] Ġof Ċ Ġ* Ġtransactions . ĠCon sum ers Ġcan Ġregister Ġas Ġa Ġpage Ġlistener Ġand Ġreceive Ġan Ġinterface Ġthat Ġallows Ġfor Ċ Ġ* Ġefficiently Ġpaging Ġdata . Ċ Ġ* Ċ Ġ* Ġ@ param ĠpageSize Ġtransactions Ġper Ġpage . ĠThis Ġinflu ences Ġpre - fetch Ġand Ġmemory Ġconfiguration . Ċ Ġ*/ Ċ class ĠP aged Transaction Repository Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġdb : ĠDerived Data Db , ĊĠĠĠ Ġprivate Ġval ĠpageSize : ĠInt Ċ ) Ġ: ĠTransaction Repository Ġ{ ĊĊĠĠĠ Ġ// ĠDA Os ĊĠĠĠ Ġprivate Ġval Ġblocks Ġ= Ġdb . block Dao () ĊĠĠĠ Ġprivate Ġval Ġaccounts Ġ= Ġdb . account Dao () ĊĠĠĠ Ġprivate Ġval Ġtransactions Ġ= Ġdb . transaction Dao () ĊĊĠĠĠ Ġ// ĠTransaction ĠFlow s ĊĠĠĠ Ġprivate Ġval Ġall Transactions Factory Ġ= Ġtransactions . getAll Transactions (). to Refresh able () ĊĊĠĠĠ Ġoverride Ġval Ġreceived Transactions ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġflow < List < Confirmed Transaction >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit All ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransactions . get Received Transactions (). to Refresh able (). to Flow Paged List ( pageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġval Ġsent Transactions ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġflow < List < Confirmed Transaction >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit All ( transactions . get Sent Transactions (). to Refresh able (). to Flow Paged List ( pageSize )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġval Ġall Transactions ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġflow < List < Confirmed Transaction >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit All ( all Transactions Factory . to Flow Paged List ( pageSize )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠTransaction Repository ĠAPI ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġoverride Ġfun Ġinvalidate () Ġ= Ġall Transactions Factory . refresh () ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġlast Sc anned Height () Ġ= Ġblocks . last Sc anned Height () ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfirst Sc anned Height () Ġ= Ġblocks . first Sc anned Height () ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġis Initialized () Ġ= Ġblocks . count () Ġ> Ġ 0 ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfind Encoded Transaction ById ( tx Id : ĠLong ) Ġ= ĊĠĠĠĠĠĠĠ Ġtransactions . find Encoded Transaction ById ( tx Id ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfind New Transactions ( block Height Range : ĠInt Range ): ĠList < Confirmed Transaction > Ġ= ĊĠĠĠĠĠĠĠ Ġtransactions . findAll Transactions By Range ( block Height Range . first , Ġblock Height Range . last ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfind M ined Height ( raw Transaction Id : ĠByteArray ) Ġ= ĊĠĠĠĠĠĠĠ Ġtransactions . find M ined Height ( raw Transaction Id ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfind Matching Transaction Id ( raw Transaction Id : ĠByteArray ): ĠLong ? Ġ= ĊĠĠĠĠĠĠĠ Ġtransactions . find Matching Transaction Id ( raw Transaction Id ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġcleanup Cancelled Tx ( raw Transaction Id : ĠByteArray ) Ġ= ĊĠĠĠĠĠĠĠ Ġtransactions . cleanup Cancelled Tx ( raw Transaction Id ) ĊĊĠĠĠ Ġ// Ġlet Ġexpired Ġtransactions Ġl inger Ġin Ġthe ĠUI Ġfor Ġa Ġlittle Ġwhile ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete Expired ( last Sc anned Height : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġtransactions . delete Expired ( last Sc anned Height Ġ- Ġ( Z cash Sdk . EXPI RY _ OFFSET Ġ/ Ġ 2 )) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġcount () Ġ= Ġtransactions . count () ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Account ( accountId : ĠInt ) Ġ= Ġaccounts . find Account ById ( accountId ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Account Count () Ġ= Ġaccounts . count () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClose Ġthe Ġunderlying Ġdatabase . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Sdk Dispatch ers . DATABASE _ IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : Ġbegin Ġconverting Ġthese Ġinto ĠData ĠAccess ĠAPI . ĠFor Ġnow , Ġjust Ġcollect Ġthe Ġdesired Ġoperations Ġand Ġiterate / refactor , Ġlater ĊĠĠĠ Ġsuspend Ġfun Ġfind Block Hash ( height : ĠInt ): ĠByteArray ? Ġ= Ġblocks . find Hash By Height ( height ) ĊĠĠĠ Ġsuspend Ġfun Ġget Transaction Count (): ĠInt Ġ= Ġtransactions . count () ĊĊĠĠĠ Ġ// ĠTODO : Ġconvert Ġthis Ġinto Ġa Ġwallet Ġrepository Ġrather Ġthan Ġ" transaction Ġrepository " ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġnew ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpageSize : ĠInt Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrust Backend : ĠRust Backend , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbirthday : ĠWallet Birth day , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġviewing Keys : ĠList < Unified View ing Key >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverwrite V ks : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġ): ĠP aged Transaction Repository Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Missing Databases ( rust Backend , Ġbirthday , Ġviewing Keys ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Ġ= Ġbuild Database ( app Context . application Context , Ġrust Backend . path Data Db ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Key Migrations ( rust Backend , Ġoverwrite V ks , Ġviewing Keys ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠP aged Transaction Repository ( db , ĠpageSize ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBuild Ġthe Ġdatabase Ġand Ġapply Ġmigrations . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġsuspend Ġfun Ġbuild Database ( context : ĠContext , Ġdatabase Path : ĠString ): ĠDerived Data Db Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" Building Ġdata Db Ġand Ġapplying Ġmigrations ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRoom . database Builder ( context , ĠDerived Data Db :: class . java , Ġdatabase Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Journal Mode ( Room Database . Journal Mode . TRUNC ATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Query Executor ( Sdk Executors . DATABASE _ IO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Transaction Executor ( Sdk Executors . DATABASE _ IO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Migrations ( Derived Data Db . M IG RATION _ 3 _ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Migrations ( Derived Data Db . M IG RATION _ 4 _ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Migrations ( Derived Data Db . M IG RATION _ 4 _ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Migrations ( Derived Data Db . M IG RATION _ 5 _ 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Migrations ( Derived Data Db . M IG RATION _ 6 _ 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġdocument Ġwhy Ġwe Ġdo Ġthis . ĠMy Ġguess Ġis Ġto Ġcatch Ġdatabase Ġissues Ġearly Ġor Ġto Ġtrigger Ġmigrations -- I Ġforget Ġwhy Ġit Ġwas Ġadded Ġbut Ġthere Ġwas Ġa Ġgood Ġreason ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Sdk Dispatch ers . DATABASE _ IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . open Helper . writable Database . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . open Helper . writable Database . end Transaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreate Ġany Ġdatabases Ġthat Ġdon 't Ġalready Ġexist Ġvia ĠRust . ĠOrigin ally , Ġthis Ġwas Ġdone Ġon Ġthe ĠRust ĊĠĠĠĠĠĠĠĠ Ġ* Ġside Ġbecause ĠRust Ġwas Ġintended Ġto Ġown Ġthe Ġ" data Db " Ġand ĠKotlin Ġjust Ġreads Ġfrom Ġit . ĠSince Ġthen , ĊĠĠĠĠĠĠĠĠ Ġ* Ġit Ġhas Ġbeen Ġmore Ġclear Ġthat ĠKotlin Ġshould Ġown Ġthe Ġdata Ġand Ġjust Ġlet ĠRust Ġuse Ġit . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġsuspend Ġfun Ġinit Missing Databases ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrust Backend : ĠRust Backend , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbirthday : ĠWallet Birth day , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġviewing Keys : ĠList < Unified View ing Key >, ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaybe Create Data Db ( rust Backend ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaybe Init Blocks Table ( rust Backend , Ġbirthday ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaybe Init Accounts Table ( rust Backend , Ġviewing Keys ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreate Ġthe Ġdata Db Ġand Ġits Ġtable , Ġif Ġit Ġdoesn 't Ġexist . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġsuspend Ġfun Ġmaybe Create Data Db ( rust Backend : ĠRust Backend ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Warn (" Warning : Ġdid Ġnot Ġcreate Ġdata Db . ĠIt Ġprobably Ġalready Ġexists .") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrust Backend . init Data Db () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" Initialized Ġwallet Ġfor Ġfirst Ġrun Ġfile : Ġ${ rust Backend . path Data Db }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠInitialize Ġthe Ġblocks Ġtable Ġwith Ġthe Ġgiven Ġbirthday , Ġif Ġneeded . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġsuspend Ġfun Ġmaybe Init Blocks Table ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrust Backend : ĠRust Backend , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbirthday : ĠWallet Birth day ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġconsider Ġconverting Ġthese Ġto Ġtyped Ġexceptions Ġin Ġthe Ġwel ding Ġlayer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Warning : Ġdid Ġnot Ġinitialize Ġthe Ġblocks Ġtable . ĠIt Ġprobably Ġwas Ġalready Ġinitialized .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Contains Ġ= Ġ" table Ġis Ġnot Ġempty " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrust Backend . init Blocks Table ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbirthday . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbirthday . hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbirthday . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbirthday . tree ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" see ded Ġthe Ġdatabase Ġwith Ġsap ling Ġtree Ġat Ġheight Ġ${ birthday . height }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" database Ġfile : Ġ${ rust Backend . path Data Db }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠInitialize Ġthe Ġaccounts Ġtable Ġwith Ġthe Ġgiven Ġviewing Ġkeys . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġsuspend Ġfun Ġmaybe Init Accounts Table ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrust Backend : ĠRust Backend , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġviewing Keys : ĠList < Unified View ing Key > ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġconsider Ġconverting Ġthese Ġto Ġtyped Ġexceptions Ġin Ġthe Ġwel ding Ġlayer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Warning : Ġdid Ġnot Ġinitialize Ġthe Ġaccounts Ġtable . ĠIt Ġprobably Ġwas Ġalready Ġinitialized .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Contains Ġ= Ġ" table Ġis Ġnot Ġempty " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrust Backend . init Accounts Table (* view ing Keys . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" Initialized Ġthe Ġaccounts Ġtable Ġwith Ġ${ view ing Keys . size } Ġviewing Key ( s )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġsuspend Ġfun Ġapply Key Migrations ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrust Backend : ĠRust Backend , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverwrite V ks : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġviewing Keys : ĠList < Unified View ing Key > ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( overwrite V ks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" apply ing Ġkey Ġmigrations Ġ. Ġ. Ġ. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaybe Init Accounts Table ( rust Backend , Ġviewing Keys ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ