package Ġme . cyber . n uk le os . bluetooth Ċ Ċ import Ġ Ġandroid . app . Activity Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroid . bluetooth . Bluetooth Manager Ċ import Ġandroid . bluetooth . le .* Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Parcel Uuid Ċ import Ġio . reactivex . Back pressure Strategy Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . Flow able Emitter Ċ import Ġme . cyber . n uk le us . R Ċ import Ġjava . lang . IllegalStateException Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠBluetooth Connector ( val Ġcontext : ĠContext ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Bluetooth Scan Callback : ĠBluetooth Scan Callback ? Ġ= Ġnull ĊĠĠĠ Ġ// Ġscan . ĊĠĠĠ Ġfun Ġstart Bluetooth Scan ( service UUID : ĠUUID ?) Ġ= ĠFlow able . create < Bluetooth Device >({ ĊĠĠĠĠĠĠĠ Ġm Bluetooth Scan Callback Ġ= ĠBluetooth Scan Callback ( it ) ĊĠĠĠĠĠĠĠ Ġval Ġbluetooth Scanner Ġ= Ġget Bluetooth Scanner () ĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Scanner Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . try OnError ( IllegalStateException ( context . getString ( R . string . bt _ adapter _ problem ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ create ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( service UUID Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Scanner . start Scan ( m Bluetooth Scan Callback ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Scanner . start Scan ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray ListOf ( Scan Filter . Builder (). set Service Uuid ( Parcel Uuid ( service UUID )). build ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScan Settings . Builder (). set Scan Mode ( Scan Settings . SCAN _ MODE _ LOW _ LAT ENCY ). build (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Scan Callback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĠBack pressure Strategy . BUFFER ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġdo On Cancel Ġ{ Ġget Bluetooth Scanner ()?. stop Scan ( m Bluetooth Scan Callback ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġscan Ġwith Ġtimeout ĊĠĠĠ Ġfun Ġstart Bluetooth Scan ( interval : ĠLong , Ġtime Unit : ĠTimeUnit , Ġservice UUID : ĠUUID ? Ġ= Ġnull ) Ġ= Ġstart Bluetooth Scan ( service UUID ). take Until ( Flow able . timer ( interval , Ġtime Unit )) Ċ Ċ /* ĠĠĠ Ġfun Ġget My o ( bluetooth Device : ĠBluetooth Device ) Ġ= ĠMy o ( bluetooth Device ) ĊĊĠĠĠ Ġfun Ġget My o ( my o Address : ĠString ) Ġ= ĠSingle . create < My o > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm B TL ow Energy Scanner . start Scan ( listOf ( Scan Filter . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Device Address ( my o Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()), ĠScan Settings . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Scan Mode ( Scan Settings . SCAN _ MODE _ LOW _ POWER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (), Ġobject Ġ: ĠScan Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Result ( callback Type : ĠInt , Ġresult : ĠScan Result ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scan Result ( callback Type , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ?. device ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Success ( My o ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Failed ( errorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scan Failed ( errorCode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onError ( RuntimeException ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĊĠĠĠ Ġprivate Ġfun Ġget Bluetooth Scanner (): ĠBluetooth Le Scanner ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( context . getSystem Service ( Activity . BL U ETO OTH _ SERVICE ) Ġas ? ĠBluetooth Manager )?. adapter ?. bluetooth Le Scanner ĊĊĊĠĠĠ Ġinner Ġclass ĠBluetooth Scan Callback ( private Ġval Ġemitter : ĠFlow able Emitter < Bluetooth Device >) Ġ: ĠScan Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Result ( callback Type : ĠInt , Ġresult : ĠScan Result ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scan Result ( callback Type , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . device . apply Ġ{ Ġemitter . onNext ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Failed ( errorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scan Failed ( errorCode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . try OnError ( RuntimeException ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ