package Ġcom . sn ail . easy ble . core Ċ Ċ import Ġandroid . bluetooth .* Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . os . Message Ċ import Ġandroidx . annotation . Int Range Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġcom . sn ail . easy ble . callback .* Ċ import Ġcom . sn ail . easy ble . util . B le Utils Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Concurrent Linked Queue Ċ Ċ /** Ċ Ġ* Ġdate : Ġ 2 0 1 8 / 4 / 1 1 Ġ 1 6 : 3 7 Ċ Ġ* Ġauthor : Ġz eng fan sh eng Ċ Ġ*/ Ċ @ Suppress (" Le aking This ") Ċ abstract Ġclass ĠBase Connection Ġinternal Ġconstructor ( val Ġdevice : ĠDevice , Ġprotected Ġvar Ġbluetooth Device : ĠBluetooth Device , Ġval Ġconfig : ĠConnection Config ) Ġ: ĠĊĠĠĠĠĠĠĠ ĠBluetooth Gatt Callback (), ĠI Connection Ġ{ ĊĠĠĠ Ġvar Ġbluetooth Gatt : ĠBluetooth Gatt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprotected Ġset ĊĠĠĠ Ġprivate Ġvar Ġrequest Queue : ĠMutable List < Request > Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġvar Ġcurrent Request : ĠRequest ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpending Characteristic : ĠBluetooth GattCharacteristic ? Ġ= Ġnull ĊĠĠĠ Ġprotected Ġvar Ġbluetooth Adapter : ĠBluetooth Adapter ? Ġ= Ġnull ĊĠĠĠ Ġprotected Ġvar Ġis Released : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġinternal Ġvar Ġconn Handler : ĠHandler ĊĠĠĠ Ġprivate Ġvar Ġcharacteristic Changed Callback : ĠCharacter istic Changed Callback ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġconn Handler Ġ= ĠConn Handler ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè¿ĶåĽŀ ä¸Ģä¸ª èĵĿ çī Ļ æľįåĬ¡ åĪĹè¡¨ ï¼Į åıªæľī åľ¨ æī§è¡Į äºĨ åıĳçİ° æľįåĬ¡ åĲİ ï¼Į æīį ä¼ļ æľī ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġg att Services : ĠList < Bluetooth Gatt Service > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( bluetooth Gatt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Gatt !!. services ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĠArrayList () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ¸ ħ éĻ¤ è¯·æ±Ĥ éĺŁåĪĹ ï¼Į ä¸į è§¦åıĳ äºĭä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear Request Queue () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Queue . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Request Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè®¾ç½® æĶ¶ åĪ° çī¹å¾ģ éĢļçŁ¥ æķ°æį® åĽŀè°ĥ ï¼Į ä½ľ çĶ¨äºİ æľī nof ity å±ŀæĢ§ çļĦ çī¹å¾ģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Characteristic Changed Callback ( character istic Changed Callback : ĠCharacter istic Changed Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . character istic Changed Callback Ġ= Ġcharacteristic Changed Callback ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå°Ĩ æĮĩå®ļçļĦ è¯·æ±Ĥ ç±»åŀĭ ä»İ éĺŁåĪĹ ä¸Ń ç§»éĻ¤ ï¼Į ä¸į è§¦åıĳ äºĭä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear Request Queue ByType ( type : ĠRequest . RequestType ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġrequest Queue . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( it . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġit . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . type Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Request Ġ!= Ġnull Ġ&& Ġcurrent Request !!. type Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Request Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ¸ ħ ç©º è¯·æ±Ĥ éĺŁåĪĹ å¹¶ è§¦åıĳ éĢļçŁ¥ äºĭä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġclear Request Queue And Notify () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( request Ġin Ġrequest Queue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( request , ĠI Connection . REQUEST _ FAIL _ TYPE _ CONNECTION _ DIS CONNECTED , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Request Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( current Request !! , ĠI Connection . REQUEST _ FAIL _ TYPE _ CONNECTION _ DIS CONNECTED , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclear Request Queue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Released Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġconn Handler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠ Ġclear Request Queue And Notify () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Service ( service Uuid : ĠUUID ): ĠBluetooth Gatt Service ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( bluetooth Gatt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Gatt !!. getService ( service Uuid ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Characteristic ( service Uuid : ĠUUID , Ġcharacteristic Uuid : ĠUUID ): ĠBluetooth GattCharacteristic ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Gatt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġbluetooth Gatt !!. getService ( service Uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( service Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġservice . get Characteristic ( character istic Uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetDescriptor ( service Uuid : ĠUUID , Ġcharacteristic Uuid : ĠUUID , Ġdescriptor Uuid : ĠUUID ): ĠBluetooth Gatt Descriptor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Gatt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġbluetooth Gatt !!. getService ( service Uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( service Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacteristic Ġ= Ġservice . get Characteristic ( character istic Uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcharacteristic . get Descriptor ( descriptor Uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Characteristic Read ( g att : ĠBluetooth Gatt , Ġcharacteristic : ĠBluetooth GattCharacteristic , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Request Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Request !!. type Ġ== ĠRequest . RequestType . READ _ CHARACTER ISTIC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcurrent Request !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠBluetooth Gatt . G ATT _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB le . instance . getMethod Post er (). post ( request . callback , ĠCharacter istic Read Callback . getMethod Info ( device , Ġrequest . tag , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . service . uuid , Ġcharacteristic . uuid , Ġcharacteristic . value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Characteristic Read ( request . tag , Ġcharacteristic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Gatt Status Failed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Next Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Characteristic Write ( g att : ĠBluetooth Gatt , Ġcharacteristic : ĠBluetooth GattCharacteristic , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Request Ġ!= Ġnull Ġ&& Ġcurrent Request !!. wait Write Result Ġ&& Ġcurrent Request !!. type Ġ== ĠRequest . RequestType . WRITE _ CHARACTER ISTIC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠBluetooth Gatt . G ATT _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Request !!. remain Queue Ġ== Ġnull Ġ|| Ġcurrent Request !!. remain Queue !!. isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcurrent Request !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB le . instance . getMethod Post er (). post ( request . callback , ĠCharacter istic Write Callback . getMethod Info ( device , Ġrequest . tag , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . service . uuid , Ġcharacteristic . uuid , Ġrequest . value !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Characteristic Write ( request . tag , Ġcharacteristic . service . uuid , Ġcharacteristic . uuid , Ġrequest . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Next Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconn Handler . remove Messages ( MSG _ REQUEST _ TIMEOUT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconn Handler . sendMessage Delayed ( Message . obtain ( conn Handler , ĠMSG _ REQUEST _ TIMEOUT , Ġcurrent Request ), Ġconfig . request Timeout Millis . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelay Ġ= Ġcurrent Request !!. write Delay . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delay Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Ġ= Ġcurrent Request ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( delay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( req Ġ!= Ġcurrent Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Request !!. sending Bytes Ġ= Ġcurrent Request !!. remain Queue !!. remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( write Fail ( character istic , Ġcurrent Request !!. sending Bytes !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Write Failed ( current Request !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( current Request !! , ĠI Connection . REQUEST _ FAIL _ TYPE _ G ATT _ STATUS _ FAILED , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Characteristic Changed ( g att : ĠBluetooth Gatt , Ġcharacteristic : ĠBluetooth GattCharacteristic ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Characteristic Changed ( character istic ) ĊĠĠĠĠĠĠĠ Ġif Ġ( character istic Changed Callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠB le . instance . getMethod Post er (). post ( character istic Changed Callback !! , ĠCharacter istic Changed Callback . getMethod Info ( device , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . service . uuid , Ġcharacteristic . uuid , Ġcharacteristic . value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Read Remote R ssi ( g att : ĠBluetooth Gatt ?, Ġr ssi : ĠInt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Request Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Request !!. type Ġ== ĠRequest . RequestType . READ _ RSS I ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠBluetooth Gatt . G ATT _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcurrent Request !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB le . instance . getMethod Post er (). post ( request . callback , ĠRemote R ssi Read Callback . getMethod Info ( device , Ġrequest . tag , Ġr ssi )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Read Remote R ssi ( request . tag , Ġr ssi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Gatt Status Failed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Next Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Descriptor Read ( g att : ĠBluetooth Gatt , Ġdescriptor : ĠBluetooth Gatt Descriptor , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Request Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacteristic Ġ= Ġdescriptor . character istic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( current Request !!. type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . ENABLE _ NOTIFICATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . DISABLE _ NOTIFICATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . ENABLE _ IND ICATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . DISABLE _ IND ICATION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= ĠBluetooth Gatt . G ATT _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Gatt Status Failed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( character istic . service . uuid Ġ== Ġpending Characteristic !!. service . uuid Ġ&& Ġcharacteristic . uuid Ġ== Ġpending Characteristic !!. uuid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Enable Notify Ġ= Ġcurrent Request !!. type Ġ== ĠRequest . RequestType . ENABLE _ NOTIFICATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enable Notification Or Indication Fail ( is Enable Notify Ġ|| Ġcurrent Request !!. type Ġ== ĠRequest . RequestType . ENABLE _ IND ICATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Enable Notify , Ġcharacteristic )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Gatt Status Failed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . READ _ DESCRIPTOR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠBluetooth Gatt . G ATT _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcurrent Request !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB le . instance . getMethod Post er (). post ( request . callback , ĠDescriptor Read Callback . getMethod Info ( device , Ġrequest . tag , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . service . uuid , Ġcharacteristic . uuid , Ġdescriptor . uuid , Ġdescriptor . value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Descriptor Read ( request . tag , Ġdescriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Gatt Status Failed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Next Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Descriptor Write ( g att : ĠBluetooth Gatt ?, Ġdescriptor : ĠBluetooth Gatt Descriptor , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Request Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Request !!. type Ġ== ĠRequest . RequestType . ENABLE _ NOTIFICATION Ġ|| Ġcurrent Request !!. type Ġ== ĠRequest . RequestType . DISABLE _ NOTIFICATION Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Request !!. type Ġ== ĠRequest . RequestType . ENABLE _ IND ICATION Ġ|| Ġcurrent Request !!. type Ġ== ĠRequest . RequestType . DISABLE _ IND ICATION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Descriptor Ġ= ĠgetDescriptor ( descriptor . character istic . service . uuid , Ġdescriptor . character istic . uuid , ĠI Connection . client Characteristic Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcurrent Request !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= ĠBluetooth Gatt . G ATT _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Gatt Status Failed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Descriptor ?. value Ġ= Ġcurrent Request !!. value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Enabled Ġ= Ġcurrent Request !!. type Ġ== ĠRequest . RequestType . ENABLE _ NOTIFICATION Ġ|| Ġcurrent Request !!. type Ġ== ĠRequest . RequestType . ENABLE _ IND ICATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġch Ġ= Ġdescriptor . character istic ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . type Ġ== ĠRequest . RequestType . ENABLE _ NOTIFICATION Ġ|| Ġrequest . type Ġ== ĠRequest . RequestType . DISABLE _ NOTIFICATION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB le . instance . getMethod Post er (). post ( request . callback , ĠNotification Changed Callback . getMethod Info ( device , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . tag , Ġch . service . uuid , Ġch . uuid , Ġdescriptor . uuid , Ġis Enabled )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB le . instance . getMethod Post er (). post ( request . callback , ĠIndic ation Changed Callback . getMethod Info ( device , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . tag , Ġch . service . uuid , Ġch . uuid , Ġdescriptor . uuid , Ġis Enabled )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( request . type Ġ== ĠRequest . RequestType . ENABLE _ NOTIFICATION Ġ|| Ġrequest . type Ġ== ĠRequest . RequestType . DISABLE _ NOTIFICATION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Notification Changed ( request . tag , Ġdescriptor , Ġis Enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Indication Changed ( request . tag , Ġdescriptor , Ġis Enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Next Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon M tu Changed ( g att : ĠBluetooth Gatt ?, Ġmt u : ĠInt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Request Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Request !!. type Ġ== ĠRequest . RequestType . CHANGE _ MT U ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcurrent Request !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠBluetooth Gatt . G ATT _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB le . instance . getMethod Post er (). post ( request . callback , ĠM tu Changed Callback . getMethod Info ( device , Ġrequest . tag , Ġmt u )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon M tu Changed ( request . tag , Ġmt u ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Gatt Status Failed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Next Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Phy Read ( g att : ĠBluetooth Gatt ?, Ġtx Phy : ĠInt , Ġrx Phy : ĠInt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Phy Read OrUpdate ( true , Ġtx Phy , Ġrx Phy , Ġstatus ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Phy Update ( g att : ĠBluetooth Gatt ?, Ġtx Phy : ĠInt , Ġrx Phy : ĠInt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Phy Read OrUpdate ( false , Ġtx Phy , Ġrx Phy , Ġstatus ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Phy Read OrUpdate ( read : ĠBoolean , Ġtx Phy : ĠInt , Ġrx Phy : ĠInt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Request Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( read Ġ&& Ġcurrent Request !!. type Ġ== ĠRequest . RequestType . READ _ PHY ) Ġ|| Ġ((! read Ġ&& Ġcurrent Request !!. type Ġ== ĠRequest . RequestType . SET _ PREFERRED _ PHY ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcurrent Request !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠBluetooth Gatt . G ATT _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB le . instance . getMethod Post er (). post ( request . callback , ĠP hy Read Callback . getMethod Info ( device , Ġrequest . tag , Ġtx Phy , Ġrx Phy )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB le . instance . getMethod Post er (). post ( request . callback , ĠP hy Update Callback . getMethod Info ( device , Ġrequest . tag , Ġtx Phy , Ġrx Phy )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Phy Read OrUpdate ( request . tag , Ġread , Ġtx Phy , Ġrx Phy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Gatt Status Failed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Next Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// make Ġsure Ġcurrent Request Ġis Ġnot Ġnull ĊĠĠĠ Ġprivate Ġfun Ġhandle Gatt Status Failed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Request Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( current Request !! , ĠI Connection . REQUEST _ FAIL _ TYPE _ G ATT _ STATUS _ FAILED , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Failed Callback ( tag : ĠString , Ġrequest Type : ĠRequest . RequestType , Ġfail Type : ĠInt , Ġvalue : ĠByteArray ?, Ġexecute Next : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Request F ia led ( tag , Ġrequest Type , Ġfail Type , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġif Ġ( execute Next ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Next Request () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Failed Callback ( request : ĠRequest , Ġfail Type : ĠInt , Ġexecute Next : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request . callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . callback Ġis ĠRequest Failed Callback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( request . callback , Ġdevice , Ġrequest . tag , Ġrequest . type , Ġfail Type , Ġrequest . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Request F ia led ( request . tag , Ġrequest . type , Ġfail Type , Ġrequest . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( execute Next ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Next Request () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Failed Callback ( callback : ĠRequest Failed Callback , Ġdevice : ĠDevice , Ġtag : ĠString , Ġrequest Type : ĠRequest . RequestType , Ġfail Type : ĠInt , Ġsrc : ĠByteArray ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠB le . instance . getMethod Post er (). post ( callback , ĠRequest Failed Callback . getMethod Info ( device , Ġtag , Ġrequest Type , Ġfail Type , Ġsrc )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä¿®æĶ¹ æľĢå¤§ ä¼łè¾ĵ åįķåħĥ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtag Ġ çĶ¨äºİ åĮº åĪĨ è¯·æ±Ĥ ĊĠĠĠĠ Ġ* Ġ@ param Ġmt u Ġ æľĢå¤§ ä¼łè¾ĵ åįķåħĥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . LO L LI POP ) ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġchange M tu ( tag : ĠString , Ġ@ Int Range ( from Ġ= Ġ 2 3 , Ġto Ġ= Ġ 5 1 7 ) Ġmt u : ĠInt , Ġcallback : ĠM tu Changed Callback ? Ġ= Ġnull , Ġpriority : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġenqueue ( Request . new Change M tu Request ( tag , Ġmt u , Ġcallback , Ġpriority )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¯»åıĸ èĵĿ çī Ļ è®¾å¤ĩ çļĦ çī¹å¾ģ ï¼Į åıªæľī å±ŀæĢ§ æľī read çļĦ æīįèĥ½ æĪĲåĬŁ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġread Characteristic ( tag : ĠString , Ġservice : ĠUUID , Ġcharacteristic : ĠUUID , Ġcallback : ĠCharacter istic Read Callback ? Ġ= Ġnull , Ġpriority : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( check Uuid Exists ( tag , ĠRequest . RequestType . READ _ CHARACTER ISTIC , Ġnull , Ġcallback , Ġservice , Ġcharacteristic )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenqueue ( Request . new Read Characteristic Request ( tag , Ġservice , Ġcharacteristic , Ġcallback , Ġpriority )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¼ĢåĲ¯ æķ°æį® éĢļçŁ¥ ï¼Į çī¹å¾ģ å±ŀæĢ§ ä¸Ń éľĢè¦ģ æľī notify ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġenable Notification ( tag : ĠString , Ġservice : ĠUUID , Ġcharacteristic : ĠUUID , Ġcallback : ĠNotification Changed Callback ? Ġ= Ġnull , Ġpriority : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( check Uuid Exists ( tag , ĠRequest . RequestType . ENABLE _ NOTIFICATION , Ġnull , Ġcallback , Ġservice , Ġcharacteristic )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenqueue ( Request . new Enable Notification Request ( tag , Ġservice , Ġcharacteristic , Ġcallback , Ġpriority )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġdisable Notification ( tag : ĠString , Ġservice : ĠUUID , Ġcharacteristic : ĠUUID , Ġcallback : ĠNotification Changed Callback ? Ġ= Ġnull , Ġpriority : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( check Uuid Exists ( tag , ĠRequest . RequestType . DISABLE _ NOTIFICATION , Ġnull , Ġcallback , Ġservice , Ġcharacteristic )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenqueue ( Request . new Disable Notification Request ( tag , Ġservice , Ġcharacteristic , Ġcallback , Ġpriority )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġenable Indication ( tag : ĠString , Ġservice : ĠUUID , Ġcharacteristic : ĠUUID , Ġcallback : ĠIndic ation Changed Callback ? Ġ= Ġnull , Ġpriority : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( check Uuid Exists ( tag , ĠRequest . RequestType . ENABLE _ IND ICATION , Ġnull , Ġcallback , Ġservice , Ġcharacteristic )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenqueue ( Request . new Enable Indication Request ( tag , Ġservice , Ġcharacteristic , Ġcallback , Ġpriority )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġdisable Indication ( tag : ĠString , Ġservice : ĠUUID , Ġcharacteristic : ĠUUID , Ġcallback : ĠIndic ation Changed Callback ? Ġ= Ġnull , Ġpriority : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( check Uuid Exists ( tag , ĠRequest . RequestType . DISABLE _ IND ICATION , Ġnull , Ġcallback , Ġservice , Ġcharacteristic )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenqueue ( Request . new Disable Indication Request ( tag , Ġservice , Ġcharacteristic , Ġcallback , Ġpriority )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġthe Ġvalue Ġfor Ġa Ġgiven Ġdescriptor Ġfrom Ġthe Ġassociated Ġremote Ġdevice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġread Descriptor ( tag : ĠString , Ġservice : ĠUUID , Ġcharacteristic : ĠUUID , Ġdescriptor : ĠUUID , Ġcallback : ĠDescriptor Read Callback ? Ġ= Ġnull , Ġpriority : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( check Uuid Exists ( tag , ĠRequest . RequestType . READ _ DESCRIPTOR , Ġnull , Ġcallback , Ġservice , Ġcharacteristic )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenqueue ( Request . new Read Descriptor Request ( tag , Ġservice , Ġcharacteristic , Ġdescriptor , Ġcallback , Ġpriority )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrites Ġa Ġgiven Ġcharacteristic Ġand Ġits Ġvalues Ġto Ġthe Ġassociated Ġremote Ġdevice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġwrite Characteristic ( tag : ĠString , Ġservice : ĠUUID , Ġcharacteristic : ĠUUID , Ġvalue : ĠByteArray ?, Ġcallback : ĠCharacter istic Write Callback ? Ġ= Ġnull , Ġpriority : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull Ġ|| Ġvalue . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( callback , Ġdevice , Ġtag , ĠRequest . RequestType . WRITE _ CHARACTER ISTIC , ĠI Connection . REQUEST _ FAIL _ TYPE _ VALUE _ IS _ NULL _ OR _ EMPTY , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( tag , ĠRequest . RequestType . WRITE _ CHARACTER ISTIC , ĠI Connection . REQUEST _ FAIL _ TYPE _ VALUE _ IS _ NULL _ OR _ EMPTY , Ġvalue , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( check Uuid Exists ( tag , ĠRequest . RequestType . WRITE _ CHARACTER ISTIC , Ġvalue , Ġcallback , Ġservice , Ġcharacteristic )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenqueue ( Request . new Write Characteristic Request ( tag , Ġservice , Ġcharacteristic , Ġvalue , Ġcallback , Ġpriority )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¯»åıĸ å·² è¿ŀæİ¥ çļĦ èĵĿ çī Ļ è®¾å¤ĩ çļĦ ä¿¡åı· å¼º åº¦ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġread R ssi ( tag : ĠString , Ġcallback : ĠRemote R ssi Read Callback ? Ġ= Ġnull , Ġpriority : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġenqueue ( Request . new Read R ssi Request ( tag , Ġcallback , Ġpriority )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġthe Ġcurrent Ġtransmit ter ĠPHY Ġand Ġreceiver ĠPHY Ġof Ġthe Ġconnection . ĠThe Ġvalues Ġare Ġreturned ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġread Phy ( tag : ĠString , Ġcallback : ĠP hy Read Callback ? Ġ= Ġnull , Ġpriority : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġenqueue ( Request . new Read Phy Request ( tag , Ġcallback , Ġpriority )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġpreferred Ġconnection ĠPHY Ġfor Ġthis Ġapp . ĠPlease Ġnote Ġthat Ġthis Ġis Ġjust Ġa ĊĠĠĠĠ Ġ* Ġrecommendation , Ġwhether Ġthe ĠPHY Ġchange Ġwill Ġhappen Ġdepends Ġon Ġother Ġapplications Ġpreferences , ĊĠĠĠĠ Ġ* Ġlocal Ġand Ġremote Ġcontroller Ġcapabilities . ĠController Ġcan Ġoverride Ġthese Ġsettings . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtx Phy Ġpreferred Ġtransmit ter ĠPHY . ĠBit wise ĠOR Ġof Ġany Ġof Ġ[ Bluetooth Device . PHY _ LE _ 1 M _ MASK ], Ġ[ Bluetooth Device . PHY _ LE _ 2 M _ MASK ], Ġand Ġ[ Bluetooth Device . PHY _ LE _ CODE D _ MASK ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġrx Phy Ġpreferred Ġreceiver ĠPHY . ĠBit wise ĠOR Ġof Ġany Ġof Ġ[ Bluetooth Device . PHY _ LE _ 1 M _ MASK ], Ġ[ Bluetooth Device . PHY _ LE _ 2 M _ MASK ], Ġand Ġ[ Bluetooth Device . PHY _ LE _ CODE D _ MASK ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġphy Options Ġpreferred Ġcoding Ġto Ġuse Ġwhen Ġtransmit ting Ġon Ġthe ĠLE ĠCode d ĠPHY . ĠCan Ġbe Ġone ĊĠĠĠĠ Ġ* Ġof Ġ[ Bluetooth Device . PHY _ OPTION _ NO _ PREFERRED ], Ġ[ Bluetooth Device . PHY _ OPTION _ S 2 ] Ġor ĊĠĠĠĠ Ġ* Ġ[ Bluetooth Device . PHY _ OPTION _ S 8 ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġset Preferred Phy ( tag : ĠString , Ġtx Phy : ĠInt , Ġrx Phy : ĠInt , Ġphy Options : ĠInt , Ġcallback : ĠP hy Update Callback ? Ġ= Ġnull , Ġpriority : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġenqueue ( Request . new Set Preferred Phy Request ( tag , Ġtx Phy , Ġrx Phy , Ġphy Options , Ġcallback , Ġpriority )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// æ£ĢæŁ¥ uuid æĺ¯åĲ¦ åŃĺåľ¨ ĊĠĠĠ Ġprivate Ġfun Ġcheck Uuid Exists ( tag : ĠString , Ġrequest Type : ĠRequest . RequestType , Ġsrc : ĠByteArray ?, Ġcallback : ĠAny ?, Ġvar arg Ġuuid s : ĠUUID ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuuid s . isNotEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Service Exists ( uuid s [ 0 ], Ġtag , Ġrequest Type , Ġsrc , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuuid s . size Ġ> Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Characteristic Exists ( uuid s [ 0 ], Ġuuid s [ 1 ], Ġtag , Ġrequest Type , Ġsrc , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuuid s . size Ġ> Ġ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Descript ore Exists ( uuid s [ 0 ], Ġuuid s [ 1 ], Ġuuid s [ 2 ], Ġtag , Ġrequest Type , Ġsrc , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// æ£ĢæŁ¥ æľįåĬ¡ æĺ¯åĲ¦ åŃĺåľ¨ ĊĠĠĠ Ġprivate Ġfun Ġcheck Service Exists ( uuid : ĠUUID , Ġtag : ĠString , Ġrequest Type : ĠRequest . RequestType , Ġsrc : ĠByteArray ?, Ġcallback : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( getService ( uuid ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callback Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( tag , Ġrequest Type , ĠI Connection . REQUEST _ FAIL _ TYPE _ NULL _ SERVICE , Ġsrc , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( callback Ġis ĠRequest Failed Callback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( callback , Ġdevice , Ġtag , Ġrequest Type , ĠI Connection . REQUEST _ FAIL _ TYPE _ NULL _ SERVICE , Ġsrc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// æ£ĢæŁ¥ çī¹å¾ģ æĺ¯åĲ¦ åŃĺåľ¨ ĊĠĠĠ Ġprivate Ġfun Ġcheck Characteristic Exists ( service : ĠUUID , Ġcharacteristic : ĠUUID , Ġtag : ĠString , Ġrequest Type : ĠRequest . RequestType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc : ĠByteArray ?, Ġcallback : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( check Service Exists ( service , Ġtag , Ġrequest Type , Ġsrc , Ġcallback )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get Characteristic ( service , Ġcharacteristic ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callback Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( tag , Ġrequest Type , ĠI Connection . REQUEST _ FAIL _ TYPE _ NULL _ CHARACTER ISTIC , Ġsrc , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( callback Ġis ĠRequest Failed Callback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( callback , Ġdevice , Ġtag , Ġrequest Type , ĠI Connection . REQUEST _ FAIL _ TYPE _ NULL _ CHARACTER ISTIC , Ġsrc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// æ£ĢæŁ¥ Descript ore æĺ¯åĲ¦ åŃĺåľ¨ ĊĠĠĠ Ġprivate Ġfun Ġcheck Descript ore Exists ( service : ĠUUID , Ġcharacteristic : ĠUUID , Ġdescriptor : ĠUUID , Ġtag : ĠString , Ġrequest Type : ĠRequest . RequestType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc : ĠByteArray ?, Ġcallback : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( check Service Exists ( service , Ġtag , Ġrequest Type , Ġsrc , Ġcallback ) Ġ&& Ġcheck Characteristic Exists ( service , Ġcharacteristic , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag , Ġrequest Type , Ġsrc , Ġcallback )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get Descriptor ( service , Ġcharacteristic , Ġdescriptor ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callback Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( tag , Ġrequest Type , ĠI Connection . REQUEST _ FAIL _ TYPE _ NULL _ DESCRIPTOR , Ġsrc , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( callback Ġis ĠRequest Failed Callback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( callback , Ġdevice , Ġtag , Ġrequest Type , ĠI Connection . REQUEST _ FAIL _ TYPE _ NULL _ DESCRIPTOR , Ġsrc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenqueue ( request : ĠRequest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Released ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( request , ĠI Connection . REQUEST _ FAIL _ TYPE _ CONNECTION _ RELEASE D , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Request Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Request ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æł¹æį® ä¼ĺåĮĸ çº§ å°Ĩ è¯·æ±Ĥ æıĴåħ¥ éĺŁåĪĹ ä¸Ń ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Queue . forEach Indexed Ġ{ Ġi , Ġreq Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( req . priority Ġ>= Ġrequest . priority ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġrequest Queue . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Queue [ i Ġ+ Ġ 1 ]. priority Ġ< Ġrequest . priority ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġi Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġi Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ== Ġ- 1 Ġ-> Ġrequest Queue . add ( 0 , Ġrequest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ>= Ġrequest Queue . size Ġ-> Ġrequest Queue . add ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġrequest Queue . add ( index , Ġrequest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Next Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn Handler . remove Messages ( MSG _ REQUEST _ TIMEOUT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Queue . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Request Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Request ( request Queue . remove At ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠConn Handler Ġinternal Ġconstructor ( connection : ĠBase Connection ) Ġ: ĠHandler ( Looper . get Main Looper ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġweak Ref : ĠWeak Reference < Base Connection > Ġ= ĠWeak Reference ( connection ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġweak Ref . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connection Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( msg . what ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMSG _ REQUEST _ TIMEOUT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġmsg . obj Ġas ĠRequest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connection . current Request Ġ!= Ġnull Ġ&& Ġconnection . current Request Ġ=== Ġrequest ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . handle Failed Callback ( request , ĠI Connection . REQUEST _ FAIL _ TYPE _ REQUEST _ TIMEOUT , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . execute Next Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . handle Msg ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġhandle Msg ( msg : ĠMessage ) ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Request ( request : ĠRequest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Request Ġ= Ġrequest ĊĠĠĠĠĠĠĠ Ġconn Handler . sendMessage Delayed ( Message . obtain ( conn Handler , ĠMSG _ REQUEST _ TIMEOUT , Ġrequest ), Ġconfig . request Timeout Millis . to Long ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Adapter !!. isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Gatt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( request . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . READ _ RSS I Ġ-> Ġexecute Read R ssi ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . CHANGE _ MT U Ġ-> Ġexecute Change M tu ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . READ _ PHY Ġ-> Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Gatt !!. read Phy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . SET _ PREFERRED _ PHY Ġ-> Ġexecute Set Preferred Phy ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg att Service Ġ= Ġbluetooth Gatt !!. getService ( request . service ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g att Service Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacteristic Ġ= Ġg att Service . get Characteristic ( request . character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( request . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . ENABLE _ NOTIFICATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . DISABLE _ NOTIFICATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . ENABLE _ IND ICATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . DISABLE _ IND ICATION Ġ-> Ġexecute Indication Or Notification ( character istic , Ġrequest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . READ _ CHARACTER ISTIC Ġ-> Ġexecute Read Characteristic ( character istic , Ġrequest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . READ _ DESCRIPTOR Ġ-> Ġexecute Read Descriptor ( character istic , Ġrequest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . RequestType . WRITE _ CHARACTER ISTIC Ġ-> Ġexecute Write Characteristic ( character istic , Ġrequest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( request , ĠI Connection . REQUEST _ FAIL _ TYPE _ NULL _ CHARACTER ISTIC , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( request , ĠI Connection . REQUEST _ FAIL _ TYPE _ NULL _ SERVICE , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( request , ĠI Connection . REQUEST _ FAIL _ TYPE _ G ATT _ IS _ NULL , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( request , ĠI Connection . REQUEST _ FAIL _ TYPE _ BL U ETO OTH _ ADAPTER _ DISABLED , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Change M tu ( request : ĠRequest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! bluetooth Gatt !!. request M tu ( B le Utils . bytes To Long ( false , Ġ* request . value !! ). toInt ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( request , ĠI Connection . REQUEST _ FAIL _ TYPE _ REQUEST _ FAILED , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Read R ssi ( request : ĠRequest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! bluetooth Gatt !!. read Remote R ssi ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( request , ĠI Connection . REQUEST _ FAIL _ TYPE _ REQUEST _ FAILED , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Set Preferred Phy ( request : ĠRequest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Phy Ġ= ĠB le Utils . bytes To Long ( false , Ġ* Arrays . copyOf Range ( request . value , Ġ 0 , Ġ 4 )). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrx Phy Ġ= ĠB le Utils . bytes To Long ( false , Ġ* Arrays . copyOf Range ( request . value , Ġ 4 , Ġ 8 )). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphy Options Ġ= ĠB le Utils . bytes To Long ( false , Ġ* Arrays . copyOf Range ( request . value , Ġ 8 , Ġ 1 2 )). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Gatt !!. set Preferred Phy ( tx Phy , Ġrx Phy , Ġphy Options ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Read Characteristic ( character istic : ĠBluetooth GattCharacteristic , Ġrequest : ĠRequest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! bluetooth Gatt !!. read Characteristic ( character istic )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( request , ĠI Connection . REQUEST _ FAIL _ TYPE _ REQUEST _ FAILED , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Write Characteristic ( character istic : ĠBluetooth GattCharacteristic , Ġrequest : ĠRequest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . wait Write Result Ġ= Ġconfig . is Wait Write Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . write Delay Ġ= Ġconfig . package Write Delay Millis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Write Delay Millis Ġ= Ġconfig . request Write Delay Millis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Delay Ġ= Ġif Ġ( request Write Delay Millis Ġ> Ġ 0 ) Ġrequest Write Delay Millis Ġelse Ġrequest . write Delay ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( req Delay Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( req Delay . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Ġ!= Ġcurrent Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . value !!. size Ġ> Ġconfig . package Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠB le Utils . split Package ( request . value !! , Ġconfig . package Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! request . wait Write Result ) Ġ{ Ġ// without Ġwaiting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelay Ġ= Ġrequest . write Delay . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġlist . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġlist [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ> Ġ 0 Ġ&& Ġdelay Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( delay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Ġ!= Ġcurrent Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( write Fail ( character istic , Ġbytes )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Write Failed ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// åıĳéĢģ ç¬¬ä¸Ģ åĮħ ï¼Į åī © ä¸ĭçļĦ åĬłåħ¥ éĺŁåĪĹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . remain Queue Ġ= ĠConcurrent Linked Queue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . remain Queue !!. addAll ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . sending Bytes Ġ= Ġrequest . remain Queue !!. remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( write Fail ( character istic , Ġrequest . sending Bytes !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Write Failed ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . sending Bytes Ġ= Ġrequest . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( write Fail ( character istic , Ġrequest . value !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Write Failed ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! request . wait Write Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB le . instance . getMethod Post er (). post ( current Request !!. callback !! , ĠCharacter istic Write Callback . getMethod Info ( device , Ġrequest . tag , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . service . uuid , Ġcharacteristic . uuid , Ġrequest . value !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Characteristic Write ( request . tag , Ġcharacteristic . service . uuid , Ġcharacteristic . uuid , Ġrequest . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Next Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Write Failed ( request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Write Failed ( request : ĠRequest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconn Handler . remove Messages ( MSG _ REQUEST _ TIMEOUT ) ĊĠĠĠĠĠĠĠ Ġrequest . remain Queue Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġhandle Failed Callback ( request , ĠI Connection . REQUEST _ FAIL _ TYPE _ REQUEST _ FAILED , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Fail ( character istic : ĠBluetooth GattCharacteristic , Ġvalue : ĠByteArray ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġcharacteristic . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġval Ġwrite Type Ġ= Ġconfig . get Write Type ( character istic . service . uuid , Ġcharacteristic . uuid ) ĊĠĠĠĠĠĠĠ Ġif Ġ( write Type Ġ!= Ġnull Ġ&& Ġ( write Type Ġ== ĠBluetooth GattCharacteristic . WRITE _ TYPE _ DEFAULT Ġ|| Ġwrite Type Ġ== ĠBluetooth GattCharacteristic . WRITE _ TYPE _ SIGNED Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Type Ġ== ĠBluetooth GattCharacteristic . WRITE _ TYPE _ NO _ RESPONSE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . write Type Ġ= Ġwrite Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ! bluetooth Gatt !!. write Characteristic ( character istic ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Read Descriptor ( character istic : ĠBluetooth GattCharacteristic , Ġrequest : ĠRequest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġg att Descriptor Ġ= Ġcharacteristic . get Descriptor ( request . descriptor ) ĊĠĠĠĠĠĠĠ Ġif Ġ( g att Descriptor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! bluetooth Gatt !!. read Descriptor ( g att Descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( request , ĠI Connection . REQUEST _ FAIL _ TYPE _ REQUEST _ FAILED , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( request , ĠI Connection . REQUEST _ FAIL _ TYPE _ NULL _ DESCRIPTOR , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Indication Or Notification ( character istic : ĠBluetooth GattCharacteristic , Ġrequest : ĠRequest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpending Characteristic Ġ= Ġcharacteristic ĊĠĠĠĠĠĠĠ Ġval Ġg att Descriptor Ġ= Ġpending Characteristic !!. get Descriptor ( I Connection . client Characteristic Config ) ĊĠĠĠĠĠĠĠ Ġif Ġ( g att Descriptor Ġ== Ġnull Ġ|| Ġ! bluetooth Gatt !!. read Descriptor ( g att Descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Failed Callback ( request , ĠI Connection . REQUEST _ FAIL _ TYPE _ REQUEST _ FAILED , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable Notification Or Indication Fail ( enable : ĠBoolean , Ġnotification : ĠBoolean , Ġcharacteristic : ĠBluetooth GattCharacteristic ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! bluetooth Adapter !!. isEnabled Ġ|| Ġbluetooth Gatt Ġ== Ġnull Ġ|| Ġ! bluetooth Gatt !!. set Characteristic Notification ( character istic , Ġenable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġcharacteristic . get Descriptor ( I Connection . client Characteristic Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġor ia Value Ġ= Ġdescriptor . value ĊĠĠĠĠĠĠĠ Ġif Ġ( current Request Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Request !!. type Ġ== ĠRequest . RequestType . DISABLE _ NOTIFICATION Ġ|| Ġcurrent Request !!. type Ġ== ĠRequest . RequestType . ENABLE _ NOTIFICATION Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Request !!. type Ġ== ĠRequest . RequestType . DISABLE _ IND ICATION Ġ|| Ġcurrent Request !!. type Ġ== ĠRequest . RequestType . ENABLE _ IND ICATION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Request !!. value Ġ= Ġor ia Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . value Ġ= Ġif Ġ( notification ) ĠBluetooth Gatt Descriptor . ENABLE _ NOTIFICATION _ VALUE Ġelse ĠBluetooth Gatt Descriptor . ENABLE _ IND ICATION _ VALUE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . value Ġ= ĠBluetooth Gatt Descriptor . DISABLE _ NOTIFICATION _ VALUE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠThere Ġwas Ġa Ġbug Ġin ĠAndroid Ġup Ġto Ġ 6 . 0 Ġwhere Ġthe Ġdescriptor Ġwas Ġwritten Ġusing Ġparent ĊĠĠĠĠĠĠĠ Ġ// Ġcharacteristic 's Ġwrite Ġtype , Ġinstead Ġof Ġalways ĠWrite ĠWith ĠResponse , Ġas Ġthe Ġspec Ġsays . ĊĠĠĠĠĠĠĠ Ġval Ġwrite Type Ġ= Ġcharacteristic . write Type ĊĠĠĠĠĠĠĠ Ġcharacteristic . write Type Ġ= ĠBluetooth GattCharacteristic . WRITE _ TYPE _ DEFAULT ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġbluetooth Gatt !!. write Descriptor ( descriptor ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¿ĺ åİŁ åİŁå§ĭ åĢ¼ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . value Ġ= Ġor ia Value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcharacteristic . write Type Ġ= Ġwrite Type ĊĠĠĠĠĠĠĠ Ġreturn Ġ! result ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Notification Or Indication Enabled ( character istic : ĠBluetooth GattCharacteristic ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġcharacteristic . get Descriptor ( I Connection . client Characteristic Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn ĠArrays . equals ( descriptor . value , ĠBluetooth Gatt Descriptor . ENABLE _ NOTIFICATION _ VALUE ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . equals ( descriptor . value , ĠBluetooth Gatt Descriptor . ENABLE _ IND ICATION _ VALUE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Notification Or Indication Enabled ( service : ĠUUID , Ġcharacteristic : ĠUUID ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġget Characteristic ( service , Ġcharacteristic ) ĊĠĠĠĠĠĠĠ Ġif Ġ( c Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġis Notification Or Indication Enabled ( c ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ REQUEST _ TIMEOUT Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠMSG _ CONNECT Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠMSG _ DIS CONNECT Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠMSG _ REFRESH Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠMSG _ AUTO _ REFRESH Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠMSG _ TIMER Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠMSG _ RELEASE Ġ= Ġ 6 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠMSG _ DIS COVER _ SERVICES Ġ= Ġ 7 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠMSG _ ON _ CONNECTION _ STATE _ CHANGE Ġ= Ġ 8 ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠMSG _ ON _ SERVICES _ DIS COVER ED Ġ= Ġ 9 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠClear s Ġthe Ġinternal Ġcache Ġand Ġforces Ġa Ġrefresh Ġof Ġthe Ġservices Ġfrom Ġthe Ġremote Ġdevice . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġrefresh ( bluetooth Gatt : ĠBluetooth Gatt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Method Ġ= Ġbluetooth Gatt . java Class . getMethod (" refresh ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlocal Method . invoke ( bluetooth Gatt ) Ġas ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }