/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠThanks M ister ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ġdistributed Ċ Ġ* Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . th ank sm ister . iot . mqtt . alar mp anel . network Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Key guard Manager Ċ import Ġandroid . content .* Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . net . wifi . Wifi Manager Ċ import Ġandroid . os .* Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . lifecycle . Lifecycle Service Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . local broadcast manager . content . Local Broadcast Manager Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġcom . ko ush ik dut ta . async . Async Server Ċ import Ġcom . ko ush ik dut ta . async . ByteBuffer List Ċ import Ġcom . ko ush ik dut ta . async . http . server . Async HttpServer Ċ import Ġcom . ko ush ik dut ta . async . http . server . Async HttpServer Response Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . Lifecycle Handler Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . R Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . managers . Connection LiveData Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . modules .* Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . persistence .* Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . ui . activities . MainActivity Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils .* Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ ALERT Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ ARM _ AW AY Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ ARM _ CUSTOM _ BY PASS Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ ARM _ HOME Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ ARM _ N IGHT Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ AUDIO Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ CAPTURE Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ DASH BOARD Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ DIS ARM Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ NOTIFICATION Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ SENSOR _ FACE Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ SENSOR _ MOT ION Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ SENSOR _ PREFIX Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ SENSOR _ QR _ CODE Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ SPE AK Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ STATE Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ SUN Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ WAKE Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . COMMAND _ WE ATHER Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . EVENT _ ARM _ FAILED Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . EVENT _ COMMAND _ NOT _ ALLOWED Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . EVENT _ INVALID _ CODE Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . EVENT _ NO _ CODE Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . EVENT _ SYSTEM _ DISABLED Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . EVENT _ TRIGGER Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . EVENT _ UNKNOWN Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . STATE _ ARM _ AW AY Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . STATE _ ARM _ CUSTOM _ BY PASS Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . STATE _ ARM _ HOME Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . STATE _ ARM _ N IGHT Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . STATE _ BR IGHT NESS Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . STATE _ CURRENT _ URL Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . STATE _ DIS ARM Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . STATE _ PENDING Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . STATE _ PRES ENCE Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . STATE _ SCREEN _ ON Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . STATE _ TRIGGER ED Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . TYPE _ ALARM Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . TYPE _ COMMAND Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . TYPE _ EVENT Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . utils . Mqtt Utils . Companion . VALUE Ċ import Ġdagger . android . Android Injection Ċ import Ġio . reactivex .* Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . exceptions . Un deliver able Exception Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġorg . json . JSONException Ċ import Ġorg . json . JSONObject Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjavax . inject . Inject ĊĊ Ċ class ĠAlarm Panel Service Ġ: ĠLifecycle Service (), ĠMQTT Module . MQTT Listener Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġconfiguration : ĠConfiguration ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġsensor Reader : ĠSensor Reader ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġmqtt Options : ĠM QT TO ptions ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġnotifications : ĠNotification Utils ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġmessage DataSource : ĠMessage Dao ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġsensor DataSource : ĠSensor Dao ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġweather Dao : ĠWeather Dao ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġsun Dao : ĠSun Dao ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġscreen Utils : ĠScreen Utils ĊĊĠĠĠ Ġprivate Ġvar Ġcamera Reader : ĠCamera Reader ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġdis posable Ġ= ĠComposite Disposable () ĊĠĠĠ Ġprivate Ġval Ġm J peg Sockets Ġ= ĠArrayList < Async HttpServer Response >() ĊĠĠĠ Ġprivate Ġvar Ġpartial Wake Lock : ĠPower Manager . Wake Lock ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġwifi Lock : ĠW ifi Manager . Wifi Lock ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġkey guard Lock : ĠKey guard Manager . Key guard Lock ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġaudio Player : ĠMedia Player ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġaudio Player Busy : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġhttp Server : ĠAsync HttpServer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm Binder Ġ= ĠAlarm Panel Service Binder () ĊĠĠĠ Ġprivate Ġval Ġmotion Clear Handler Ġ= ĠHandler () ĊĠĠĠ Ġprivate Ġval Ġqr Code Clear Handler Ġ= ĠHandler () ĊĠĠĠ Ġprivate Ġval Ġface Clear Handler Ġ= ĠHandler () ĊĠĠĠ Ġprivate Ġvar Ġtext ToS peech Module : ĠText ToS peech Module ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmqtt Module : ĠMQTT Module ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġconnection LiveData : ĠConnection LiveData ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġhas Network Ġ= ĠAtomic Boolean ( true ) ĊĠĠĠ Ġprivate Ġvar Ġmotion Detected : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġqr Code Read : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġface Detected : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġcurrent Url : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġreconnect Handler Ġ= ĠHandler () ĊĠĠĠ Ġprivate Ġvar Ġlocal Broad Cast Manager : ĠLocal Broadcast Manager ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmqtt Alert Message Shown Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġmqtt Connected Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġmqtt Connecting Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġmqtt Init Connection Ġ= ĠAtomic Boolean ( true ) ĊĠĠĠ Ġprivate Ġvar Ġuser Presence Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠ Ġprivate Ġval Ġrestart MQ T TR un nable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġclear Alert Message () Ġ// Ġclear Ġany Ġdialog s ĊĠĠĠĠĠĠĠ Ġmqtt Alert Message Shown Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġmqtt Connecting Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġsend Toast Message ( getString ( R . string . toast _ connect _ retry )) ĊĠĠĠĠĠĠĠ Ġmqtt Module ?. restart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġalarm Panel Service : ĠIntent Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠIntent ( this , ĠAlarm Panel Service :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠAlarm Panel Service Binder Ġ: ĠB inder () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice : ĠAlarm Panel Service ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ Alarm Panel Service ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠĠĠĠĠ ĠAndroid Injection . inject ( this ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= Ġnotifications . create O ngo ing Notification ( getString ( R . string . app _ name ), ĠgetString ( R . string . service _ notification _ message )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground ( ONGO ING _ NOTIFICATION _ ID , Ġnotification ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . start Foreground Service ( this , Ġalarm Panel Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġprepare Ġthe Ġlock Ġtypes Ġwe Ġmay Ġuse ĊĠĠĠĠĠĠĠ Ġval Ġpm Ġ= Ġget System Service ( Context . POWER _ SERVICE ) Ġas ĠPower Manager ĊĠĠĠĠĠĠĠ Ġ// no inspection Ġdeprecation ĊĠĠĠĠĠĠĠ Ġpartial Wake Lock Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ> ĠBuild . VERSION _ CODES . KIT K AT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpm . new Wake Lock ( Power Manager . FULL _ WAKE _ LOCK Ġor ĠPower Manager . AC Q UIRE _ CA USE S _ WAKE UP , Ġ" alar mp anel : partial Wake Lock ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpm . new Wake Lock ( Power Manager . FULL _ WAKE _ LOCK Ġor ĠPower Manager . AC Q UIRE _ CA USE S _ WAKE UP Ġor ĠPower Manager . ON _ AFTER _ RELEASE , Ġ" alar mp anel : partial Wake Lock ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġwifi Ġlock ĊĠĠĠĠĠĠĠ Ġval Ġwifi Manager Ġ= Ġapplication Context . getSystem Service ( Context . WIFI _ SERVICE ) Ġas ĠW ifi Manager ĊĠĠĠĠĠĠĠ Ġwifi Lock Ġ= Ġwifi Manager . create Wifi Lock ( Wifi Manager . WIFI _ MODE _ FULL , Ġ" alar mp anel : wifi Lock ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠSome ĠAmazon Ġdevices Ġare Ġnot Ġseeing Ġthis Ġpermission Ġso Ġwe Ġare Ġtrying Ġto Ġcheck ĊĠĠĠĠĠĠĠ Ġval Ġpermission Ġ= Ġ" android . permission . DISABLE _ KEY GU ARD " ĊĠĠĠĠĠĠĠ Ġval Ġcheck Self Permission Ġ= ĠContext Compat . check Self Permission ( this @ Alarm Panel Service , Ġpermission ) ĊĠĠĠĠĠĠĠ Ġif Ġ( check Self Permission Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey guard Manager Ġ= Ġget System Service ( Context . KEY GU ARD _ SERVICE ) Ġas ĠKey guard Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey guard Lock Ġ= Ġkey guard Manager . new Key guard Lock (" ALARM _ KEY BOARD _ LOCK _ TAG ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey guard Lock ?. disable Key guard () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . current Url Ġ= Ġconfiguration . web Url ĊĊĠĠĠĠĠĠĠ Ġconfigure Camera () ĊĠĠĠĠĠĠĠ Ġstart Foreground Service () ĊĠĠĠĠĠĠĠ Ġconfigure Mqtt () ĊĠĠĠĠĠĠĠ Ġconfigure Power Options () ĊĠĠĠĠĠĠĠ Ġstart Http () ĊĠĠĠĠĠĠĠ Ġconfigure Audio Player () ĊĠĠĠĠĠĠĠ Ġconfigure Text ToS peech () ĊĠĠĠĠĠĠĠ Ġstart Sensors () ĊĠĠĠĠĠĠĠ Ġclear Database Period ically () ĊĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= ĠIntent Filter () ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( BRO ADCAST _ EVENT _ URL _ CHANGE ) ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( BRO ADCAST _ EVENT _ SCREEN _ TO UCH ) ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( BRO ADCAST _ EVENT _ ALARM _ MODE ) ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( BRO ADCAST _ EVENT _ USER _ IN ACTIVE ) ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( BRO ADCAST _ EVENT _ PUBL ISH _ PAN IC ) ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( Intent . ACTION _ SCREEN _ ON ) ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( Intent . ACTION _ SCREEN _ OFF ) ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( Intent . ACTION _ USER _ PRESENT ) ĊĊĠĠĠĠĠĠĠ Ġlocal Broad Cast Manager Ġ= ĠLocal Broadcast Manager . getInstance ( this ) ĊĠĠĠĠĠĠĠ Ġlocal Broad Cast Manager ?. register Receiver ( m Broadcast Receiver , Ġfilter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġif Ġ(! dis posable . is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdis posable . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlocal Broad Cast Manager ?. unregister Receiver ( m Broadcast Receiver ) ĊĠĠĠĠĠĠĠ Ġmqtt Module ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Module Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcamera Reader ?. stop Camera () ĊĠĠĠĠĠĠĠ Ġsensor Reader . stop Read ings () ĊĠĠĠĠĠĠĠ Ġstop Http () ĊĠĠĠĠĠĠĠ Ġstop Power Options () ĊĠĠĠĠĠĠĠ Ġreconnect Handler . remove Callbacks ( restart MQ T TR un nable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ): ĠI Binder Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Bind ( intent ) ĊĠĠĠĠĠĠĠ Ġreturn Ġm Binder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġis Screen On : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpower Manager Ġ= Ġget System Service ( Context . POWER _ SERVICE ) Ġas ĠPower Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . KIT K AT _ WATCH Ġ&& Ġpower Manager . is Interactive Ġ|| ĠBuild . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . KIT K AT _ WATCH Ġ&& Ġpower Manager . is Screen On ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetState ( user Active : ĠBoolean ): ĠJSONObject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠ Ġstate . put ( STATE _ CURRENT _ URL , Ġcurrent Url ) ĊĠĠĠĠĠĠĠ Ġstate . put ( STATE _ SCREEN _ ON , Ġis Screen On ) ĊĠĠĠĠĠĠĠ Ġstate . put ( STATE _ BR IGHT NESS , Ġscreen Utils . getCurrent Screen Brightness ()) ĊĠĠĠĠĠĠĠ Ġstate . put ( STATE _ PRES ENCE , Ġuser Active . toString ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġstate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Foreground Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection LiveData Ġ= ĠConnection LiveData ( this ) ĊĠĠĠĠĠĠĠ Ġconnection LiveData ?. observe ( this , ĠObserver Ġ{ Ġconnected Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connected !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Network Connect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Network Disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġsend Service Started () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Network Connect () Ġ{ ĊĠĠĠĠĠĠĠ Ġmqtt Module ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Network . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . restart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhas Network . set ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Network Disconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġmqtt Module ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Network . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Connected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhas Network . set ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Network (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhas Network . get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Wake lock Timeout ") ĊĠĠĠ Ġprivate Ġfun Ġconfigure Power Options () Ġ{ ĊĠĠĠĠĠĠĠ Ġpartial Wake Lock ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Hel d ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . acquire ( 3 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwifi Lock ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Hel d ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . acquire () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey guard Lock ?. disable Key guard () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Dis abling Ġkey guard Ġdidn 't Ġwork ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Power Options () Ġ{ ĊĠĠĠĠĠĠĠ Ġpartial Wake Lock ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Hel d ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwifi Lock ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Hel d ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey guard Lock ?. reen able Key guard () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" En abling Ġkey guard Ġdidn 't Ġwork ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Sensors () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" sensors Enabled Ġ${ configuration . device Sensors }") ĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . device Sensors Ġ&& Ġmqtt Options . isValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" start Sensors ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Reader . start Read ings ( configuration . mqtt Sensor Frequency , Ġsensor Callback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconfigure Mqtt () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mqtt Module Ġ== Ġnull Ġ&& Ġmqtt Options . isValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Module Ġ= ĠMQTT Module ( this @ Alarm Panel Service . application Context , Ġmqtt Options , Ġthis @ Alarm Panel Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle . add Observer ( mqtt Module !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . publish Command ( COMMAND _ STATE , ĠgetState ( true ). toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon MQTT Connect () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . w (" on MQTT Connect ") ĊĠĠĠĠĠĠĠ Ġif Ġ( mqtt Alert Message Shown ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Alert Message () Ġ// Ġclear Ġany Ġdialog s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Alert Message Shown Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclear Face Detected () ĊĠĠĠĠĠĠĠ Ġclear Motion Detected () ĊĠĠĠĠĠĠĠ Ġmqtt Connected Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġmqtt Init Connection . set ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon MQTT Disconnect () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . w (" on MQTT Disconnect ") ĊĠĠĠĠĠĠĠ Ġhandle MQ T Disconnect Error () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon MQTT Exception ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . w (" on MQTT Exception : Ġ$ message ") ĊĠĠĠĠĠĠĠ Ġhandle MQ T Disconnect Error () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle MQ T Disconnect Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Network ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Connected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mqtt Init Connection . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Init Connection . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Sn ack Message ( getString ( R . string . error _ mqtt _ exception )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Alert Message Shown Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! mqtt Connecting ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreconnect Handler . post Delayed ( restart MQ T TR un nable , Ġ 3 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Connecting Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO Ġtest Ġif Ġpayload Ġis Ġjson Ġand Ġhand l ĊĠĠĠ Ġoverride Ġfun Ġon MQTT Message ( id : ĠString , Ġtopic : ĠString , Ġpayload : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . i (" on MQTT Message Ġtopic : Ġ$ topic ") ĊĠĠĠĠĠĠĠ Ġif Ġ( mqtt Options . get Alarm State Topic () Ġ== Ġtopic Ġ|| Ġmqtt Options . get Alarm Command Topic () Ġ== Ġtopic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠM qtt Utils . parse State FromJson ( payload ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelay Ġ= ĠM qtt Utils . parse Delay FromJson ( payload ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM qtt Utils . STATE _ ARM ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configuration . has System Alerts ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotifications . clear Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġpayload , ĠTYPE _ ALARM , Ġdelay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM qtt Utils . STATE _ DIS AR MED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configuration . has System Alerts ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotifications . clear Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġpayload , ĠTYPE _ ALARM , Ġdelay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM qtt Utils . STATE _ AR MED _ CUSTOM _ BY PASS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM qtt Utils . STATE _ AR MED _ AW AY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM qtt Utils . STATE _ AR MED _ N IGHT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM qtt Utils . STATE _ AR MED _ HOME Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġpayload , ĠTYPE _ ALARM , Ġdelay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ ARM _ CUSTOM _ BY PASS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ ARM _ N IGHT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ ARM _ AW AY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ ARM _ HOME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ DIS ARM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġpayload , ĠTYPE _ ALARM , Ġdelay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ TRIGGER ED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configuration . alarm Mode Ġ== ĠSTATE _ TRIGGER ED Ġ&& Ġconfiguration . has System Alerts ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotifications . create Alarm Notification ( getString ( R . string . text _ notification _ trigger _ title ), ĠgetString ( R . string . text _ notification _ trigger _ description )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġpayload , ĠTYPE _ ALARM , Ġdelay ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ PENDING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configuration . is Alarm Ar med Mode () Ġ&& Ġconfiguration . has System Alerts ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotifications . create Alarm Notification ( getString ( R . string . text _ notification _ entry _ title ), ĠgetString ( R . string . text _ notification _ entry _ description )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġpayload , ĠTYPE _ ALARM , Ġdelay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( mqtt Options . get Alarm Event Topic () Ġ== Ġtopic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Event ( id , Ġtopic , Ġpayload ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( topic . contains ( mqtt Options . get Alarm Sensors Topic ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Sensor ( topic , Ġpayload ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Command ( id , Ġtopic , Ġpayload ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpublish Alarm ( action : ĠString , Ġcode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmqtt Module ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . publish Alarm ( action , Ġcode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠCOMMAND _ DIS ARM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture Image Task () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPublish Ġcommand Ġwith Ġjson Ġformatted Ġpayload . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġpublish Command ( command : ĠString , Ġdata : ĠJSONObject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . publish Command ( command , Ġdata . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPublish Ġcommand Ġwith Ġdefault Ġpayload . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġpublish Command ( command : ĠString , Ġmessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmqtt Module ?. publish Command ( command , Ġmessage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConfigure Ġthe Ġcamera Ġwith Ġmultiple Ġdetection s Ġ( face , Ġmotion , Ġqr code , Ġm jpeg Ġstream ) Ġor ĊĠĠĠĠ Ġ* Ġjust Ġset Ġup Ġthe Ġcamera Ġto Ġtake Ġa Ġcapture Ġa Ġphoto Ġon Ġalarm Ġdis arm ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġconfigure Camera () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . has Camera Det e ctions () Ġ|| Ġconfiguration . capture Camera Image ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Reader Ġ= ĠCamera Reader ( this . application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Reader ?. start Camera ( camera Detector Callback , Ġconfiguration ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconfigure Text ToS peech () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( text ToS peech Module Ġ== Ġnull Ġ&& ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech Module Ġ= ĠText ToS peech Module ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle . add Observer ( text ToS peech Module !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconfigure Audio Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġaudio Player Ġ= ĠMedia Player () ĊĠĠĠĠĠĠĠ Ġaudio Player ?. setOn Prepared Listener Ġ{ Ġaudio Player Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Player Busy Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Player . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaudio Player ?. setOn Completion Listener Ġ{ Ġaudio Player Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( audio Player . is Playing ) Ġ{ Ġ Ġ// Ġshould Ġnever Ġhappen , Ġjust Ġin Ġcase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Player . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Player . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Player Busy Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaudio Player !!. setOn Error Listener Ġ{ Ġaudio Player , Ġi , Ġi 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Player Busy Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Http () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( http Server Ġ== Ġnull Ġ&& Ġconfiguration . http MJ PEG Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Server Ġ= ĠAsync HttpServer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configuration . http MJ PEG Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart MJ PEG () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Server ?. addAction (" GET ", Ġ"/ camera / stream ") Ġ{ Ġ_, Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart MJ PEG ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Tim ber . i (" Enabled ĠM JPEG ĠEndpoint ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Server ?. addAction ("* ", Ġ"* ") Ġ{ Ġrequest , Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Unhandled ĠRequest ĠAr rived ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . send ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Server ?. listen ( Async Server . getDefault (), Ġconfiguration . http Port ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Http () Ġ{ ĊĠĠĠĠĠĠĠ Ġhttp Server ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop MJ PEG () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Server Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart MJ PEG () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Reader ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get J peg (). observe ( this , ĠObserver Ġ{ Ġj peg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mJ peg Sockets . size Ġ> Ġ 0 Ġ&& Ġj peg Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġm J peg Sockets . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġm J peg Sockets [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbb Ġ= ĠByteBuffer List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s . isOpen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbb . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbb . add ( ByteBuffer . wrap ("-- jpg boundary \ r \ n Content - Type : Ġimage / jpeg \ r \ n ". toByteArray ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbb . add ( ByteBuffer . wrap ((" Content - Length : Ġ" Ġ+ Ġj peg . size Ġ+ Ġ"\ r \ n \ r \ n "). toByteArray ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbb . add ( ByteBuffer . wrap ( jpeg )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbb . add ( ByteBuffer . wrap ("\ r \ n ". toByteArray ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . write ( bb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm J peg Sockets . remove At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Tim ber . i (" MJ PEG ĠSession ĠCount Ġis Ġ" Ġ+ Ġm J peg Sockets . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop MJ PEG () Ġ{ ĊĠĠĠĠĠĠĠ Ġm J peg Sockets . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart MJ PEG ( response : ĠAsync HttpServer Response ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mJ peg Sockets . size Ġ< Ġconfiguration . http MJ PEG Max Streams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . headers . add (" Cache - Control ", Ġ" no - cache ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . headers . add (" Connection ", Ġ" close ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . headers . add (" Pr agma ", Ġ" no - cache ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . set ContentType (" multipart / x - mixed - replace ; Ġboundary = -- jpg boundary ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . write Head () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm J peg Sockets . add ( response ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . send (" Max Ġstreams Ġexceeded ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . end () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Command ( id : ĠString , Ġtopic : ĠString , Ġcommand Json : ĠJSONObject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpayload Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( command Json . has ( COMMAND _ WAKE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Ġ= Ġcommand Json . getString ( COMMAND _ WAKE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġcommand Json . toString (), ĠTYPE _ COMMAND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Screen On ( AW A KE _ TIME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( command Json . has ( COMMAND _ DASH BOARD )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Ġ= Ġcommand Json . getString ( COMMAND _ DASH BOARD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġcommand Json . toString (), ĠTYPE _ COMMAND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdashboard Ġ= Ġpayload . toInt OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdashboard ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbrowse Dashboard ( dashboard Ġ= Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( command Json . has ( COMMAND _ AUDIO )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Ġ= Ġcommand Json . getString ( COMMAND _ AUDIO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġcommand Json . toString (), ĠTYPE _ COMMAND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Audio ( payload ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( command Json . has ( COMMAND _ SPE AK )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Ġ= Ġcommand Json . getString ( COMMAND _ SPE AK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġcommand Json . toString (), ĠTYPE _ COMMAND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeak Message ( payload ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( command Json . has ( COMMAND _ NOTIFICATION )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Ġ= Ġcommand Json . getString ( COMMAND _ NOTIFICATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġcommand Json . toString (), ĠTYPE _ COMMAND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= ĠgetString ( R . string . notification _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotifications . create Alarm Notification ( title , Ġpayload ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( command Json . has ( COMMAND _ ALERT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Ġ= Ġcommand Json . getString ( COMMAND _ ALERT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġcommand Json . toString (), ĠTYPE _ COMMAND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Alert Message ( payload ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( command Json . has ( COMMAND _ CAPTURE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Ġ= Ġcommand Json . getString ( COMMAND _ CAPTURE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġcommand Json . toString (), ĠTYPE _ COMMAND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture Image Task () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( command Json . has ( COMMAND _ WE ATHER ) Ġ&& Ġconfiguration . show Weather Module ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Ġ= Ġcommand Json . getString ( COMMAND _ WE ATHER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Weather ( payload ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( command Json . has ( COMMAND _ SUN )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Ġ= Ġcommand Json . getString ( COMMAND _ SUN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( payload . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Sun ( payload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" JSON ĠError : Ġ" Ġ+ Ġex . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Invalid ĠJSON Ġpassed Ġas Ġa Ġcommand : Ġ" Ġ+ Ġcommand Json . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbrowse Dashboard ( dashboard : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" browse Url ") ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( BRO ADCAST _ DASH BOARD ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( BRO ADCAST _ DASH BOARD , Ġdashboard ) ĊĠĠĠĠĠĠĠ Ġval Ġbm Ġ= ĠLocal Broadcast Manager . getInstance ( application Context ) ĊĠĠĠĠĠĠĠ Ġbm . send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠProcess Ġthe Ġstatus Ġstate ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġprocesses Ġevents Ġfor Ġerror Ġand Ġalternative Ġstate Ġpublishing . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġprocess Event ( id : ĠString , Ġtopic : ĠString , Ġpayload : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" process Event ") ĊĠĠĠĠĠĠĠ Ġif Ġ( Mqtt Utils . is JSON Valid ( payload )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠM qtt Utils . parse JSONObject OrEmpty ( payload ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( json . has (" event ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent : ĠString Ġ= Ġjson . getString (" event "). toLowerCase ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEVENT _ NO _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Sn ack Message ( getString ( R . string . error _ no _ code )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġevent , ĠTYPE _ EVENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEVENT _ SYSTEM _ DISABLED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Alert Message ( getString ( R . string . error _ system _ disabled )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġevent , ĠTYPE _ EVENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEVENT _ COMMAND _ NOT _ ALLOWED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Sn ack Message ( getString ( R . string . error _ command _ not _ allowed )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġevent , ĠTYPE _ EVENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEVENT _ INVALID _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Sn ack Message ( getString ( R . string . error _ invalid _ code )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġevent , ĠTYPE _ EVENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEVENT _ UNKNOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Alert Message ( getString ( R . string . error _ unknown )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġevent , ĠTYPE _ EVENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEVENT _ ARM _ FAILED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Alert Message ( getString ( R . string . error _ arm _ failed )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġevent , ĠTYPE _ EVENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġhack Ġfor Ġevents Ġfrom Ġal ar mo Ġwith Ġno Ġdelay Ġvalues , Ġthey Ġshould Ġbe Ġignored Ġand Ġonly Ġuse Ġalarm Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ ARM _ HOME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ ARM _ AW AY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ ARM _ N IGHT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ ARM _ CUSTOM _ BY PASS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelay Ġ= ĠM qtt Utils . parse Delay FromJson ( payload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( delay Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , Ġtopic , Ġevent , ĠTYPE _ ALARM , Ġdelay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġthis Ġis Ġa Ġhack Ġfor Ġal ar mo Ġbecause Ġdoes Ġnot Ġappend Ġdelay Ġtime Ġto Ġpending ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEVENT _ TRIGGER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelay Ġ= ĠM qtt Utils . parse Delay FromJson ( payload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( id , ĠSTATE _ PENDING , Ġevent , ĠTYPE _ EVENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Trigger Event ( delay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Command ( id : ĠString , Ġtopic : ĠString , Ġcommand : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" process Command ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Command ( id , Ġtopic , ĠJSONObject ( command )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" JSON ĠError : Ġ" Ġ+ Ġex . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Invalid ĠJSON Ġpassed Ġas Ġa Ġcommand : Ġ$ command ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro cesses Ġthe Ġremote Ġconfig Ġfile Ġfrom Ġthe Ġpayload Ġas Ġjson Ġand Ġsets Ġthe Ġvalues ĊĠĠĠĠ Ġ* Ġon Ġthe Ġmqtt Ġconfiguration . ĠA Ġrestart Ġis Ġmost Ġlikely Ġneeded Ġto Ġset Ġall Ġthe ĊĠĠĠĠ Ġ* Ġremote Ġconfig Ġchanges . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ{" version ": Ġ 1 , ĊĠĠĠĠ Ġ* Ġ" code _ arm _ required ": Ġfalse , ĊĠĠĠĠ Ġ* Ġ" code _ dis arm _ required ": Ġtrue , ĊĠĠĠĠ Ġ* Ġ" state _ topic ": Ġ" home / alarm ", ĊĠĠĠĠ Ġ* Ġ" status _ topic ": Ġ" home / alarm / status ", ĊĠĠĠĠ Ġ* Ġ" command _ topic ": Ġ" home / alarm / set ", ĊĠĠĠĠ Ġ* Ġ" delay _ times ": Ġ{" dis ar med ": Ġ 2 0 , Ġ" ar med _ away ": Ġ 2 0 , Ġ" ar med _ home ": Ġ 0 , Ġ" ar med _ night ": Ġ 2 0 }, ĊĠĠĠĠ Ġ* Ġ" arm ing _ times ": Ġ{" ar med _ away ": Ġ 3 0 , Ġ" ar med _ home ": Ġ 0 , Ġ" ar med _ night ": Ġ 3 0 }, ĊĠĠĠĠ Ġ* Ġ" trigger _ times ": Ġ{" dis ar med ": Ġ 0 , Ġ" ar med _ away ": Ġ 4 , Ġ" ar med _ home ": Ġ 4 , Ġ" ar med _ night ": Ġ 4 }} ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġprocess Config ( payload : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Json Ġ= ĠJSONObject ( payload ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Json . has (" state _ topic ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Options . set Alarm Topic ( config Json . getString (" state _ topic ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Json . has (" command _ topic ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Options . set Command Topic ( config Json . getString (" command _ topic ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Json . has (" status _ topic ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Options . set Alarm Event Topic Ġ= Ġconfig Json . getString (" status _ topic ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Json . has (" code _ arm _ required ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Options . require Code For Ar ming Ġ= Ġconfig Json . getBoolean (" code _ arm _ required ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Json . has (" code _ dis arm _ required ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Options . require Code For Dis arm ing Ġ= Ġconfig Json . getBoolean (" code _ dis arm _ required ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Json . has (" arm ing _ times ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġar ming Times Json Ġ= Ġconfig Json . getJSONObject (" arm ing _ times ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arm ing Times Json . has (" ar med _ away ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Options . remote Ar ming Away Time Ġ= Ġconfig Json . getInt (" ar med _ away ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arm ing Times Json . has (" ar med _ home ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Options . remote Ar ming Home Time Ġ= Ġconfig Json . getInt (" ar med _ home ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arm ing Times Json . has (" ar med _ night ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmqtt Options . remote Ar ming Night Time Ġ= Ġconfig Json . getInt (" ar med _ night ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" JSON ĠError : Ġ" Ġ+ Ġex . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Invalid Ġconfig ĠJSON : Ġ$ payload ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Sn ack Message ( getString ( R . string . toast _ config _ invalid )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay Audio ( audio Url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġis Playing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġaudio Player ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġit . is Playing ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( audio Player Busy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" audio Player : ĠC ancell ing Ġall Ġprevious Ġbuffers Ġbecause Ġnew Ġaudio Ġwas Ġrequested ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Player ?. reset () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" audio Player : ĠSto pping Ġall Ġmedia Ġplayback Ġbecause Ġnew Ġaudio Ġwas Ġrequested ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Player ?. stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Player ?. reset () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaudio Player Busy Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Player ?. set DataSource ( audio Url ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" audio Player : ĠAn Ġerror Ġoccurred Ġwhile Ġpre paring Ġaudio Ġ(" Ġ+ Ġe . message Ġ+ Ġ") ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Player Busy Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Player ?. reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠTim ber . d (" audio Player : ĠBuffer ing Ġ$ audio Url ") ĊĠĠĠĠĠĠĠ Ġaudio Player ?. prepare Async () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġspeak Message ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" speak Message Ġ$ message ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech Module ?. speak Text ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Wake lock Timeout ") ĊĠĠĠ Ġprivate Ġfun Ġswitch Screen On ( aw ake Time : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpartial Wake Lock ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Hel d ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . acquire ( aw ake Time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . is Hel d ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . acquire ( aw ake Time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsend Wake Screen () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpublish Motion Detected () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelay Ġ= Ġ( configuration . motion Reset Time Ġ* Ġ 1 0 0 0 ). to Long () ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠ Ġdata . put ( VALUE , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġmotion Detected Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġpublish Command ( COMMAND _ SENSOR _ MOT ION , Ġdata ) ĊĠĠĠĠĠĠĠ Ġmotion Clear Handler . post Delayed ({ Ġclear Motion Detected () Ġ}, Ġdelay ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpublish Face Detected () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠ Ġdata . put ( VALUE , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġface Detected Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġpublish Command ( COMMAND _ SENSOR _ FACE , Ġdata ) ĊĠĠĠĠĠĠĠ Ġface Clear Handler . post Delayed ({ Ġclear Face Detected () Ġ}, Ġ 1 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Motion Detected () Ġ{ ĊĠĠĠĠĠĠĠ Ġmotion Detected Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠ Ġdata . put ( VALUE , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġpublish Command ( COMMAND _ SENSOR _ MOT ION , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Face Detected () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠ Ġdata . put ( VALUE , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġface Detected Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġpublish Command ( COMMAND _ SENSOR _ FACE , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Qr Code Read () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( qr Code Read ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqr Code Read Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpublish Qr Code ( data : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! qr Code Read ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj data Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj data . put ( VALUE , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqr Code Read Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Toast Message ( getString ( R . string . toast _ qr _ code _ read )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Command ( COMMAND _ SENSOR _ QR _ CODE , Ġj data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqr Code Clear Handler . post Delayed ({ Ġclear Qr Code Read () Ġ}, Ġ 5 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinsert Sun ( payload : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdis posable . add ( Comp letable . from Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsun Ġ= ĠSun () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsun . sun Ġ= Ġpayload ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsun . createdAt Ġ= ĠDate Utils . generate CreatedAt Date () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsun Dao . update Item ( sun ) ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . computation ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġerror Ġ-> ĠTim ber . e (" Database Ġerror " Ġ+ Ġerror . message ) Ġ})) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinsert Weather ( payload : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" insert Weather ") ĊĠĠĠĠĠĠĠ Ġval Ġgson Ġ= ĠGson Builder (). serialize Null s (). create () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweather Ġ= Ġgson . fromJson < Weather >( payload , ĠWeather :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdis posable . add ( Comp letable . from Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweather . createdAt Ġ= ĠDate Utils . generate CreatedAt Date () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweather Dao . update Item ( weather ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . computation ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġerror Ġ-> ĠTim ber . e (" Weather Ġinsert Ġerror " Ġ+ Ġerror . message ) Ġ})) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Weather Ġparsing Ġerror " Ġ+ Ġerror . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWe Ġwant Ġto Ġclean Ġthe Ġdatabase Ġperiodically Ġso Ġit Ġdoes Ġnot Ġgrow Ġtoo Ġlarge ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġclear Database Period ically () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠHandler () ĊĠĠĠĠĠĠĠ Ġval Ġrunnable : ĠRunnable Ġ= Ġobject Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage DataSource . delete All Messages () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġhandle Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Delayed ( this , Ġ 2 5 9 2 0 0 0 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhandler . post ( run nable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParses Ġand Ġupdates Ġexisting Ġsensor Ġin Ġthe Ġdatabase Ġwith Ġnew Ġpayload . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġprocess Sensor ( topic : ĠString , Ġpayload : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" insert Message Ġtopic : Ġ$ topic ") ĊĠĠĠĠĠĠĠ ĠTim ber . d (" insert Message Ġpayload : Ġ$ payload ") ĊĠĠĠĠĠĠĠ Ġval Ġsensor Topic Ġ= Ġtopic . replace ( mqtt Options . get Alarm Sensors Topic () Ġ+ Ġ"/", Ġ"", Ġtrue ) ĊĠĠĠĠĠĠĠ Ġdis posable . add ( get Sensor ( sensor Topic ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Sensor ( payload , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Sensor ( payload : ĠString , Ġsensor : ĠSensor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdis posable . add ( Comp letable . from Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor . payload Ġ= Ġpayload . toLowerCase ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor DataSource . insert Item ( sensor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . computation ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ-> ĠTim ber . e (" Database Ġerror " Ġ+ Ġerror . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Sensor ( topic : ĠString ): ĠMaybe < Sensor > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsensor DataSource . get Sensor By Topic ( topic ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinsert Message ( message Id : ĠString , Ġtopic : ĠString , Ġpayload : ĠString , Ġtype : ĠString , Ġdelay : ĠInt Ġ= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" insert Message Ġtopic : Ġ$ topic ") ĊĠĠĠĠĠĠĠ ĠTim ber . d (" insert Message Ġpayload : Ġ$ payload ") ĊĠĠĠĠĠĠĠ ĠTim ber . d (" insert Message Ġdelay : Ġ$ delay ") ĊĠĠĠĠĠĠĠ Ġdis posable . add ( Comp letable . from Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcreatedAt Ġ= ĠDate Utils . generate CreatedAt Date () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠMessage Mqtt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . type Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . topic Ġ= Ġtopic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . payload Ġ= Ġpayload . toLowerCase ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . message Id Ġ= ĠmessageId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . message Id Ġ= ĠmessageId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . delay Ġ= Ġdelay ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . createdAt Ġ= ĠcreatedAt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage DataSource . insert Message Transaction ( message ) ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . computation ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġerror Ġ-> ĠTim ber . e (" Database Ġerror " Ġ+ Ġerror . message ) Ġ})) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCapture Ġand Ġsend Ġimage Ġif Ġuser Ġhas Ġsetup Ġthis Ġfeature . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcapture Image Task () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . capture Camera Image ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Task Ġ= ĠBitmap Task ( object Ġ: ĠOn Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete ( bitmap : ĠBitmap ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Capt ured Image ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Reader ?. get J peg ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Task . execute ( it . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Alert Message ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" send Alert Message ") ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( BRO ADCAST _ ALERT _ MESSAGE ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( BRO ADCAST _ ALERT _ MESSAGE , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġval Ġbm Ġ= ĠLocal Broadcast Manager . getInstance ( application Context ) ĊĠĠĠĠĠĠĠ Ġbm . send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Sn ack Message ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" send Sn ack Message ") ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( BRO ADCAST _ SN ACK _ MESSAGE ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( BRO ADCAST _ SN ACK _ MESSAGE , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġval Ġbm Ġ= ĠLocal Broadcast Manager . getInstance ( application Context ) ĊĠĠĠĠĠĠĠ Ġbm . send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Service Started () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" clear Alert Message ") ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( BRO ADCAST _ SERVICE _ STARTED ) ĊĠĠĠĠĠĠĠ Ġval Ġbm Ġ= ĠLocal Broadcast Manager . getInstance ( application Context ) ĊĠĠĠĠĠĠĠ Ġbm . send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Alert Message () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" clear Alert Message ") ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( BRO ADCAST _ CLEAR _ ALERT _ MESSAGE ) ĊĠĠĠĠĠĠĠ Ġval Ġbm Ġ= ĠLocal Broadcast Manager . getInstance ( application Context ) ĊĠĠĠĠĠĠĠ Ġbm . send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbroadcast Alarm Command ( command : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( BRO ADCAST _ ALARM _ COMMAND ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( EXTRA _ ALARM _ COMMAND , Ġcommand ) ĊĠĠĠĠĠĠĠ Ġval Ġbm Ġ= ĠLocal Broadcast Manager . getInstance ( application Context ) ĊĠĠĠĠĠĠĠ Ġbm . send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Trigger Event ( delay : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( BRO ADCAST _ TRIGGER _ EVENT ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( EXTRA _ DELAY _ TIME , Ġdelay ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( EXTRA _ STATE , ĠM qtt Utils . STATE _ PENDING ) ĊĠĠĠĠĠĠĠ Ġval Ġbm Ġ= ĠLocal Broadcast Manager . getInstance ( application Context ) ĊĠĠĠĠĠĠĠ Ġbm . send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Wake Screen () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" send Wake Screen ") ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( BRO ADCAST _ SCREEN _ WAKE ) ĊĠĠĠĠĠĠĠ Ġval Ġbm Ġ= ĠLocal Broadcast Manager . getInstance ( application Context ) ĊĠĠĠĠĠĠĠ Ġbm . send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Toast Message ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" send Toast Message ") ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( BRO ADCAST _ TO AST _ MESSAGE ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( BRO ADCAST _ TO AST _ MESSAGE , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġval Ġbm Ġ= ĠLocal Broadcast Manager . getInstance ( application Context ) ĊĠĠĠĠĠĠĠ Ġbm . send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġreceive Ġmessages Ġfrom Ġthe Ġactivity ĊĠĠĠ Ġprivate Ġval Ġm Broadcast Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( BRO ADCAST _ EVENT _ URL _ CHANGE Ġ== Ġintent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Url Ġ= Ġintent . getString Extra ( BRO ADCAST _ EVENT _ URL _ CHANGE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Alarm Panel Service . publish Command ( COMMAND _ STATE , ĠgetState ( user Presence . get ()). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Intent . ACTION _ SCREEN _ OFF Ġ== Ġintent . action Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ== ĠIntent . ACTION _ SCREEN _ ON Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ== ĠIntent . ACTION _ USER _ PRESENT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent . action Ġ== ĠIntent . ACTION _ USER _ PRESENT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Presence . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Alarm Panel Service . publish Command ( COMMAND _ STATE , ĠgetState ( user Presence . get ()). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( BRO ADCAST _ EVENT _ SCREEN _ TO UCH Ġ== Ġintent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Presence . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Alarm Panel Service . publish Command ( COMMAND _ STATE , ĠgetState ( user Presence . get ()). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( BRO ADCAST _ EVENT _ USER _ IN ACTIVE Ġ== Ġintent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Presence . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Alarm Panel Service . publish Command ( COMMAND _ STATE , ĠgetState ( user Presence . get ()). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( BRO ADCAST _ EVENT _ ALARM _ MODE Ġ== Ġintent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalarm Mode Ġ= Ġintent . getString Extra ( BRO ADCAST _ EVENT _ ALARM _ MODE ). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġalarm Code Ġ= Ġintent . getString Extra ( BRO ADCAST _ EVENT _ ALARM _ CODE ). or Empty (). toInt OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( alarm Code Ġ== Ġnull ) Ġalarm Code Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Alarm ( alarm Mode , Ġalarm Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( mqtt Options . use Remote Code . not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Alarm Command ( alarm Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( BRO ADCAST _ EVENT _ PUBL ISH _ PAN IC Ġ== Ġintent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġintent . getString Extra ( BRO ADCAST _ EVENT _ PUBL ISH _ PAN IC ). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġalarm Code Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mqtt Options . use Remote Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Code Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Alarm ( mode , Ġalarm Code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsensor Callback Ġ= Ġobject Ġ: ĠSensor Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpublish Sensor Data ( sensor Name : ĠString , Ġsensor Data : ĠJSONObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Command ( COMMAND _ SENSOR _ PREFIX Ġ+ Ġsensor Name , Ġsensor Data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcamera Detector Callback Ġ= Ġobject Ġ: ĠCamera Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Detector Error () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Toast Message ( getString ( R . string . error _ missing _ vision _ lib )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Camera Error () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Toast Message ( getString ( R . string . toast _ camera _ source _ error )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Motion Detected () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! motion Detected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Motion Ġdetected Ġcamera Motion Wake Ġ${ configuration . camera Motion Wake }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configuration . camera Motion Wake ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Screen On ( AW A KE _ TIME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Motion Detected () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Too Dark () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTim ber . i (" Too Ġdark Ġfor Ġmotion Ġdetection ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Face Detected () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! face Detected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Face Ġdetected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configuration . camera Face Wake ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Screen On ( AW A KE _ TIME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Face Detected () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon QR Code ( data : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" QR ĠCode ĠReceived : Ġ$ data ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Toast Message ( getString ( R . string . toast _ qr _ code _ read )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Qr Code ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Capt ured Image ( bitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . has Mail Gun Credentials ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemail Image ( bitmap ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . has Telegram Credentials ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Telegram ( bitmap ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Telegram ( bitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" send Telegram ") ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġconfiguration . telegram Token ĊĠĠĠĠĠĠĠ Ġval Ġchat Id Ġ= Ġconfiguration . telegram Chat Id ĊĠĠĠĠĠĠĠ Ġval Ġobservable Ġ= ĠObservable . create Ġ{ Ġemitter : ĠObservable Emitter < Any > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= ĠTelegram Module ( this @ Alarm Panel Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . email Image ( token , Ġchat Id , Ġbitmap , Ġobject Ġ: ĠTelegram Module . Callback Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onNext ( true ) Ġ Ġ// ĠPass Ġon Ġthe Ġdata Ġto Ġsubscriber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Exception ( message : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( Throwable ( message )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdis posable . add ( observable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . new Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ ĠTim ber . d (" Telegram ĠMessage Ġposted Ġsuccessfully !"); Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ Ġthrowable Ġ-> ĠTim ber . e (" Telegram ĠMessage Ġerror : Ġ" Ġ+ Ġthrowable . message ); Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġemail Image ( bitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdomain Ġ= Ġconfiguration . get Mail Gun Url () ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġconfiguration . get Mail Gun ApiKey () ĊĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġconfiguration . get Mail From () ĊĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġconfiguration . get Mail To () ĊĠĠĠĠĠĠĠ Ġval Ġobservable Ġ= ĠObservable . create Ġ{ Ġemitter : ĠObservable Emitter < Any > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmail Gun Module Ġ= ĠMail Gun Module ( this @ Alarm Panel Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Subject Ġ= ĠgetString ( R . string . text _ camera _ image _ subject , Ġ"< $ from >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmail Gun Module . email Image ( domain !! , Ġkey !! , Ġfrom Subject , Ġto !! , Ġbitmap , Ġobject Ġ: ĠMail Gun Module . Callback Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onNext ( true ) Ġ Ġ// ĠPass Ġon Ġthe Ġdata Ġto Ġsubscriber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Exception ( message : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( Throwable ( message )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUn deliver able Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdis posable . add ( observable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . new Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ ĠTim ber . d (" Image Ġposted Ġsuccessfully !"); Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ Ġthrowable Ġ-> ĠTim ber . e (" Image Ġerror : Ġ" Ġ+ Ġthrowable . message ); Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Toast Message ( getString ( R . string . error _ mail gun _ credentials )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Complete Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠonComplete ( bitmap : ĠBitmap ?) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvert Ġbyte Ġarray Ġto Ġbitmap Ġfor Ġdis ar med Ġimage ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠBitmap Task ( private Ġval ĠonComplete Listener : ĠOn Complete Listener ) Ġ: ĠAsync Task < Any , ĠVoid , ĠBitmap >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġparams : Ġkotlin . Any ): ĠBitmap ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Cancelled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠbyteArray Ġ= Ġparams [ 0 ] Ġas ĠByteArray ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠBitmap Factory . decode ByteArray ( byteArray , Ġ 0 , ĠbyteArray . size ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbitmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Post Execute ( result : ĠBitmap ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Post Execute ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Cancelled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete Listener . onComplete ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbring Application To Foreground IfNeeded () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! Lifecycle Handler . is Application In Foreground ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" br ing Application To Foreground IfNeeded ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (" intent . alarm . action ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . component Ġ= ĠComponent Name ( this @ Alarm Panel Service . packageName , ĠMainActivity :: class . java . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ SINGLE _ TOP ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠA WAKE _ TIME : ĠLong Ġ= Ġ 3 0 0 0 0 Ġ// Ġ 3 0 ĠSE CON DS ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠON GO ING _ NOTIFICATION _ ID Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ EVENT _ PUBL ISH _ PAN IC Ġ= Ġ" BRO ADCAST _ EVENT _ PUBL ISH _ ALERT " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ EVENT _ URL _ CHANGE Ġ= Ġ" BRO ADCAST _ EVENT _ URL _ CHANGE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ EVENT _ SCREEN _ TO UCH Ġ= Ġ" BRO ADCAST _ EVENT _ SCREEN _ TO UCH " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ EVENT _ USER _ IN ACTIVE Ġ= Ġ" BRO ADCAST _ EVENT _ USER _ IN ACTIVE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ EVENT _ ALARM _ MODE Ġ= Ġ" BRO ADCAST _ EVENT _ ALARM _ MODE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ ALARM _ COMMAND Ġ= Ġ" BRO ADCAST _ ALARM _ COMMAND " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ TRIGGER _ EVENT Ġ= Ġ" BRO ADCAST _ TRIGGER _ EVENT " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ EVENT _ ALARM _ CODE Ġ= Ġ" BRO ADCAST _ EVENT _ ALARM _ CODE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ ALERT _ MESSAGE Ġ= Ġ" BRO ADCAST _ ALERT _ MESSAGE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ SN ACK _ MESSAGE Ġ= Ġ" BRO ADCAST _ SN ACK _ MESSAGE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ TO AST _ MESSAGE Ġ= Ġ" BRO ADCAST _ TO AST _ MESSAGE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ SCREEN _ WAKE Ġ= Ġ" BRO ADCAST _ SCREEN _ WAKE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ CLEAR _ ALERT _ MESSAGE Ġ= Ġ" BRO ADCAST _ CLEAR _ ALERT _ MESSAGE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ SERVICE _ STARTED Ġ= Ġ" BRO ADCAST _ SERVICE _ STARTED " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRO ADCAST _ DASH BOARD Ġ= Ġ" BRO ADCAST _ ACTION _ LOAD _ URL " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ DELAY _ TIME Ġ= Ġ" EXTRA _ DELAY _ TIME " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ ALARM _ COMMAND Ġ= Ġ" EXTRA _ ALARM _ COMMAND " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ STATE Ġ= Ġ" EXTRA _ STATE " ĊĠĠĠ Ġ} Ċ }