/* Ċ Ġ* Ġ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 . service Ċ Ċ import Ġandroid . app . Notification Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . widget . Toast Ċ import Ġcom . ch il lib its . pm app . model . Sensor Ċ import Ġcom . ch il lib its . pm app . tool . Constants Ċ import Ġcom . ch il lib its . pm app . tool . Storage Utils Ċ import Ġcom . ch il lib its . pm app . ui . activity . MainActivity Ċ import Ġcom . google . firebase . database .* Ċ import Ġcom . m rg ames 1 3 . j im do . fe inst a ub app . R Ċ import Ġjava . util .* Ċ Ċ class ĠWeb Realtime Sync Service Ġ: ĠService () Ġ{ ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġfavour ites : ĠArrayList < Sensor > ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġown Sensors : ĠArrayList < Sensor > ĊĊĠĠĠ Ġ// ĠUtils Ġpackages ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsu : ĠStorage Utils ĊĠĠĠ Ġprivate Ġvar Ġtimestamp Ġ= Ġ 0 L ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ): ĠI Binder ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent , Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsync Key Ġ= Ġintent . getString Extra (" sync _ key ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġown Ġinstance ĊĠĠĠĠĠĠĠ Ġown _ instance Ġ= Ġthis ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize ĠStorage Utils ĊĠĠĠĠĠĠĠ Ġsu Ġ= ĠStorage Utils ( application Context ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize ĠFirebase ĊĠĠĠĠĠĠĠ Ġref Ġ= ĠFirebase Database . getInstance (). getReference (" sync /" Ġ+ Ġsync Key !! ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDisplay Ġforeground Ġnotification ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠNotification . Builder ( this , ĠConstants . CHANNEL _ SYSTEM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . notification _ icon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( getString ( R . string . app _ name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( getString ( R . string . connected _ to _ web _ version )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground ( 1 0 0 0 1 , Ġbuilder . build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġrefresh ing ĊĠĠĠĠĠĠĠ Ġrefresh ( application Context ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrefresh ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġfavour ites Ġand Ġown Ġsensors Ġfrom Ġlocal Ġdb ĊĠĠĠĠĠĠĠ Ġfavour ites Ġ= Ġsu . all F avour ites ĊĠĠĠĠĠĠĠ Ġown Sensors Ġ= Ġsu . all Own Sensors ĊĊĠĠĠĠĠĠĠ Ġ// ĠAs semble Ġdata ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠHashMap < String , ĠAny >() ĊĠĠĠĠĠĠĠ Ġvar Ġobject Id Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfavour ites . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsensor Map Ġ= ĠHashMap < String , ĠAny >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Map [" name "] Ġ= Ġit . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Map [" chip _ id "] Ġ= Ġit . chip ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Map [" color "] Ġ= ĠString . format ("# % 0 6 X ", Ġ 0 x FFFFFF Ġand Ġit . color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Map [" fav "] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ objectId . toString ()] Ġ= Ġsensor Map ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Id ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġown Sensors . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsensor Map Ġ= ĠHashMap < String , ĠAny >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Map [" name "] Ġ= Ġit . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Map [" chip _ id "] Ġ= Ġit . chip ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Map [" color "] Ġ= ĠString . format ("# % 0 6 X ", Ġ 0 x FFFFFF Ġand Ġit . color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Map [" fav "] Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ objectId . toString ()] Ġ= Ġsensor Map ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Id ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuild Ġconnection ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= ĠHashMap < String , ĠAny >() ĊĠĠĠĠĠĠĠ Ġconnection [" time "] Ġ= Ġtimestamp ĊĠĠĠĠĠĠĠ Ġconnection [" device "] Ġ= Ġ" app " ĊĠĠĠĠĠĠĠ Ġconnection [" data "] Ġ= Ġdata ĊĠĠĠĠĠĠĠ Ġref . setValue ( connection ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet ĠDate ChangeListener ĊĠĠĠĠĠĠĠ Ġref . add Value EventListener ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( snap : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( snap . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( snap . child (" device "). value Ġ!= Ġnull Ġ&& Ġsnap . child (" device "). value Ġ!= Ġ" app ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Sensors Ġ= Ġsnap . child (" data "). value Ġas ĠArrayList < *> ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Sensors Ġ!= Ġnull Ġ&& Ġnew Sensors . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavour ites Ġ= Ġsu . all F avour ites ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġown Sensors Ġ= Ġsu . all Own Sensors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavour ites . forEach Ġ{ Ġsu . remove F avour ite ( it . chip ID , Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġown Sensors . forEach Ġ{ Ġsu . remove Own Sensor ( it . chip ID , Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġnew Sensors . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsensor Ġ= Ġnew Sensors [ i ] Ġas ĠMap < *, Ġ*> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExtract Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchip Id Ġ= Ġsensor [" chip _ id "]. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġsensor [" name "]. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfav ored Ġ= Ġsensor [" fav "] !!. toString (). to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġsensor [" color "]. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! su . is Sensor Linked ( chip Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fav ored ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . add F avour ite ( Sensor ( chip Id , Ġname , ĠColor . parse Color ( color )), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu . add Own Sensor ( Sensor ( chip Id , Ġname , ĠColor . parse Color ( color )), Ġoffline Ġ= Ġtrue , Ġrequest From Realtime Sync Service Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMainActivity . own _ instance ?. pager Adapter ?. refresh F avour ites () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMainActivity . own _ instance ?. pager Adapter ?. refresh My Sensors () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref . removeEventListener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShow Ġtoast ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= ĠToast ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . set Gravity ( Gravity . CENTER , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . duration Ġ= ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . view Ġ= ĠLayoutInflater . from ( context ). inflate ( R . layout . sync _ failure , Ġnull , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( database Error : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" Sync Ġfailed ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġref . remove Value () ĊĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠVariables Ġas Ġobjects ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġref : ĠDatabase Reference ĊĊĠĠĠĠĠĠĠ Ġ// ĠVariables ĊĠĠĠĠĠĠĠ Ġvar Ġown _ instance : ĠWeb Realtime Sync Service ? Ġ= Ġnull ĊĠĠĠ Ġ} Ċ }