/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠJ U UL ĠLabs , ĠInc . Ċ Ġ*/ Ċ Ċ package Ġcom . ju ul . able . experimental Ċ Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroid . bluetooth . Bluetooth Gatt Ċ import Ġandroid . bluetooth . Bluetooth Gatt . STATE _ CONNECTED Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Remote Exception Ċ import Ġcom . ju ul . able . experimental . Connect Gatt Result . Canceled Ċ import Ġcom . ju ul . able . experimental . Connect Gatt Result . Failure Ċ import Ġcom . ju ul . able . experimental . Connect Gatt Result . Success Ċ import Ġcom . ju ul . able . experimental . messenger . Gatt Callback Ċ import Ġcom . ju ul . able . experimental . messenger . Gatt Callback Config Ċ import Ġcom . ju ul . able . experimental . messenger . Messenger Ċ import Ġkotlinx . coroutines . Cancellation Exception Ċ Ċ class ĠCor outines Device ( ĊĠĠĠ Ġprivate Ġval Ġdevice : ĠBluetooth Device , ĊĠĠĠ Ġprivate Ġval Ġcallback Config : ĠG att Callback Config Ġ= ĠG att Callback Config () Ċ ) Ġ: ĠDevice Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequests Ġthat Ġa Ġconnection Ġto Ġthe Ġ[ device ] Ġbe Ġestablished . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠA Ġdedicated Ġthread Ġis Ġsp un Ġup Ġto Ġhandle Ġinteracting Ġwith Ġthe Ġnewly Ġretrieved Ġ[ Bluetooth Gatt ] ĊĠĠĠĠ Ġ* Ġand Ġmust Ġbe Ġclosed Ġwhen Ġthe Ġconnection Ġis Ġno Ġlonger Ġneeded Ġby Ġinvoking Ġ[ Gatt . close ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrequest Connect Gatt ( context : ĠContext , Ġauto Connect : ĠBoolean ): ĠCor outines Gatt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= ĠG att Callback ( callback Config ) ĊĠĠĠĠĠĠĠ Ġval Ġbluetooth Gatt Ġ= Ġdevice . connect Gatt ( context , Ġauto Connect , Ġcallback ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġmess enger Ġ= ĠMess enger ( bluetooth Gatt , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCor outines Gatt ( bluetooth Gatt , Ġmess enger ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEst abl ishes Ġa Ġconnection Ġto Ġthe Ġ[ Bluetooth Device ], Ġsus pending Ġuntil Ġconnection Ġis Ġsuccessful ĊĠĠĠĠ Ġ* Ġor Ġerror Ġoccurs . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTo Ġcancel Ġan Ġin - flight Ġconnection Ġattempt , Ġthe ĠCor outine Ġfrom Ġwhich Ġthis Ġmethod Ġwas Ġcalled ĊĠĠĠĠ Ġ* Ġcan Ġbe Ġcanceled : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* Ġfun Ġconnect ( android Context : ĠContext , Ġdevice : ĠBluetooth Device ) Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġconnect Job Ġ= Ġasync Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġdevice . connect Gatt OrNull ( android Context , Ġauto Connect Ġ= Ġfalse ) ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ} ĊĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġfun Ġcancel Connection () Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġconnect Job ?. cancel () Ġ// Ġcancel s Ġthe Ġabove Ġ` connect Gatt ` ĊĠĠĠĠ Ġ* Ġ} ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠA Ġdedicated Ġthread Ġis Ġsp un Ġup Ġto Ġhandle Ġinteracting Ġwith Ġthe Ġunderlying Ġ[ Bluetooth Gatt ], Ġand ĊĠĠĠĠ Ġ* Ġcan Ġbe Ġstopped Ġby Ġinvoking Ġ[ Gatt . close ] Ġon Ġthe Ġreturned Ġ[ Gatt ] Ġobject . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġan Ġerror Ġoccurs Ġduring Ġconnection Ġprocess , Ġthen Ġ[ Gatt . close ] Ġis Ġautomatically Ġcalled ĊĠĠĠĠ Ġ* Ġ( which Ġstops Ġthe Ġdedicated Ġthread ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġconnect Gatt ( context : ĠContext , Ġauto Connect : ĠBoolean ): ĠConnect Gatt Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġg att Ġ= Ġrequest Connect Gatt ( context , Ġauto Connect ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠFailure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemoteException (" ` Bluetooth Device . connect Gatt ` Ġreturned Ġ` null `. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġconnection State Monitor Ġ= ĠConnection State Monitor ( g att ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdid Connect Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection State Monitor . suspend Until Connection State ( STATE _ CONNECTED ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAb le . info Ġ{ Ġ" connect Gatt () Ġcanceled ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠC anceled ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection State Monitor . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( did Connect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSuccess ( g att ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAb le . warn Ġ{ Ġ" connect Gatt () Ġfailed ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFailure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIllegalStateException (" Failed Ġto Ġconnect Ġto Ġ${ device . address }. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ