package Ġcom . aware framework . android . sensor . bluetooth Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Alarm Manager Ċ import Ġandroid . app . Alarm Manager . RTC _ WAKE UP Ċ import Ġandroid . app . Notification Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroid . bluetooth . Bluetooth Manager Ċ import Ġandroid . bluetooth . le . Scan Callback Ċ import Ġandroid . bluetooth . le . Scan Result Ċ import Ġandroid . bluetooth . le . Scan Settings Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . content . pm . PackageManager . FEATURE _ BL U ETO OTH _ LE Ċ import Ġandroid . content . pm . PackageManager . PERMISSION _ GRAN TED Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . support . v 4 . app . Notification Compat Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . util . Log Ċ import Ġcom . aware framework . android . core . Aware Sensor Ċ import Ġcom . aware framework . android . core . R Ċ import Ġcom . aware framework . android . core . db . model . Db Sync Config Ċ import Ġcom . aware framework . android . core . model . Sensor Config Ċ import Ġcom . aware framework . android . core . util . Notification Util Ċ import Ġcom . aware framework . android . core . util . Notification Util . Companion . AW ARE _ NOTIFICATION _ ID Ċ import Ġcom . aware framework . android . sensor . bluetooth . model . Bluetooth Data ĊĊ Ċ /** Ċ Ġ* ĠBluetooth ĠModule . ĠFor Ġnow , Ġscans Ġand Ġreturns Ġsurrounding Ġbluetooth Ġdevices Ġand ĠRSS I ĠdB Ġvalues . Ċ Ġ* Ċ Ġ* Ġ@ author Ġ Ġser cant Ċ Ġ* Ġ@ date Ġ 1 4 / 0 8 / 2 0 1 8 Ċ Ġ*/ Ċ class ĠBluetooth Sensor Ġ: ĠA ware Sensor () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" AW ARE :: Bluetooth " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBroadcast ed Ġevent : Ġnew Ġbluetooth Ġdevice Ġdetected ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ AW ARE _ BL U ETO OTH _ NEW _ DEVICE Ġ= Ġ" ACTION _ AW ARE _ BL U ETO OTH _ NEW _ DEVICE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ AW ARE _ BL U ETO OTH _ NEW _ DEVICE _ BLE Ġ= Ġ" ACTION _ AW ARE _ BL U ETO OTH _ NEW _ DEVICE _ BLE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ DEVICE Ġ= Ġ" extra _ device " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBroadcast ed Ġevent : Ġbluetooth Ġscan Ġstarted ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ AW ARE _ BL U ETO OTH _ SCAN _ STARTED Ġ= Ġ" ACTION _ AW ARE _ BL U ETO OTH _ SCAN _ STARTED " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ AW ARE _ BL U ETO OTH _ BLE _ SCAN _ STARTED Ġ= Ġ" ACTION _ AW ARE _ BL U ETO OTH _ BLE _ SCAN _ STARTED " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBroadcast ed Ġevent : Ġbluetooth Ġscan Ġended ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ AW ARE _ BL U ETO OTH _ SCAN _ ENDED Ġ= Ġ" ACTION _ AW ARE _ BL U ETO OTH _ SCAN _ ENDED " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ AW ARE _ BL U ETO OTH _ BLE _ SCAN _ ENDED Ġ= Ġ" ACTION _ AW ARE _ BL U ETO OTH _ BLE _ SCAN _ ENDED " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBroadcast Ġreceiving Ġevent : Ġrequest Ġa Ġbluetooth Ġscan ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ AW ARE _ BL U ETO OTH _ REQUEST _ SCAN Ġ= Ġ" ACTION _ AW ARE _ BL U ETO OTH _ REQUEST _ SCAN " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRequest Ġuser Ġpermission Ġfor Ġbt Ġscanning ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ AW ARE _ ENABLE _ BT Ġ= Ġ" ACTION _ AW ARE _ ENABLE _ BT "; ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ AW ARE _ BL U ETO OTH _ START Ġ= Ġ" com . aware framework . android . sensor . bluetooth . SENSOR _ START " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ AW ARE _ BL U ETO OTH _ STOP Ġ= Ġ" com . aware framework . android . sensor . bluetooth . SENSOR _ STOP " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ AW ARE _ BL U ETO OTH _ SET _ LABEL Ġ= Ġ" com . aware framework . android . sensor . bluetooth . SET _ LABEL " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ LABEL Ġ= Ġ" label " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ AW ARE _ BL U ETO OTH _ SYNC Ġ= Ġ" com . aware framework . android . sensor . bluetooth . SENSOR _ SYNC " ĊĊĠĠĠĠĠĠĠ Ġval ĠCONFIG Ġ= ĠConfig () ĊĊĠĠĠĠĠĠĠ Ġval ĠREQUIRED _ PERMISSION S Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . BL U ETO OTH , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . BL U ETO OTH _ ADMIN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart ( context : ĠContext , Ġconfig : ĠConfig ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONFIG . replace With ( config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . start Service ( Intent ( context , ĠBluetooth Sensor :: class . java )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġstop ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . stop Service ( Intent ( context , ĠBluetooth Sensor :: class . java )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġalarm Manager : ĠAlarm Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbluetooth Scan : ĠPending Intent ĊĊĠĠĠ Ġprivate Ġvar Ġscan Timestamp Ġ= Ġ 0 L ĊĠĠĠ Ġprivate Ġvar Ġcurrent Frequency : ĠFloat Ġ= Ġ- 1 f ĊĊĠĠĠ Ġprivate Ġvar Ġbluetooth Adapter : ĠBluetooth Adapter ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnotification Manager : ĠNotification Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġenable BT : ĠIntent ĊĊĠĠĠ Ġprivate Ġvar Ġble Support Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġm BLE Handler : ĠHandler Ġ= ĠHandler () ĊĊĠĠĠ Ġprivate Ġval Ġscan Settings : ĠScan Settings ? Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠ ĠScan Settings . Builder (). set Scan Mode ( Scan Settings . SCAN _ MODE _ LOW _ POWER ). build () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġis BLE Sc anning Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġdiscovered BLE Ġ= ĠHashMap < String , ĠBluetooth Device >() ĊĊĠĠĠ Ġprivate Ġval Ġbluetooth Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( intent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ AW ARE _ BL U ETO OTH _ SET _ LABEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . getString Extra ( EXTRA _ LABEL )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONFIG . label Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ AW ARE _ BL U ETO OTH _ SYNC Ġ-> Ġon Sync ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbluetooth Monitor Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextras Ġ= Ġintent ?. extras Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( intent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Device . ACTION _ FOUND Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbt Device : ĠBluetooth Device ? Ġ= Ġextras . get Parcelable ( Bluetooth Device . EXTRA _ DEVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bt Device Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbt Device RSS I Ġ= Ġextras . get Short ( Bluetooth Device . EXTRA _ RSS I ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠBluetooth Data (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdeviceId Ġ= ĠCONFIG . deviceId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= ĠCONFIG . label ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġbt Device . address Ġ// ĠTODO Ġadd Ġencryption ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġbt Device . name Ġ// ĠTODO Ġadd Ġencryption ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr ssi Ġ= Ġbt Device RSS I . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Label Ġ= Ġscan Timestamp . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Engine ?. save ( data , ĠBluetooth Data . TABLE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONFIG . sensor Observer ?. on Bluetooth Detected ( data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog d ("$ ACTION _ AW ARE _ BL U ETO OTH _ NEW _ DEVICE : Ġ$ data ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Broadcast ( Intent ( ACTION _ AW ARE _ BL U ETO OTH _ NEW _ DEVICE ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ DEVICE , Ġdata . toJson ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog d (" No ĠBluetooth Ġdevice Ġwas Ġdiscovered Ġduring Ġthe Ġscan ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Adapter . ACTION _ DIS COVERY _ FINISHED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONFIG . sensor Observer ?. on Scan Ended () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog d ( ACTION _ AW ARE _ BL U ETO OTH _ SCAN _ ENDED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Broadcast ( Intent ( ACTION _ AW ARE _ BL U ETO OTH _ SCAN _ ENDED )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm BLE Handler . post ( scan Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Adapter . ACTION _ DIS COVERY _ STARTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONFIG . sensor Observer ?. on Scan Started () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Timestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog d ( ACTION _ AW ARE _ BL U ETO OTH _ SCAN _ STARTED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Broadcast ( Intent ( ACTION _ AW ARE _ BL U ETO OTH _ SCAN _ STARTED )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Adapter . ACTION _ STATE _ CHANGED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( extras . getInt ( Bluetooth Adapter . EXTRA _ STATE , Ġ- 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Adapter . STATE _ OFF Ġ-> Ġnotify Missing Bluetooth ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Adapter . STATE _ ON Ġ-> Ġnotify Missing Bluetooth ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ AW ARE _ BL U ETO OTH _ REQUEST _ SCAN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Adapter ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// interrupt Ġongoing Ġscans ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Discover ing ) Ġit . cancel Discovery () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Discover ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isEnabled ) Ġit . start Discovery () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Bluetooth Ġis Ġoff ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog d (" Bluetooth Ġis Ġturned Ġoff ...") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠBluetooth Data (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdeviceId Ġ= ĠCONFIG . deviceId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= ĠCONFIG . label ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" disabled " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġ" disabled " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Label Ġ= Ġ" disabled " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Engine ?. save ( data , ĠBluetooth Data . TABLE _ NAME ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONFIG . sensor Observer ?. on Bluetooth Disabled () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġscan Runnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscanner Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Adapter ?. bluetooth Le Scanner ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scanner Ġ!= Ġnull Ġ&& Ġ! is BLE Sc anning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm BLE Handler . post Delayed ( stop Scan , Ġ 3 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscanner . start Scan ( null , Ġscan Settings , Ġscan Callback ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONFIG . sensor Observer ?. on BLE Scan Started () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog d ( ACTION _ AW ARE _ BL U ETO OTH _ BLE _ SCAN _ STARTED ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Broadcast ( Intent ( ACTION _ AW ARE _ BL U ETO OTH _ BLE _ SCAN _ STARTED )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis BLE Sc anning Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġstop Scan Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscanner Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Adapter ?. bluetooth Le Scanner ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scanner Ġ!= Ġnull Ġ&& Ġis BLE Sc anning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscanner . stop Scan ( scan Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONFIG . sensor Observer ?. on BLE Scan Ended () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog d ( ACTION _ AW ARE _ BL U ETO OTH _ BLE _ SCAN _ ENDED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Broadcast ( Intent ( ACTION _ AW ARE _ BL U ETO OTH _ BLE _ SCAN _ ENDED )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscovered BLE . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis BLE Sc anning Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġscan Callback Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠScan Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" New Api ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Result ( callback Type : ĠInt , Ġresult : ĠScan Result ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scan Result ( callback Type , Ġresult ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbt Device Ġ= Ġresult ?. device Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dis covered BLE . containsKey ( bt Device . address )) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscovered BLE . put ( bt Device . address , Ġbt Device ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠBluetooth Data (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdeviceId Ġ= ĠCONFIG . deviceId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= ĠCONFIG . label ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġbt Device . address Ġ// ĠTODO Ġadd Ġencryption ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġbt Device . name Ġ// ĠTODO Ġadd Ġencryption ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr ssi Ġ= Ġresult . rssi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Label Ġ= Ġscan Timestamp . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Engine ?. save ( data , ĠBluetooth Data . TABLE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONFIG . sensor Observer ?. on Bluetooth BLE Detected ( data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog d ("$ ACTION _ AW ARE _ BL U ETO OTH _ NEW _ DEVICE _ BLE : Ġ$ data ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Broadcast ( Intent ( ACTION _ AW ARE _ BL U ETO OTH _ NEW _ DEVICE _ BLE ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ DEVICE , Ġdata . toJson ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠĠĠĠĠ Ġinitialize Db Engine ( CONFIG ) ĊĠĠĠĠĠĠĠ ĠNotification Util . create Notification Channel ( this ) ĊĊĠĠĠĠĠĠĠ Ġnotification Manager Ġ= Ġget System Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠ Ġalarm Manager Ġ= Ġget System Service ( Context . ALARM _ SERVICE ) Ġas ĠAlarm Manager ĊĊĠĠĠĠĠĠĠ Ġregister Receiver ( bluetooth Monitor , ĠIntent Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( ACTION _ AW ARE _ BL U ETO OTH _ REQUEST _ SCAN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Bluetooth Device . ACTION _ FOUND ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Bluetooth Adapter . ACTION _ DIS COVERY _ FINISHED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Bluetooth Adapter . ACTION _ DIS COVERY _ STARTED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Bluetooth Adapter . ACTION _ STATE _ CHANGED ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġbackground Service Ġ= ĠIntent ( ACTION _ AW ARE _ BL U ETO OTH _ REQUEST _ SCAN ) ĊĠĠĠĠĠĠĠ Ġbluetooth Scan Ġ= ĠPending Intent . get Broadcast ( this , Ġ 0 , Ġbackground Service , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĊĠĠĠĠĠĠĠ Ġbluetooth Adapter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( getSystem Service ( Context . BL U ETO OTH _ SERVICE ) Ġas ĠBluetooth Manager ). adapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Adapter . getDefault Adapter () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġble Support Ġ= Ġpackage Manager . has System Feature ( FEATURE _ BL U ETO OTH _ LE ) ĊĊĠĠĠĠĠĠĠ Ġenable BT Ġ= ĠIntent ( this , ĠBluetooth Sensor :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra (" action ", ĠACTION _ AW ARE _ ENABLE _ BT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġregister Receiver ( bluetooth Receiver , ĠIntent Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( ACTION _ AW ARE _ BL U ETO OTH _ SET _ LABEL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( ACTION _ AW ARE _ BL U ETO OTH _ SYNC ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġlog d (" Bluetooth Ġservice Ġcreated !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart Command ( intent , Ġflags , Ġstart Id ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( REQUIRED _ PERMISSION S . any Ġ{ ĠContext Compat . check Self Permission ( this , Ġit ) Ġ!= ĠPER MISSION _ GRAN TED Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog w (" Missing Ġpermissions Ġdetected .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġintent ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . getString Extra (" action ") Ġ== ĠACTION _ AW ARE _ ENABLE _ BT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( Bluetooth Adapter . ACTION _ REQUEST _ ENABLE )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġble Adapter Ġ= Ġbluetooth Adapter ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ble Adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog w (" No Ġbluetooth Ġis Ġdetected Ġon Ġthis Ġdevice ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ble Adapter . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Missing Bluetooth ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Device ( ble Adapter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Frequency Ġ!= ĠCONFIG . frequency ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Frequency Ġ= ĠCONFIG . frequency ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Manager . cancel ( bluetooth Scan ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Manager . set Repe ating ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRTC _ WAKE UP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . currentTimeMillis () Ġ+ Ġ( current Frequency Ġ* Ġ 6 0 0 0 0 ). to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( current Frequency Ġ* Ġ 2 Ġ* Ġ 6 0 0 0 0 ). to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Scan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog d (" Bluetooth Ġservice Ġis Ġactive : Ġ$ current Frequency Ġm ") ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĊĠĠĠĠĠĠĠ Ġdb Engine ?. close () ĊĊĠĠĠĠĠĠĠ Ġunregister Receiver ( bluetooth Receiver ) ĊĠĠĠĠĠĠĠ Ġunregister Receiver ( bluetooth Monitor ) ĊĊĠĠĠĠĠĠĠ Ġlog d (" Bluetooth Ġservice Ġterminated .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Device ( bt Adapter : ĠBluetooth Adapter ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġbt Adapter Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġcom . aware framework . android . sensor . bluetooth . model . Bluetooth Device (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdeviceId Ġ= ĠCONFIG . deviceId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= ĠCONFIG . label ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġbt Adapter . address Ġ// ĠTODO Ġadd Ġencryption ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġbt Adapter . name Ġ// ĠTODO Ġadd Ġencryption ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdb Engine ?. save ( device , Ġcom . aware framework . android . sensor . bluetooth . model . Bluetooth Device . TABLE _ NAME , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġlog d (" Bluetooth Ġlocal Ġinformation : Ġ$ device ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify Missing Bluetooth ( dismiss : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! dismiss ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠNotification Compat . Builder ( application Context , ĠAW ARE _ NOTIFICATION _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ aware _ accessibility _ white ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title (" AW ARE : ĠBluetooth Ġneeded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text (" Tap Ġto Ġenable ĠBluetooth Ġfor Ġnearby Ġscanning .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Defaults ( Notification . DEFAULT _ ALL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Only Alert Once ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( Pending Intent . getService ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 2 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable BT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . notify ( 1 2 3 , Ġbuilder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog d (" Notification Ġexception : Ġ${ e . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . cancel ( 1 2 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog d (" Notification Ġexception : Ġ${ e . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Sync ( intent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Engine ?. start Sync ( Bluetooth Data . TABLE _ NAME ) ĊĠĠĠĠĠĠĠ Ġdb Engine ?. start Sync ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcom . aware framework . android . sensor . bluetooth . model . Bluetooth Device . TABLE _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDb Sync Config ( remove After Sync Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ?): ĠI Binder ? Ġ= Ġnull ĊĊĠĠĠ Ġdata Ġclass ĠConfig ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsensor Observer : ĠObserver ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfrequency : ĠFloat Ġ= Ġ 1 f ĊĠĠĠ Ġ) Ġ: ĠSensor Config ( db Path Ġ= Ġ" aware _ bluetooth ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠSensor Config > Ġreplace With ( config : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . replace With ( config ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Ġis ĠConfig ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Observer Ġ= Ġconfig . sensor Observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrequency Ġ= Ġconfig . frequency ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠObserver Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Bluetooth Detected ( data : ĠBluetooth Data ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Bluetooth BLE Detected ( data : ĠBluetooth Data ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Scan Started () ĊĠĠĠĠĠĠĠ Ġfun Ġon Scan Ended () ĊĠĠĠĠĠĠĠ Ġfun Ġon BLE Scan Started () ĊĠĠĠĠĠĠĠ Ġfun Ġon BLE Scan Ended () ĊĠĠĠĠĠĠĠ Ġfun Ġon Bluetooth Disabled () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBluetooth Sensor Broadcast Receiver Ġ: ĠA ware Sensor . Sensor Broadcast Receiver () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog d (" Sensor Ġbroadcast Ġreceived . Ġaction : Ġ" Ġ+ Ġintent ?. action ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( intent ?. action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ENSOR _ START _ ENABLED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog d (" Sensor Ġenabled : Ġ" Ġ+ ĠCONFIG . enabled ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( CONFIG . enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ AW ARE _ BL U ETO OTH _ STOP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ENSOR _ STOP _ ALL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog d (" Stopping Ġsensor .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ AW ARE _ BL U ETO OTH _ START Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġlog d ( text : ĠString ) Ġ{ ĊĠĠĠ Ġif Ġ( Bluetooth Sensor . CONFIG . debug ) ĠLog . d ( Bluetooth Sensor . TAG , Ġtext ) Ċ } Ċ Ċ private Ġfun Ġlog w ( text : ĠString ) Ġ{ ĊĠĠĠ ĠLog . w ( Bluetooth Sensor . TAG , Ġtext ) Ċ }