package Ġcom . zh uk er Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . zh uk er . MainActivity . Companion . TAG Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ import Ġio . reactivex . rx java 3 . core . Single Ċ import Ġokhttp 3 .* Ċ import Ġokhttp 3 . MediaType . Companion . to MediaType Ċ import Ġokhttp 3 . RequestBody . Companion . to RequestBody Ċ import Ġokhttp 3 . sse . EventSource Ċ import Ġokhttp 3 . sse . EventSource Listener Ċ import Ġokhttp 3 . sse . Event Sources Ċ import Ġjava . io . IOException Ċ import Ġjava . lang . StringBuilder Ċ import Ġjava . net . Socket Ċ import Ġjava . util .* Ċ Ċ fun ĠByteArray . drop 4 ( limit : ĠInt ? Ġ= Ġnull ): ĠByteArray Ġ= Ġthis . slice Array ( Int Range ( 4 , Ġ( limit Ġ?: Ġthis . size ) Ġ- Ġ 1 )) Ċ Ċ data Ġclass ĠGate Event ( val Ġid : ĠString ?, Ġval Ġtype : ĠString ?, Ġval Ġdata : ĠString ) Ċ class ĠSSE Exception ( err : ĠThrowable ?, Ġval Ġresponse : ĠResponse ?) Ġ: Ġjava . lang . RuntimeException ( err ) Ċ data Ġclass ĠGate Status ( val Ġid : ĠString , Ġval Ġstate : ĠString , Ġval Ġvalue : ĠBoolean ) Ċ Ċ object ĠModel Ġ{ ĊĠĠĠ Ġconst Ġval Ġpayload _ query Ġ= Ġ" AAAA I 9 Dw 0 q HY q 9 + 6 1 / X Pt JS 2 0 b T An + y V 5 o / hh + j K 8 J 7 rh + v L tp br " ĊĠĠĠ Ġconst Ġval Ġpayload _ on Ġ= Ġ" AAAA Kt D yg fi L / 5 r 3 1 e + U ts Wg 1 Iv 5 n PC R 6 Lf Es NG lw OL Yo 4 Hy hue T 9 t Tu 3 6 L fog ==" ĊĠĠĠ Ġconst Ġval Ġpayload _ off Ġ= Ġ" AAAA Kt D yg fi L / 5 r 3 1 e + U ts Wg 1 Iv 5 n PC R 6 Lf Es NG lw OL Yo 4 Hy hue T 9 t Tu 3 q Pe ow ==" ĊĠĠĠ Ġconst Ġval Ġlights _ ip _ addr Ġ= Ġ" 1 9 2 . 1 6 8 . 1 . 1 9 2 " ĊĠĠĠ Ġconst Ġval Ġlights _ port Ġ= Ġ 9 9 9 9 ĊĠĠĠ Ġconst Ġval Ġgate _ ip Ġ= Ġ" 1 9 2 . 1 6 8 . 1 . 2 4 4 " ĊĊĠĠĠ Ġfun Ġrx msg ( q : ĠByteArray ): ĠSingle < ByteArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSocket ( lights _ ip _ addr , Ġlights _ port ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . so Timeout Ġ= Ġ 2 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get OutputStream (). write ( q ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarr Ġ= ĠByteArray ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġit . getInputStream (). read ( arr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Ġ<= Ġ 0 Ġ-> Ġemitter . onError ( RuntimeException (" cant Ġread Ġresponse Ġ$ r ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġemitter . on Success ( arr . slice Array ( Int Range ( 0 , Ġr Ġ- Ġ 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecode ( bytes : ĠByteArray ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbytes . fold (( 1 7 1 u Ġto ĠStringBuilder ())) Ġ{ Ġ( code , Ġsb ), Ġbyte Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġbyte . to U Byte (). to UInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġelement Ġxor Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġoutput . to U Short (). to Short (). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġto Ġsb ĊĠĠĠĠĠĠĠ Ġ}. second . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġgson Ġ= ĠGson () ĊĊĠĠĠ Ġfun Ġquery (): ĠSingle < Switch Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrx msg ( Base 6 4 . get Decoder (). decode ( payload _ query )). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġdecode ( it . drop 4 ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgson . fromJson ( s , ĠSwitch Status :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġturn On (): ĠSingle < Switch Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrx msg ( Base 6 4 . get Decoder (). decode ( payload _ on )). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġdecode ( it . drop 4 ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgson . fromJson ( s , ĠSwitch Status :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġturn Off (): ĠSingle < Switch Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrx msg ( Base 6 4 . get Decoder (). decode ( payload _ off )). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġdecode ( it . drop 4 ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgson . fromJson ( s , ĠSwitch Status :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġclient Ġ= ĠOk HttpClient () ĊĊĠĠĠ Ġfun Ġgate Events (): ĠObservable < Gate Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew EventSource Ġ= ĠEvent Sources . create Factory ( client ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. new EventSource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . Builder (). url (" http :// $ gate _ ip : 8 0 / events "). build (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠEvent Source Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Open ( event Source : ĠEvent Source , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Open ( event Source , Ġresponse ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" on Open ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Closed ( event Source : ĠEvent Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Closed ( event Source ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" on Closed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Event ( event Source : ĠEvent Source , Ġid : ĠString ?, Ġtype : ĠString ?, Ġdata : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Event ( event Source , Ġid , Ġtype , Ġdata ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" on Event Ġ'$ id ' Ġ'$ type ' Ġ'$ data '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onNext ( Gate Event ( id , Ġtype , Ġdata )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( event Source : ĠEvent Source , Ġt : ĠThrowable ?, Ġresponse : ĠResponse ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Failure ( event Source , Ġt , Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! emitter . is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( SSE Exception ( t , Ġresponse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" gate Ġevent Ġerror Ġ$ t ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . set C ancellable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew EventSource . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgate Status (): ĠObservable < Gate Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgate Events (). filter Ġ{ Ġit . type Ġ== Ġ" state " Ġ}. map Ġ{ Ġgson . fromJson ( it . data , ĠGate Status :: class . java ) !! Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtoggle Gate (): ĠSingle < Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĠRequest . Builder (). url (" http :// $ gate _ ip / switch / open _ for _ 3 0 min / toggle ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. method (" POST ", Ġ"". to RequestBody (" text / plain ". to MediaType ())). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Call Ġ= Ġclient . new Call ( req ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Call . enqueue ( object Ġ: ĠCallback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall , Ġe : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . set C ancellable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Call . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }