package Ġcom . github . z ak apro v . rx bluetooth adapter Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroid . bluetooth . Bluetooth Socket Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġcom . cant row itz . r xb roadcast . R xB roadcast Ċ import Ġcom . github . z ak apro v . rx bluetooth adapter . error . Bluetooth Disabled Error Ċ import Ġcom . github . z ak apro v . rx bluetooth adapter . error . Bluetooth Pair ing Error Ċ import Ġcom . github . z ak apro v . rx bluetooth adapter . error . Bluetooth Permission Error Ċ import Ġcom . github . z ak apro v . rx bluetooth adapter . error . Bluetooth Unsupported Error Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . rx kotlin . addTo Ċ import Ġio . reactivex . rx kotlin . to Observable Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġio . reactivex . subjects . Replay Subject Ċ import Ġjava . io . IOException Ċ import Ġjava . util . UUID Ċ Ċ enum Ġclass ĠConnection State Ġ{ ĊĠĠĠ ĠDIS CONNECTED , ĠCONNECT ING , ĠCONNECT ED Ċ } Ċ Ċ class ĠRx Bluetooth Adapter ( private Ġval Ġapp Context : ĠContext ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġstream Ġof Ġdevices Ġwhich Ġare Ġrecogn ised Ġas Ġpreviously Ġpaired Ġby Ġthe Ġlocal ĠBluetooth Ġadapter . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġ[ Observable ] Ġcreated Ġfrom Ġthe Ġlist Ġof Ġadapter 's Ġbon ded Ġdevices . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠBluetooth Disabled Error Ġif ĠBluetooth Ġis Ġdisabled Ġon Ġthe Ġdevice . ĊĠĠĠĠ Ġ* Ġ@ throws ĠBluetooth Unsupported Error Ġif ĠBluetooth Ġis Ġunsupported Ġon Ġthe Ġdevice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġpaired Devices : ĠObservable < Bluetooth Device > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġassert Conditions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( adapter ?. bon ded Devices ?. to Observable ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġstream Ġof Ġchanges Ġto Ġthe Ġconnection Ġstate Ġof Ġremote ĠBluetooth Ġdevices . ĠEach Ġemitted Ġitem Ġis Ġa Ġ[ Pair ] ĊĠĠĠĠ Ġ* Ġcontaining Ġa Ġ[ Bluetooth Device ] Ġobject Ġand Ġits Ġlatest Ġ[ Connection State ] Ġvalue . ĊĠĠĠĠ Ġ* ĠOnce Ġsubscribed Ġto , Ġthe Ġstream Ġwill Ġreplay Ġits Ġlast Ġemitted Ġvalue , Ġallowing Ġfor Ġchecking Ġthe Ġlast Ġreported Ġstate ĊĠĠĠĠ Ġ* Ġof Ġa Ġdevice . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġ[ Observable ] Ġemit ting Ġchanges Ġto Ġthe Ġconnection Ġstate Ġto Ġa Ġgiven ĠBluetooth Ġdevice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġconnection Event Stream : ĠObservable < Pair < Connection State , ĠBluetooth Device >> ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connection State Disposable . size () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Connection Event Stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconnection State Subject ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġstream Ġof Ġvalues Ġrepresenting Ġthe Ġcurrent Ġstate Ġof ĠBluetooth Ġdevice Ġdiscovery . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġ[ Observable ] Ġemit ting ĠBoolean Ġvalues Ġindicating Ġwhether Ġthere 's Ġan Ġongoing ĠBluetooth Ġdevice Ġscan . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġscan State Stream : ĠObservable < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdiscovery State Subject ĊĊĠĠĠ Ġprivate Ġval Ġadapter : ĠBluetooth Adapter ? Ġ= ĠBluetooth Adapter . getDefault Adapter () ĊĊĠĠĠ Ġprivate Ġval Ġs pp Uuid Ġ= ĠUUID . fromString (" 0 0 0 0 1 1 0 1 - 0 0 0 0 - 1 0 0 0 - 8 0 0 0 - 0 0 8 0 5 f 9 b 3 4 fb ") ĊĠĠĠ Ġprivate Ġval Ġrequired Permissions Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION , ĊĠĠĠĠĠĠĠ ĠManifest . permission . BL U ETO OTH , ĊĠĠĠĠĠĠĠ ĠManifest . permission . BL U ETO OTH _ ADMIN ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġrequired Scan Permissions Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġvar Ġdevice Scan Subject : ĠPublish Subject < Bluetooth Device > Ġ= ĠPublish Subject . create () ĊĠĠĠ Ġprivate Ġvar Ġdiscovery State Subject : ĠRe play Subject < Boolean > Ġ= ĠRe play Subject . create With Size ( 1 ) ĊĠĠĠ Ġprivate Ġval Ġscan Composite Disposable Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġprivate Ġvar Ġconnection State Subject : ĠRe play Subject < Pair < Connection State , ĠBluetooth Device >> Ġ= ĠRe play Subject . create With Size ( 1 ) ĊĠĠĠ Ġprivate Ġval Ġconnection State Disposable Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAt tempts Ġto Ġestablish Ġan ĠS PP Ġ( serial Ġport ) Ġconnection Ġto Ġa Ġremote ĠBluetooth Ġserver Ġrepresented Ġby Ġthe Ġargument Ġdevice . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġlocal Ġand Ġremote Ġdevices Ġare Ġnot Ġpaired , Ġthis Ġwill Ġstart Ġthe Ġpair ing Ġprocess Ġbefore Ġattempting Ġa Ġconnection . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdevice Ġthe ĠBluetooth Ġdevice Ġto Ġconnect Ġto . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġ[ Single ] Ġwhich Ġreturns Ġthe Ġ[ Bluetooth Socket ] Ġin Ġcase Ġof Ġa Ġsuccessful Ġconnection . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠBluetooth Pair ing Error Ġwhen Ġthe Ġpair ing Ġprocess Ġfails . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException Ġwhen Ġthe Ġconnection Ġto Ġthe Ġremote Ġdevice Ġfails . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠBluetooth Disabled Error Ġif ĠBluetooth Ġis Ġdisabled Ġon Ġthe Ġdevice . ĊĠĠĠĠ Ġ* Ġ@ throws ĠBluetooth Permission Error Ġif Ġthe Ġapp Ġis Ġlack ing Ġrequired Ġpermissions . ĊĠĠĠĠ Ġ* Ġ@ throws ĠBluetooth Unsupported Error Ġif ĠBluetooth Ġis Ġunsupported Ġon Ġthe Ġdevice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconnect To Device ( device : ĠBluetooth Device ): ĠSingle < Bluetooth Socket > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġassert Conditions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( pair Device ( device )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection State Subject . onNext ( Pair ( Connection State . CONNECT ING , Ġdevice )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsocket Ġ= Ġdevice . create Rf comm Socket To Service Record ( sp p Uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . connect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection State Subject . onNext ( Pair ( Connection State . DIS CONNECTED , Ġdevice )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . error < Bluetooth Socket >( Bluetooth Pair ing Error ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ Ġconnection State Subject . onNext ( Pair ( Connection State . CONNECTED , Ġdevice )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ Ġconnection State Subject . onNext ( Pair ( Connection State . DIS CONNECTED , Ġdevice )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġthe ĠBluetooth Ġpair ing Ġ( bon ding ) Ġprocess Ġwith Ġthe ĠBluetooth Ġdevice Ġgiven Ġas Ġthe Ġargument . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdevice Ġthe ĠBluetooth Ġdevice Ġto Ġpair Ġwith . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġ[ Single ] Ġwhich Ġreturns Ġtrue Ġif Ġthe Ġpair ing Ġprocess Ġwas Ġsuccessful Ġor Ġfalse Ġif Ġit Ġfailed Ġor Ġwas Ġcancelled . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠBluetooth Disabled Error Ġif ĠBluetooth Ġis Ġdisabled Ġon Ġthe Ġdevice . ĊĠĠĠĠ Ġ* Ġ@ throws ĠBluetooth Permission Error Ġif Ġthe Ġapp Ġis Ġlack ing Ġrequired Ġpermissions . ĊĠĠĠĠ Ġ* Ġ@ throws ĠBluetooth Unsupported Error Ġif ĠBluetooth Ġis Ġunsupported Ġon Ġthe Ġdevice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpair Device ( device : ĠBluetooth Device ): ĠSingle < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( device . is Pa ired () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSingle . just ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġassert Conditions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then Ġ{ Ġdevice . create Bond () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR xB roadcast ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Broadcast ( app Context , ĠIntent Filter ( Bluetooth Device . ACTION _ B OND _ STATE _ CHANGED )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . getInt Extra ( Bluetooth Device . EXTRA _ B OND _ STATE , ĠBluetooth Device . B OND _ B OND ING ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= ĠBluetooth Device . B OND _ B OND ING Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġ== ĠBluetooth Device . B OND _ B ON DED Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitial ises Ġa ĠBluetooth Ġscan Ġ( discovery ) Ġfor Ġnearby Ġavailable Ġdevices . ĠCalling Ġthis Ġmethod Ġduring ĊĠĠĠĠ Ġ* Ġan Ġalready Ġongoing Ġdiscovery Ġscan Ġis Ġsafe Ġand Ġis Ġbacked Ġby Ġone Ġdata Ġsource . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġ[ Observable ] Ġemit ting Ġdevices Ġdiscovered Ġduring Ġthe Ġscan . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠBluetooth Disabled Error Ġif ĠBluetooth Ġis Ġdisabled Ġon Ġthe Ġdevice . ĊĠĠĠĠ Ġ* Ġ@ throws ĠBluetooth Permission Error Ġif Ġthe Ġapp Ġis Ġlack ing Ġrequired Ġpermissions . ĊĠĠĠĠ Ġ* Ġ@ throws ĠBluetooth Unsupported Error Ġif ĠBluetooth Ġis Ġunsupported Ġon Ġthe Ġdevice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart Device Scan (): ĠObservable < Bluetooth Device > Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Discovery () ĊĠĠĠĠĠĠĠ Ġreturn Ġassert Conditions ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( device Scan Subject ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Conditions ( check Scan Permissions : ĠBoolean Ġ= Ġfalse ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . from Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBluetooth Unsupported Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! adapter . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBluetooth Disabled Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermissions Ġ= Ġrequired Permissions . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Scan Permissions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . addAll ( required Scan Permissions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmissing Permissions Ġ= Ġpermissions . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Ġ-> ĠContext Compat . check Self Permission ( app Context , Ġpermission ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . PERMISSION _ DEN IED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! missing Permissions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBluetooth Permission Error ( missing Permissions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Connection Event Stream () Ġ{ ĊĠĠĠĠĠĠĠ ĠR xB roadcast ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Broadcast ( app Context , ĠIntent Filter ( Bluetooth Device . ACTION _ ACL _ CONNECTED )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġit . get Parcelable Extra < Bluetooth Device >( Bluetooth Device . EXTRA _ DEVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection State Subject . onNext ( Pair ( Connection State . CONNECTED , Ġdevice )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( connection State Disposable ) ĊĊĠĠĠĠĠĠĠ ĠR xB roadcast ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Broadcast ( app Context , ĠIntent Filter ( Bluetooth Device . ACTION _ ACL _ DIS CONNECTED )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġit . get Parcelable Extra < Bluetooth Device >( Bluetooth Device . EXTRA _ DEVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection State Subject . onNext ( Pair ( Connection State . DIS CONNECTED , Ġdevice )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( connection State Disposable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Discovery () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( adapter ?. is Discover ing Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( scan Composite Disposable . size () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR xB roadcast ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Broadcast ( app Context , ĠIntent Filter ( Bluetooth Device . ACTION _ FOUND )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice : ĠBluetooth Device Ġ= Ġit . get Parcelable Extra ( Bluetooth Device . EXTRA _ DEVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. subscribe Ġ{ Ġdevice Scan Subject . onNext ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( scan Composite Disposable ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠR xB roadcast ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Broadcast ( app Context , ĠIntent Filter ( Bluetooth Adapter . ACTION _ DIS COVERY _ STARTED )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscovery State Subject . onNext ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( scan Composite Disposable ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠR xB roadcast ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Broadcast ( app Context , ĠIntent Filter ( Bluetooth Adapter . ACTION _ DIS COVERY _ FINISHED )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġstop Discovery () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( scan Composite Disposable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadapter ?. start Discovery () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Discovery () Ġ{ ĊĠĠĠĠĠĠĠ Ġdevice Scan Subject . onComplete () ĊĠĠĠĠĠĠĠ Ġdevice Scan Subject Ġ= ĠPublish Subject . create () ĊĠĠĠĠĠĠĠ Ġdiscovery State Subject . onNext ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠBluetooth Device . is Pa ired () Ġ= Ġadapter ?. bon ded Devices ?. contains ( this ) Ċ } Ċ