/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠAl gor and , ĠInc . Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense Ċ Ġ*/ Ċ Ċ package Ġcom . al gor and . android . ledger Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġcom . al gor and . alg os dk . mobile . Mobile Ċ import Ġcom . al gor and . android . R Ċ import Ġcom . al gor and . android . ledger . operations . Account Fetch All Operation Ċ import Ġcom . al gor and . android . ledger . operations . Base Operation Ċ import Ġcom . al gor and . android . ledger . operations . Base Transaction Operation Ċ import Ġcom . al gor and . android . ledger . operations . Transaction Operation Ċ import Ġcom . al gor and . android . ledger . operations . Verify Address Operation Ċ import Ġcom . al gor and . android . ledger . operations . Wallet Connect Transaction Operation Ċ import Ġcom . al gor and . android . models . Ledger B le Result Ċ import Ġcom . al gor and . android . repository . Account Repository Ċ import Ġcom . al gor and . android . utils . Event Ċ import Ġcom . al gor and . android . utils . Lifecycle Scoped Coroutine Owner Ċ import Ġcom . google . firebase . crash ly t ics . Firebase Crash ly t ics Ċ import Ġjavax . inject . Inject Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . cancel Children Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠLed ger B le Operation Manager Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġaccount Repository : ĠAccount Repository , ĊĠĠĠ Ġprivate Ġval Ġledger B le ConnectionManager : ĠLed ger B le ConnectionManager Ċ ) Ġ: ĠLifecycle Scoped Coroutine Owner (), ĠLed ger B le ConnectionManager Callback Ġ{ ĊĊĠĠĠ Ġval Ġconnected Bluetooth Device : ĠBluetooth Device ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġledger B le ConnectionManager . bluetooth Device ĊĊĠĠĠ Ġval Ġledger B le Result Flow Ġ= ĠMutable State Flow < Event < Ledger B le Result >? >( null ) ĊĠĠĠ Ġprivate Ġvar Ġcurrent Operation : ĠBase Operation ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġsetup ( lifecycle : ĠLifecycle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġledger B le ConnectionManager . set Gatt Callbacks ( this ) ĊĠĠĠĠĠĠĠ Ġassign To Lifecycle ( lifecycle ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bon ding Failed ( device : ĠBluetooth Device ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpost Result ( Ledger B le Result . On Bon ding Failed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Bon ding Required ( address : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBluetooth Adapter . getDefault Adapter (). bon ded Devices . all Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . address Ġ!= Ġaddress ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Ledger Operation ( new Operation : ĠBase Operation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Operation Ġ= Ġnew Operation ĊĠĠĠĠĠĠĠ Ġcurrent Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( new Operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTransaction Operation , Ġis ĠAccount Fetch All Operation , Ġis ĠWallet Connect Transaction Operation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend PublicKey Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVerify Address Operation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify PublicKey Request ( new Operation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġverify PublicKey Request ( new Operation : ĠVerify Address Operation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Operation ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connect To Ledger ( bluetooth Device )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġledger B le ConnectionManager . send Verify PublicKey Request ( new Operation . indexOf Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsend Transaction Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( current Operation Ġas ? ĠBase Transaction Operation )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Transaction Data Ġ= Ġtransaction ByteArray ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Transaction Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connect To Ledger ( bluetooth Device )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġledger B le ConnectionManager . send Sign Transaction Request ( current Transaction Data , Ġnext Index Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Result ( Ledger B le Result . Ledger Waiting For Approval ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsend PublicKey Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Operation ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connect To Ledger ( bluetooth Device )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġledger B le ConnectionManager . send PublicKey Request ( next Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġoverride Ġfun Ġon PublicKey Received ( device : ĠBluetooth Device , ĠpublicKey : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Operation ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠVerify Address Operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLed ger B le Result . Verify PublicKey Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Verified Ġ= ĠpublicKey Ġ== Ġthis . address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġledger PublicKey Ġ= ĠpublicKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal PublicKey Ġ= Ġthis . address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠBase Transaction Operation Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( publicKey Ġ== Ġaccount Address Ġ|| ĠpublicKey Ġ== Ġaccount Auth Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Transaction Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Repository . get Other Account Information ( publicKey , Ġinclude Closed Accounts Ġ= Ġtrue ). use ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ Ġfetched Account Information Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f etched Account Information . is Created () Ġ|| Ġnext Index Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠAccount Fetch All Operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccounts . add ( f etched Account Information ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend PublicKey Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġall Ġthe Ġaccounts Ġare Ġfetched . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAccount Fetch All Operation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLed ger B le Result . Account Result ( accounts , Ġdevice ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTransaction Operation , Ġis ĠWallet Connect Transaction Operation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLed ger B le Result . App Error Result ( R . string . it _ appe ars _ this , ĠR . string . error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVerify Address Operation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Verify Ġoperation Ġshould Ġnot Ġposted Ġhere .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failed Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLed ger B le Result . App Error Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . a _ network _ error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . error _ connection _ title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Transaction Signature Received ( device : ĠBluetooth Device , Ġtransaction Signature : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( current Operation Ġas ? ĠBase Transaction Operation )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauth Address Ġ= Ġaccount Cache Data ?. auth Address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigned Transaction Data Ġ= Ġif Ġ( account Cache Data ?. is Re keyed To Another Account () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMobile . attach Signature With Signer ( transaction Signature , Ġtransaction ByteArray , Ġauth Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMobile . attach Signature ( transaction Signature , Ġtransaction ByteArray ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Result ( Ledger B le Result . Signed Transaction Result ( signed Transaction Data )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Crash ly t ics . getInstance (). record Exception ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Result ( Ledger B le Result . Ledger Error Result ( exception . message . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Missing Bytes ( device : ĠBluetooth Device ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpost Result ( Ledger B le Result . On Missing Bytes ( device )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Operation Cancelled () Ġ{ ĊĠĠĠĠĠĠĠ Ġpost Result ( Ledger B le Result . Operation Cancelled Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Manager Error ( error Res Id : ĠInt , Ġtitle Res Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpost Result ( Ledger B le Result . App Error Result ( error Res Id , Ġtitle Res Id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Device Disconnected ( device : ĠBluetooth Device ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpost Result ( Ledger B le Result . On Ledger Disconnected ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonError ( device : ĠBluetooth Device , Ġmessage : ĠString , ĠerrorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpost Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( errorCode Ġ== ĠERROR _ ON _ WRITE _ CHARACTER ISTIC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLed ger B le Result . App Error Result ( R . string . error _ re ceiving _ message , ĠR . string . error _ transmission _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLed ger B le Result . Ledger Error Result ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Device NotSupported ( device : ĠBluetooth Device ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpost Result ( Ledger B le Result . App Error Result ( R . string . error _ unsupported _ message , ĠR . string . error _ unsupported _ title )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpost Result ( ledger B le Result : ĠLed ger B le Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġledger B le Result Flow . value Ġ= ĠEvent ( ledger B le Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġconnect To Ledger ( bluetooth Device : ĠBluetooth Device ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ledger B le ConnectionManager . bluetooth Device ?. address Ġ== Ġbluetooth Device . address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġledger Ġis Ġalready Ġconnect Ġto Ġconnection Manager . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġledger B le ConnectionManager . connect To Device ( bluetooth Device ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( ledger B le ConnectionManager . is Ready . not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( LED GER _ CONNECTION _ DELAY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ledger B le ConnectionManager . is Trying To Connect (). not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLed ger B le Result . App Error Result ( R . string . error _ connection _ message , ĠR . string . error _ connection _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmanual Stop All Process () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Scope . coroutine Context . cancel Children () ĊĠĠĠĠĠĠĠ Ġstop All Resources () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop All Resources () Ġ{ ĊĠĠĠĠĠĠĠ Ġledger B le Result Flow . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcurrent Operation Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġledger B le ConnectionManager . disconnect (). enqueue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠERROR _ ON _ WRITE _ CHARACTER ISTIC Ġ= Ġ 1 3 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLED GER _ CONNECTION _ DELAY Ġ= Ġ 2 5 0 L ĊĠĠĠ Ġ} Ċ } Ċ