package Ġcom . ms 8 . smart ir hub . android . firebase Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . util . Log Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . database .* Ċ import Ġcom . ms 8 . smart ir hub . android . remote _ control . models . Remote Profile . Command Ċ import Ġcom . ms 8 . smart ir hub . android . models . realtime database . Hub Action Ċ import Ġcom . ms 8 . smart ir hub . android . models . realtime database . Hub Result Ċ import Ġcom . ms 8 . smart ir hub . android . models . firestore . Ir Signal Ċ import Ġcom . ms 8 . smart ir hub . android . database . AppState Ċ import Ġcom . ms 8 . smart ir hub . android . firebase . Firebase Constants . IR _ ACTION _ LIST EN Ċ import Ġcom . ms 8 . smart ir hub . android . firebase . Firebase Constants . IR _ ACTION _ NONE Ċ import Ġcom . ms 8 . smart ir hub . android . firebase . Firebase Constants . IR _ ACTION _ SEND Ċ import Ġcom . ms 8 . smart ir hub . android . models . firestore . Hub Ċ import Ġcom . ms 8 . smart ir hub . android . models . firestore . Hub . Companion . DEFAULT _ HUB Ċ import Ġorg . jetbrains . ank o . do Async Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . collections . HashMap Ċ import Ġjava . util .* Ċ Ċ object ĠReal time Database Functions Ġ{ ĊĊĠĠĠ Ġ@ Suppress Lint (" Log Not Tim ber ") ĊĠĠĠ Ġfun Ġsend Listen Action 2 ( hub UID : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Mode ) Ġ{ Ġreturn Ġdebug _ send Listen Action 2 () Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġuid Ġ= ĠFirebase Auth . getInstance (). currentUser !!. uid ĊĊĠĠĠĠĠĠĠ ĠLog . d (" R DB F ", Ġ" send Listen Action 2 Ġ- ĠB eg ging Ġlistening Ġprocess Ġon Ġhub Ġ$ hub UID Ġfrom Ġuser Ġ$ uid ") ĊĠĠĠĠĠĠĠ Ġclear Result ( hub UID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġ Ġe Ġ-> ĠApp State . error Data . pair Signal Error . set ( Hub Unknown Exception ( e . message )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend None Action ( hub UID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġe Ġ-> ĠApp State . error Data . pair Signal Error . set ( Hub Unknown Exception ( e . message )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Database . getInstance (). reference . child (" devices "). child ( hub UID ). child (" action ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHub Action (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠIR _ ACTION _ LIST EN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender Ġ= Ġuid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ĠHH : mm : ss ", ĠLocale . US ). format ( Calendar . getInstance (). time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġe Ġ-> ĠApp State . error Data . pair Signal Error . set ( Hub Unknown Exception ( e . message )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Hub Results ( hub UID ). add Value EventListener ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĠApp State . error Data . pair Signal Error . set ( Hub Unknown Exception ( p 0 . to Exception (). message )) Ġ} ĊĊ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( data Snapshot : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhub Result Ġ= Ġparse Hub Result ( data Snapshot . value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hub Result Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w (" Realtime Database ", Ġ" send Listen Action 2 Ġ- Ġhub Result Ġwas Ġnull !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Hub Results ( hub UID ). removeEventListener ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( hub Result . result Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOverflow ĠError ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Constants . IR _ RES _ OVER FLOW _ ERR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp State . error Data . pair Signal Error . set ( Hub Overflow Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTimeout ĠError ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Constants . IR _ RES _ TIMEOUT _ ERR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp State . error Data . pair Signal Error . set ( Hub TimeoutException ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUnknown ĠError ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Constants . IR _ RES _ UNKNOWN _ ERR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp State . error Data . pair Signal Error . set ( Hub Unknown Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReceived Ġan ĠIR ĠSignal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Constants . IR _ RES _ RECE IVED _ SIG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Realtime Database ", Ġ" send Listen Action 2 Ġ- ĠReceived Ġsignal ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp State . temp Data . temp Signal . set ( Ir Signal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Length Ġ= Ġhub Result . raw Len ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencoding Type Ġ= Ġhub Result . encoding ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= Ġhub Result . code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat Ġ= Ġfalse Ġ// TODO Ġdetermine Ġif Ġthis Ġis Ġneeded Ġat Ġall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget RawData ( hub UID ). add Value EventListener ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĠApp State . error Data . pair Signal Error . set ( Hub Unknown Exception ()) Ġ} Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( data Snapshot : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Realtime Database ", Ġ" get RawData Ġ- Ġdata Ġchanged !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Data Ġ= Ġparse RawData ( data Snapshot . value ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Chunks Ġ= Ġcalculate Num Chunks ( AppState . temp Data . temp Signal . get ()?. raw Length Ġ?: Ġ 0 ) Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Realtime Database ", Ġ" get RawData Ġ- Ġraw Data Ġsize Ġ= Ġ${ raw Data . size }") Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw Data . size Ġ== Ġnum Chunks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStop Ġlistening Ġfor Ġraw Data Ġchanges ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget RawData ( hub UID ). removeEventListener ( this ) Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġdata Ġarray Ġfor Ġtemp Signal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompleted Temp Signal Ġ= ĠIr Signal . copyFrom ( AppState . temp Data . temp Signal . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompleted Temp Signal . raw Data Ġ= Ġraw Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp State . temp Data . temp Signal . set ( completed Temp Signal ) Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġraw Data Ġfrom Ġhub 's Ġendpoint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget RawData ( hub UID ). remove Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w (" Realtime Database ", Ġ" send Listen Action 2 Ġ- ĠMis match Ġin Ġchunk Ġlist Ġsize : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" expected Ġ$ num Chunks Ġbut Ġactually Ġ${ raw Data . size }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUnexpected ĠIR Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Realtime Database ", Ġ" unexpected Ġresult Ġcode Ġ(${ hub Result . result Code }) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp State . error Data . pair Signal Error . set ( Hub Unknown Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" SimpleDateFormat ") ĊĠĠĠ Ġfun Ġsend Signal To Hub ( hub UID : ĠString , Ġir Signal : ĠIr Signal ): ĠTask < Void > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuid Ġ= ĠFirebase Auth . getInstance (). currentUser !!. uid ĊĊĠĠĠĠĠĠĠ ĠLog . d (" TEST ", Ġ" Sending ĠSignal Ġto Ġ$ hub UID ") ĊĠĠĠĠĠĠĠ ĠFirebase Database . getInstance (). reference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" devices ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( hub UID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" raw Data ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( ArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġir Signal . raw Data . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( ir Signal . raw Data [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠFirebase Database . getInstance (). reference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" devices ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( hub UID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" action ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHub Action (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠIR _ ACTION _ SEND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender Ġ= Ġuid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ĠHH : mm : ss "). format ( Calendar . getInstance (). time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Len Ġ= Ġir Signal . raw Length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" SimpleDateFormat ") ĊĠĠĠ Ġfun Ġsend None Action ( hub UID : ĠString ): ĠTask < Void > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuid Ġ= ĠFirebase Auth . getInstance (). currentUser !!. uid ĊĊĠĠĠĠĠĠĠ Ġreturn ĠFirebase Database . getInstance (). reference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" devices ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( hub UID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" action ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHub Action (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠIR _ ACTION _ NONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender Ġ= Ġuid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ĠHH : mm : ss "). format ( Calendar . getInstance (). time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" SimpleDateFormat ") ĊĠĠĠ Ġfun Ġsend Listen Action ( hub UID : ĠString ): ĠTask < Void > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuid Ġ= ĠFirebase Auth . getInstance (). currentUser !!. uid ĊĊĠĠĠĠĠĠĠ Ġreturn ĠFirebase Database . getInstance (). reference . child (" devices "). child ( hub UID ). child (" action ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHub Action (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠIR _ ACTION _ LIST EN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender Ġ= Ġuid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ĠHH : mm : ss "). format ( Calendar . getInstance (). time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Log Not Tim ber ") ĊĠĠĠ Ġfun Ġsend Command To Hub ( command : ĠCommand ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d (" send Command To Hub ", Ġ" default Hub Ġ= Ġ${ AppState . userData . user . default Hub }") ĊĠĠĠĠĠĠĠ Ġdo Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( command ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĠLog . w (" send Command To Hub ", Ġ" call Ġwith Ġnull Ġcommands ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactions Ġ= ĠArrayList ( command . actions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Next Signal To Hub ( actions , ĠApp State . userData . user . default Hub Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends Ġa Ġlist Ġof Ġcommands Ġse quent ially Ġby Ġremoving Ġthe Ġfirst Ġaction Ġfrom Ġactions Ġ( the Ġstack ) Ġand ĊĠĠĠĠ Ġ* Ġrecursively Ġcalling Ġthis Ġfunction Ġuntil Ġactions . size Ġ= Ġ 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress Lint (" Log Not Tim ber ") ĊĠĠĠ Ġprivate Ġfun Ġsend Next Signal To Hub ( actions : ĠArrayList < Command . Action >, Ġdefault Hub UID : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( actions . size Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġactions . remove At ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġdest Hub Ġ= Ġif Ġ( action . hub UID Ġ== ĠDEFAULT _ HUB ) Ġdefault Hub UID Ġelse Ġaction . hub UID ĊĠĠĠĠĠĠĠ ĠLog . d (" TEST ", Ġ" Dest Hub Ġ= Ġ$ dest Hub Ġ( default Hub UID Ġ= Ġ$ default Hub UID )") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( dest Hub ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" Ġ-> Ġ{ ĠLog . e (" send Command To Hub ", Ġ" empty Ġdefault Ġhub UID Ġfor Ġaction Ġ${ AppState . userData . ir Signals [ action . ir Signal ]?. name }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġsignal Ġ= ĠApp State . userData . ir Signals [ action . ir Signal ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" send Command To Hub ", Ġ" Null Ġir Signal Ġpassed Ġfor Ġaction Ġ${ action . ir Signal }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFire store Actions . get Ir Signal ( action . ir Signal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĠLog . e (" send Command To Hub ", Ġ"$ it ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . data Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" send Command To Hub ", Ġ" data Ġwas Ġnull Ġ( exists Ġ= Ġ${ it . exists () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsig Ġ= Ġit . toObject ( Ir Signal :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuid Ġ= Ġaction . ir Signal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĠLog . d (" send Command To Hub ", Ġ" Did n 't Ġfind Ġsignal Ġ${ it . id }"); Ġreturn @ add On Success Listener } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" send Command To Hub ", Ġ" Got Ġmissing ĠIR ĠSignal : Ġ${ sig . uid }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp State . userData . ir Signals [ sig . uid ] Ġ= Ġsig ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" send Next Signal To Hub ", Ġ" Send Ġsig : Ġ$ sig ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Signal To Hub ( dest Hub , Ġsig ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġ ĠLog . e (" send Command To Hub ", Ġ" Failed Ġto Ġsend Ġ${ AppState . userData . ir Signals [ action . ir Signal ]?. name } Ġto Ġhub Ġ$ dest Hub ")} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" TEST ", Ġ" Action Ġsent !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : ĠChange Ġaction Ġbackend Ġimplementation Ġto Ġbetter Ġsupport Ġa Ġlist Ġof Ġactions Ġthat Ġthe ĠHub Ġreads Ġat Ġits Ġown Ġp ace , Ġone Ġat Ġa Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actions . size Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimer (). schedule ( object Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Next Signal To Hub ( actions , Ġdefault Hub UID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġactions [ 0 ]. delay . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" send Next Signal To Hub ", Ġ" Send Ġsig : Ġ$ signal ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Signal To Hub ( dest Hub , Ġsignal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġ ĠLog . e (" send Command To Hub ", Ġ" Failed Ġto Ġsend Ġ${ AppState . userData . ir Signals [ action . ir Signal ]?. name } Ġto Ġhub Ġ$ dest Hub ")} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" TEST ", Ġ" Action Ġsent !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : ĠChange Ġaction Ġbackend Ġimplementation Ġto Ġbetter Ġsupport Ġa Ġlist Ġof Ġactions Ġthat Ġthe ĠHub Ġreads Ġat Ġits Ġown Ġp ace , Ġone Ġat Ġa Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actions . size Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimer (). schedule ( object Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Next Signal To Hub ( actions , Ġdefault Hub UID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġactions [ 0 ]. delay . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Hub Availability ( hub UID : ĠString ) Ġ: ĠDatabase Reference Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFirebase Database . getInstance (). reference . child (" devices "). child ( hub UID ). child (" action "). child (" sender ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Result ( hub UID : ĠString ): ĠTask < Void > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFirebase Database . getInstance (). reference . child (" devices "). child ( hub UID ). child (" result ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove Value () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Hub Ref ( hub UID : ĠString ): ĠDatabase Reference Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFirebase Database . getInstance (). reference . child (" devices "). child ( hub UID ). child (" result ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Hub Results ( hub UID : ĠString ): ĠDatabase Reference Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFirebase Database . getInstance (). reference . child (" devices "). child ( hub UID ). child (" result ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠQueries Ġfor Ġraw Data Ġfrom Ġdesign ated Ġhub . ĠUses Ġraw Len Ġto Ġcalculate Ġhow Ġmany Ġchunks Ġof ĊĠĠĠĠ Ġ* Ġdata Ġto Ġquery Ġfor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget RawData ( hub UID : ĠString ): ĠDatabase Reference Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFirebase Database . getInstance (). reference . child (" devices "). child ( hub UID ). child (" raw Data ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Use Sparse Arrays ", Ġ" Log Not Tim ber ") ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġparse RawData ( value : ĠAny ?): ĠArrayList < String >? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Map Ġ= Ġvalue Ġas ĠHashMap < Any , ĠAny > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Map . remove (" num Chunks ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Realtime Database ", Ġ" parse RawData Ġ- Ġtemp Map Ġsize Ġ= Ġ${ temp Map . size } Ġ Ġ| Ġ${ temp Map [ 0 ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġtemp Map . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( temp Map [ i ] Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e Ġ: ĠException ) Ġ{ ĠLog . e (" Realtime Database ", Ġ" Ġparse RawData Ġ- Ġ$ e ")} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġas ĠArrayList < String > ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e Ġ: ĠException ) Ġ{ ĠLog . e (" Realtime Database ", Ġ" parse RawData Ġ- Ġ$ e ")} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Log Not Tim ber ") ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġparse Hub Result ( value : ĠAny ?): ĠHub Result ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Val Ġ= Ġvalue Ġas ĠMap < String , ĠAny ?> ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠresultCode Ġ= Ġmap Val ?. get (" result Code ") Ġas ĠNumber ? Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġmap Val ?. get (" timestamp ") Ġas ĠString ? Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoding Ġ= Ġmap Val ?. get (" encoding ") Ġas ĠNumber ? Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Len Ġ= Ġmap Val ?. get (" raw Len ") Ġas ĠNumber ? Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġmap Val ?. get (" code ") Ġas ĠString ? Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġrepeat Ġ= Ġvalue ?. get (" repeat ") Ġas ĠBoolean ? Ġ?: Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHub Result (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . result Code Ġ= ĠresultCode . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . timestamp Ġ= Ġtimestamp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . encoding Ġ= Ġencoding . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . raw Len Ġ= Ġraw Len . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . code Ġ= Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e Ġ: ĠException ) Ġ{ ĠLog . e (" Realtime Database ", Ġ" parse Hub Result Ġ- Ġ$ e ")} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcalculate Num Chunks ( raw Length : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnum Chunks Ġ: ĠInt Ġ= Ġ( raw Length Ġ/ ĠCH UNK _ SIZE ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( num Chunks Ġ* ĠCH UNK _ SIZE Ġ< Ġraw Length ) Ġnum Chunks + 1 Ġelse Ġnum Chunks ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠCH UNK _ SIZE Ġ= Ġ 5 0 ĊĊĊ Ċ /* Ċ -------------------------------- -------------- ĊĠ ĠHub ĠErrors Ċ -------------------------------- -------------- Ċ */ ĊĠĠĠ Ġopen Ġclass ĠHub Exception ( val Ġtitle ID Ġ: ĠInt , Ġval Ġmessage ID Ġ: ĠInt , Ġmessage Ġ: ĠString ? Ġ= Ġ"") Ġ: Ġjava . lang . Exception ( message ) ĊĠĠĠ Ġclass ĠHub Overflow Exception ( message Ġ: ĠString ? Ġ= Ġ"") Ġ: ĠHub Exception ( ĊĠĠĠĠĠĠĠ Ġcom . ms 8 . smart ir hub . android . R . string . err _ overflow _ title , ĊĠĠĠĠĠĠĠ Ġcom . ms 8 . smart ir hub . android . R . string . err _ overflow _ desc , ĊĠĠĠĠĠĠĠ Ġmessage ) ĊĠĠĠ Ġclass ĠHub TimeoutException ( message Ġ: ĠString ? Ġ= Ġ"") Ġ: ĠHub Exception ( ĊĠĠĠĠĠĠĠ Ġcom . ms 8 . smart ir hub . android . R . string . err _ timeout _ title , ĊĠĠĠĠĠĠĠ Ġcom . ms 8 . smart ir hub . android . R . string . err _ timeout _ desc , ĊĠĠĠĠĠĠĠ Ġmessage ) ĊĠĠĠ Ġclass ĠHub Unknown Exception ( message Ġ: ĠString ? Ġ= Ġ"") Ġ: ĠHub Exception ( ĊĠĠĠĠĠĠĠ Ġcom . ms 8 . smart ir hub . android . R . string . err _ title , ĊĠĠĠĠĠĠĠ Ġcom . ms 8 . smart ir hub . android . R . string . err _ unknown _ desc , ĊĠĠĠĠĠĠĠ Ġmessage ) Ċ Ċ /* Ċ -------------------------------- -------------- ĊĠ ĠDebug Ċ -------------------------------- -------------- Ċ */ ĊĠĠĠ Ġvar Ġdebug Mode Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġfun Ġdebug _ send Listen Action 2 ( delay Time Ġ: ĠLong Ġ= Ġ 3 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġandroid . os . Handler (). post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp State . temp Data . temp Signal . set ( Ir Signal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Data Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd (" 0 Ġ 1 Ġ 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= Ġ" 0 x 3 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Length Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencoding Type Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ}, Ġdelay Time ) ĊĠĠĠ Ġ} Ċ Ċ }