package Ġnl . r ws link man . sim device ble . bluetooth Ċ Ċ import Ġandroid . bluetooth .* Ċ import Ġandroid . bluetooth . le . Ad vertise Callback Ċ import Ġandroid . bluetooth . le . Ad vertise Data Ċ import Ġandroid . bluetooth . le . Ad vertise Settings Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Parcel Uuid Ċ import Ġandroid . util . Log Ċ import Ġnl . r ws link man . sim device ble . device . model . Characteristic Ċ import Ġnl . r ws link man . sim device ble . device . model . Device Ċ import Ġjava . util .* Ċ Ċ class ĠAd vertisement Manager ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġbluetooth Adapter : ĠBluetooth Adapter , ĊĠĠĠ Ġvar Ġlistener : ĠListener ? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġinterface ĠListener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġupdate Data Container ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic : ĠCharacter istic , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Initial Value : ĠBoolean ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġfun ĠsetIs Ad vertising ( is Ad vertising : ĠBoolean ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Device Connected ( device Address : ĠString ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Device Disconnected ( device Address : ĠString ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠOverall Ġused Ġvariables ĊĠĠĠ Ġprivate Ġval Ġbluetooth Manager : ĠBluetooth Manager Ġ= ĊĠĠĠĠĠĠĠ Ġcontext . getSystem Service ( Context . BL U ETO OTH _ SERVICE ) Ġas ĠBluetooth Manager ĊĠĠĠ Ġprivate Ġval Ġadvert iser Ġ= Ġbluetooth Adapter . bluetooth Le Ad vert iser ĊĠĠĠ Ġprivate Ġvar Ġg att Server : ĠBluetooth Gatt Server ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġconnected Devices : ĠMutable Map < String , ĠBluetooth Device > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġ// ĠOnly Ġused Ġwhen Ġadvertising ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadd Service Queue : ĠQueue < Bluetooth Gatt Service > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġad vertise Command : ĠAd vertise Command ĊĊĠĠĠ Ġprivate Ġval Ġg att Callback Ġ= Ġobject Ġ: ĠBluetooth Gatt Server Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connection StateChange ( device : ĠBluetooth Device ?, Ġstatus : ĠInt , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠBluetooth Gatt . G ATT _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newState Ġ== ĠBluetooth Gatt . STATE _ CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Connection StateChange : Ġconnected Ġto Ġ${ it . name } Ġ[ ${ it . address }] " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Device Connected ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( newState Ġ== ĠBluetooth Gatt . STATE _ DIS CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Connection StateChange : Ġdisconnected Ġfrom Ġ${ device . name } Ġ[ ${ device . address }] " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Device Disconnected ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Connection StateChange : ĠConnect Ġerror Ġwhile Ġconnecting Ġ${ device . name } Ġ[ ${ device . address }] " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Device Disconnected ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Characteristic Read Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice : ĠBluetooth Device ?, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic : ĠBluetooth GattCharacteristic ? ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Characteristic Read Request : ĠDevice Ġtried Ġto Ġread Ġcharacteristic : Ġ" Ġ+ Ġcharacteristic ?. uuid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Characteristic Read Request : Ġcurrent Ġvalue Ġ${ character istic ?. value }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att Server ?. send Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . G ATT _ INVALID _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att Server ?. send Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . G ATT _ SUCCESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic ?. value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Characteristic Write Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice : ĠBluetooth Device ?, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic : ĠBluetooth GattCharacteristic ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Write : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Needed : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠByteArray ? ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Characteristic Write Request : ĠCharacter istic ĠWrite Ġrequest ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstatus : ĠInt Ġ= ĠBluetooth Gatt . G ATT _ SUCCESS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacteristic Model Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġad vertise Command . device . get Characteristic ( character istic ?. uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic Model ?. let Ġ{ Ġchar Model Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLet Ġcharacteristic Ġdecide Ġif Ġwrite Ġvalue Ġis ĠOK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġcharacteristic Model . validate Write ( offset , Ġvalue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic ?. value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠBluetooth Gatt . G ATT _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. update Data Container ( char Model , Ġit , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att Server ?. send Response ( device , ĠrequestId , Ġstatus , Ġ 0 , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Descriptor Read Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice : ĠBluetooth Device ?, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor : ĠBluetooth Gatt Descriptor ? ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Descriptor Read Request : ĠDevice Ġtried Ġto Ġread Ġdescriptor : Ġ" Ġ+ Ġdescriptor ?. uuid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att Server ?. send Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . G ATT _ INVALID _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att Server ?. send Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . G ATT _ SUCCESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor ?. value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Descriptor Write Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice : ĠBluetooth Device ?, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor : ĠBluetooth Gatt Descriptor ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Write : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Needed : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠByteArray ? ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Descriptor ĠWrite ĠRequest Ġ" Ġ+ Ġdescriptor ?. uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor ?. uuid Ġ== ĠCLIENT _ CHARACTER ISTIC _ CONFIGURATION _ UUID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacteristic Ġ= Ġdescriptor ?. character istic ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsupports Notifications Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( character istic ?. properties Ġ!= Ġnull Ġ&& ĠBluetooth GattCharacteristic . PROPERTY _ NOTIFY Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsupports Indic ations Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( character istic ?. properties Ġ!= Ġnull Ġ&& ĠBluetooth GattCharacteristic . PROPERTY _ IND ICATE Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( supports Notifications Ġ|| Ġsupports Indic ations )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠBluetooth Gatt . G ATT _ REQUEST _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( value ?. size Ġ!= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠBluetooth Gatt . G ATT _ INVALID _ ATTRIBUTE _ LENGTH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Arrays . equals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt Descriptor . DISABLE _ NOTIFICATION _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠBluetooth Gatt . G ATT _ SUCCESS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor ?. value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( supports Notifications Ġ&& ĠArrays . equals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt Descriptor . ENABLE _ NOTIFICATION _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠBluetooth Gatt . G ATT _ SUCCESS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor ?. value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( supports Indic ations Ġ&& ĠArrays . equals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt Descriptor . ENABLE _ IND ICATION _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠBluetooth Gatt . G ATT _ SUCCESS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor ?. value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠBluetooth Gatt . G ATT _ REQUEST _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠBluetooth Gatt . G ATT _ SUCCESS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor ?. value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att Server ?. send Response ( device , ĠrequestId , Ġstatus , Ġ 0 , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Added ( status : ĠInt , Ġservice : ĠBluetooth Gatt Service ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠBluetooth Gatt . G ATT _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠServices Ġmust Ġbe Ġadded Ġse quent ially ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Item Ġ= Ġadd Service Queue . poll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Item Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ad vertisement () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att Server ?. add Service ( next Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġscan Callback Ġ= Ġobject Ġ: ĠAd vertise Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Success ( settings In Effect : ĠAd vertise Settings ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . onStart Success ( settings In Effect ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onStart Success : Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. setIs Ad vertising ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Failure ( errorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . onStart Failure ( errorCode ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onStart Failure : Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// region ĠPublic Ġmethods ĊĠĠĠ Ġfun Ġad vertise ( command : ĠAd vertise Command ) Ġ{ ĊĠĠĠĠĠĠĠ Ġg att Server Ġ= Ġbluetooth Manager . open Gatt Server ( context , Ġg att Callback ) ĊĠĠĠĠĠĠĠ Ġif Ġ( g att Server Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" ad vertise : ĠUnable Ġto Ġopen ĠG ATT Ġserver ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġad vertise Command Ġ= Ġcommand Ġ// ĠStore Ġfor Ġlater ĊĊĠĠĠĠĠĠĠ Ġval Ġg att Services Ġ= Ġcreate Services ( command . device ) ĊĠĠĠĠĠĠĠ Ġadd Service Queue Ġ= ĠLinkedList ( g att Services ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( add Service Queue . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ad vertisement () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att Server ?. add Service ( add Service Queue . poll ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġg att Server ?. clear Services () ĊĠĠĠĠĠĠĠ Ġg att Server ?. close () ĊĠĠĠĠĠĠĠ Ġg att Server Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġadvert iser ?. stop Ad vertising ( scan Callback ) ĊĠĠĠĠĠĠĠ Ġlistener ?. setIs Ad vertising ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Ad vert ised Character istics ( character istic Data : ĠMutable Map < UUID , ĠByteArray >) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Ad vert ised Gatt Character istics ()?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG ather Ġall Ġadvert ised Ġcharacteristics Ġto Ġcheck Ġif Ġupdate Ġcan Ġbe Ġset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Value : ĠByteArray ? Ġ= Ġcharacteristic Data [ it . uuid ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Value ?. let Ġ{ Ġup Val Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value Ġ= Ġup Val ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Notification To Connected Devices ( uuid : ĠUUID ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcharacteristic Ġ= Ġad vertise Command . device . get Characteristic ( uuid ) ĊĠĠĠĠĠĠĠ Ġcharacteristic ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification To Connected Devices ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġsend Notification To Connected Devices ( character istic : ĠCharacter istic ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindicate Ġ= Ġcharacteristic . is Indic ate ĊĠĠĠĠĠĠĠ Ġval Ġnotify Me : ĠBluetooth GattCharacteristic ? Ġ= Ġget Ad vert ised Gatt Character istics ()?. first Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . uuid Ġ== Ġcharacteristic . uuid ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnotify Me ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( device Ġin Ġconnected Devices . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att Server ?. notify Characteristic Changed ( device , Ġit , Ġindicate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Ad vert ised Characteristic Values (): ĠMap < Characteristic , ĠByteArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġad vertise Command . device ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < Characteristic , ĠByteArray >() ĊĠĠĠĠĠĠĠ Ġget Ad vert ised Gatt Character istics ()?. forEach Ġ{ Ġbt Char Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar Ġ= Ġdevice . get Characteristic ( bt Char . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchar ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbt Value Ġ= Ġbyte ArrayOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bt Char . value Ġ!== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbt Value Ġ= Ġbt Char . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ char ] Ġ= Ġbt Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġ// region Ġprivate Ġmethods ĊĠĠĠ Ġprivate Ġfun Ġcreate Services ( device : ĠDevice ): ĠList < Bluetooth Gatt Service > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdevice . services . map Ġ{ Ġservice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg att Service Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt Service ( service . uuid , ĠBluetooth Gatt Service . SERVICE _ TYPE _ PRIMARY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . character istics ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMap Ġto ĠG ATT ĠCharacter istic ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg att Characteristic Ġ= Ġcreate GattCharacteristic ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Notify Ġ|| Ġit . is Indic ate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc cc Descriptor Ġ= Ġcreate Client Characteristic Configuration Descriptor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att Characteristic . add Descriptor ( ccc Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . description ?. let Ġ{ Ġdescr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġcreate User Description Descriptor ( descr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att Characteristic . add Descriptor ( descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Value : ĠByteArray ? Ġ= Ġit . initial Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Value ?. let Ġ{ Ġinit Val Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att Characteristic . value Ġ= Ġinitial Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. update Data Container ( it , Ġinit Val , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att Characteristic ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att Service . add Characteristic ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att Service ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate GattCharacteristic ( character istic : ĠCharacter istic ): ĠBluetooth GattCharacteristic Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġproperties Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġpermissions Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( character istic . is Read ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Ġ= Ġproperties . or ( Bluetooth GattCharacteristic . PROPERTY _ READ ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions Ġ= Ġpermissions . or ( Bluetooth GattCharacteristic . PERMISSION _ READ ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( character istic . is Write ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Ġ= Ġproperties . or ( Bluetooth GattCharacteristic . PROPERTY _ WRITE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions Ġ= Ġpermissions . or ( Bluetooth GattCharacteristic . PERMISSION _ WRITE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( character istic . is Notify ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Ġ= Ġproperties . or ( Bluetooth GattCharacteristic . PROPERTY _ NOTIFY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( character istic . is Indic ate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Ġ= Ġproperties . or ( Bluetooth GattCharacteristic . PROPERTY _ IND ICATE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠBluetooth GattCharacteristic ( character istic . uuid , Ġproperties , Ġpermissions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Client Characteristic Configuration Descriptor (): ĠBluetooth Gatt Descriptor Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠBluetooth Gatt Descriptor ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCLIENT _ CHARACTER ISTIC _ CONFIGURATION _ UUID , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt Descriptor . PERMISSION _ READ Ġor ĠBluetooth Gatt Descriptor . PERMISSION _ WRITE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdescriptor . value Ġ= Ġbyte ArrayOf ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdescriptor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate User Description Descriptor ( description : ĠString ): ĠBluetooth Gatt Descriptor Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠBluetooth Gatt Descriptor ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUSER _ DESCRIPTION _ CHARACTER ISTIC _ UUID , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt Descriptor . PERMISSION _ READ . or ( Bluetooth Gatt Descriptor . PERMISSION _ WRITE ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdescriptor . value Ġ= Ġdescription . toByteArray () ĊĠĠĠĠĠĠĠ Ġreturn Ġdescriptor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Ad vertisement () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm Adv Settings Ġ= ĠAd vertise Settings . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Ad vertise Mode ( Ad vertise Settings . AD VER TI SE _ MODE _ BAL ANCED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Tx Power Level ( Ad vertise Settings . AD VER TI SE _ TX _ POWER _ MEDIUM ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Connect able ( ad vertise Command . is Connect able ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġm Adv Data Ġ= ĠAd vertise Data . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Include Tx Power Level ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Service Uuid ( Parcel Uuid ( ad vertise Command . device . primary Service Uuid )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġm Adv Scan Response Ġ= ĠAd vertise Data . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Include Device Name ( ad vertise Command . include Device Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġadvert iser . start Ad vertising ( m Adv Settings , Ġm Adv Data , Ġm Adv Scan Response , Ġscan Callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Device Connected ( device : ĠBluetooth Device ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconnected Devices [ device . address ] Ġ= Ġdevice ĊĠĠĠĠĠĠĠ Ġlistener ?. on Device Connected ( device . address ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Device Disconnected ( device : ĠBluetooth Device ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconnected Devices . remove ( device . address ) ĊĠĠĠĠĠĠĠ Ġlistener ?. on Device Disconnected ( device . address ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Ad vert ised Gatt Character istics (): ĠList < Bluetooth GattCharacteristic >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġg att Server ?. services ?. flatMap Ġ{ Ġit . character istics Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" Ad vertisement Manager " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCLIENT _ CHARACTER ISTIC _ CONFIGURATION _ 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 ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠUSER _ DESCRIPTION _ CHARACTER ISTIC _ UUID Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUUID . fromString (" 0 0 0 0 2 9 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 ") ĊĠĠĠ Ġ} Ċ }