package Ġfs iles . name . qs relay . feature Ċ Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . AsyncTask Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Switch Ċ import Ġandroid . widget . Toast Ċ import Ġfs iles . name . qs relay . feature . store . Device Data Ċ import Ġfs iles . name . qs relay . feature . store . Relay Data Ċ import Ġfs iles . name . qs relay . feature . store . Store Utils Ċ import Ġfs iles . name . qs relay . feature . utils . Rel ays Utils Ċ import Ġkotlinx . android . synt hetic . main . control _ layout .* ĊĊ Ċ class ĠControl Activity : ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġrelay Array Ġ= Ġarray ListOf < Switch >() ĊĠĠĠ Ġprivate Ġvar Ġrelay State Ġ= Ġarray ListOf < Boolean >() ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Bluetooth Adapter Ġ= ĠBluetooth Adapter . getDefault Adapter () !! ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Address : ĠString ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCAN NOT _ SEND _ COMMAND _ TO _ DEVICE _ MESSAGE Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can Ġnot Ġsend Ġall Ġdata Ġto Ġselected Ġdevice . ĠConnection Ġproblem " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCAN NOT _ SEND _ COMMAND _ TO _ DEVICE _ DURATION Ġ= ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCAN NOT _ CONNECT _ TO _ DEVICE _ MESSAGE Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can Ġnot Ġconnect Ġto Ġselected Ġdevice . ĠIs ĠOn ?" ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCAN NOT _ CONNECT _ TO _ DEVICE _ DURATION Ġ= ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCAN NOT _ SAVE _ TO _ STORE _ MESSAGE Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can Ġnot Ġsave Ġto Ġstore . ĠAndroid Ġproblem ?" ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCAN NOT _ SAVE _ TO _ STORE _ DURATION Ġ= ĠToast . LENGTH _ LONG ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . control _ layout ) ĊĠĠĠĠĠĠĠ Ġm Address Ġ= Ġintent . getString Extra ( MainActivity . EXTRA _ ADDRESS ) ĊĠĠĠĠĠĠĠ Ġinit Components View Array () ĊĠĠĠĠĠĠĠ Ġsave _ state . setOnClickListener Ġ{ run Save All Config ()} ĊĠĠĠĠĠĠĠ ĠLog . i (" Started Control Activity ", Ġ" Control Activity Ġis Ġstarted ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġobtain Rel ays Data From Store AndUpdate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Restart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Restart () ĊĠĠĠĠĠĠĠ Ġobtain Rel ays Data From Store AndUpdate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġto Return Ġ= Ġsuper . onCreate Options Menu ( menu ) ĊĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= Ġmenu Inflater ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . control _ activity _ menu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġto Return ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ) Ġ= Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠ ĠR . id . config Menu Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠConfig Device Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( MainActivity . EXTRA _ ADDRESS , Ġm Address ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Components View Array () Ġ{ ĊĠĠĠĠĠĠĠ Ġrelay Array . add ( switch _ relay _ 1 Ġas ĠSwitch ) ĊĠĠĠĠĠĠĠ Ġrelay Array . add ( switch _ relay _ 2 Ġas ĠSwitch ) ĊĠĠĠĠĠĠĠ Ġrelay Array . add ( switch _ relay _ 3 Ġas ĠSwitch ) ĊĠĠĠĠĠĠĠ Ġrelay Array . add ( switch _ relay _ 4 Ġas ĠSwitch ) ĊĠĠĠĠĠĠĠ Ġrelay Array . add ( switch _ relay _ 5 Ġas ĠSwitch ) ĊĠĠĠĠĠĠĠ Ġrelay Array . add ( switch _ relay _ 6 Ġas ĠSwitch ) ĊĠĠĠĠĠĠĠ Ġrelay Array . add ( switch _ relay _ 7 Ġas ĠSwitch ) ĊĠĠĠĠĠĠĠ Ġrelay Array . add ( switch _ relay _ 8 Ġas ĠSwitch ) ĊĠĠĠĠĠĠĠ Ġobtain Rel ays Data From Store AndUpdate () ĊĠĠĠĠĠĠĠ Ġrefresh Relay State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobtain Rel ays Data From Store AndUpdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdevice Data Ġ= ĠStore Utils . find Device Data ( application Context , Ġm Address ) ĊĠĠĠĠĠĠĠ Ġif ( device Data Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( relay Ġin Ġdevice Data . relay s ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( relay . index Ġ>= Ġ 0 Ġ&& Ġrelay . index Ġ< Ġrelay Array . size ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelay Array [ relay . index ]. isChecked Ġ= Ġrelay . state ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! relay . name . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelay Array [ relay . index ]. text Ġ= Ġrelay . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Actual State To Store (){ ĊĠĠĠĠĠĠĠ Ġvar Ġdevice Data Ġ= ĠStore Utils . find Device Data ( application Context , Ġm Address ) ĊĠĠĠĠĠĠĠ Ġif ( device Data Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Data Ġ= ĠDevice Data () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdevice Data . relay s Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġrelay Array . size ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelay Data Ġ= ĠRelay Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelay Data . index Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelay Data . name Ġ= Ġrelay Array [ i ]. text Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelay Data . state Ġ= Ġrelay Array [ i ]. isChecked ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Data . relay s . add ( relay Data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠStore Utils . save Device Data ( application Context , Ġm Address , Ġdevice Data ) ĊĠĠĠĠĠĠĠ Ġif (! result ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast In Main Loop ( CAN NOT _ SAVE _ TO _ STORE _ MESSAGE , ĠCAN NOT _ SAVE _ TO _ STORE _ DURATION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh Relay State (){ ĊĠĠĠĠĠĠĠ Ġif ( relay State . isEmpty () Ġ|| Ġrelay State . size Ġ!= Ġrelay Array . size ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelay State . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġrelay Array . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelay State . add ( relay Array [ i ]. isChecked ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġrelay Array . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelay State [ i ] Ġ= Ġrelay Array [ i ]. isChecked ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave All Config (): Ġjava . util . ArrayList < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdevice Data Ġ= ĠStore Utils . find Device Data ( application Context , Ġm Address ) ĊĠĠĠĠĠĠĠ Ġvar Ġmax T ries Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġmin T ries Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġms Time Between Each Try : Long Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġif ( device Data Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax T ries Ġ= Ġdevice Data . max T ries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin T ries Ġ= Ġdevice Data . min T ries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġms Time Between Each Try Ġ= Ġdevice Data . ms Time Between Each Try ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġto Send Ġ= ĠArrayList < ByteArray >() ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġrelay Array . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelay Ġ= Ġrelay Array [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Send . add ( Rel ays Utils . get Command ( i , Ġrelay . isChecked )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠRel ays Utils . send Commands ( m Bluetooth Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Address , Ġmax T ries , Ġmin T ries , Ġms Time Between Each Try , Ġto Send ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Toast In Main Loop ( message : ĠString , Ġduration : ĠInt ){ ĊĠĠĠĠĠĠĠ ĠHandler ( application Context . main Looper ). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , Ġmessage , Ġduration ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Save All Config (){ ĊĠĠĠĠĠĠĠ Ġval Ġcallback : AsyncTask Callback Ġ= Ġobject : ĠAsync Task Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Callback (): ĠArrayList < Boolean > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsave All Config () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Post Post Execute ( status Array : ĠArrayList < Boolean >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Bluetooth Response ( status Array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Actual State To Store () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart Loading () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Loading Widget () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstop Loading () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Loading Widget () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠSave Config Task (). init ( callback ). execute () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Loading Widget (){ ĊĠĠĠĠĠĠĠ Ġloading Layout !!. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġsave _ state !!. isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfor ( relay Ġin Ġrelay Array ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelay . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Loading Widget (){ ĊĠĠĠĠĠĠĠ Ġloading Layout !!. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġsave _ state !!. isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfor ( relay Ġin Ġrelay Array ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelay . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Bluetooth Response ( status Array : ĠArrayList < Boolean > ){ ĊĠĠĠĠĠĠĠ Ġvar Ġfailed Commands Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġstatus Array . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! status Array [ i ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelay : ĠSwitch Ġ= Ġrelay Array [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelay . isChecked Ġ= Ġrelay State [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailed Commands ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( failed Commands Ġ> Ġ 0 Ġ&& Ġfailed Commands Ġ< Ġrelay Array . size ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast In Main Loop ( CAN NOT _ SEND _ COMMAND _ TO _ DEVICE _ MESSAGE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCAN NOT _ SEND _ COMMAND _ TO _ DEVICE _ DURATION ) ĊĠĠĠĠĠĠĠ Ġ} else Ġif ( failed Commands Ġ> Ġ 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast In Main Loop ( CAN NOT _ CONNECT _ TO _ DEVICE _ MESSAGE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCAN NOT _ CONNECT _ TO _ DEVICE _ DURATION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrefresh Relay State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠAsync Task Callback { ĊĠĠĠĠĠĠĠ Ġfun Ġdo Callback (): ĠArrayList < Boolean > ĊĠĠĠĠĠĠĠ Ġfun Ġdo Post Post Execute ( status Array : ĠArrayList < Boolean >) ĊĠĠĠĠĠĠĠ Ġfun Ġstart Loading () ĊĠĠĠĠĠĠĠ Ġfun Ġstop Loading () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSave Config Task : ĠAsync Task < Void , Void , ArrayList < Boolean >> (){ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcallback : ĠAsync Task Callback ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġinit ( callback : ĠAsync Task Callback ): ĠSave Config Task { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . callback Ġ= Ġcallback ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Execute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Pre Execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback !!. start Loading () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġp 0 : ĠVoid ?): ĠArrayList < Boolean > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcallback !!. do Callback () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Post Execute ( status Array : ĠArrayList < Boolean >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Post Execute ( status Array ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback !!. do Post Post Execute ( status Array ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback !!. stop Loading () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }