package Ġio . particle . mesh . bluetooth . connecting Ċ Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroid . bluetooth . Bluetooth Gatt Ċ import Ġandroid . content . Context Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġcom . sn aky design . li ved ata extensions . filter Ċ import Ġcom . sn aky design . li ved ata extensions . first Ċ import Ġio . particle . mesh . bluetooth . BLE LiveData Callbacks Ċ import Ġio . particle . mesh . bluetooth . bt Adapter Ċ import Ġio . particle . mesh . common . android . Simple Lifecycle Owner Ċ import Ġio . particle . mesh . setup . flow . Scopes Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . util . concurrent . TimeUnit ĊĊ Ċ private Ġval ĠINITIAL _ CONNECTION _ TIMEOUT Ġ= ĠTimeUnit . SECONDS . to Millis ( 5 ) ĊĊ Ċ class ĠG att Connector ( private Ġval Ġctx : ĠContext ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlifecycle Owner Ġ= ĠSimple Lifecycle Owner () ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġsuspend Ġfun Ġcreate Gatt Connection ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice : ĠBluetooth Device , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscopes : ĠS copes ĊĠĠĠ Ġ): ĠPair < Bluetooth Gatt , ĠBLE LiveData Callbacks >? Ġ{ ĊĠĠĠĠĠĠĠ Ġlifecycle Owner . set New State ( Lifecycle . State . RE SU MED ) ĊĊĠĠĠĠĠĠĠ Ġthis . ctx . bt Adapter . cancel Discovery () ĊĊĠĠĠĠĠĠĠ Ġval Ġcallbacks Ġ= ĠBLE LiveData Callbacks () ĊĠĠĠĠĠĠĠ Ġval Ġg att Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscopes . with Main ( INITIAL _ CONNECTION _ TIMEOUT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Creating ĠG ATT Ġconnection " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Create Gatt Connection ( device , Ġctx , Ġcallbacks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( g att , Ġcallbacks ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Owner . set New State ( Lifecycle . State . DESTROY ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks . connection StateChanged LD . remove Observer s ( lifecycle Owner ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġdo Create Gatt Connection ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice : ĠBluetooth Device , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks : ĠBLE LiveData Callbacks ĊĠĠĠ Ġ): ĠBluetooth Gatt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcomplet able Ġ= ĠComp letable Deferred < Bluetooth Gatt >() ĊĠĠĠĠĠĠĠ Ġdo Create Gatt Connection ( device , Ġctx , Ġcallbacks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomplet able . complete ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcomplet able . await () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġdo Create Gatt Connection ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice : ĠBluetooth Device , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data Callbacks : ĠBLE LiveData Callbacks , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : Ġ( Bluetooth Gatt ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" About Ġto Ġconnect Ġto Ġ$ device " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġg att Ref Ġ= Ġdevice . connect Gatt ( ctx . application Context , Ġfalse , Ġlive Data Callbacks ) ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Called Ġconnect Gatt Ġfor Ġ$ g att Ref " Ġ} ĊĠĠĠĠĠĠĠ Ġlive Data Callbacks . connection StateChanged LD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ== ĠConnection State . CONNECTED Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe ( lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Connection Ġstate Ġupdated Ġto Ġ$ it " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== ĠConnection State . CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( g att Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error Ġ{ Ġ" Connection Ġstatus Ġnot ĠCONNECT ED ?! Ġit =$ it " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ Ċ }