/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠK ort i Ċ Ġ* Ċ Ġ* ĠĠĠ Ġ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 Ġio . k ort i . m uffle Ċ Ċ import Ġandroid . location . Location Ċ import Ġandroid . util . Log Ċ import Ġio . k ort i . m uffle . audio . Audio Manager Ċ import Ġio . k ort i . m uffle . database . dao . M uffle Point Dao Ċ import Ġio . k ort i . m uffle . database . entity . M uffle Point Ċ import Ġio . k ort i . m uffle . notification . Notification Manager Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠM uffle Point Manager Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġm uffle Point Dao : ĠM uffle Point Dao , ĊĠĠĠ Ġprivate Ġval Ġaudio Manager : ĠAudio Manager , ĊĠĠĠ Ġprivate Ġval Ġnotification Manager : ĠNotification Manager Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠM uffle Point Manager :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNO _ ACTIVE _ POINT Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠST ILL _ ACTIVE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNOT _ ACTIVE _ ANY MORE Ġ= Ġ 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġenable Disable M uffle Point ( m uffle Point : ĠM uffle Point ) Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m uffle Point . status Ġ>= ĠM uffle Point . Status . ENABLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm uffle Point Dao . update Status ( m uffle Point . uid , ĠM uffle Point . Status . DISABLED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m uffle Point . status Ġ== ĠM uffle Point . Status . ACTIVE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Active Area Ġ= Ġm uffle Point Dao . getIn Area M uffle Point () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Active Area Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . show Activ M uffle Point Notification ( new Active Area ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm uffle Point Dao . update Status ( new Active Area . uid , ĠM uffle Point . Status . ACTIVE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . hide Active M uffle Point Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . reverse OrUpdate M uffle ( new Active Area ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm uffle Point Dao . update Status ( m uffle Point . uid , ĠM uffle Point . Status . ENABLE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġprocess Locations ( location : ĠLocation ) Ġ= Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFirst Ġcheck Ġis Ġthe Ġcurrent Ġactive Ġm uffle Ġpoint Ġstill Ġvalid ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Status Ġ= Ġcheck Current Active Location ( location ) ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġin Ġarea Ġm uffle Ġpoints Ġif Ġthey Ġare Ġstill Ġin Ġarea ĊĠĠĠĠĠĠĠ Ġcheck In Area Locations ( location , Ġcurrent Status ) ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġand Ġupdate Ġenabled Ġbut Ġcurrently Ġnot Ġin Ġarea Ġm uffle Ġpoints ĊĠĠĠĠĠĠĠ Ġcheck Area Locations ( location ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcheck Current Active Location ( location : ĠLocation ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Active Ġ= Ġm uffle Point Dao . getActive M uffle Point () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Active Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdummy Location Ġ= ĠLocation (" m uffle _ application "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlongitude Ġ= Ġcurrent Active . lng ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlatitude Ġ= Ġcurrent Active . lat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( location . distance To ( dummy Location ) Ġ<= Ġcurrent Active . radius ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" M uffle Ġpoint Ġwith Ġid =${ current Active . uid } Ġis Ġstill Ġactive .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠST ILL _ ACTIVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" M uffle Ġpoint Ġwith Ġid =${ current Active . uid } Ġis Ġnot Ġactive Ġanymore .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm uffle Point Dao . update Status ( current Active . uid , ĠM uffle Point . Status . ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠNOT _ ACTIVE _ ANY MORE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNO _ ACTIVE _ POINT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcheck In Area Locations ( location : ĠLocation , Ġcurrent Status : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdummy Location Ġ= ĠLocation (" m uffle _ application ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin Area Points Ġ= Ġm uffle Point Dao . getIn Area M uffle Points (). groupBy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Location . longitude Ġ= Ġit . lng ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Location . latitude Ġ= Ġit . lat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġlocation . distance To ( dummy Location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Distance Ġbetween Ġ$ location Ġand Ġ$ dummy Location Ġis Ġ$ distance ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Ġ<= Ġit . radius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Status Ġ== ĠNOT _ ACTIVE _ ANY MORE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Active M uffle Point Ġ= Ġin Area Points [ true ]?. first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Active M uffle Point Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm uffle Point Dao . update Status ( new Active M uffle Point . uid , ĠM uffle Point . Status . ACTIVE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . show Activ M uffle Point Notification ( new Active M uffle Point ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" M uffle Ġpoint Ġwith Ġid =${ new Active M uffle Point . uid } Ġchanged Ġstatus Ġfrom Ġin Ġarea Ġto Ġactive ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . hide Active M uffle Point Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . reverse OrUpdate M uffle ( new Active M uffle Point ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Re versed Ġor Ġupdated Ġsound Ġsettings .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Area Points [ false ]?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm uffle Point Dao . update Status ( it . uid , ĠM uffle Point . Status . ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcheck Area Locations ( location : ĠLocation ) Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdummy Location Ġ= ĠLocation (" m uffle _ application ") ĊĠĠĠĠĠĠĠ Ġval Ġenabled M uffle Points Ġ= Ġm uffle Point Dao . get Enabled M uffle Points (). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Location . longitude Ġ= Ġit . lng ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Location . latitude Ġ= Ġit . lat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġlocation . distance To ( dummy Location ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Distance Ġbetween Ġ$ location Ġand Ġ$ dummy Location Ġis Ġ$ distance ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Ġ<= Ġit . radius ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġskip First Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( enabled M uffle Points . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m uffle Point Dao . getActive M uffle Point () Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Active M uffle Point Ġ= Ġenabled M uffle Points . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm uffle Point Dao . update Status ( new Active M uffle Point . uid , ĠM uffle Point . Status . ACTIVE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . m uffle Sounds ( new Active M uffle Point ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . show Activ M uffle Point Notification ( new Active M uffle Point ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" M uffle Ġpoint Ġwith Ġid =${ new Active M uffle Point . uid } Ġis Ġnow Ġactive .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip First Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( skip First ) Ġenabled M uffle Points . drop ( 1 ) Ġelse Ġenabled M uffle Points ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm uffle Point Dao . update Status ( it . uid , ĠM uffle Point . Status . IN _ AREA ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ }