package Ġcom . app . near by ble . bluetooth Ċ Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . bluetooth . le . Scan Callback Ċ import Ġandroid . bluetooth . le . Scan Filter Ċ import Ġandroid . bluetooth . le . Scan Result Ċ import Ġandroid . bluetooth . le . Scan Settings Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Parcel Uuid Ċ import Ġandroid . util . Log Ċ import Ġcom . app . near by ble . database . BLE Device Dao Ċ import Ġcom . app . near by ble . database . B le Device Ċ import Ġkotlinx . coroutines .* Ċ Ċ /*** Ċ Ġ* Ġ ĠBLE ĠDevice Ġscanner Ċ Ġ* Ċ Ġ* Ġ ĠScan Ġfor Ġnew Ġdevice Ġon Ġa Ġspec if ĠUUID Ġand Ġhandle Ġdiscover Ċ Ġ* Ċ Ġ*/ Ċ class ĠB le Scanner ( ĊĠĠĠ Ġprivate Ġval Ġcoroutine Scope : ĠCor outine Scope , ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval ĠdataSource : ĠBLE Device Dao Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠB le Scanner :: class . java . simple Name ĊĊĠĠĠ Ġprivate Ġval Ġbluetooth Le Scanner Ġ= ĠBluetooth Adapter . getDefault Adapter (). bluetooth Le Scanner ĊĊĠĠĠ Ġ// Ġ ĠTemporary Ġlist Ġof Ġdevices Ġdiscovered ĊĠĠĠ Ġprivate Ġval Ġscan Results Ġ= Ġmutable ListOf < Scan Result >() ĊĊĠĠĠ Ġprivate Ġvar Ġis Sc anning Ġ= Ġfalse ĊĊĠĠĠ Ġ// B le Ġscanner Ġsettings ĊĠĠĠ Ġprivate Ġval Ġsettings Ġ= ĠScan Settings . Builder () ĊĠĠĠĠĠĠĠ Ġ. set Scan Mode ( Scan Settings . SCAN _ MODE _ LOW _ POWER ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠFilter Ġfor Ġa Ġspecific Ġservice ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ ĠThis Ġis Ġwhere Ġwe Ġfilter Ġto Ġfind Ġapp Ġrunning Ġthe Ġsame Ġapp ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġfilter Ġ= ĊĠĠĠĠĠĠĠ ĠScan Filter . Builder (). set Service Uuid ( Parcel Uuid ( BLE _ CONSTANT S . DIS COVER _ SERVICE )). build () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġscanning Ġfor Ġble Ġdev ble Server . start Server () ices ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġscan Le Device () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Sc anning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" BLE Ġscanner Ġscanning .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Sc anning Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Le Scanner . start Scan ( listOf ( filter ), Ġsettings , Ġle Scan Callback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop Ġscanning ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop B le Scan () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Sc anning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" BLE Ġscanner Ġstopped Ġscanning .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Le Scanner . stop Scan ( le Scan Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Sc anning Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠB le Ġscanner Ġcall Back Ġhandle Ġnew Ġdiscover s ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġle Scan Callback : ĠScan Callback Ġ= Ġobject Ġ: ĠScan Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Result ( callback Type : ĠInt , Ġresult : ĠScan Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scan Result ( callback Type , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scan Results . indexOf First Ġ{ Ġit . device . address Ġ== Ġresult . device . address Ġ} Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" New Ġ ĠBLE Ġdevice Ġfound ! ĠName : Ġ${ result . device . name Ġ?: Ġ" Unnamed "}, Ġaddress : Ġ${ result . device . address }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Results . add ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB le Client Api ( result . device , Ġcontext ). connect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= ĠB le Device ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Name Ġ= Ġresult . device . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Mac Address Ġ= Ġresult . device . address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Signal Strength Ġ= Ġresult . rssi . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Found From Ġ= ĠBLE _ CONSTANT S . FOUND _ FROM _ CLIENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . insert ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Failed ( errorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Scan Failed : Ġcode Ġ$ errorCode ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ