package Ġcom . by ton . dt . b leg atts ample Ċ Ċ /* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 3 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . bluetooth . Bluetooth GattCharacteristic Ċ import Ġandroid . bluetooth . Bluetooth Gatt Service Ċ import Ġandroid . content .* Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . widget . Expand able ListView Ċ import Ġandroid . widget . Simple Expand able ListAdapter Ċ import Ġandroid . widget . TextView Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠFor Ġa Ġgiven ĠBLE Ġdevice , Ġthis ĠActivity Ġprovides Ġthe Ġuser Ġinterface Ġto Ġconnect , Ġdisplay Ġdata , Ċ Ġ* Ġand Ġdisplay ĠG ATT Ġservices Ġand Ġcharacteristics Ġsupported Ġby Ġthe Ġdevice . Ġ ĠThe ĠActivity Ċ Ġ* Ġcommunic ates Ġwith Ġ` Bluetooth Le Service `, Ġwhich Ġin Ġturn Ġinteract s Ġwith Ġthe Ċ Ġ* ĠBluetooth ĠLE ĠAPI . Ċ Ġ*/ Ċ class ĠDevice Control Activity Ġ: ĠActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Connection State : ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Data Field : ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Device Name : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Device Address : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Gatt Services List : ĠExpand able ListView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Bluetooth Le Service : ĠBluetooth Le Service ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Gatt Character istics : ĠArrayList < ArrayList < Bluetooth GattCharacteristic >> ? Ġ= ĊĠĠĠĠĠĠĠ ĠArrayList () ĊĠĠĠ Ġprivate Ġvar Ġm Connected Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm Notify Characteristic : ĠBluetooth GattCharacteristic ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġ_ list Name Ġ= Ġ" NAME " ĊĠĠĠ Ġprivate Ġval Ġ_ list UUID Ġ= Ġ" UUID " ĊĊĠĠĠ Ġ// ĠCode Ġto Ġmanage ĠService Ġlifecycle . ĊĠĠĠ Ġprivate Ġval Ġm Service Connection Ġ= Ġobject Ġ: ĠService Connection Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Connected ( component Name : ĠComponent Name , Ġservice : ĠI Binder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Le Service Ġ= Ġ( service Ġas ĠBluetooth Le Service . Local Binder ). service ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Bluetooth Le Service !!. initialize ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Unable Ġto Ġinitialize ĠBluetooth ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAutomatically Ġconnects Ġto Ġthe Ġdevice Ġupon Ġsuccessful Ġstart - up Ġinitialization . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Le Service !!. connect ( m Device Address ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( component Name : ĠComponent Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Le Service Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠHandles Ġvarious Ġevents Ġfired Ġby Ġthe ĠService . ĊĠĠĠ Ġ// ĠACTION _ G ATT _ CONNECTED : Ġconnected Ġto Ġa ĠG ATT Ġserver . ĊĠĠĠ Ġ// ĠACTION _ G ATT _ DIS CONNECTED : Ġdisconnected Ġfrom Ġa ĠG ATT Ġserver . ĊĠĠĠ Ġ// ĠACTION _ G ATT _ SERVICES _ DIS COVER ED : Ġdiscovered ĠG ATT Ġservices . ĊĠĠĠ Ġ// ĠACTION _ DATA _ AVAILABLE : Ġreceived Ġdata Ġfrom Ġthe Ġdevice . Ġ ĠThis Ġcan Ġbe Ġa Ġresult Ġof Ġread ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor Ġnotification Ġoperations . ĊĠĠĠ Ġprivate Ġval Ġm Gatt Update Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( intent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Le Service . ACTION _ G ATT _ CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Connected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Connection State ( R . string . connected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate Options Menu () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Le Service . ACTION _ G ATT _ DIS CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Connected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Connection State ( R . string . disconnected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate Options Menu () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear UI () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Le Service . ACTION _ G ATT _ SERVICES _ DIS COVER ED Ġ// ĠShow Ġall Ġthe Ġsupported Ġservices Ġand Ġcharacteristics Ġon Ġthe Ġuser Ġinterface . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġdisplay Gatt Services ( m Bluetooth Le Service !!. supported Gatt Services ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Le Service . ACTION _ DATA _ AVAILABLE Ġ-> Ġdisplay Data ( intent . getString Extra ( Bluetooth Le Service . EXTRA _ DATA )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠIf Ġa Ġgiven ĠG ATT Ġcharacteristic Ġis Ġselected , Ġcheck Ġfor Ġsupported Ġfeatures . Ġ ĠThis Ġsample ĊĠĠĠ Ġ// Ġdemonstrates Ġ' Read ' Ġand Ġ' Notify ' Ġfeatures . Ġ ĠSee ĊĠĠĠ Ġ// Ġhttp :// d . android . com / reference / android / bluetooth / Bluetooth Gatt . html Ġfor Ġthe Ġcomplete ĊĠĠĠ Ġ// Ġlist Ġof Ġsupported Ġcharacteristic Ġfeatures . ĊĠĠĠ Ġprivate Ġval Ġservices List ClickListener Ġ= ĊĠĠĠĠĠĠĠ ĠExpand able ListView . On Child ClickListener Ġ{ Ġ_, Ġ_, Ġgroup Position , Ġchild Position , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Gatt Character istics Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacteristic Ġ= Ġm Gatt Character istics ! ![ group Position ][ child Position ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar a Prop Ġ= Ġcharacteristic . properties ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char a Prop Ġor ĠBluetooth GattCharacteristic . PROPERTY _ READ Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġis Ġan Ġactive Ġnotification Ġon Ġa Ġcharacteristic , Ġclear ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġit Ġfirst Ġso Ġit Ġdoesn 't Ġupdate Ġthe Ġdata Ġfield Ġon Ġthe Ġuser Ġinterface . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Notify Characteristic Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Le Service !!. set Characteristic Notification ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Notify Characteristic !! , Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Notify Characteristic Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Le Service !!. read Characteristic ( character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char a Prop Ġor ĠBluetooth GattCharacteristic . PROPERTY _ NOTIFY Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Notify Characteristic Ġ= Ġcharacteristic ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Le Service !!. set Characteristic Notification ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic , Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Child ClickListener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Gatt Services List !!. setAdapter ( null Ġas ĠSimple Expand able ListAdapter ?) ĊĠĠĠĠĠĠĠ Ġm Data Field !!. setText ( R . string . no _ data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . g att _ services _ character istics ) ĊĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġintent ĊĠĠĠĠĠĠĠ Ġm Device Name Ġ= Ġintent . getString Extra ( EX TR AS _ DEVICE _ NAME ) ĊĠĠĠĠĠĠĠ Ġm Device Address Ġ= Ġintent . getString Extra ( EX TR AS _ DEVICE _ ADDRESS ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSets Ġup ĠUI Ġreferences . ĊĠĠĠĠĠĠĠ Ġthis . findViewById < TextView >( R . id . device _ address ). text Ġ= Ġm Device Address ĊĠĠĠĠĠĠĠ Ġm Gatt Services List Ġ= Ġthis . findViewById ( R . id . g att _ services _ list ) ĊĠĠĠĠĠĠĠ Ġm Gatt Services List !!. setOn Child ClickListener ( services List ClickListener ) ĊĠĠĠĠĠĠĠ Ġm Connection State Ġ= ĠfindViewById ( R . id . connection _ state ) ĊĠĠĠĠĠĠĠ Ġm Data Field Ġ= ĠfindViewById ( R . id . data _ value ) ĊĊĠĠĠĠĠĠĠ Ġaction Bar !!. title Ġ= Ġm Device Name ĊĠĠĠĠĠĠĠ Ġaction Bar !!. set Display Home As Up Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġval Ġg att Service Intent Ġ= ĠIntent ( this , ĠBluetooth Le Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġbind Service ( g att Service Intent , Ġm Service Connection , ĠContext . BIND _ AUTO _ CREATE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġregister Receiver ( m Gatt Update Receiver , Ġmake Gatt Update Intent Filter ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Bluetooth Le Service Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġm Bluetooth Le Service !!. connect ( m Device Address ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Connect Ġrequest Ġresult =$ result ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġunregister Receiver ( m Gatt Update Receiver ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġun bind Service ( m Service Connection ) ĊĠĠĠĠĠĠĠ Ġm Bluetooth Le Service Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . g att _ services , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Connected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . menu _ connect ). isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . menu _ disconnect ). isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . menu _ connect ). isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . menu _ disconnect ). isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ connect Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Le Service !!. connect ( m Device Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ disconnect Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Le Service !!. disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . id . home Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Connection State ( resourceId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ Ġm Connection State !!. setText ( resourceId ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay Data ( data : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Data Field !!. text Ġ= Ġdata ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠD emon str ates Ġhow Ġto Ġiterate Ġthrough Ġthe Ġsupported ĠG ATT ĠServices / Character istics . ĊĠĠĠ Ġ// ĠIn Ġthis Ġsample , Ġwe Ġpopulate Ġthe Ġdata Ġstructure Ġthat Ġis Ġbound Ġto Ġthe ĠExpand able ListView ĊĠĠĠ Ġ// Ġon Ġthe ĠUI . ĊĠĠĠ Ġprivate Ġfun Ġdisplay Gatt Services ( g att Services : ĠList < Bluetooth Gatt Service > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( g att Services Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġuuid : ĠString ? ĊĠĠĠĠĠĠĠ Ġval Ġunknown Service String Ġ= Ġresources . getString ( R . string . unknown _ service ) ĊĠĠĠĠĠĠĠ Ġval Ġunknown Char a String Ġ= Ġresources . getString ( R . string . unknown _ character istic ) ĊĠĠĠĠĠĠĠ Ġval Ġg att Service Data Ġ= ĠArrayList < HashMap < String , ĠString >>() ĊĠĠĠĠĠĠĠ Ġval Ġg att Characteristic Data Ġ= ĠArrayList < ArrayList < HashMap < String , ĠString >> >() ĊĠĠĠĠĠĠĠ Ġm Gatt Character istics Ġ= ĠArrayList () ĊĊĠĠĠĠĠĠĠ Ġ// ĠLo ops Ġthrough Ġavailable ĠG ATT ĠServices . ĊĠĠĠĠĠĠĠ Ġfor Ġ( g att Service Ġin Ġg att Services ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Service Data Ġ= ĠHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuuid Ġ= Ġg att Service . uuid . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Service Data [_ list Name ] Ġ= ĠSample Gatt Attributes . lookup ( uuid , Ġunknown Service String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Service Data [_ list UUID ] Ġ= Ġuuid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att Service Data . add ( current Service Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg att Characteristic GroupData Ġ= ĠArrayList < HashMap < String , ĠString >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg att Character istics Ġ= Ġg att Service . character istics ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar as Ġ= ĠArrayList < Bluetooth GattCharacteristic >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLo ops Ġthrough Ġavailable ĠCharacter istics . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( g att Characteristic Ġin Ġg att Character istics ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar as . add ( g att Characteristic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Char a Data Ġ= ĠHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuuid Ġ= Ġg att Characteristic . uuid . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Char a Data [_ list Name ] Ġ= ĠSample Gatt Attributes . lookup ( uuid , Ġunknown Char a String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Char a Data [_ list UUID ] Ġ= Ġuuid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg att Characteristic GroupData . add ( current Char a Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Gatt Character istics !!. add ( char as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att Characteristic Data . add ( g att Characteristic GroupData ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġg att Service Adapter Ġ= ĠSimple Expand able ListAdapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att Service Data , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . layout . simple _ expand able _ list _ item _ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (_ list Name , Ġ_ list UUID ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf ( android . R . id . text 1 , Ġandroid . R . id . text 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg att Characteristic Data , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . layout . simple _ expand able _ list _ item _ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (_ list Name , Ġ_ list UUID ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf ( android . R . id . text 1 , Ġandroid . R . id . text 2 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġm Gatt Services List !!. setAdapter ( g att Service Adapter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠDevice Control Activity :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TR AS _ DEVICE _ NAME Ġ= Ġ" DEVICE _ NAME " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TR AS _ DEVICE _ ADDRESS Ġ= Ġ" DEVICE _ ADDRESS " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmake Gatt Update Intent Filter (): ĠIntent Filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Filter Ġ= ĠIntent Filter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Filter . addAction ( Bluetooth Le Service . ACTION _ G ATT _ CONNECTED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Filter . addAction ( Bluetooth Le Service . ACTION _ G ATT _ DIS CONNECTED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Filter . addAction ( Bluetooth Le Service . ACTION _ G ATT _ SERVICES _ DIS COVER ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Filter . addAction ( Bluetooth Le Service . ACTION _ DATA _ AVAILABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġintent Filter ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ