/* Ċ Ġ* ĠCopyright ĠÂ© ĠMar c ĠA uber er Ġ 2 0 1 7 Ġ- Ġ 2 0 2 0 . ĠAll Ġrights Ġreserved Ċ Ġ*/ Ċ Ċ package Ġcom . ch il lib its . pm app . tasks Ċ Ċ import Ġandroid . app widget . App Widget Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . AsyncTask Ċ import Ġandroid . util . Log Ċ import Ġcom . ch il lib its . pm app . model . Data Record Ċ import Ġcom . ch il lib its . pm app . model . Sensor Ċ import Ġcom . ch il lib its . pm app . network . Server Messaging Utils Ċ import Ġcom . ch il lib its . pm app . network . load Data Records Ċ import Ġcom . ch il lib its . pm app . tool . Constants Ċ import Ġcom . ch il lib its . pm app . tool . Notification Utils Ċ import Ġcom . ch il lib its . pm app . tool . Storage Utils Ċ import Ġcom . ch il lib its . pm app . tool . Tools Ċ import Ġcom . ch il lib its . pm app . widget . Widget Provider Large Ċ import Ġcom . ch il lib its . pm app . widget . Widget Provider Small Ċ import Ġcom . m rg ames 1 3 . j im do . fe inst a ub app . R Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠSync Task ( val Ġcontext : ĠContext , Ġprivate Ġval Ġlistener : ĠOn Task Complete Listener , Ġprivate Ġval Ġfrom Foreground : ĠBoolean ) Ġ: ĠAsync Task < Int , ĠInt , ĠBoolean >() Ġ{ ĊĊĠĠĠ Ġ// ĠVariables Ġas Ġobjects ĊĠĠĠ Ġprivate Ġval Ġsu Ġ= ĠStorage Utils ( context ) ĊĠĠĠ Ġprivate Ġval Ġsm u Ġ= ĠServer Messaging Utils ( context ) ĊĠĠĠ Ġprivate Ġval Ġnu Ġ= ĠNotification Utils ( context ) ĊĊĠĠĠ Ġ// ĠVariables ĊĠĠĠ Ġprivate Ġvar Ġlimit P 1 : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlimit P 2 : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlimit Temp : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlimit Hum idity : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlimit Pressure : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġselected Day Timestamp : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġsync Success Ġ= Ġtrue ĊĊĠĠĠ Ġ// ĠInterfaces ĊĠĠĠ Ġinterface ĠOn Task Complete Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Task Completed ( success : ĠBoolean ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġparams : ĠInt ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( Constants . TAG , Ġ" Sync Ġstarted Ġ... ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġcalendar ĊĠĠĠĠĠĠĠ Ġval Ġcalendar Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . HOUR _ OF _ DAY , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . MINUTE , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . SECOND , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . MILLI SECOND , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġselected Day Timestamp Ġ= Ġcalendar . time . time ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġinternet Ġis Ġavailable ĊĠĠĠĠĠĠĠ Ġif Ġ( sm u . is Internet Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġmax Ġlimit Ġfrom ĠSharedPreferences ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit P 1 Ġ= Ġsu . getString (" limit _ p 1 ", ĠConstants . DEFAULT _ P 1 _ LIMIT . toString ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit P 2 Ġ= Ġsu . getString (" limit _ p 2 ", ĠConstants . DEFAULT _ P 2 _ LIMIT . toString ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Temp Ġ= Ġsu . getString (" limit _ temp ", ĠConstants . DEFAULT _ TEMP _ LIMIT . toString ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Hum idity Ġ= Ġsu . getString (" limit _ humidity ", ĠConstants . DEFAULT _ HUM ID ITY _ LIMIT . toString ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Pressure Ġ= Ġsu . getString (" limit _ pressure ", ĠConstants . DEFAULT _ PRESS URE _ LIMIT . toString ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġtimestamps Ġfor Ġ' from ' Ġand Ġ' to ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġselected Day Timestamp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġselected Day Timestamp Ġ+ ĠTimeUnit . DAYS . to Millis ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsensors Ġ= ĠArrayList < Sensor >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensors . addAll ( su . all F avour ites ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensors . addAll ( su . all Own Sensors ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġsensors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLoad Ġexisting Ġrecords Ġfrom Ġthe Ġlocal Ġdatabase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrecords Ġ= Ġsu . load Records ( s . chip ID , Ġfrom , Ġto ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecords . sort () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLoad Ġrecords Ġfrom Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecords External Ġ= Ġload Data Records ( context , Ġs . chip ID , Ġif Ġ( records . size Ġ> Ġ 0 ) Ġrecords [ records . size Ġ- Ġ 1 ]. dateTime . time Ġ+ Ġ 1 0 0 0 Ġelse Ġfrom , Ġto ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecords External ?. let Ġ{ Ġrecords . addAll ( records External ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecords . sort () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( records . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDetect Ġa Ġbreak down ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( su . getBoolean (" notification _ break down ", Ġtrue ) Ġ&& Ġsu . is Sensor Existing ( s . chip ID ) Ġ&& ĠTools . is Measurement Break down ( su , Ġrecords )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( records External Ġ!= Ġnull Ġ&& Ġrecords External . size Ġ> Ġ 0 Ġ&& Ġ! su . getBoolean (" BD _" Ġ+ Ġs . chip ID )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnu . display Missing Measure ments Notification ( s . chip ID , Ġs . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Boolean (" BD _" Ġ+ Ġs . chip ID , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnu . cancel Notification ( Integer . parseInt ( s . chip ID ) Ġ* Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . remove Key (" BD _" Ġ+ Ġs . chip ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġaverage Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( su . getBoolean (" notification _ threshold ", Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaverage P 1 Ġ= Ġget P 1 Average ( records ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaverage P 2 Ġ= Ġget P 2 Average ( records ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaverage Temp Ġ= Ġget Temp Average ( records ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaverage Hum idity Ġ= Ġget Hum idity Average ( records ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaverage Pressure Ġ= Ġget Pressure Average ( records ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecords Ġ= Ġtrim Data Records To Sync Time ( s . chip ID , Ġrecords ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEvaluate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( r Ġin Ġrecords ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! from Foreground Ġ&& Ġ! su . getBoolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ p 1 _ ex ceeded ") Ġ&& Ġlimit P 1 Ġ> Ġ 0 Ġ&& Ġ( if Ġ( su . getBoolean (" notification _ average s ", Ġtrue )) Ġaverage P 1 Ġ> Ġlimit P 1 Ġelse Ġr . p 1 Ġ> Ġlimit P 1 ) Ġ&& Ġr . p 1 Ġ> Ġsu . getDouble ( selected Day Timestamp . toString () Ġ+ Ġ"_ p 1 _ max ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( Constants . TAG , Ġ" P 1 Ġlimit Ġexceeded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠP 1 Ġnotification ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnu . display Limit Exceeded Notification ( s . name Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġcontext . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . limit _ ex ceeded _ p 1 ), Ġs . chip ID , Ġr . dateTime . time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Double ( selected Day Timestamp . toString () Ġ+ Ġ"_ p 1 _ max ", Ġr . p 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Boolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ p 1 _ ex ceeded ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( limit P 1 Ġ> Ġ 0 Ġ&& Ġr . p 1 Ġ< Ġlimit P 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Boolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ p 1 _ ex ceeded ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! from Foreground Ġ&& Ġ! su . getBoolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ p 2 _ ex ceeded ") Ġ&& Ġlimit P 2 Ġ> Ġ 0 Ġ&& Ġ( if Ġ( su . getBoolean (" notification _ average s ", Ġtrue )) Ġaverage P 2 Ġ> Ġlimit P 2 Ġelse Ġr . p 2 Ġ> Ġlimit P 2 ) Ġ&& Ġr . p 2 Ġ> Ġsu . getDouble ( selected Day Timestamp . toString () Ġ+ Ġ"_ p 2 _ max ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( Constants . TAG , Ġ" P 2 Ġlimit Ġexceeded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠP 2 Ġnotification ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnu . display Limit Exceeded Notification ( s . name Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġcontext . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . limit _ ex ceeded _ p 2 ), Ġs . chip ID , Ġr . dateTime . time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Double ( selected Day Timestamp . toString () Ġ+ Ġ"_ p 2 _ max ", Ġr . p 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Boolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ p 2 _ ex ceeded ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( limit P 1 Ġ> Ġ 0 Ġ&& Ġr . p 1 Ġ< Ġlimit P 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Boolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ p 2 _ ex ceeded ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! from Foreground Ġ&& Ġ! su . getBoolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ temp _ ex ceeded ") Ġ&& Ġlimit Temp Ġ> Ġ 0 Ġ&& Ġ( if Ġ( su . getBoolean (" notification _ average s ", Ġtrue )) Ġaverage Temp Ġ> Ġlimit Temp Ġelse Ġr . temp Ġ> Ġlimit Temp ) Ġ&& Ġr . temp Ġ> Ġsu . getDouble ( selected Day Timestamp . toString () Ġ+ Ġ"_ temp _ max ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( Constants . TAG , Ġ" Temp Ġlimit Ġexceeded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTemperature Ġnotification ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnu . display Limit Exceeded Notification ( s . name Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġcontext . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . limit _ ex ceeded _ temp ), Ġs . chip ID , Ġr . dateTime . time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Double ( selected Day Timestamp . toString () Ġ+ Ġ"_ temp _ max ", Ġr . temp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Boolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ temp _ ex ceeded ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( limit P 1 Ġ> Ġ 0 Ġ&& Ġr . p 1 Ġ< Ġlimit P 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Boolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ temp _ ex ceeded ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! from Foreground Ġ&& Ġ! su . getBoolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ humidity _ ex ceeded ") Ġ&& Ġlimit Hum idity Ġ> Ġ 0 Ġ&& Ġ( if Ġ( su . getBoolean (" notification _ average s ", Ġtrue )) Ġaverage Hum idity Ġ> Ġlimit Hum idity Ġelse Ġr . humidity Ġ> Ġlimit Hum idity ) Ġ&& Ġr . humidity Ġ> Ġsu . getDouble ( selected Day Timestamp . toString () Ġ+ Ġ"_ humidity _ max ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( Constants . TAG , Ġ" Hum idity Ġlimit Ġexceeded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHum idity Ġnotification ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnu . display Limit Exceeded Notification ( s . name Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġcontext . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . limit _ ex ceeded _ humidity ), Ġs . chip ID , Ġr . dateTime . time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Double ( selected Day Timestamp . toString () Ġ+ Ġ"_ humidity _ max ", Ġr . humidity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Boolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ humidity _ ex ceeded ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( limit P 1 Ġ> Ġ 0 Ġ&& Ġr . p 1 Ġ< Ġlimit P 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Boolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ humidity _ ex ceeded ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! from Foreground Ġ&& Ġ! su . getBoolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ pressure _ ex ceeded ") Ġ&& Ġlimit Pressure Ġ> Ġ 0 Ġ&& Ġ( if Ġ( su . getBoolean (" notification _ average s ", Ġtrue )) Ġaverage Pressure Ġ> Ġlimit Pressure Ġelse Ġr . pressure Ġ> Ġlimit Pressure ) Ġ&& Ġr . humidity Ġ> Ġsu . getDouble ( selected Day Timestamp . toString () Ġ+ Ġ"_ pressure _ max ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( Constants . TAG , Ġ" Pressure Ġlimit Ġexceeded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPress ure Ġnotification ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnu . display Limit Exceeded Notification ( s . name Ġ+ Ġ" Ġ- Ġ" Ġ+ Ġcontext . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . limit _ ex ceeded _ pressure ), Ġs . chip ID , Ġr . dateTime . time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Double ( selected Day Timestamp . toString () Ġ+ Ġ"_ pressure _ max ", Ġr . temp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Boolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ pressure _ ex ceeded ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( limit P 1 Ġ> Ġ 0 Ġ&& Ġr . p 1 Ġ< Ġlimit P 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . put Boolean ( selected Day Timestamp . toString () Ġ+ Ġ"_ pressure _ ex ceeded ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRefresh Ġhome Ġscreen Ġwidgets ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Large Intent Ġ= ĠIntent ( context , ĠWidget Provider Large :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Large Intent . action Ġ= ĠApp Widget Manager . ACTION _ APP WIDGET _ UPDATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Large Intent . putExtra ( Constants . WIDGET _ LARGE _ EXTRA _ SENSOR _ ID , Ġs . chip ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . send Broadcast ( update Large Intent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Small Intent Ġ= ĠIntent ( context , ĠWidget Provider Small :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Small Intent . action Ġ= ĠApp Widget Manager . ACTION _ APP WIDGET _ UPDATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Small Intent . putExtra ( Constants . WIDGET _ SMALL _ EXTRA _ SENSOR _ ID , Ġs . chip ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . send Broadcast ( update Small Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Success Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsync Success ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget P 1 Average ( records : ĠArrayList < Data Record >) Ġ= Ġrecords . map Ġ{ Ġit . p 1 Ġ}. average () ĊĠĠĠ Ġprivate Ġfun Ġget P 2 Average ( records : ĠArrayList < Data Record >) Ġ= Ġrecords . map Ġ{ Ġit . p 2 Ġ}. average () ĊĠĠĠ Ġprivate Ġfun Ġget Temp Average ( records : ĠArrayList < Data Record >) Ġ= Ġrecords . map Ġ{ Ġit . temp Ġ}. average () ĊĠĠĠ Ġprivate Ġfun Ġget Hum idity Average ( records : ĠArrayList < Data Record >) Ġ= Ġrecords . map Ġ{ Ġit . humidity Ġ}. average () ĊĠĠĠ Ġprivate Ġfun Ġget Pressure Average ( records : ĠArrayList < Data Record >) Ġ= Ġrecords . map Ġ{ Ġit . pressure Ġ}. average () ĊĊĠĠĠ Ġprivate Ġfun Ġtrim Data Records To Sync Time ( chip Id : ĠString , Ġall Records : ĠList < Data Record >): ĠArrayList < Data Record > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġlast Ġexecution Ġtime ĊĠĠĠĠĠĠĠ Ġval Ġlast Record Ġ= Ġsu . getLong ("${ chip Id }_ Last Record ", ĠSystem . currentTimeMillis ()) ĊĠĠĠĠĠĠĠ Ġval Ġrecords Ġ= Ġall Records . filter Ġ{ Ġit . dateTime . time Ġ> Ġlast Record Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSave Ġexecution Ġtime ĊĠĠĠĠĠĠĠ Ġif Ġ( all Records . isNotEmpty ()) Ġsu . put Long ("${ chip Id }_ Last Record ", Ġall Records [ all Records . size Ġ- Ġ 1 ]. dateTime . time ) ĊĠĠĠĠĠĠĠ Ġreturn ĠArrayList ( records ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Post Execute ( result : ĠBoolean ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Post Execute ( result ) ĊĠĠĠĠĠĠĠ ĠLog . i ( Constants . TAG , Ġ" Sync Ġended .") ĊĠĠĠĠĠĠĠ Ġlistener . on Task Completed ( result Ġ== Ġtrue ) ĊĠĠĠ Ġ} Ċ }