/* Ċ Ġ* ĠBlue g iga âĢĻ s ĠBluetooth ĠSmart ĠAndroid ĠSW Ġfor ĠBlue g iga ĠBLE Ġmodules Ċ Ġ* ĠContact : Ġsupport @ blue g iga . com . Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġfree Ġsoftware Ġdistributed Ġunder Ġthe Ġterms Ġof Ġthe ĠMIT Ġlicense Ġrepro duced Ġbelow . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 3 , ĠBlue g iga ĠTechnologies Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ(" Software ") Ċ Ġ* Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ċ Ġ* Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠTHIS ĠCODE ĠAND ĠINFORMATION ĠARE ĠPROVIDED Ġ" AS ĠIS " ĠWITHOUT ĠWARRANTY ĠOF Ċ Ġ* ĠANY ĠKIND , ĠE IT HER ĠEX PRES SED ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT Ċ Ġ* ĠNOT ĠLIMITED ĠTO ĠTHE ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND / OR ĠFITNESS ĠFOR ĠA Ġ ĠPARTICULAR ĠPURPOSE . Ċ Ġ*/ Ċ package Ġcom . sil icon labs . ble demo . iop _ test . activities Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Dialog Ċ import Ġandroid . bluetooth .* Ċ import Ġandroid . bluetooth . le . Bluetooth Le Scanner Ċ import Ġandroid . bluetooth . le . Scan Callback Ċ import Ġandroid . bluetooth . le . Scan Result Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . content . res . Color State List Ċ import Ġandroid . os .* Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . view . Window Ċ import Ġandroid . widget .* Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . content . Context Compat . startActivity Ċ import Ġandroidx . core . content . File Provider Ċ import Ġcom . sil icon labs . ble demo . Bluetooth . Services . Bluetooth Service Ċ import Ġcom . sil icon labs . ble demo . Bluetooth . BLE . Timeout Gatt Callback Ċ import Ġcom . sil icon labs . ble demo . R Ċ import Ġcom . sil icon labs . ble demo . utils . Notifications Ċ import Ġcom . sil icon labs . ble demo . utils . BLE Utils . set Notification For Characteristic Ċ import Ġcom . sil icon labs . ble demo . utils . Converters Ċ import Ġcom . sil icon labs . ble demo . iop _ test . fragments . I OP Test Fragment Ċ import Ġcom . sil icon labs . ble demo . iop _ test . fragments . I OP Test Fragment . Companion . newInstance Ċ import Ġcom . sil icon labs . ble demo . iop _ test . models .* Ċ import Ġcom . sil icon labs . ble demo . iop _ test . models . Common . Companion . isSet Property Ċ import Ġcom . sil icon labs . ble demo . iop _ test . models . I OP Test . Companion . create Data Test Ċ import Ġcom . sil icon labs . ble demo . iop _ test . models . I OP Test . Companion . getItem TestCase Info Ċ import Ġcom . sil icon labs . ble demo . iop _ test . models . I OP Test . Companion . get ListItem Children Test Ċ import Ġcom . sil icon labs . ble demo . iop _ test . models . I OP Test . Companion . getS il icon Labs Test Info Ċ import Ġcom . sil icon labs . ble demo . iop _ test . utils . ErrorCode s Ċ import Ġcom . sil icon labs . ble demo . utils . Uuid Consts Ċ import Ġkotlinx . android . synt hetic . main . action bar .* Ċ import Ġkotlinx . android . synt hetic . main . activity _ iop _ test .* Ċ import Ġjava . io .* Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Executors Ċ Ċ @ Suppress Lint (" Log Not Tim ber ") Ċ class ĠI OP Test Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġreconnect Timer : ĠTimer ? Ġ= ĠTimer () ĊĠĠĠ Ġprivate Ġvar Ġhandler : ĠHandler ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbluetooth Le Scanner : ĠBluetooth Le Scanner ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbluetooth Adapter : ĠBluetooth Adapter ĊĊĠĠĠ Ġprivate Ġvar Ġis Sc anning Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Test Running Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Connected Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Test Finished Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġread Scanner StartTime Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġvar Ġm StartTime Scanner : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm StartTime Connection : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm StartTime Discover : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm EndTime Discover : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġm Index Start Children Test Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġm Index Running Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġcount Re Test Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġi op Phase 3 Index Start Children Test Ġ= Ġ- 1 ĊĊĠĠĠ Ġprivate Ġvar Ġtest Parameters Service : ĠBluetooth Gatt Service ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcharacteristic I OP Phase 3 Control : ĠBluetooth GattCharacteristic ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcharacteristic I OP Phase 3 Through put : ĠBluetooth GattCharacteristic ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcharacteristic I OP Phase 3 Client Supported Features : ĠBluetooth GattCharacteristic ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcharacteristic I OP Phase 3 Database Hash : ĠBluetooth GattCharacteristic ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcharacteristic I OP Phase 3 I OP Test Caching : ĠBluetooth GattCharacteristic ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcharacteristic I OP Phase 3 I OP Test Service Changed Indication : ĠBluetooth GattCharacteristic ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcharacteristic I OP Phase 3 Service Changed : ĠBluetooth GattCharacteristic ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcharacteristic I OP Phase 3 Device Name : ĠBluetooth GattCharacteristic ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġm Bluetooth Device : ĠBluetooth Device ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Bluetooth Service : ĠBluetooth Service ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Bluetooth Binding : ĠBluetooth Service . Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Bluetooth Gatt : ĠBluetooth Gatt ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Listener : ĠListener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Bluetooth Enable Dialog : ĠDialog ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġm List Character istics : ĠMutable List < Bluetooth GattCharacteristic > Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġval Ġcharacteristics Phase 3 Security : ĠMutable List < Bluetooth GattCharacteristic > Ġ= ĠArrayList () ĊĊĠĠĠ Ġprivate Ġvar Ġis Disabled Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġmt u Value Ġ= Ġ 2 5 5 ĊĠĠĠ Ġprivate Ġvar Ġm StartTime Through put : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm EndTime Through put : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Byte Num Received Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm PD UL ength Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Byte Speed Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm End Through put Notification Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġo ta Setup : ĠDialog ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġo ta Progress : ĠDialog ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġloading Dialog : ĠDialog ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġbtn O ta Start : ĠButton ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġs iz ename : ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġloading Log : ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġloading Header : ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġloading image : ĠProgress Bar ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠO TA ĠSetup ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġdelay No Response Ġ= Ġ 1 ĊĊĠĠĠ Ġprivate Ġvar Ġreliable Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġbool OTA begin Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġdiscover Timeout Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġo ta _ mode Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġo ta Process Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġdisconnect Gatt Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġhome kit Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġo ta Mode Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġo ta file : ĠByteArray ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġo ta Filename : ĠString Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġupload image : ĠProgress Bar ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġmt u Ġ= Ġ 2 4 7 ĊĠĠĠ Ġprivate Ġvar Ġmt u Div isible Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġis Service Changed Indication Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġvar Ġis Connecting Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġk Bits Ġ= Ġ"% . 2 fk bit / s " ĊĊĠĠĠ Ġprivate Ġvar Ġkit Descriptor : ĠBluetooth Gatt Descriptor ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpack Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġo ta Time : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar ĠprogressBar : ĠProgress Bar ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġchrono : ĠCh ron ometer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġdata Rate : ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġdata Size : ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġfilename : ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsteps : ĠTextView ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġo ta 1 Device Name Ġ= Ġ" I OP ĠTest ĠUpdate " ĊĠĠĠ Ġprivate Ġval Ġo ta 2 Device Name Ġ= Ġ" I OP ĠTest " ĊĠĠĠ Ġprivate Ġvar Ġo ta Device Name : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Device Name : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Device Address : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġi op Phase 3 Database Hash : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar ĠtestCase Count Ġ= Ġ 0 ĊĊĊĠĠĠ Ġprivate Ġval Ġm Bond State Receiver : ĠBroadcast Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġintent . getInt Extra ( Bluetooth Device . EXTRA _ B OND _ STATE , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev State Ġ= Ġintent . getInt Extra ( Bluetooth Device . EXTRA _ PREVIOUS _ B OND _ STATE , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" Bond Ġstate Ġchange : Ġstate Ġ" Ġ+ Ġprint Bond State ( state ) Ġ+ Ġ", Ġprevious Ġstate Ġ" Ġ+ Ġprint Bond State ( prev State ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠBluetooth Device . B OND _ B ON DED Ġ&& Ġprev State Ġ== ĠBluetooth Device . B OND _ B OND ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getS il icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ SECURITY ]. getStatus Test () Ġ== ĠCommon . I OP 3 _ TC _ STATUS _ PROCESS ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ Ġ|| Ġget Sil icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ C ACH ING ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getStatus Test () Ġ== ĠCommon . I OP 3 _ TC _ STATUS _ PROCESS ING */) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Bluetooth Gatt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm List Character istics . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristics Phase 3 Security . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" discover ing Ġservices Ġwith Ġ 1 6 0 0 ms Ġdelay ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" isConnected : Ġ$ isConnected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġm Bluetooth Gatt !!. discover Services () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" discover Services Ġfailed Ġto Ġstart ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry I OP 3 Failed ( m Index Running , Ġ++ count Re Test Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 1 6 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( state Ġ== ĠBluetooth Device . B OND _ B OND ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ I OP Test Activity , ĠR . string . iop _ test _ toast _ bon ding , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprint Bond State ( state : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Device . B OND _ NONE Ġ-> Ġ" B OND _ NONE " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Device . B OND _ B OND ING Ġ-> Ġ" B OND _ B OND ING " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Device . B OND _ B ON DED Ġ-> Ġ" B OND _ B ON DED " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġstate . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġm Pair Request Receiver : ĠBroadcast Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariant Ġ= Ġintent . getInt Extra ( Bluetooth Device . EXTRA _ PAIR ING _ VARIANT , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" Pair ing Ġrequest , Ġvariant : Ġ" Ġ+ Ġprint Variant ( variant ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġmsg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprint Variant ( variant : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( variant Ġ== ĠBluetooth Device . PAIR ING _ VARIANT _ PIN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ I OP Test Activity , ĠR . string . iop _ test _ toast _ press _ pass key , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" PAIR ING _ VARIANT _ PIN " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvariant . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġbluetooth Adapter State ChangeListener : ĠBroadcast Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġintent . action ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġintent . getInt Extra ( Bluetooth Adapter . EXTRA _ STATE , ĠBluetooth Adapter . ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠBluetooth Adapter . ACTION _ STATE _ CHANGED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Bluetooth Adapter . ACTION _ STATE _ CHANGED Ġm Index Running : Ġ$ m Index Running , state : Ġ$ state ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Adapter . STATE _ OFF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect Gatt ( m Bluetooth Gatt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġdata Ġtest Ġfailed Ġby Ġitem ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Data Test Failed ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" update Data Test Failed Ġ$ index ") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ SCAN NER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Le Device ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Sil icon Labs Test Info (). list Item Test [ index ]. setStatus Test ( Common . I OP 3 _ TC _ STATUS _ FAILED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ CONNECTION , ĠPOSITION _ TEST _ DIS COVER _ SERVICE , ĠPOSITION _ TEST _ SERVICE Ġ-> Ġdisconnect Gatt ( m Bluetooth Gatt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġindex Ġuntil Ġget Sil icon Labs Test Info (). list Item Test . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Sil icon Labs Test Info (). list Item Test [ i ]. setStatus Test ( Common . I OP 3 _ TC _ STATUS _ FAILED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ>= ĠPOSITION _ TEST _ SCAN NER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Test Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Test Finished Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Connected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ Ġupdate UI Footer ( is Test Running ) Ġ} ĊĠĠĠĠĠĠĠ Ġm Listener ?. update Ui () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġtest Ġby Ġitem ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart Item Test ( item : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Listener ?. scroll View To Position ( item ) ĊĊĠĠĠĠĠĠĠ Ġm Index Running Ġ= Ġitem ĊĠĠĠĠĠĠĠ Ġis Test Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġis Test Finished Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġis Connecting Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" start Item Test : ĠsetStatus Test ĠPROCESS ING , Ġitem : Ġ$ item ") ĊĠĠĠĠĠĠĠ Ġget Sil icon Labs Test Info (). list Item Test [ item ]. setStatus Test ( Common . I OP 3 _ TC _ STATUS _ PROCESS ING ) ĊĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" start Item Test Ġwith Ġ 1 0 0 0 ms Ġdelay Ġof Ġtest Ġcase ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ SCAN NER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" scan Le Device Ġat ĠPOSITION _ TEST _ SCAN NER ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Device Name Ġ= Ġget Sil icon Labs Test Info (). fw Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Le Device ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ CONNECTION Ġ-> Ġconnect To Device ( m Bluetooth Device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ DIS COVER _ SERVICE Ġ-> Ġm Bluetooth Gatt ?. request M tu ( 2 4 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ SERVICE Ġ-> Ġrun Children TestCase ( m Index Start Children Test ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ I OP 3 _ TH RO UG HP UT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" POSITION _ TEST _ I OP 3 _ TH RO UG HP UT ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Run TestCase Through put ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ I OP 3 _ SECURITY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" POSITION _ TEST _ I OP 3 _ SECURITY ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Index Start Children Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Run TestCase Security ( iop Phase 3 Index Start Children Test , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ I OP 3 _ C ACH ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Service Changed Indication Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Run TestCase Caching ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ I OP 3 _ OTA _ ACK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Index Start Children Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 TestCase OTA ( iop Phase 3 Index Start Children Test ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ I OP 3 _ OTA _ WITHOUT _ ACK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Index Start Children Test Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 TestCase OTA ( iop Phase 3 Index Start Children Test ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 0 ) ĊĊĠĠĠĠĠĠĠ Ġshow Detail Information Test ( testCase Count ++, Ġfalse ) ĊĠĠĠĠĠĠĠ Ġm Listener ?. update Ui () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinish Ġtest Ġby Ġitem ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfinish Item Test ( item : ĠInt , Ġitem TestCase Info : ĠItem TestCase Info ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" finish Item Test , Ġtest Ġitem : Ġ$ item ") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ SCAN NER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem TestCase Info . time Start Ġ= Ġm StartTime Scanner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem TestCase Info . setTime End ( System . currentTimeMillis ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" finish Item Test : Ġscan Le Device ĠstartTime : Ġ" Ġ+ Ġitem TestCase Info . getTime End ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item TestCase Info . getStatus Test () Ġ== ĠCommon . I OP 3 _ TC _ STATUS _ FAILED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Re Test Ġ< Ġ 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem TestCase Info . setStatus Test (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Item Test ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ CONNECTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem TestCase Info . time Start Ġ= Ġm StartTime Connection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem TestCase Info . setTime End ( System . currentTimeMillis ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" finish Item Test : ĠPOSITION _ TEST _ CONNECTION Ġtime Ġ" Ġ+ Ġ( System . currentTimeMillis () Ġ- Ġm StartTime Connection )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item TestCase Info . getStatus Test () Ġ== ĠCommon . I OP 3 _ TC _ STATUS _ FAILED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Re Test Ġ< Ġ 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Connected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem TestCase Info . setStatus Test ( Common . I OP 3 _ TC _ STATUS _ PROCESS ING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ Ġstart Item Test ( item ) Ġ}, Ġ 3 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ DIS COVER _ SERVICE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem TestCase Info . time Start Ġ= Ġm StartTime Discover ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem TestCase Info . setTime End ( m EndTime Discover ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" finish Item Test : ĠPOSITION _ TEST _ DIS COVER _ SERVICE Ġ" Ġ+ Ġ( m EndTime Discover Ġ- Ġm StartTime Discover ) Ġ+ Ġ" ms ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ SERVICE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetItem TestCase Info ( POSITION _ TEST _ SERVICE ). check Status Item Service () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" finish Item Test : ĠPOSITION _ TEST _ SERVICE ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ I OP 3 _ TH RO UG HP UT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthroughput Accept able Ġ= Ġ( m PD UL ength ) Ġ* Ġ 4 Ġ* Ġ 1 0 0 0 Ġ* Ġ 6 5 Ġ/ Ġ 1 5 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem TestCase Info . set Through put Byte Per Sec ( m Byte Speed , Ġthroughput Accept able ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" finish Item Test : ĠPOSITION _ TEST _ I OP 3 _ TH RO UG HP UT Ġm Byte Speed Ġ$ m Byte Speed Ġthroughput Accept able Ġ$ through put Accept able ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ I OP 3 _ SECURITY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetItem TestCase Info ( POSITION _ TEST _ I OP 3 _ SECURITY ). check Status Item Service () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" finish Item Test : ĠPOSITION _ TEST _ I OP 3 _ SECURITY ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Test Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Test Finished Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ I OP 3 _ C ACH ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Test Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Test Finished Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ I OP 3 _ OTA _ ACK , ĠPOSITION _ TEST _ I OP 3 _ OTA _ WITHOUT _ ACK Ġ-> Ġcount Re Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( item Ġ!= ĠPOSITION _ TEST _ I OP 3 _ SECURITY Ġ&& Ġcount Re Test Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Item Test ( item Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ Ġupdate UI Footer ( is Test Running ) Ġ} ĊĠĠĠĠĠĠĠ Ġm Listener ?. update Ui () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrunnable ( g att : ĠBluetooth Gatt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Services Info ( g att ) Ġ// SHOW ĠSERVICES ĊĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġdata Ġtest Ġafter Ġlistening Ġbluetooth Ġg att Ġcallback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Data Test ( character istic : ĠBluetooth GattCharacteristic ?, Ġtype : ĠInt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( character istic Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Children Test : ĠChildren Item Test Info Ġin ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Children Test . character istic ?. uuid . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . status Run Test Ġ= Ġ 1 Ġ// Ġ 0 Ġrunning , Ġ 1 Ġfinish Ġtest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . value M tu Ġ= Ġmt u ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Children Test . character istic ?. uuid . toString () Ġ== ĠCommon UUID . Characteristic . NOTIFICATION _ LENGTH _ 1 . toString () Ġ|| Ġitem Children Test . character istic ?. uuid . toString () Ġ== ĠCommon UUID . Characteristic . IND ICATE _ LENGTH _ 1 . toString () Ġ|| Ġitem Children Test . character istic ?. uuid . toString () Ġ== ĠCommon UUID . Characteristic . NOTIFICATION _ LENGTH _ MT U _ 3 . toString () Ġ|| Ġitem Children Test . character istic ?. uuid . toString () Ġ== ĠCommon UUID . Characteristic . IND ICATE _ LENGTH _ MT U _ 3 . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . endTime Test Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġitem Children Test . status Read Ġ= Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġitem Children Test . status Write Ġ= Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . setData And Compare Result ( character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Children Test : ĠChildren Item Test Info Ġin ĠgetList Children Item TestCase ( POSITION _ TEST _ I OP 3 _ SECURITY ) !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Children Test . character istic ?. uuid . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . status Run Test Ġ= Ġ 1 Ġ// Ġ 0 Ġrunning , Ġ 1 Ġfinish Ġtest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġitem Children Test . status Read Ġ= Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġitem Children Test . status Write Ġ= Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . setData And Compare Result ( character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Index Running Ġ== ĠPOSITION _ TEST _ I OP 3 _ OTA _ ACK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġm Index Running Ġ== ĠPOSITION _ TEST _ I OP 3 _ OTA _ WITHOUT _ ACK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ota Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic I OP Phase 3 Device Name ?. uuid . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Array Ġ= Ġcharacteristic . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Device Name Ġ= ĠString ( name Array , ĠStandard Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" connected Ġto Ġ$ m Device Name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Device Name ?. replace (" Ġ", Ġ""). equals ( ota Device Name ?. replace (" Ġ", Ġ""), Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck I OP 3 OTA ( m Index Running , ĠCommon . I OP 3 _ TC _ STATUS _ PASS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck I OP 3 OTA ( m Index Running , ĠCommon . I OP 3 _ TC _ STATUS _ FAILED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Item Test ( m Index Running , Ġget Sil icon Labs Test Info (). list Item Test [ m Index Running ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( character istic I OP Phase 3 Control ?. uuid . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getS il icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ TH RO UG HP UT ]. getStatus Test () Ġ== ĠCommon . I OP 3 _ TC _ STATUS _ PROCESS ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Run TestCase Through put ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ/* Ġelse Ġif Ġ( getS il icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ C ACH ING ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getStatus Test () Ġ== ĠCommon . I OP 3 _ TC _ STATUS _ PROCESS ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Service Changed Indication Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecurity Item Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ I OP 3 _ SECURITY )! ![ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( security Item . character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( character istic I OP Phase 3 Through put ?. uuid . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Byte Num Received Ġ+= Ġcharacteristic . value . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm PD UL ength Ġ= Ġcharacteristic . value . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m Index Running Ġ== ĠPOSITION _ TEST _ I OP 3 _ C ACH ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Service Changed Indication Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic I OP Phase 3 I OP Test Service Changed Indication Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic I OP Phase 3 I OP Test Service Changed Indication ?. uuid . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Children Test Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ I OP 3 _ C ACH ING )! ![ is Service Changed Indication ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . status Read Ġ= Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . status Run Test Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . setData And Compare Result (( item Children Test . character istic ) !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic I OP Phase 3 Database Hash ?. uuid . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iop Phase 3 Database Hash Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Test Info Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ I OP 3 _ C ACH ING )! ![ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! item Test Info . compare Value Characteristic ( iop Phase 3 Database Hash !! , ĠConverter s . get Hex Value ( character istic . value ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" iop Phase 3 Database Hash Ġhas Ġchanged ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm List Character istics . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristics Phase 3 Security . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Services () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Notification For Characteristic ( character istic I OP Phase 3 Service Changed , ĠNotifications . DISABLED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Database Hash Ġ= ĠConverter s . get Hex Value ( character istic . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" character istic I OP Phase 3 Database Hash : Ġ$ iop Phase 3 Database Hash ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( character istic I OP Phase 3 Client Supported Features ?. uuid . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( character istic I OP Phase 3 Database Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( character istic I OP Phase 3 I OP Test Caching Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic I OP Phase 3 I OP Test Caching ?. uuid . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Children Test Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ I OP 3 _ C ACH ING )! ![ is Service Changed Indication ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . status Read Ġ= Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . status Run Test Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . setData And Compare Result (( item Children Test . character istic ) !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. remove Callbacks ( iop Caching Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Children Test . status Children Test ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetItem TestCase Info ( POSITION _ TEST _ I OP 3 _ C ACH ING ). setStatus Test ( Common . I OP 3 _ TC _ STATUS _ PASS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Item Test ( POSITION _ TEST _ I OP 3 _ C ACH ING , Ġget Sil icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ C ACH ING ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDIS CONNECT S ĠAND ĠCONNECT S ĠWITH ĠTHE ĠSELECT ED ĠDEL AY ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreconnect ( delay to connect : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Bluetooth Device Ġ= Ġm Bluetooth Gatt ?. device ĊĠĠĠĠĠĠĠ Ġif Ġ( m Bluetooth Service ?. is Gatt Connected () !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Service ?. clear Connected Gatt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Service ?. clear Cache () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. disconnect () ĊĠĠĠĠĠĠĠ Ġreconnect Timer ?. schedule ( object Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Binding ?. unbind () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 4 0 0 ) ĊĊĠĠĠĠĠĠĠ Ġreconnect Timer ?. schedule ( object Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" At tempting Ġconnection ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Binding Ġ= Ġobject Ġ: ĠBluetooth Service . Binding ( application Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bound ( service : ĠBluetooth Service ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice ?. is Notification Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt Ġ= Ġm Bluetooth Device ?. connect Gatt ( application Context , Ġfalse , Ġg att Callback , ĠBluetooth Device . TRANSPORT _ LE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Binding ?. bind () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġdelay to connect ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDIS CONNECT ĠG ATT ĠG ENT LY ĠAND ĠC LEAN ĠGLOBAL ĠVARIABLE S ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdisconnect Gatt ( g att : ĠBluetooth Gatt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdisconnect Timer Ġ= ĠTimer () ĊĠĠĠĠĠĠĠ Ġbool OTA begin Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġo ta Process Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġdisconnect Gatt Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( g att Ġ!= Ġnull Ġ&& Ġg att . device Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbt Gatt : ĠBluetooth Gatt Ġ= Ġg att ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect Timer . schedule ( object Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Getting Ġbluetooth Device Ġto ĠFetch UUID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbt Gatt . device ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Device Ġ= Ġbt Gatt . device ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbt Gatt . disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Service ?. clear Connected Gatt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect Timer . schedule ( object Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Device ?. fetch Uuid sWith S dp () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 3 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠC LEAN S ĠUSER ĠINTER FACE ĠAND ĠFIN ISH ĠACT IVITY ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexit ( g att : ĠBluetooth Gatt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġg att ?. close () ĊĠĠĠĠĠĠĠ Ġm Bluetooth Service ?. connected Gatt ?. close () ĊĊĠĠĠĠĠĠĠ Ġm Bluetooth Service ?. clear Cache () ĊĠĠĠĠĠĠĠ Ġm Bluetooth Binding ?. unbind () ĊĠĠĠĠĠĠĠ Ġdisconnect Gatt Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loading Dialog Ġ!= Ġnull Ġ&& Ġloading Dialog ?. is Showing !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Dialog ?. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ota Progress Ġ!= Ġnull Ġ&& Ġo ta Progress ?. is Showing !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Progress ?. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ota Setup Ġ!= Ġnull Ġ&& Ġo ta Setup ?. is Showing !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Setup ?. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconnect To Device ( bluetooth Device : ĠBluetooth Device ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" connect To Device () Ġcalled Ġwith : Ġbluetooth Device Ġ= Ġ$ bluetooth Device ") ĊĠĠĠĠĠĠĠ Ġm StartTime Connection Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" connect To Device (), Ġpost Delayed Ġconnection Runnable ") ĊĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ( connection Runnable , ĠCONNECTION _ PERIOD ) ĊĠĠĠĠĠĠĠ Ġm Bluetooth Binding Ġ= Ġobject Ġ: ĠBluetooth Service . Binding ( application Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bound ( service : ĠBluetooth Service ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Service Ġ= Ġservice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice ?. is Notification Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice ?. connect Gatt ( bluetooth Device !! , Ġfalse , Ġg att Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt Ġ= Ġservice ?. connected Gatt !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Bluetooth Binding ?. bind () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave LogFile () Ġ{ ĊĠĠĠĠĠĠĠ ĠExec utors . new Single Thread Executor (). execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġsave Data Test ToFile ( getPath Of LogFile ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshare Log Data Test By Email ( file . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Test Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġis Test Finished Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreset Function Test () ĊĠĠĠĠĠĠĠ Ġstart Item Test ( POSITION _ TEST _ SCAN NER ) ĊĊĠĠĠĠĠĠĠ Ġupdate UI Footer ( is Test Running ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate ĠUi Ġfooter ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate UI Footer ( isRunning : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn _ start _ and _ stop _ test . text Ġ= ĠgetString ( R . string . button _ run _ test ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn _ start _ and _ stop _ test . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn _ start _ and _ stop _ test . background Tint List Ġ= ĠColor State List . valueOf ( Context Compat . getColor ( this , ĠR . color . sil abs _ blue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Test Finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn _ share _ test . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn _ start _ and _ stop _ test . text Ġ= ĠgetString ( R . string . button _ waiting ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn _ start _ and _ stop _ test . background Tint List Ġ= ĠColor State List . valueOf ( Context Compat . getColor ( this , ĠR . color . sil abs _ inactive _ light )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn _ start _ and _ stop _ test . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn _ share _ test . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShow Ġinformation Ġdevice Ġtest Ġand Ġprogress Ġtest Ġitem ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow Detail Information Test ( item : ĠInt , Ġis Information : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsil icon labs Test Info Ġ= Ġget Sil icon Labs Test Info () ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Information Ġ|| Ġitem Ġ== ĠPOSITION _ TEST _ CONNECTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv _ fw _ name . text Ġ= ĠgetString ( R . string . iop _ test _ label _ fw _ name , Ġsil icon labs Test Info . fw Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv _ device _ name . text Ġ= ĠgetString ( R . string . iop _ test _ label _ device _ name , Ġsil icon labs Test Info . phone Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Ġ= Ġsil icon labs Test Info . total TestCase . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ== ĠPOSITION _ TEST _ SERVICE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtestCase Count Ġ= Ġitem Ġ+ Ġm Index Start Children Test Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" The Ġnumber Ġof Ġtest Ġcase Ġ$ testCase Count ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtv _ progress . text Ġ= ĠgetString ( R . string . iop _ test _ label _ progress _ count _ test , ĠtestCase Count . toString (), Ġtotal ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReset Ġlist Ġitem Ġtest Ġand Ġstart Ġover ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreset Function Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġreliable Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠtestCase Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġm Index Running Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġread Scanner StartTime Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġm StartTime Scanner Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġm StartTime Connection Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġm Byte Num Received Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Connected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. disconnect () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreset Data () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Data Test ( getS il icon Labs Test Info (). fw Name ) ĊĠĠĠĠĠĠĠ Ġm Listener ?. update Ui () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ ĠLog . d (" on Destroy ", Ġ" called ") ĊĠĠĠĠĠĠĠ Ġif Ġ( is Sc anning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Le Device ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" on Destroy ", Ġ" scan Le Device ( false )") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġhandler ?. remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠ Ġreconnect Timer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġhandler Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġm Bluetooth Service ?. clear Connected Gatt () ĊĠĠĠĠĠĠĠ Ġunregister Broadcast Re ceiv ers () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġunregister Broadcast Re ceiv ers () Ġ{ ĊĠĠĠĠĠĠĠ Ġunregister Receiver ( m Bond State Receiver ) ĊĠĠĠĠĠĠĠ Ġunregister Receiver ( m Pair Request Receiver ) ĊĠĠĠĠĠĠĠ Ġunregister Receiver ( bluetooth Adapter State ChangeListener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Listener ( listener : ĠListener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Test Running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Dialog Confirm Stop Test () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect Gatt ( m Bluetooth Gatt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ iop _ test ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . iv _ go _ back ). setOnClickListener Ġ{ Ġon Back Pressed () Ġ} ĊĠĠĠĠĠĠĠ Ġcheck If Bluetooth Is Supported () ĊĊĠĠĠĠĠĠĠ Ġbluetooth Adapter Ġ= ĠBluetooth Adapter . getDefault Adapter () ĊĠĠĠĠĠĠĠ Ġbluetooth Le Scanner Ġ= Ġbluetooth Adapter . bluetooth Le Scanner ĊĠĠĠĠĠĠĠ Ġhandler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĊĠĠĠĠĠĠĠ Ġadd Children View () ĊĠĠĠĠĠĠĠ Ġshow Detail Information Test ( POSITION _ TEST _ SCAN NER , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġcheck Bluetooth Extended Settings () ĊĠĠĠĠĠĠĠ Ġregister Broadcast Re ceiv ers () ĊĠĠĠĠĠĠĠ Ġhandle Click Events () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck If Bluetooth Is Supported () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Bluetooth Adapter . getDefault Adapter () Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠR . string . iop _ test _ toast _ bluetooth _ not _ supported , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Bluetooth Extended Settings () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Adapter . is Le 2 MP hy Supported ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" 2 M ĠPHY Ġsupported !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Adapter . is Le Extended Ad vertising Supported ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" LE ĠExtended ĠAd vertising Ġsupported !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmax Data Length Ġ= Ġbluetooth Adapter . le Maximum Ad vertising Data Length ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" max Data Length Ġ$ max Data Length ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister Broadcast Re ceiv ers () Ġ{ ĊĠĠĠĠĠĠĠ Ġregister Receiver ( m Bond State Receiver , ĠIntent Filter ( Bluetooth Device . ACTION _ B OND _ STATE _ CHANGED )) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( m Pair Request Receiver , ĠIntent Filter ( Bluetooth Device . ACTION _ PAIR ING _ REQUEST )) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( bluetooth Adapter State ChangeListener , ĠIntent Filter ( Bluetooth Adapter . ACTION _ STATE _ CHANGED )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Click Events () Ġ{ ĊĠĠĠĠĠĠĠ Ġbtn _ start _ and _ stop _ test . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Test () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbtn _ share _ test . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave LogFile () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠScan ĠDevice ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġscan Le Device ( enable : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Sc anning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sc anning Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ( scan Runnable , ĠSC AN _ PERIOD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Scanner StartTime Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Scanner ĠF w Ġname : Ġ" Ġ+ Ġget Sil icon Labs Test Info (). fw Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Adapter . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Le Scanner . start Scan ( scan Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Scan Ġhas Ġalready Ġstarted ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Scanner () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. remove Callbacks ( scan Runnable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġscan Runnable : ĠRunnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Sc anning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Scanner () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" scan Runnable Ġupdate Data Test Failed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data Test Failed ( m Index Running ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġconnection Runnable : ĠRunnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" update Data Test Failed Ġconnection Runnable ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ota Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry I OP 3 Failed ( m Index Running , Ġcount Re Test ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop ĠScan Ġdevice ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstop Scanner () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Sc anning Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Adapter . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Le Scanner . stop Scan ( scan Callback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDialog ĠConfirm Ġstop Ġtest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow Dialog Confirm Stop Test () Ġ{ ĊĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( getString ( R . string . iop _ test _ message _ stop _ test )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( getString ( R . string . button _ ok )) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect Gatt ( m Bluetooth Gatt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. set Negative Button ( getString ( R . string . button _ cancel )) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd ĠFragment Ġhave Ġnot Ġyet Ġlist Ġitem Ġtest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Children View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . container , Ġnew Instance (), ĠI OP Test Fragment :: class . java . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. dis allow AddTo Back Stack () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠB LU ETO OTH _ SETTINGS _ REQUEST _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! bluetooth Adapter . isEnabled Ġ&& Ġm Bluetooth Enable Dialog Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Enable Dialog ?. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnable Ġindicate Ġby Ġcharacteristics ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Indication Property ( character istic : ĠBluetooth GattCharacteristic ?, Ġindicate : ĠNotifications ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Notification For Characteristic ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠU uid Consts . CLIENT _ CHARACTER ISTIC _ CONFIG _ DESCRIPTOR , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicate ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnable Ġnotification Ġby Ġcharacteristics ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Notification For Characteristic ( character istic : ĠBluetooth GattCharacteristic ?, Ġnotifications : ĠNotifications ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Notification For Characteristic ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠU uid Consts . CLIENT _ CHARACTER ISTIC _ CONFIG _ DESCRIPTOR , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotifications ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrite Ġdown Ġthe Ġvalue Ġin Ġcharacteristics ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġwrite Value To Characteristic ( character istic : ĠBluetooth GattCharacteristic ?, Ġvalue : ĠString ?, Ġbyte Values : ĠByteArray ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠnewValue : ĠByteArray ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( byte Values Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ= Ġbyte Values ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! TextUtils . isEmpty ( value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ= ĠConverter s . hex To ByteArray ( value !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( isSet Property ( Common . PropertyType . WRITE , Ġcharacteristic !!. properties )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . write Type Ġ= ĠBluetooth GattCharacteristic . WRITE _ TYPE _ DEFAULT ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( isSet Property ( Common . PropertyType . WRITE _ NO _ RESPONSE , Ġcharacteristic . properties )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . write Type Ġ= ĠBluetooth GattCharacteristic . WRITE _ TYPE _ NO _ RESPONSE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcharacteristic . value Ġ= ĠnewValue ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" writeValue To Characteristic Ġ" Ġ+ Ġcharacteristic . uuid . toString ()) ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Bluetooth Gatt !!. write Characteristic ( character istic )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠString . format (" ERROR : Ġwrite Characteristic Ġfailed Ġfor Ġcharacteristic : Ġ% s ", Ġcharacteristic . uuid )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġvalues Ġof Ġwrite Ġcharacteristics ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġwrite Hex For MaxLength Byte ( value : ĠString , Ġlength : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠStringBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġvalues Ġby Ġcharacteristic ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġread Characteristic ( character istic : ĠBluetooth GattCharacteristic ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. read Characteristic ( character istic ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġall Ġservice ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Services Info ( g att : ĠBluetooth Gatt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm EndTime Discover Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġg att Services Ġ= Ġg att . services ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" get Services Info (), ĠServices Ġcount : Ġ" Ġ+ Ġg att Services . size ) ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( g att Service : ĠBluetooth Gatt Service Ġin Ġg att Services ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice UUID Ġ= Ġg att Service . uuid . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" get Services Info (), Ġadd ĠCharacter istic Ġof ĠService UUID Ġ$ service UUID ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( service UUID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Service . UUID _ GENERIC _ ATTRIBUTE . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg att Character istics Ġ= Ġg att Service . character istics ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item : ĠBluetooth GattCharacteristic Ġin Ġg att Character istics ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" m Bluetooth Gatt Service Generic Attribute Ġ" Ġ+ Ġitem . uuid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Characteristic . I OP _ TEST _ PHASE 3 _ SERVICE _ CHANGED . toString () Ġ== Ġitem . uuid . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic I OP Phase 3 Service Changed Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Characteristic . I OP _ TEST _ PHASE 3 _ CLIENT _ SUPPORT _ FEATURES . toString () Ġ== Ġitem . uuid . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic I OP Phase 3 Client Supported Features Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Characteristic . I OP _ TEST _ PHASE 3 _ DATABASE _ HASH . toString () Ġ== Ġitem . uuid . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic I OP Phase 3 Database Hash Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Service . UUID _ GENERIC _ ACCESS . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg att Character istics Ġ= Ġg att Service . character istics ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item : ĠBluetooth GattCharacteristic Ġin Ġg att Character istics ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Common UUID . Characteristic . I OP _ DEVICE _ NAME . toString () Ġ== Ġitem . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" character istic I OP Phase 3 Device Name Ġ" Ġ+ Ġitem . uuid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic I OP Phase 3 Device Name Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Service . TEST _ PARAMETERS . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Parameters Service Ġ= Ġg att Service ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Service . UUID _ PROPERTIES _ SERVICE . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Service . UUID _ CHARACTER ISTICS _ SERVICE . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg att Character istics Ġ= Ġg att Service . character istics ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item : ĠBluetooth GattCharacteristic Ġin Ġg att Character istics ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm List Character istics . add ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Service . UUID _ PHASE 3 _ SERVICE . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" m Bluetooth Gatt Service Phase 3 Ġ" Ġ+ Ġg att Service . uuid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg att Character istics I OP Phase 3 Ġ= Ġg att Service . character istics ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item : ĠBluetooth GattCharacteristic Ġin Ġg att Character istics I OP Phase 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar UUID Ġ= Ġitem . uuid . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( char UUID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Characteristic . I OP _ TEST _ PHASE 3 _ CONTROL . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic I OP Phase 3 Control Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Characteristic . I OP _ TEST _ TH RO UG HP UT . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic I OP Phase 3 Through put Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Characteristic . I OP _ TEST _ G ATT _ CATCH ING . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic I OP Phase 3 I OP Test Caching Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" character istic I OP Phase 3 I OP Test Caching Ġ" Ġ+ Ġcharacteristic I OP Phase 3 I OP Test Caching ?. uuid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Characteristic . I OP _ TEST _ SERVICE _ CHANGED _ IND ICATION . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic I OP Phase 3 I OP Test Service Changed Indication Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" character istic I OP Phase 3 I OP Test Service Changed Indication Ġ" Ġ+ Ġcharacteristic I OP Phase 3 I OP Test Service Changed Indication ?. uuid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Characteristic . I OP _ TEST _ SECURITY _ PAIR ING . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Characteristic . I OP _ TEST _ SECURITY _ AUTHENT ICATION . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Characteristic . I OP _ TEST _ SECURITY _ B OND ING . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" character istics Phase 3 Security Ġ$ char UUID ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristics Phase 3 Security . add ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Service . UUID _ BLE _ OTA . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg att Character istics Ġ= Ġg att Service . character istics ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( g att Characteristic : ĠBluetooth GattCharacteristic Ġin Ġg att Character istics ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacteristic UUID Ġ= Ġg att Characteristic . uuid . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Services Dis covered ĠCharacter istic ĠUUID Ġ" Ġ+ Ġcharacteristic UUID Ġ+ Ġ" Ġ- ĠProperties : Ġ" Ġ+ Ġg att Characteristic . properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g att Characteristic . uuid . toString () Ġ== Ġo ta _ control . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g att Character istics . contains ( m Bluetooth Gatt ?. getService ( ota _ service )?. get Characteristic ( ota _ data ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! g att Services . contains ( m Bluetooth Gatt ?. getService ( home kit _ service ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Services Dis covered ĠDevice Ġin ĠD FU ĠMode ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. request M tu ( 2 4 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Services Dis covered ĠO TA _ Control Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg att Descriptors Ġ= Ġg att Characteristic . descriptors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( g att Descriptor : ĠBluetooth Gatt Descriptor Ġin Ġg att Descriptors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġg att Descriptor . uuid . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g att Descriptor . uuid . toString () Ġ== Ġhome kit _ descriptor . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkit Descriptor Ġ= Ġg att Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" descriptor , ĠUUID : Ġ$ descriptor ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstable Ġ= Ġbyte ArrayOf ( 0 x 0 0 . to Byte (), Ġ 0 x 0 0 . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhome Kit OTA Control ( stable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhome kit Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !!. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġi Ġuntil Ġm List Character istics . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE )! ![ i ]. character istic Ġ= Ġm List Character istics [ j ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin ĠgetList Children Item TestCase ( POSITION _ TEST _ I OP 3 _ SECURITY ) !!. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġi Ġuntil Ġcharacteristics Phase 3 Security . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetList Children Item TestCase ( POSITION _ TEST _ I OP 3 _ SECURITY )! ![ i ]. character istic Ġ= Ġcharacteristics Phase 3 Security [ j ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( m Index Running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ DIS COVER _ SERVICE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Parameters Service ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ Ġread Characteristic ( it . character istics [ 0 ]) Ġ}, Ġ 5 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ I OP 3 _ OTA _ WITHOUT _ ACK , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ I OP 3 _ OTA _ ACK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ota Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" read Ġdevice Ġname ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( character istic I OP Phase 3 Device Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 5 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ I OP 3 _ TH RO UG HP UT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm End Through put Notification Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Item Test ( POSITION _ TEST _ I OP 3 _ TH RO UG HP UT , Ġget Sil icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ TH RO UG HP UT ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ I OP 3 _ SECURITY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Run TestCase Security ( iop Phase 3 Index Start Children Test , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ TEST _ I OP 3 _ C ACH ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic I OP Phase 3 I OP Test Caching Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetList Children Item TestCase ( POSITION _ TEST _ I OP 3 _ C ACH ING )! ![ 0 ]. character istic Ġ= Ġcharacteristic I OP Phase 3 I OP Test Caching ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( character istic I OP Phase 3 I OP Test Caching ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( character istic I OP Phase 3 I OP Test Service Changed Indication Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetList Children Item TestCase ( POSITION _ TEST _ I OP 3 _ C ACH ING )! ![ 1 ]. character istic Ġ= Ġcharacteristic I OP Phase 3 I OP Test Service Changed Indication ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( character istic I OP Phase 3 I OP Test Service Changed Indication ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Parameters ( character istic : ĠBluetooth GattCharacteristic ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( character istic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Characteristic . FIRM WARE _ VERSION . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Sil icon Labs Test Info (). firmware Version Ġ= Ġparse Firmware Version ( character istic . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( test Parameters Service ?. character istics ?. get ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . Characteristic . CONNECTION _ PARAMETERS . toString () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Sil icon Labs Test Info (). iop Board Ġ= ĠI op Board . from Board Code ( character istic . value [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Sil icon Labs Test Info (). connection Parameters Ġ= ĠConnection Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmt u Ġ= ĠConverter s . calculate Decimal Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . value . copyOf Range ( 2 , Ġ 4 ), Ġis BigEndian Ġ= Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp du Ġ= ĠConverter s . calculate Decimal Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . value . copyOf Range ( 4 , Ġ 6 ), Ġis BigEndian Ġ= Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterval Ġ= ĠConverter s . calculate Decimal Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . value . copyOf Range ( 6 , Ġ 8 ), Ġis BigEndian Ġ= Ġfalse ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. times ( 1 . 2 5 ), Ġ// ĠConversion Ġof Ġsent Ġint Ġrepresentation Ġto Ġactual Ġdouble Ġvalue Ġin Ġms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslave Latency Ġ= ĠConverter s . calculate Decimal Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . value . copyOf Range ( 8 , Ġ 1 0 ), Ġis BigEndian Ġ= Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper vision Timeout Ġ= ĠConverter s . calculate Decimal Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic . value . copyOf Range ( 1 0 , Ġ 1 2 ), Ġis BigEndian Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. times ( 1 0 ) Ġ// ĠConversion Ġof Ġsent Ġint Ġrepresentation Ġto Ġactual Ġvalue Ġin Ġms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Index Start Children Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Item Test ( POSITION _ TEST _ DIS COVER _ SERVICE , Ġget Sil icon Labs Test Info (). list Item Test [ POSITION _ TEST _ DIS COVER _ SERVICE ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" convert Values Parameters (), Ġfinish Item Test ( POSITION _ TEST _ DIS COVER _ SERVICE )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Firmware Version ( payload : ĠByteArray ) Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( payload . size Ġ< Ġ 8 ) Ġpayload [ 0 ]. toString () ĊĠĠĠĠĠĠĠ Ġelse ĠStringBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( Converters . calculate Decimal Value ( payload . copyOf Range ( 0 , Ġ 2 ), Ġis BigEndian Ġ= Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (".") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( Converters . calculate Decimal Value ( payload . copyOf Range ( 2 , Ġ 4 ), Ġis BigEndian Ġ= Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (".") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( Converters . calculate Decimal Value ( payload . copyOf Range ( 4 , Ġ 6 ), Ġis BigEndian Ġ= Ġfalse )) ĊĠĠĠĠĠĠĠ Ġ}. toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġlist Ġitem Ġchildren Ġtest Ġby Ġindex Ġtest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetList Children Item TestCase ( index : ĠInt ): ĠList < Children Item Test Info >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget ListItem Children Test ( index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġtime Ġstart Ġand ĠEnd Ġitem Ġnotification Ġand Ġindicate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Time Start ( g att Characteristic : ĠBluetooth GattCharacteristic ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( item : ĠChildren Item Test Info Ġin ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . character istic ?. uuid Ġ== Ġg att Characteristic !!. uuid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . startTime Test Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet ĠPath Ġof Ġlog Ġfile Ġin ĠExternal Storage ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetPath Of LogFile (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġboard Name Ġ= Ġget Sil icon Labs Test Info (). iop Board . ic Name . text ĊĠĠĠĠĠĠĠ Ġval Ġpath File Ġ= Ġget Sil icon Labs Test Info (). phone Name ĊĠĠĠĠĠĠĠ Ġpath File . replace (" Ġ", Ġ"") ĊĠĠĠĠĠĠĠ Ġreturn Ġpath File Ġ+ Ġ"_" Ġ+ Ġboard Name Ġ+ Ġ"_" Ġ+ Ġget Date () Ġ+ Ġ". txt " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSave Ġlog Ġdata Ġinto ĠFile ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsave Data Test ToFile ( path File Of Log : ĠString ?): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġget External Files Dir ( null )?. absolute Path Ġ+ ĠFile . separator Ġ+ ĠF OLDER _ NAME ĊĠĠĠĠĠĠĠ Ġval Ġfolder Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! folder . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfolder . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( folder , Ġpath File Of Log ) ĊĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . createNew File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġf Out : ĠFileOutputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf Out Ġ= ĠFileOutputStream ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmy Out Writer : ĠOutputStream Writer ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Out Writer Ġ= ĠOutputStream Writer ( f Out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Out Writer . write ( getData Log ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġe . localized Message Ġ?: Ġ" save Data Test ToFile (), ĠOutputStream Writer Ġexception ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Out Writer ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf Out . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġe . localized Message Ġ?: Ġ" save Data Test ToFile (), ĠFileOutputStream Ġexception ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf Out ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Exception ", Ġ" File Ġwrite Ġfailed : Ġ$ e ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet ĠDate Ġcurrently ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Date (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSimpleDateFormat (" yyyy _ MM _ dd _ HH _ mm _ ss ", ĠLocale . getDefault ()). format ( Date ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġlog Ġdata Ġby Ġobject ĠSil icon labs Information ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetData Log (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Sil icon Labs Test Info (). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshare Log Data Test By Email ( file Location : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠFile Provider . get Uri For File ( this , Ġapplication Context . packageName Ġ+ Ġ". provider ", ĠFile ( file Location )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ" Please Ġcheck Ġthe Ġattachment Ġto Ġget Ġthe Ġlog Ġfile ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ SEND ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ" text / plain " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ SUBJECT , Ġ"[ Sil abs ] ĠTest Ġlog ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ STREAM , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ TEXT , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Flags ( Intent . FLAG _ GRANT _ READ _ URI _ PERMISSION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Exception Ġin Ġshare Log Data Test By Email (): Ġ$ e ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerform Ġthe Ġtest Ġby Ġitem Ġtest Ġcase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrun Children TestCase ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Detail Information Test ( POSITION _ TEST _ SERVICE , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġval Ġchildren Item Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE )! ![ index ] ĊĠĠĠĠĠĠĠ Ġval Ġuuid s Ġ= ĠCommon UUID . Characteristic . values () ĊĠĠĠĠĠĠĠ Ġval Ġc Uuid Ġ= Ġchildren Item . character istic ?. uuid . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( c Uuid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Item . status Run Test Ġ= Ġ 0 Ġ// Ġ 0 Ġrunning , Ġ 1 Ġfinish Ġtest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Index Start Children Test Ġ<= Ġ 1 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Index Start Children Test Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Children TestCase ( m Index Start Children Test ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġmatch Char Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġuuid s . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Uuid . equals ( uuid s [ i ]. toString (), Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Char Ġ= Ġuuid s [ i ]. id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Run ĠTestCase Ġ[" Ġ+ Ġ( match Char Ġ+ Ġ 3 ) Ġ+ Ġ"] Ġat Ġcharacteristic Ġ" Ġ+ Ġuuid s [ i ]. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( match Char ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . ID _ READ _ ONLY _ LENGTH _ 1 , ĠCommon UUID . ID _ READ _ ONLY _ LENGTH _ 2 5 5 Ġ-> Ġread Characteristic ( children Item . character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . ID _ WRITE _ ONLY _ LENGTH _ 1 , ĠCommon UUID . ID _ WRITE _ WITHOUT _ RESPONSE _ LENGTH _ 1 Ġ-> Ġwrite Value To Characteristic ( children Item . character istic , Ġwrite Hex For MaxLength Byte ( Common . WRITE _ VALUE _ 0 , ĠCommon . WRITE _ LENGTH _ 1 ), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . ID _ WRITE _ ONLY _ LENGTH _ 2 5 5 , ĠCommon UUID . ID _ WRITE _ WITHOUT _ RESPONSE _ LENGTH _ 2 5 5 Ġ-> Ġwrite Value To Characteristic ( children Item . character istic , Ġwrite Hex For MaxLength Byte ( Common . WRITE _ VALUE _ 0 , ĠCommon . WRITE _ LENGTH _ 2 5 5 ), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . ID _ NOTIFICATION _ LENGTH _ 1 , ĠCommon UUID . ID _ NOTIFICATION _ LENGTH _ MT U _ 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Time Start ( children Item . character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Notification For Characteristic ( children Item . character istic , ĠNotifications . NOTIFY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . ID _ IND ICATE _ LENGTH _ 1 , ĠCommon UUID . ID _ IND ICATE _ LENGTH _ MT U _ 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Time Start ( children Item . character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Indication Property ( children Item . character istic , ĠNotifications . IND ICATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . ID _ I OP _ TEST _ LENGTH _ 1 , ĠCommon UUID . ID _ I OP _ TEST _ USER _ LEN _ 1 Ġ-> Ġif Ġ(! children Item . is Write Characteristic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value To Characteristic ( children Item . character istic , Ġwrite Hex For MaxLength Byte ( Common . WRITE _ VALUE _ 5 5 , ĠCommon . WRITE _ LENGTH _ 1 ), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( children Item . character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . ID _ I OP _ TEST _ LENGTH _ 2 5 5 , ĠCommon UUID . ID _ I OP _ TEST _ USER _ LEN _ 2 5 5 Ġ-> Ġif Ġ(! children Item . is Write Characteristic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value To Characteristic ( children Item . character istic , Ġnull , ĠConverter s . dec To ByteArray ( create Data TestCase Length 2 5 5 ( mt u Value ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( children Item . character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . ID _ I OP _ TEST _ LENGTH _ VARIABLE _ 4 , ĠCommon UUID . ID _ I OP _ TEST _ USER _ LEN _ VARIABLE _ 4 Ġ-> ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwrite Ġlength Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( children Item . get Lst Value Item Test (). isEmpty () Ġ&& Ġ! children Item . is Write Characteristic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value To Characteristic ( children Item . character istic , Ġwrite Hex For MaxLength Byte ( Common . WRITE _ VALUE _ 5 5 , ĠCommon . WRITE _ LENGTH _ 1 ), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( children Item . get Lst Value Item Test (). isEmpty () Ġ&& Ġchildren Item . is Write Characteristic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Item . is Write Characteristic Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Item . status Write Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( children Item . character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( children Item . get Lst Value Item Test (). size Ġ== Ġ 1 Ġ&& Ġ! children Item . is Write Characteristic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Item . status Read Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Item . is Read Characteristic Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value To Characteristic ( children Item . character istic , Ġwrite Hex For MaxLength Byte ( Common . WRITE _ VALUE _ 6 6 , ĠCommon . WRITE _ LENGTH _ 4 ), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( children Item . get Lst Value Item Test (). size Ġ== Ġ 1 Ġ&& Ġchildren Item . is Write Characteristic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( children Item . character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . ID _ I OP _ TEST _ CONST _ LENGTH _ 1 Ġ-> Ġif Ġ(! children Item . is Read Characteristic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( children Item . character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value To Characteristic ( children Item . character istic , Ġwrite Hex For MaxLength Byte ( Common . WRITE _ VALUE _ 5 5 , ĠCommon . WRITE _ LENGTH _ 1 ), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . ID _ I OP _ TEST _ CONST _ LENGTH _ 2 5 5 Ġ-> Ġif Ġ(! children Item . is Read Characteristic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( children Item . character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value To Characteristic ( children Item . character istic , Ġnull , ĠConverter s . dec To ByteArray ( create Data TestCase Length 2 5 5 ( mt u Value ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġvalue Ġwrite Ġto Ġcharacteristics ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Data TestCase Length 2 5 5 ( len : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( i ). append (" Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġstatus Ġitem Ġtest Ġand Ġthe Ġnext Ġitem Ġtest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Next TestCase ( character istic : ĠBluetooth GattCharacteristic ?, Ġtype : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( character istic Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Children Test : ĠChildren Item Test Info Ġin ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Children Test . character istic ?. uuid . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . is Read Characteristic Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( type Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . is Write Characteristic Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Common UUID . Characteristic . I OP _ TEST _ LENGTH _ 1 . toString () Ġ== Ġcharacteristic . uuid . toString () Ġ|| ĠCommon UUID . Characteristic . I OP _ TEST _ LENGTH _ 2 5 5 . toString () Ġ== Ġcharacteristic . uuid . toString () Ġ|| ĠCommon UUID . Characteristic . I OP _ TEST _ CONST _ LENGTH _ 1 . toString () Ġ== Ġcharacteristic . uuid . toString () Ġ|| ĠCommon UUID . Characteristic . I OP _ TEST _ CONST _ LENGTH _ 2 5 5 . toString () Ġ== Ġcharacteristic . uuid . toString () Ġ|| ĠCommon UUID . Characteristic . I OP _ TEST _ USER _ LEN _ 1 . toString () Ġ== Ġcharacteristic . uuid . toString () Ġ|| ĠCommon UUID . Characteristic . I OP _ TEST _ USER _ LEN _ 2 5 5 . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Index Start Children Test Ġ= Ġif Ġ( item Children Test . is Read Characteristic Ġ&& Ġitem Children Test . is Write Characteristic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !!. indexOf ( item Children Test ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !!. indexOf ( item Children Test ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Common UUID . Characteristic . NOTIFICATION _ LENGTH _ 1 . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Disabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Index Start Children Test Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !!. indexOf ( item Children Test ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Disabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Children Test . status Children Test ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Index Start Children Test Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !!. indexOf ( item Children Test ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Disabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Re Test Ġ> Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Index Start Children Test Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !!. indexOf ( item Children Test ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Disabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Disabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Notification For Characteristic ( character istic , ĠNotifications . DISABLED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Common UUID . Characteristic . IND ICATE _ LENGTH _ 1 . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Disabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Index Start Children Test Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !!. indexOf ( item Children Test ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Disabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Children Test . status Children Test ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Index Start Children Test Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !!. indexOf ( item Children Test ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Disabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Re Test Ġ> Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Index Start Children Test Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !!. indexOf ( item Children Test ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Disabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Disabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Indication Property ( character istic , ĠNotifications . DISABLED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Common UUID . Characteristic . I OP _ TEST _ LENGTH _ VARIABLE _ 4 . toString () Ġ== Ġcharacteristic . uuid . toString () Ġ|| ĠCommon UUID . Characteristic . I OP _ TEST _ USER _ LEN _ VARIABLE _ 4 . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Children Test . get Lst Value Item Test (). size Ġ> Ġ 1 Ġ&& Ġitem Children Test . is Read Characteristic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Index Start Children Test Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !!. indexOf ( item Children Test ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( Common UUID . Characteristic . I OP _ TEST _ USER _ LEN _ VARIABLE _ 4 . toString () Ġ== Ġcharacteristic . uuid . toString ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Item Test ( POSITION _ TEST _ SERVICE , ĠgetItem TestCase Info ( POSITION _ TEST _ SERVICE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Index Start Children Test Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !!. indexOf ( item Children Test ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Index Start Children Test Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ SERVICE ) !!. indexOf ( item Children Test ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Index Running Ġ== ĠPOSITION _ TEST _ I OP 3 _ SECURITY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Children Test : ĠChildren Item Test Info Ġin ĠgetList Children Item TestCase ( POSITION _ TEST _ I OP 3 _ SECURITY ) !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Children Test . character istic ?. uuid . toString () Ġ== Ġcharacteristic . uuid . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. remove Callbacks ( iop Security Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . is Read Characteristic Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Common UUID . Characteristic . I OP _ TEST _ SECURITY _ B OND ING . toString () Ġ!= Ġ( character istic . uuid . toString ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Index Start Children Test ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" iop Phase 3 Index Start Children Test Ġ$ iop Phase 3 Index Start Children Test ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Detail Information Test ( testCase Count ++, Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Run TestCase Security ( iop Phase 3 Index Start Children Test , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Item Test ( POSITION _ TEST _ I OP 3 _ SECURITY , Ġget Sil icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ SECURITY ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m Index Running Ġ== ĠPOSITION _ TEST _ I OP 3 _ C ACH ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic I OP Phase 3 I OP Test Service Changed Indication Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( character istic I OP Phase 3 I OP Test Service Changed Indication ?. uuid . toString () Ġ== Ġcharacteristic . uuid . toString ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. remove Callbacks ( iop Caching Runnable ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Service Changed Indication Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Detail Information Test ( testCase Count ++, Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Run TestCase Caching ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( m Index Start Children Test Ġ<= Ġ 1 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Children TestCase ( m Index Start Children Test ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġnr T ries Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġfun Ġretry Command ( character istic : ĠBluetooth GattCharacteristic ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnr T ries ++ ĊĠĠĠĠĠĠĠ Ġif Ġ( nr T ries Ġ<= Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" retry Command (), Ġread Ġcharacteristic " Ġ+ Ġcharacteristic . uuid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġvalues Ġfor Ġcontrol Ġcharacteristic ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġi op Phase 3 Write Control Bytes ( through put : ĠInt , Ġsecurity : ĠInt , Ġcaching : ĠInt ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhex Ġ= ĠByteArray ( 3 ) ĊĠĠĠĠĠĠĠ Ġhex [ 0 ] Ġ= Ġthroughput . to Byte () ĊĠĠĠĠĠĠĠ Ġhex [ 1 ] Ġ= Ġsecurity . to Byte () ĊĠĠĠĠĠĠĠ Ġhex [ 2 ] Ġ= Ġcaching . to Byte () ĊĠĠĠĠĠĠĠ Ġreturn Ġhex ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġi op Phase 3 Run TestCase Security ( index : ĠInt , Ġis Control : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġi op Phase 3 Index Start Children Test Ġ= Ġindex ĊĠĠĠĠĠĠĠ Ġis Connecting Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġsecurity Item Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ I OP 3 _ SECURITY )! ![ index ] ĊĠĠĠĠĠĠĠ Ġval Ġc Uuid Ġ= Ġsecurity Item . character istic ?. uuid . toString () ĊĠĠĠĠĠĠĠ Ġval Ġuuid s Ġ= ĠCommon UUID . Characteristic . values () ĊĠĠĠĠĠĠĠ Ġvar Ġmatch Char Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġuuid s . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Uuid . equals ( uuid s [ i ]. toString (), Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Char Ġ= Ġuuid s [ i ]. id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Run ĠTestCase Ġ[ 7 ." Ġ+ Ġ( match Char Ġ- ĠCommon UUID . ID _ I OP _ TEST _ PHASE 3 _ TH RO UG HP UT ) Ġ+ Ġ"] Ġat ĠCharacter istic Ġ" Ġ+ Ġuuid s [ i ]. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( match Char ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . ID _ I OP _ TEST _ PHASE 3 _ SECURITY _ PAIR ING , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . ID _ I OP _ TEST _ PHASE 3 _ SECURITY _ AUTHENT ICATION , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon UUID . ID _ I OP _ TEST _ PHASE 3 _ SECURITY _ B OND ING Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Control Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Re Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ( iop Security Runnable , Ġ 6 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value To Characteristic ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic I OP Phase 3 Control , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Write Control Bytes ( 0 , Ġmatch Char Ġ- ĠCommon UUID . ID _ I OP _ TEST _ PHASE 3 _ CONTROL Ġ- Ġ 1 , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Set ĠControl ĠCharacter istic Ġfor ĠSecurity ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! security Item . is Read Characteristic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Read ĠSecurity ĠCharacter istic Ġ$ c Uuid ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( security Item . character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġi op Phase 3 Run TestCase Through put ( is Control : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Run ĠTestCase Ġ[ 6 ] Ġat ĠCharacter istic Ġ" Ġ+ Ġcharacteristic I OP Phase 3 Through put ?. uuid . toString ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Control Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value To Characteristic ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic I OP Phase 3 Control , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Write Control Bytes ( 1 , Ġ 0 , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Set ĠControl ĠCharacter istic Ġfor ĠThrough put ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" set ĠNotification Ġenable Ġfor ĠThrough put ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm End Through put Notification Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Notification For Characteristic ( character istic I OP Phase 3 Through put , ĠNotifications . NOTIFY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm StartTime Through put Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm EndTime Through put Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Byte Speed Ġ= Ġ(( m Byte Num Received Ġ* Ġ 1 0 0 0 ) Ġ/ Ġ( m EndTime Through put Ġ- Ġm StartTime Through put )). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" set ĠNotification Ġdisable Ġfor Ġthroughput ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Through put Ġis Ġ$ m Byte Speed ĠBytes / sec ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Notification For Characteristic ( character istic I OP Phase 3 Through put , ĠNotifications . DISABLED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error ĠNotification Ġdisable Ġfor Ġthroughput ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm End Through put Notification Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 5 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġi op Phase 3 Run TestCase Caching ( is Control : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Run ĠTestCase Ġ[ 8 ]") ĊĠĠĠĠĠĠĠ Ġval Ġitem Children Test : ĠChildren Item Test Info ĊĠĠĠĠĠĠĠ Ġis Connecting Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( is Control Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Service Changed Indication Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value To Characteristic ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic I OP Phase 3 Control , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Write Control Bytes ( 0 , Ġ 0 , Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Set ĠControl ĠCharacter istic Ġfor ĠService ĠChanged ĠIndic ations ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value To Characteristic ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic I OP Phase 3 Control , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Write Control Bytes ( 0 , Ġ 0 , Ġ 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Set ĠControl ĠCharacter istic Ġfor ĠG ATT ĠC aching ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ I OP 3 _ C ACH ING )! ![ is Service Changed Indication ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . status Run Test Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Children Test . startTime Test Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ( iop Caching Runnable , Ġ 9 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Service Changed Indication Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbon ded Ġ= Ġm Bluetooth Gatt ?. device ?. bond State Ġ== ĠBluetooth Device . B OND _ B ON DED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bon ded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Subscribe ĠIndic ation Ġfor ĠService ĠChanged ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Notification For Characteristic ( character istic I OP Phase 3 Service Changed , ĠNotifications . IND ICATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Connection Ġis Ġnot Ġtrusted , Ġnot Ġbon ded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Caching Failed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. remove Callbacks ( iop Caching Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Set Ġon ĠClient ĠSupported ĠFeatures ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value To Characteristic ( character istic I OP Phase 3 Client Supported Features , Ġ" 0 1 ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġi op Caching Runnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" iop Caching Runnable ") ĊĠĠĠĠĠĠĠ Ġi op Caching Failed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġi op Caching Failed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Children Test Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ I OP 3 _ C ACH ING )! ![ is Service Changed Indication ] ĊĠĠĠĠĠĠĠ Ġitem Children Test . status Run Test Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġitem Children Test . status Children Test Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġitem Children Test . endTime Test Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġget Sil icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ C ACH ING ]. setStatus Test ( Common . I OP 3 _ TC _ STATUS _ FAILED ) ĊĠĠĠĠĠĠĠ Ġfinish Item Test ( POSITION _ TEST _ I OP 3 _ C ACH ING , Ġget Sil icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ C ACH ING ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġretry I OP 3 Failed ( index : ĠInt , Ġm Count Re Test : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== ĠPOSITION _ TEST _ SERVICE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data Test Failed ( index ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( index Ġ== ĠPOSITION _ TEST _ CONNECTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" retry I OP 3 Failed Ġindex Ġ$ index ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ Ġfinish Item Test ( POSITION _ TEST _ CONNECTION , Ġget Sil icon Labs Test Info (). list Item Test [ POSITION _ TEST _ CONNECTION ]) Ġ}, Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Count Re Test Ġ< Ġ 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Connecting Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreconnect ( 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data Test Failed ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck I OP 3 OTA ( index : ĠInt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! ota Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== ĠPOSITION _ TEST _ I OP 3 _ OTA _ ACK Ġ|| Ġindex Ġ== ĠPOSITION _ TEST _ I OP 3 _ OTA _ WITHOUT _ ACK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" check I OP 3 OTA Ġ$ index , ĠsetStatus Run Test Ġfinish Ġtest ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" setStatus Test Ġ$ status ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem TestCase Info Ġ= Ġget Sil icon Labs Test Info (). list Item Test [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem TestCase Info . setStatus Test ( status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġi op Security Runnable : ĠRunnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" iop Security Runnable Ġ$ iop Phase 3 Index Start Children Test ") ĊĠĠĠĠĠĠĠ Ġval Ġitem Children Test Ġ= ĠgetList Children Item TestCase ( POSITION _ TEST _ I OP 3 _ SECURITY )! ![ iop Phase 3 Index Start Children Test ] ĊĠĠĠĠĠĠĠ Ġitem Children Test . status Run Test Ġ= Ġ 1 Ġ// Ġ 0 Ġrunning , Ġ 1 Ġfinish Ġtest ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" iop Security Runnable Ġ$ iop Phase 3 Index Start Children Test , ĠsetStatus Run Test Ġfinish Ġtest ") ĊĠĠĠĠĠĠĠ Ġitem Children Test . status Children Test Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" setStatus Children Test Ġfalse ") ĊĠĠĠĠĠĠĠ Ġval Ġitem TestCase Info Ġ= Ġget Sil icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ SECURITY ] ĊĠĠĠĠĠĠĠ Ġitem TestCase Info . setStatus Test ( Common . I OP 3 _ TC _ STATUS _ FAILED ) ĊĠĠĠĠĠĠĠ Ġupdate Data Test Failed ( POSITION _ TEST _ I OP 3 _ SECURITY ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġi op Phase 3 TestCase OTA ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" iop Phase 3 TestCase OTA Ġ$ index ") ĊĠĠĠĠĠĠĠ Ġo ta Mode Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit O ta Progress () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Loading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo ta OnClick () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. request M tu ( 2 4 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreliable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo ta OnClick () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget O ta Filename (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġboard Ġ= Ġget Sil icon Labs Test Info (). iop Board ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( iop Phase 3 Index Start Children Test Ġ== Ġ 0 ) Ġboard . ota 1 FileName Ġelse Ġboard . ota 2 FileName ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen O ta FileInputStream (): ĠInputStream Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirmware Version Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getS il icon Labs Test Info (). firmware Version Ġ== Ġ" 2 ") Ġ" 3 . 2 . 1 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġget Sil icon Labs Test Info (). firmware Version ĊĠĠĠĠĠĠĠ Ġreturn Ġassets . open (" iop /" Ġ+ Ġfirmware Version Ġ+ Ġ"/" Ġ+ Ġget O ta Filename ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart O ta Process () Ġ{ ĊĠĠĠĠĠĠĠ Ġo ta Filename Ġ= Ġget O ta Filename () ĊĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġopen O ta FileInputStream () ĊĠĠĠĠĠĠĠ Ġo ta file Ġ= ĠByteArray ( inputStream . available ()) ĊĠĠĠĠĠĠĠ ĠinputStream . read ( ota file ) ĊĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo ta _ mode Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Setup ?. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbool OTA begin Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Process Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , ĠO TA _ BEGIN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdf u Mode ( OTA _ BEGIN ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠINITIAL IZ ES ĠO TA ĠPROG RESS ĠDIALOG ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit O ta Progress () Ġ{ ĊĠĠĠĠĠĠĠ Ġo ta Progress Ġ= ĠDialog ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Window Feature ( Window . FEATURE _ NO _ TITLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . iop _ ota _ progress ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . device _ address ). text Ġ= Ġm Bluetooth Gatt ?. device ?. address ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar Ġ= ĠfindViewById ( R . id . ot apro gress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Rate Ġ= ĠfindViewById ( R . id . dat ar ate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Size Ġ= ĠfindViewById ( R . id . datas ize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilename Ġ= ĠfindViewById ( R . id . filename ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsteps Ġ= ĠfindViewById ( R . id . ot ast eps ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchrono Ġ= ĠfindViewById ( R . id . chrono ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn O ta Start Ġ= ĠfindViewById ( R . id . ot ab utton ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs iz ename Ġ= ĠfindViewById ( R . id . s iz ename ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload image Ġ= ĠfindViewById ( R . id . connecting _ spinner ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbtn O ta Start ?. setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Progress ?. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo ta _ mode Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Mode Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdf u Mode (" DIS CONNECTION ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ Ġscan Le Device ( true ) Ġ}, Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠINITIAL IZ ES ĠLO ADING ĠDIALOG ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġloading Dialog Ġ= ĠDialog ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Window Feature ( Window . FEATURE _ NO _ TITLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . loading dialog ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading image Ġ= ĠfindViewById ( R . id . connecting _ spinner ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Log Ġ= ĠfindViewById ( R . id . loading Log ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Header Ġ= ĠfindViewById ( R . id . loading _ header ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSTART ĠO TA ĠBUTTON Ġ( UI , ĠB ools ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġo ta OnClick () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ota _ mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Process Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbool OTA begin Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Process Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbool OTA begin Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading image ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Dialog ?. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart O ta Process () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠO TA ĠSTATE ĠM ACH INE ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġdf u Mode ( step : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( step ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" INIT " Ġ-> Ġdf u Mode ( OTA _ BEGIN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" OT AB E GIN " Ġ-> Ġif Ġ( ota _ mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// START ĠO TA ĠPROCESS Ġ-> Ġg att Callback Ġ-> ĠOn Characteristic Write ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" OTA _ BEGIN ", Ġ" true ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ( WRITE _ OTA _ CONTROL _ ZERO , Ġ 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// PUT ĠDEVICE ĠIN ĠDF UM ODE Ġ-> Ġg att Callback Ġ-> ĠOn Characteristic Write ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( home kit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. read Descriptor ( kit Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" DF U _ MODE ", Ġ" true ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ( WRITE _ OTA _ CONTROL _ ZERO , Ġ 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" OTA UPLOAD " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( OTA _ UPLOAD , Ġ" Called ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Check ĠServices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Bluetooth Gatt Service Ġ= Ġm Bluetooth Gatt ?. getService ( ota _ service ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Bluetooth Gatt Service Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar ac Ġ= Ġm Bluetooth Gatt ?. getService ( ota _ service )?. get Characteristic ( ota _ data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char ac Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar ac . write Type Ġ= ĠBluetooth GattCharacteristic . WRITE _ TYPE _ NO _ RESPONSE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Instance ĠID ", Ġ"" Ġ+ Ġchar ac . instanceId ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdat ath read Ġ= Ġo ta file ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpack Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Set Ġinfo Ġinto ĠUI ĠO TA ĠProgress ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilename ?. text Ġ= Ġo ta Filename ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsteps ?. text Ġ= ĠgetString ( R . string . iop _ test _ label _ 1 _ of _ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs iz ename ?. text Ġ= ĠgetString ( R . string . iop _ test _ n _ bytes , Ġdat ath read ?. size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload image ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Loading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Start ĠO TA _ data ĠUpload Ġin Ġanother Ġthread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo ta Upload Ġ= ĠThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reli able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Write Data Rel iable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhite O ta Data ( dat ath read ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Upload . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" OTA END " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" OTA END ĠCalled ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ Ġwrite O ta Control ( 0 x 0 3 . to Byte ()) Ġ}, Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" DIS CONNECTION " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Process Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbool OTA begin Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect Gatt ( m Bluetooth Gatt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠD FU _ OTA _ UPLOAD : ĠRunnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġdf u Mode ( OTA _ UPLOAD ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSHO WS ĠO TA ĠPROG RESS ĠDIALOG ĠIN ĠUI ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow O ta Progress () Ġ{ ĊĠĠĠĠĠĠĠ Ġo ta Progress ?. show () ĊĠĠĠĠĠĠĠ Ġbtn O ta Start ?. is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġbtn O ta Start ?. set BackgroundColor ( Context Compat . getColor ( this @ I OP Test Activity , ĠR . color . sil abs _ inactive )) ĊĠĠĠĠĠĠĠ Ġo ta Progress ?. set Canceled On Touch Outside ( false ) ĊĠĠĠĠĠĠĠ Ġdf u Mode ( OTA _ BEGIN ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSHO WS ĠO TA ĠSET UP ĠDIALOG ĠIN ĠUI ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġloading Dialog ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Canceled On Touch Outside ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Loading () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCRE ATES ĠBAR ĠPROG RESS ĠAN IM ATION ĠIN ĠLO ADING ĠAND ĠO TA ĠPROG RESS ĠDIALOG ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġanimate Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( upload image Ġ!= Ġnull Ġ&& Ġloading image Ġ!= Ġnull Ġ&& Ġo ta Progress Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload image ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading image ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loading Dialog ?. is Showing !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading image ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ota Progress ?. is Showing !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload image ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUSE D ĠTO ĠC LEAN ĠCACHE ĠAND ĠRED IS COVER ĠSERVICES ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrefresh Services () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Bluetooth Gatt Ġ!= Ġnull Ġ&& Ġm Bluetooth Gatt ?. device Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Device Cache () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. discover Services () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m Bluetooth Service Ġ!= Ġnull Ġ&& Ġm Bluetooth Service ?. connected Gatt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Device Cache () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Service ?. connected Gatt ?. discover Services () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCALL S ĠA ĠMETHOD ĠTO ĠC LEAN ĠDEVICE ĠSERVICES ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrefresh Device Cache (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" refresh Device ĠCalled ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Method Ġ= Ġm Bluetooth Gatt ?. java Class ?. getMethod (" refresh ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Method Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbool : ĠBoolean Ġ= Ġlocal Method . invoke ( m Bluetooth Gatt , Ġ* array Of Null s ( 0 )) Ġas ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" refresh Device Ġbool : Ġ$ bool ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbool ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( local Exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" refresh Device ĠAn Ġexception Ġoccured Ġwhile Ġrefresh ing Ġdevice ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠWRITE _ OTA _ CONTROL _ ZERO : ĠRunnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite O ta Control ( 0 x 0 0 . to Byte ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ( RUN N ABLE ) ĠCHECK S ĠO TA ĠBEGIN ĠBO X ĠAND ĠSTART S ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcheck Begin Runnable : ĠRunnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġchrono ?. base Ġ= ĠSystem Clock . elapsed Realtime () ĊĠĠĠĠĠĠĠ Ġchrono ?. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġonce Again () Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite O ta Control ( 0 x 0 0 . to Byte ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWR ITES ĠBYTE ĠTO ĠO TA ĠCONT ROL ĠCHARACTER ISTIC ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġwrite O ta Control ( ctrl : ĠByte ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . e (" write O ta Control ", Ġ" Called ") ĊĠĠĠĠĠĠĠ Ġif Ġ( m Bluetooth Gatt ?. getService ( ota _ service ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar ac Ġ= Ġm Bluetooth Gatt ?. getService ( ota _ service )?. get Characteristic ( ota _ control ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char ac Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Instance ĠID ", Ġ"" Ġ+ Ġchar ac . instanceId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar ac . write Type Ġ= ĠBluetooth GattCharacteristic . WRITE _ TYPE _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" char ac _ properties ", Ġ"" Ġ+ Ġchar ac . properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrol Ġ= ĠByteArray ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol [ 0 ] Ġ= Ġctrl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar ac . value Ġ= Ġcontrol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. write Characteristic ( char ac ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" character istic Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" service ", Ġ" null ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWR ITES ĠE BL / GB L ĠFILE S ĠTO ĠO TA _ DATA ĠCHARACTER ISTIC ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġo ta Write Data Rel iable () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( pack Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// SET ĠMT U _ div isible Ġby Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġminus Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmt u Div isible Ġ= Ġmt u Ġ- Ġ 3 Ġ- Ġminus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminus ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( mt u Div isible Ġ% Ġ 4 Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwrite array : ĠByteArray ĊĠĠĠĠĠĠĠ Ġval Ġpg ss : ĠFloat ĊĠĠĠĠĠĠĠ Ġif Ġ( pack Ġ+ Ġmt u Div isible Ġ> Ġo ta file !!. size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// SET Ġlast Ġby Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġplus Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Ġ= Ġo ta file !!. size Ġ- Ġpack ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ+= Ġplus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplus ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( last Ġ% Ġ 4 Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite array Ġ= ĠByteArray ( last ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġj Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġpack Ġuntil Ġpack Ġ+ Ġlast ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ota file !!. size Ġ- Ġ 1 Ġ< Ġi ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite array [ j ] Ġ= Ġ 0 xFF . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite array [ j ] Ġ= Ġo ta file ! ![ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpg ss Ġ= Ġ(( pack Ġ+ Ġlast ). toFloat () Ġ/ Ġ( ota file !!. size Ġ- Ġ 1 )) Ġ* Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" char act e ", Ġ" last : Ġ" Ġ+ Ġpack Ġ+ Ġ" Ġ/ Ġ" Ġ+ Ġ( pack Ġ+ Ġlast ) Ġ+ Ġ" Ġ: Ġ" Ġ+ ĠConverter s . get Hex Value ( write array )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġj Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite array Ġ= ĠByteArray ( mt u Div isible ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġpack Ġuntil Ġpack Ġ+ Ġmt u Div isible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite array [ j ] Ġ= Ġo ta file ! ![ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpg ss Ġ= Ġ(( pack Ġ+ Ġmt u Div isible ). toFloat () Ġ/ Ġ( ota file !!. size Ġ- Ġ 1 )) Ġ* Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" char act e ", Ġ" pack : Ġ" Ġ+ Ġpack Ġ+ Ġ" Ġ/ Ġ" Ġ+ Ġ( pack Ġ+ Ġmt u Div isible ) Ġ+ Ġ" Ġ: Ġ" Ġ+ ĠConverter s . get Hex Value ( write array )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġchar ac Ġ= Ġm Bluetooth Gatt ?. getService ( ota _ service )?. get Characteristic ( ota _ data ) ĊĠĠĠĠĠĠĠ Ġchar ac ?. write Type Ġ= ĠBluetooth GattCharacteristic . WRITE _ TYPE _ DEFAULT ĊĠĠĠĠĠĠĠ Ġchar ac ?. value Ġ= Ġwrite array ĊĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. write Characteristic ( char ac ) ĊĠĠĠĠĠĠĠ Ġval Ġwaiting Time Ġ= Ġ( System . currentTimeMillis () Ġ- Ġo ta Time ) ĊĠĠĠĠĠĠĠ Ġval Ġbit rate Ġ= Ġ 8 Ġ* Ġpack . toFloat () Ġ/ Ġwaiting Time ĊĠĠĠĠĠĠĠ Ġif Ġ( pack Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar ?. progress Ġ= Ġpg ss . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdat ar ate Ġ= ĠString . format ( Locale . US , Ġk Bits , Ġbit rate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Rate ?. text Ġ= Ġdat ar ate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Size ?. text Ġ= ĠgetString ( R . string . iop _ test _ n _ percent , Ġpg ss . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhite Ġwith ĠNO ĠRESP ONSE ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġwhite O ta Data ( data Thread : ĠByteArray ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠByteArray ( mt u Ġ- Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠSystem . nano Time () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġj Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġdata Thread !!. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue [ j ] Ġ= Ġdata Thread [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( j Ġ>= Ġmt u Ġ- Ġ 3 Ġ|| Ġi Ġ>= Ġ( data Thread . size Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġwait Ġ= ĠSystem . nano Time () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar ac Ġ= Ġm Bluetooth Gatt ?. getService ( ota _ service )?. get Characteristic ( ota _ data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar ac ?. write Type Ġ= ĠBluetooth GattCharacteristic . WRITE _ TYPE _ NO _ RESPONSE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress Ġ= Ġ(( i Ġ+ Ġ 1 ). toFloat () Ġ/ Ġdata Thread . size ) Ġ* Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbit rate Ġ= Ġ((( i Ġ+ Ġ 1 ) Ġ* Ġ( 8 . 0 )). toFloat () Ġ/ Ġ((( wait Ġ- Ġstart ) Ġ/ Ġ 1 0 0 0 0 0 0 . 0 ). toFloat ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( j Ġ< Ġmt u Ġ- Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠByteArray ( j ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( value , Ġ 0 , Ġend , Ġ 0 , Ġj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Progress ", Ġ" sent Ġ" Ġ+ Ġ( i Ġ+ Ġ 1 ) Ġ+ Ġ" Ġ/ Ġ" Ġ+ Ġdata Thread . size Ġ+ Ġ" Ġ- Ġ" Ġ+ ĠString . format ("% . 1 f ", Ġprogress ) Ġ+ Ġ" Ġ% Ġ- Ġ" Ġ+ ĠString . format ( k Bits , Ġbit rate ) Ġ+ Ġ" Ġ- Ġ" Ġ+ ĠConverter s . get Hex Value ( end )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Size ?. text Ġ= ĠgetString ( R . string . iop _ test _ n _ percent , Ġprogress . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar ?. progress Ġ= Ġprogress . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar ac ?. value Ġ= Ġend ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Progress ", Ġ" sent Ġ" Ġ+ Ġ( i Ġ+ Ġ 1 ) Ġ+ Ġ" Ġ/ Ġ" Ġ+ Ġdata Thread . size Ġ+ Ġ" Ġ- Ġ" Ġ+ ĠString . format ("% . 1 f ", Ġprogress ) Ġ+ Ġ" Ġ% Ġ- Ġ" Ġ+ ĠString . format ( k Bits , Ġbit rate ) Ġ+ Ġ" Ġ- Ġ" Ġ+ ĠConverter s . get Hex Value ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Size ?. text Ġ= ĠgetString ( R . string . iop _ test _ n _ percent , Ġprogress . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar ?. progress Ġ= Ġprogress . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar ac ?. value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Bluetooth Gatt !!. write Characteristic ( char ac )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdat ar ate Ġ= ĠString . format ( Locale . US , Ġk Bits , Ġbit rate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Rate ?. text Ġ= Ġdat ar ate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(( System . nano Time () Ġ- Ġwait ) Ġ/ Ġ 1 0 0 0 0 0 0 . 0 Ġ< Ġdelay No Response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(( System . nano Time () Ġ- Ġwait ) Ġ/ Ġ 1 0 0 0 0 0 0 . 0 Ġ< Ġdelay No Response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Ġ= ĠSystem . nano Time () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdat ar ate Ġ= ĠString . format ( Locale . US , Ġk Bits , Ġbit rate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Rate ?. text Ġ= Ġdat ar ate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! m Bluetooth Gatt !!. write Characteristic ( char ac )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchrono ?. stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload image ?. clear Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload image ?. visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġ( end Ġ- Ġstart ) Ġ/ Ġ 1 0 0 0 L . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" OTA ĠTime Ġ- Ġ", Ġ"" Ġ+ Ġtime Ġ+ Ġ" s ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdf u Mode ( OTA _ END ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWR ITES ĠO TA ĠCONT ROL ĠFOR ĠHOME KIT ĠDE VICES ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhome Kit OTA Control ( instance ID : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// WRITE ĠCHARACTER ISTIC ĠFOR ĠHOME KIT ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġbyte ArrayOf ( 0 x 0 0 , Ġ 0 x 0 2 , Ġ 0 xee . to Byte (), Ġinstance ID [ 0 ], Ġinstance ID [ 1 ], Ġ 0 x 0 3 , Ġ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 1 , Ġ 0 x 0 1 ) ĊĠĠĠĠĠĠĠ Ġwrite Generic Characteristic ( ota _ service , Ġo ta _ control , Ġvalue ) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" character istic Ġwrit ting : Ġ" Ġ+ ĠConverter s . get Hex Value ( value )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWR ITES ĠBYTE ĠARRAY ĠTO ĠA ĠGENER IC ĠCHARACTER ISTIC ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġwrite Generic Characteristic ( service : ĠUUID ?, Ġcharacteristic : ĠUUID ?, Ġvalue : ĠByteArray ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Bluetooth Gatt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbluetooth GattCharacteristic Ġ= Ġm Bluetooth Gatt ?. getService ( service )?. get Characteristic ( character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" character istic Ġexists ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bluetooth GattCharacteristic Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth GattCharacteristic . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth GattCharacteristic . write Type Ġ= ĠBluetooth GattCharacteristic . WRITE _ TYPE _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. write Characteristic ( bluetooth GattCharacteristic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" character istic Ġwritten ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" character istic Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" bluetooth Gatt ", Ġ" null ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġg att Callback : ĠTimeout Gatt Callback Ġ= Ġobject Ġ: ĠTimeout Gatt Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Timeout () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Timeout () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" update Data Test Failed Ġon Timeout () ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data Test Failed ( m Index Running ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connection StateChange ( g att : ĠBluetooth Gatt , Ġstatus : ĠInt , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Bluetooth Gatt ?. device ?. address Ġ!= Ġg att . device . address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Connection StateChange ( g att , Ġstatus , ĠnewState ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Connection StateChange Ġstatus Ġ$ status Ġ- ĠnewState Ġ$ newState ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( newState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . STATE _ CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. remove Callbacks ( connection Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Connected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Test Finished Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getS il icon Labs Test Info (). list Item Test [ POSITION _ TEST _ CONNECTION ]. getStatus Test () Ġ== ĠCommon . I OP 3 _ TC _ STATUS _ PROCESS ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Connection StateChange ĠPOSITION _ TEST _ CONNECTION ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Item Test ( POSITION _ TEST _ CONNECTION , Ġget Sil icon Labs Test Info (). list Item Test [ POSITION _ TEST _ CONNECTION ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ota Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Connection StateChange Ġconnected Ġm Index Running Ġ$ m Index Running ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. request M tu ( 2 4 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// After ĠO TA Ġprocess Ġstarted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// get Ġinformation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Device : Ġ" Ġ+ Ġg att . device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Device ĠName : Ġ" Ġ+ Ġg att . device . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g att . services . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt Ġ= Ġnull Ġ// It 's Ġgoing Ġto Ġbe Ġequal Ġg att Ġin ĠDis cover ĠServices ĠCallback ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Connected , Ġstart ĠServices ĠDiscovery : Ġ" Ġ+ Ġg att . discover Services ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 2 5 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscover Timeout Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimeout Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( discover Timeout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect Gatt ( g att ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( base Context , Ġ" DIS COVER ĠSERVICES ĠTIME OUT ", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 2 5 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread ( timeout ). start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . STATE _ DIS CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Disconnected ĠI OP ĠTest Ġdevice : Ġ" Ġ+ ĠSystem . currentTimeMillis ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Connected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscover Timeout Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit ( m Bluetooth Gatt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= Ġ 0 Ġ&& Ġo ta Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== Ġ 1 3 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// reconnect Ġafter Ġ 3 0 Ġseconds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Connection StateChange ĠO TA Ġstatus Ġ$ status ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry I OP 3 Failed ( m Index Running , Ġcount Re Test ++) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 3 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ota Process Ġ&& Ġ! is Test Finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Connection StateChange Ġo ta _ process Ġ$ ota Process , is Connecting Ġ$ is Connecting ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Index Running Ġ> ĠPOSITION _ TEST _ I OP 3 _ OTA _ WITHOUT _ ACK Ġ|| Ġm Index Running Ġ< ĠPOSITION _ TEST _ I OP 3 _ OTA _ ACK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Connecting ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Connecting Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Connection StateChange Ġre - connecting ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry I OP 3 Failed ( m Index Running , Ġcount Re Test ++) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 5 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== Ġ 1 3 3 Ġ|| Ġstatus Ġ== Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Connecting ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Connecting Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Connection StateChange Ġstatus : Ġ$ status ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry I OP 3 Failed ( m Index Running , Ġcount Re Test ++) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 3 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== Ġ 1 3 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Connection StateChange ĠO TA Ġstatus : Ġ$ status ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry I OP 3 Failed ( m Index Running , Ġcount Re Test ++) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 3 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( disconnect Gatt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit ( g att ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ota Setup Ġ!= Ġnull Ġ&& Ġo ta Setup ?. is Showing !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit ( g att ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g att . services . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit ( g att ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! bool OTA begin Ġ&& Ġ! ota Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit ( g att ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Gatt . STATE _ CONNECT ING Ġ-> ĠLog . d ( TAG , Ġ" on Connection StateChange ĠConnect ing ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Services Dis covered ( g att : ĠBluetooth Gatt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Services Dis covered ( g att , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Services Dis covered (), Ġstatus Ġ" Ġ+ ĠInteger . to HexString ( status )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Bluetooth Gatt Ġ!= Ġg att ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt Ġ= Ġg att ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Services () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscover Timeout Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( base Context , ĠError Codes . getError Name ( status ), ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data Test Failed ( m Index Running ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect Gatt ( g att ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunnable ( g att ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo ta Service Check Ġ= Ġg att . getService ( ota _ service ) Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ota Service Check ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo ta Data Check Ġ= Ġg att . getService ( ota _ service ). get Characteristic ( ota _ data ) Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ota Data Check ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhome Kit Check Ġ= Ġg att . getService ( home kit _ service ) Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! home Kit Check ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo ta _ mode Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bool OTA begin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġonce Again () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// IF ĠD FU _ MODE , ĠLA UNCH ĠO TA ĠSET UP ĠA UT OM AT IC ALLY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ota _ mode Ġ&& Ġbool OTA begin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading image ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Dialog ?. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit O ta Progress () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow O ta Progress () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Characteristic Read ( g att : ĠBluetooth Gatt , Ġcharacteristic : ĠBluetooth GattCharacteristic , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Characteristic Read ( g att , Ġcharacteristic , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Characteristic Read : Ġ" Ġ+ Ġcharacteristic . uuid . toString () Ġ+ Ġ" Ġstatus Ġ" Ġ+ Ġstatus ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic . service . uuid . toString () Ġ== ĠCommon UUID . Service . TEST _ PARAMETERS . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Parameters ( character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Characteristic Read Ġconvert Test Parameters ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnr T ries Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Characteristic Read Ġretry Command ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry Command ( character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== Ġ 1 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Index Running Ġ== ĠPOSITION _ TEST _ I OP 3 _ C ACH ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Service Changed Indication Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Characteristic ( character istic I OP Phase 3 Database Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data Test ( character istic , Ġ 0 , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Next TestCase ( character istic , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtype Ġ 1 : ĠCharacter istic Read , Ġ 2 : Characteristic Write ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Bluetooth Gatt ?. getService ( ota _ service ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic Ġ=== Ġm Bluetooth Gatt ?. getService ( ota _ service )?. get Characteristic ( ota _ control )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġcharacteristic . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value [ 2 ] Ġ== Ġ 0 x 0 5 . to Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" home kit _ descriptor ", Ġ" In secure ĠConnection ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ I OP Test Activity , Ġ" Error : ĠNot Ġa ĠHome kit ĠSecure ĠConnection ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( value [ 2 ] Ġ== Ġ 0 x 0 4 . to Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" home kit _ descriptor ", Ġ" Wrong ĠAddress ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( value [ 2 ] Ġ== Ġ 0 x 0 0 . to Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" home kit _ descriptor ", Ġ" Enter ing Ġin ĠD FU _ Mode ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ota _ mode Ġ&& Ġo ta Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( OTA _ UPLOAD , Ġ" Sent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. remove Callbacks ( DF U _ OTA _ UPLOAD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ( DF U _ OTA _ UPLOAD , Ġ 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! ota _ mode Ġ&& Ġo ta Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Log ?. text Ġ= ĠgetString ( R . string . iop _ test _ label _ reset ting ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Loading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Loading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreconnect ( 4 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Characteristic Write ( g att : ĠBluetooth Gatt , Ġcharacteristic : ĠBluetooth GattCharacteristic , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Characteristic Write ( g att , Ġcharacteristic , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Characteristic Write : Ġ" Ġ+ Ġcharacteristic . uuid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Characteristic Write : Ġ$ status ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ota Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data Test ( character istic , Ġ 1 , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Next TestCase ( character istic , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic . uuid Ġ== Ġo ta _ control ) Ġ{ Ġ// OTA ĠControl ĠCallback ĠHandling ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic . value . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic . value [ 0 ] Ġ== Ġ 0 x 0 0 . to Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Callback ", Ġ" Control Ġ" Ġ+ ĠConverter s . get Hex Value ( character istic . value ) Ġ+ Ġ" status : Ġ" Ġ+ Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ota _ mode Ġ&& Ġo ta Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( OTA _ UPLOAD , Ġ" Sent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread ( check Begin Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. remove Callbacks ( DF U _ OTA _ UPLOAD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ( DF U _ OTA _ UPLOAD , Ġ 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! ota _ mode Ġ&& Ġo ta Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Log ?. text Ġ= ĠgetString ( R . string . iop _ test _ label _ reset ting ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Loading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Loading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreconnect ( 4 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic . value [ 0 ] Ġ== Ġ 0 x 0 3 . to Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ota Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Callback ", Ġ" Control Ġ" Ġ+ ĠConverter s . get Hex Value ( character istic . value ) Ġ+ Ġ" status : Ġ" Ġ+ Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn O ta Start ?. set BackgroundColor ( Context Compat . getColor ( this @ I OP Test Activity , ĠR . color . sil abs _ red )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn O ta Start ?. is Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn O ta Start ?. call OnClick () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbool OTA begin Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" OTA _ Control ", Ġ" Received : Ġ" Ġ+ ĠConverter s . get Hex Value ( character istic . value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic . value [ 0 ]. toInt () Ġ== Ġ 0 x 0 0 Ġ&& Ġcharacteristic . value [ 1 ]. toInt () Ġ== Ġ 0 x 0 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" Home Kit ", Ġ" Reading ĠO TA _ Control ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. read Characteristic ( character istic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character istic . uuid Ġ== Ġo ta _ data ) Ġ{ ĠĠ Ġ// OTA ĠData ĠCallback ĠHandling ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reli able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ota Progress ?. is Showing !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpack Ġ+= Ġmt u Div isible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pack Ġ<= Ġo ta file ?. size !! Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Write Data Rel iable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( pack Ġ> Ġo ta file ?. size !! Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchrono ?. stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload image ?. clear Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload image ?. visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdf u Mode ( OTA _ END ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Characteristic Changed ( g att : ĠBluetooth Gatt , Ġcharacteristic : ĠBluetooth GattCharacteristic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Characteristic Changed ( g att , Ġcharacteristic ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Characteristic Changed : Ġ" Ġ+ Ġcharacteristic . uuid . toString () Ġ+ Ġ" Ġlen :" Ġ+ Ġcharacteristic . value . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data Test ( character istic , Ġ- 1 , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Next TestCase ( character istic , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtype Ġ 1 : ĠCharacter istic Read , Ġ 2 : Characteristic Write , Ġ 0 : Notify ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Descriptor Read ( g att : ĠBluetooth Gatt , Ġdescriptor : ĠBluetooth Gatt Descriptor , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Descriptor Read ( g att , Ġdescriptor , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Descriptor Read Ġm Index Start Children Test : Ġ$ m Index Start Children Test ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor . uuid . toString () Ġ== Ġhome kit _ descriptor . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠByteArray ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue [ 0 ] Ġ= Ġ 0 xF 2 . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue [ 1 ] Ġ= Ġ 0 xFF . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor . value [ 0 ] Ġ== Ġvalue [ 0 ] Ġ&& Ġdescriptor . value [ 1 ] Ġ== Ġvalue [ 1 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" descriptor ", Ġ" getValue Ġ" Ġ+ ĠConverter s . get Hex Value ( descriptor . value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Descriptor Write ( g att : ĠBluetooth Gatt , Ġdescriptor : ĠBluetooth Gatt Descriptor , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Descriptor Write ( g att , Ġdescriptor , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Descriptor Write Ġstatus Ġ$ status ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Index Start Children Test Ġ<= Ġ 1 7 Ġ&& Ġis Disabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Descriptor Write Ġm Index Start Children Test : Ġ$ m Index Start Children Test ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Children TestCase ( m Index Start Children Test ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m End Through put Notification ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm End Through put Notification Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Item Test ( POSITION _ TEST _ I OP 3 _ TH RO UG HP UT , Ġget Sil icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ TH RO UG HP UT ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* } Ġelse Ġif Ġ( getS il icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ C ACH ING ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getStatus Test () Ġ== ĠCommon . I OP 3 _ TC _ STATUS _ PROCESS ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi op Phase 3 Run TestCase Caching ( 1 ) Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" do Ġnothing ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Rel iable Write Completed ( g att : ĠBluetooth Gatt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Rel iable Write Completed ( g att , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Rel iable Write Completed : Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon M tu Changed ( g att : ĠBluetooth Gatt , Ġmt u : ĠInt , Ġstatus : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on M tu Changed ( g att , Ġmt u , Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on M tu Changed : Ġ$ mt u ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ I OP Test Activity . mt u Ġ= Ġmt u ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm StartTime Discover Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" set Preferred Phy Ġ 1 M ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. set Preferred Phy ( Bluetooth Device . PHY _ LE _ 1 M _ MASK , ĠBluetooth Device . PHY _ LE _ 1 M _ MASK , ĠBluetooth Device . PHY _ OPTION _ NO _ PREFERRED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Index Running Ġ== ĠPOSITION _ TEST _ DIS COVER _ SERVICE Ġ|| Ġm Index Running Ġ== ĠPOSITION _ TEST _ I OP 3 _ TH RO UG HP UT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm List Character istics . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristics Phase 3 Security . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic I OP Phase 3 Control Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Services () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(( m Index Running Ġ== ĠPOSITION _ TEST _ I OP 3 _ OTA _ WITHOUT _ ACK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġm Index Running Ġ== ĠPOSITION _ TEST _ I OP 3 _ OTA _ ACK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! ota Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" redis cover ĠO TA ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm List Character istics . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristics Phase 3 Security . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic I OP Phase 3 Control Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Services () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 5 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ota Process ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Gatt ?. request Connection Priority ( Bluetooth Gatt . CONNECTION _ PRIORITY _ HIGH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġscan Callback : ĠScan Callback Ġ= Ġobject Ġ: ĠScan Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scan Result ( callback Type : ĠInt , Ġresult : ĠScan Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scan Result ( callback Type , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġresult . device ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( read Scanner StartTime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Scanner StartTime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Scanner StartTime Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm StartTime Scanner Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" scan Le Device ", Ġ" startTime : Ġ$ m StartTime Scanner ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Scanner Ġdevice Ġname : Ġ" Ġ+ Ġdevice . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Scanner Ġdevice Ġaddress : Ġ" Ġ+ Ġdevice . address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getS il icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ OTA _ ACK ]. getStatus Test () Ġ== ĠCommon . I OP 3 _ TC _ STATUS _ PROCESS ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġget Sil icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ OTA _ WITHOUT _ ACK ]. getStatus Test () Ġ== ĠCommon . I OP 3 _ TC _ STATUS _ PROCESS ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo ta Device Name Ġ= Ġif Ġ( m Index Running Ġ== ĠPOSITION _ TEST _ I OP 3 _ OTA _ ACK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo ta 1 Device Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo ta 2 Device Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device . address Ġ== Ġm Device Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Scanner , ĠO TA ĠI OP Ġtest Ġdevice : Ġ" Ġ+ Ġdevice . address Ġ+ Ġ", Ġdevice Ġname : Ġ" Ġ+ Ġdevice . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Device Ġ= Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Le Device ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sc anning Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. remove Callbacks ( scan Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnect To Device ( m Bluetooth Device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 5 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Device Name Ġ= Ġdevice . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" connect Ġto Ġ" Ġ+ Ġdevice . address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( device . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( device . name . replace (" Ġ", Ġ""). equals ( getS il icon Labs Test Info (). fw Name . replace (" Ġ", Ġ""), Ġignore Case Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġdevice . name . replace (" Ġ", Ġ""). equals ( ota Device Name !!. replace (" Ġ", Ġ""), Ġignore Case Ġ= Ġtrue ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getS il icon Labs Test Info (). list Item Test [ POSITION _ TEST _ SCAN NER ]. getStatus Test () Ġ== ĠCommon . I OP 3 _ TC _ STATUS _ PASS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device . address Ġ!= Ġm Device Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Device Ġ= Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Sil icon Labs Test Info (). fw Name Ġ= Ġdevice . name . trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Scanner , ĠI OP Ġtest Ġdevice : Ġ" Ġ+ Ġdevice . address Ġ+ Ġ", Ġdevice Ġname : Ġ" Ġ+ Ġdevice . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Le Device ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getS il icon Labs Test Info (). list Item Test [ POSITION _ TEST _ SCAN NER ]. getStatus Test () Ġ== ĠCommon . I OP 3 _ TC _ STATUS _ PROCESS ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Device Address Ġ= Ġdevice . address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Device Name Ġ= Ġdevice . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Item Test ( POSITION _ TEST _ SCAN NER , Ġget Sil icon Labs Test Info (). list Item Test [ POSITION _ TEST _ SCAN NER ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( getS il icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ SECURITY ]. getStatus Test () Ġ== ĠCommon . I OP 3 _ TC _ STATUS _ PROCESS ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* || Ġget Sil icon Labs Test Info (). list Item Test [ POSITION _ TEST _ I OP 3 _ C ACH ING ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getStatus Test () Ġ== ĠCommon . I OP 3 _ TC _ STATUS _ PROCESS ING */) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanufacturer Ġ= ĠBuild . MAN U FACT UR ER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" manufacturer : Ġ$ manufacturer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Index Running Ġ== ĠPOSITION _ TEST _ I OP 3 _ SECURITY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnect To Device ( m Bluetooth Device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m Index Running Ġ== ĠPOSITION _ TEST _ I OP 3 _ C ACH ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnect To Device ( m Bluetooth Device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Sc anning Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ?. remove Callbacks ( scan Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠListener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġupdate Ui () ĊĠĠĠĠĠĠĠ Ġfun Ġscroll View To Position ( position : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠF OLDER _ NAME Ġ= Ġ" Sil icon Labs _ App " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" I OP Test " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġo ta _ service Ġ= ĠUUID . fromString (" 1 d 1 4 d 6 ee - fd 6 3 - 4 fa 1 - bfa 4 - 8 f 4 7 b 4 2 1 1 9 f 0 ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġo ta _ data Ġ= ĠUUID . fromString (" 9 8 4 2 2 7 f 3 - 3 4 fc - 4 0 4 5 - a 5 d 0 - 2 c 5 8 1 f 8 1 a 1 5 3 ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġo ta _ control Ġ= ĠUUID . fromString (" f 7 bf 3 5 6 4 - fb 6 d - 4 e 5 3 - 8 8 a 4 - 5 e 3 7 e 0 3 2 6 0 6 3 ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhome kit _ descriptor Ġ= ĠUUID . fromString (" dc 4 6 f 0 fe - 8 1 d 2 - 4 6 1 6 - b 5 d 9 - 6 ab dd 7 9 6 9 3 9 a ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhome kit _ service Ġ= ĠUUID . fromString (" 0 0 0 0 0 0 3 e - 0 0 0 0 - 1 0 0 0 - 8 0 0 0 - 0 0 2 6 bb 7 6 5 2 9 1 ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠO TA _ BEGIN Ġ= Ġ" OT AB E GIN " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠO TA _ UPLOAD Ġ= Ġ" OTA UPLOAD " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠO TA _ END Ġ= Ġ" OTA END " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPOSITION _ TEST _ SCAN NER Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPOSITION _ TEST _ CONNECTION Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPOSITION _ TEST _ DIS COVER _ SERVICE Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPOSITION _ TEST _ SERVICE Ġ= Ġ 3 ĊĊĠĠĠĠĠĠĠ Ġ/* ĠAdd ĠIo P ĠTest Ġfor ĠP 3 Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPOSITION _ TEST _ I OP 3 _ TH RO UG HP UT Ġ= Ġ 6 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPOSITION _ TEST _ I OP 3 _ SECURITY Ġ= Ġ 7 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPOSITION _ TEST _ I OP 3 _ C ACH ING Ġ= Ġ 8 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPOSITION _ TEST _ I OP 3 _ OTA _ ACK Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPOSITION _ TEST _ I OP 3 _ OTA _ WITHOUT _ ACK Ġ= Ġ 5 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSC AN _ PERIOD : ĠLong Ġ= Ġ 1 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCONNECTION _ PERIOD : ĠLong Ġ= Ġ 1 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠB LU ETO OTH _ SETTINGS _ REQUEST _ CODE Ġ= Ġ 1 0 0 ĊĊĠĠĠĠĠĠĠ Ġfun ĠstartActivity ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠI OP Test Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( context , Ġintent , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ