package Ġid . ap w devs . simple ble Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . bluetooth .* Ċ 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 . content . pm . PackageManager Ċ import Ġandroid . os . Parcel Uuid Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . util .* Ċ Ċ class ĠMain ViewModel ( application : ĠApplication ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLive ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ humidity Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġprivate Ġval Ġ_ temperature Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġprivate Ġval Ġ_ seek Progress Ġ= ĠMutable LiveData < Int >() ĊĊĠĠĠ Ġprivate Ġval Ġ_ save Deliver ed Status Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġprivate Ġval Ġ_ connection Status Ġ= ĠMutable LiveData < Boolean >() ĊĊĠĠĠ Ġ// Ġindicate Ġwhether Ġthe Ġprocess Ġis Ġon - the - way ĊĠĠĠ Ġprivate Ġval Ġ_ is Processing : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġval Ġhum idity : ĠLive Data < String > Ġ= Ġ_ humidity ĊĠĠĠ Ġval Ġtemperature : ĠLive Data < String > Ġ= Ġ_ temperature ĊĠĠĠ Ġval Ġseek Progress : ĠLive Data < Int > Ġ= Ġ_ seek Progress ĊĊĠĠĠ Ġval Ġsave Deliver ed Status : ĠLive Data < Boolean > Ġ= Ġ_ save Deliver ed Status ĊĠĠĠ Ġval Ġconnection Status : ĠLive Data < Boolean > Ġ= Ġ_ connection Status ĊĠĠĠ Ġval Ġis Processing : ĠLive Data < Boolean > Ġ= Ġ_ is Processing ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġdefined Ġconstants ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAD VERT ISING _ UUID S : ĠUUID Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUUID . fromString (" 3 ce 0 5 adf - 2 1 2 6 - 4 9 ed - ad ca - fb 2 9 b 1 9 9 5 3 7 8 ") ĊĠĠĠĠĠĠĠ Ġval ĠS ENSOR _ SERVICE _ UUID S : ĠUUID Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUUID . fromString (" 7 1 e 9 d 6 df - 1 7 fd - 4 a 0 6 - bf 0 6 - d 0 7 3 8 7 e 7 fcd 6 ") ĊĊĠĠĠĠĠĠĠ Ġval ĠDEVICE _ SERVICE _ UUID S : ĠUUID Ġ= ĠUUID . fromString (" 7 fb 4 ca 4 b - 4 2 a 6 - 4 1 1 8 - a 3 1 6 - 6 1 9 5 4 8 1 1 1 8 f 9 ") ĊĠĠĠĠĠĠĠ Ġval ĠTEMP _ CHARACTER ISTIC : ĠUUID Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUUID . fromString (" ba fe 9 4 d 0 - 4 4 6 1 - 4 fd 1 - b 8 e 6 - ce 3 0 bfb 5 2 2 e 5 ") ĊĠĠĠĠĠĠĠ Ġval ĠSET T INGS _ CHARACTER ISTIC : ĠUUID Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUUID . fromString (" 1 4 b 0 a 3 5 2 - 7 3 8 4 - 4 8 a 0 - 8 e 4 c - bb 7 9 3 6 f 8 e 9 6 e ") ĊĠĠĠĠĠĠĠ Ġval ĠH UM _ CHARACTER ISTIC : ĠUUID Ġ= ĠUUID . fromString (" ed bec 4 d 4 - ab 2 c - 4 4 6 4 - b 8 3 7 - 9 4 ab 1 d 0 8 db 6 8 ") ĊĊĊĠĠĠĠĠĠĠ Ġval ĠBLE 2 9 0 2 _ UUID S : ĠUUID Ġ= ĠUUID . fromString (" 0 0 0 0 2 9 0 2 - 0 0 0 0 - 1 0 0 0 - 8 0 0 0 - 0 0 8 0 5 f 9 b 3 4 fb ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠGeneric Ġbluetooth Ġadapter ĊĠĠĠ Ġprivate Ġval Ġbluetooth Adapter : ĠBluetooth Adapter ? Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( application . getSystem Service ( Context . BL U ETO OTH _ SERVICE ) Ġas ĠBluetooth Manager ). adapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġtrue Ġif Ġthis Ġdevice Ġis Ġsupport ĠBLE ĊĠĠĠ Ġprivate Ġval Ġis BLE Supported : ĠBoolean Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication . package Manager . has System Feature ( PackageManager . FEATURE _ BL U ETO OTH _ LE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġuser Disconnect : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġconnected Gatt : ĠBluetooth Gatt ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġuser Disconnect Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ(!( is BLE Supported Ġ&& Ġbluetooth Adapter ?. isEnabled Ġ== Ġtrue )) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( connected Gatt Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Processing . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Devices Ġ= Ġscan Devices Async (). await () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ret Devices Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Connected Ġ= Ġconnect Devices Async ( ret Devices ). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" BLE ViewModel ", Ġ" Device Ġis Ġconnected Ġ? Ġ: Ġ$ isConnected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ connection Status . post Value ( isConnected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprocess Ġhad Ġbeen Ġdone , Ġso Ġautomatically Ġpick Ġby Ġthe Ġfirst Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Processing . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Processing . post Value ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Connected Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Gatt ?. connect () Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ connection Status . post Value ( isConnected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Processing . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Duration ( progress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconnected Gatt ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Processing . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= Ġget Service ( SENSOR _ SERVICE _ UUID S ). get Characteristic ( SETTINGS _ CHARACTER ISTIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . value Ġ= Ġ"$ progress ". toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Characteristic ( settings ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdisconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġuser Disconnect Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġconnected Gatt ?. disconnect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġdisconnect () ĊĠĠĠĠĠĠĠ Ġconnected Gatt ?. close () ĊĠĠĠĠĠĠĠ Ġconnected Gatt Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscan Devices Async () Ġ: ĠDeferred < Bluetooth Device ?> Ġ= ĠGlobal Scope . async Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġble Device : ĠBluetooth Device ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġble Scanner Ġ= Ġbluetooth Adapter ?. bluetooth Le Scanner ĊĠĠĠĠĠĠĠ Ġval Ġscan Settings Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScan Settings . Builder (). set Scan Mode ( Scan Settings . SCAN _ MODE _ BAL ANCED ). build () ĊĠĠĠĠĠĠĠ Ġval Ġscan Filter Ġ= ĠlistOf < Scan Filter >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScan Filter . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Service Uuid ( Parcel Uuid ( AD VERT ISING _ UUID S )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġvar Ġis Found Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġscan Cb Ġ= Ġobject Ġ: ĠScan Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Result ( callback Type : ĠInt , Ġresult : ĠScan Result ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ?. device ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Found Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġble Device Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Failed ( errorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Bluetooth Handler ", Ġ" ERROR Ġ-> Ġ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( errorCode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSC AN _ FAILED _ AL READY _ STARTED Ġ-> Ġ" SCAN _ FAILED _ AL READY _ STARTED " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSC AN _ FAILED _ APPLICATION _ REGISTR ATION _ FAILED Ġ-> Ġ" SCAN _ FAILED _ APPLICATION _ REGISTR ATION _ FAILED " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSC AN _ FAILED _ FEATURE _ UNSUPPORTED Ġ-> Ġ" SCAN _ FAILED _ FEATURE _ UNSUPPORTED " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSC AN _ FAILED _ INTERNAL _ ERROR Ġ-> Ġ" SCAN _ FAILED _ INTERNAL _ ERROR " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" UN IDENT IFI ED " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġble Scanner ?. start Scan ( scan Filter , Ġscan Settings , Ġscan Cb ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 1 0 0 .. 5 0 0 0 Ġstep Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isActive Ġ|| Ġis Found ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġble Scanner ?. stop Scan ( scan Cb ) ĊĠĠĠĠĠĠĠ Ġble Device ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconnect Devices Async ( device : ĠBluetooth Device ) Ġ: ĠDeferred < Boolean > Ġ= ĠGlobal Scope . async { ĊĠĠĠĠĠĠĠ Ġvar Ġis Connected Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġis Finished Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġg att Connection Callback Ġ= Ġobject Ġ: ĠBluetooth Gatt Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtry Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġtry Max Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst , Ġdiscover Ġthe Ġconnection Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġconnected , Ġthen Ġdiscover Ġthe Ġservices Ġavailable Ġon Ġthe Ġtarget Ġdevices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connection StateChange ( g att : ĠBluetooth Gatt ?, Ġstatus : ĠInt , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( newState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . STATE _ CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Gatt Ġ= Ġg att ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att ?. discover Services () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Connected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . STATE _ DIS CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// isSelected Device Connected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Connected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDis cover Ġthe ĠServices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Services Dis covered ( g att : ĠBluetooth Gatt ?, Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( status Ġ== ĠBluetooth Gatt . G ATT _ SUCCESS ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscover This Service Async ( g att ). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Finished Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ++ try Count Ġ<= Ġtry Max ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att ?. connect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Finished Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Characteristic Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att : ĠBluetooth Gatt ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic : ĠBluetooth GattCharacteristic ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( uuid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTEMP _ CHARACTER ISTIC Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpost Ġto ĠviewModel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ temperature . post Value ( String ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠH UM _ CHARACTER ISTIC Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpost Ġto ĠviewModel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ humidity . post Value ( String ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSET T INGS _ CHARACTER ISTIC Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpost Ġto ĠviewModel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Processing . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ save Deliver ed Status . post Value ( String ( value ). to Boolean ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Characteristic Read ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att : ĠBluetooth Gatt ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic : ĠBluetooth GattCharacteristic ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( character istic ?. uuid Ġ== ĠSET T INGS _ CHARACTER ISTIC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġcharacteristic . getInt Value ( Bluetooth GattCharacteristic . FORMAT _ UINT 8 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( getApplication (), Ġ" READ Ġfrom Ġcharacteristics Ġ-> Ġ$ h ", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ seek Progress . post Value ( character istic . getInt Value ( Bluetooth GattCharacteristic . FORMAT _ UINT 8 , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( connected Gatt Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice . connect Gatt ( getApplication (), Ġfalse , Ġg att Connection Callback ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Gatt ?. connect () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 1 0 0 .. 1 0 0 0 0 Ġstep Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isActive Ġ|| Ġis Finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis Connected ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdiscover This Service Async ( g att : ĠBluetooth Gatt ): ĠDeferred < Boolean > Ġ= ĠGlobal Scope . async { ĊĠĠĠĠĠĠĠ Ġval Ġsensor Service Ġ= Ġg att . getService ( SENSOR _ SERVICE _ UUID S ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġobserve Ġall Ġcharacteristics Ġon Ġthis Ġservice .. ĊĠĠĠĠĠĠĠ Ġfor Ġ( character istics Ġin Ġsensor Service . character istics ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! enable Notification Value ( character istics , Ġg att )) Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġread Ġthe Ġcurrent Ġvalue Ġof Ġseek Ġduration ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġthe Ġvalue Ġwill Ġretrieved Ġby Ġcallbacks ĊĠĠĠĠĠĠĠ Ġg att . read Characteristic ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Service . get Characteristic ( SETTINGS _ CHARACTER ISTIC ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable Notification Value ( character istic : ĠBluetooth GattCharacteristic , Ġg att : ĠBluetooth Gatt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġcharacteristic . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" NOT IF _ CHAR A _ ENABLE ", Ġ" En abling ĠCharacter istics Ġvalue Ġof ĠUUID Ġ-> Ġ$ uuid ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġg att . set Characteristic Notification ( this , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdesc Ġ= ĠgetDescriptor ( BLE 2 9 0 2 _ UUID S ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠBluetooth Gatt Descriptor . ENABLE _ NOTIFICATION _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Desc Ġ= Ġg att . write Descriptor ( desc ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult Ġ&& Ġresult Desc ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }