package Ġio . loc ally . eng age sdk . ge of ences Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . location . Location Ċ import Ġandroid . support . v 4 . content . Local Broadcast Manager Ċ import Ġcom . google . android . gms . location . Ge ofence .* Ċ import Ġcom . google . android . gms . location . Ge of encing Client Ċ import Ġcom . google . android . gms . location . Ge of encing Request Ċ import Ġcom . google . android . gms . location . Location Services Ċ import Ġcom . google . android . gms . maps . model . LatLng Ċ import Ġcom . google . maps . android . Poly Util Ċ import Ġio . loc ally . eng age sdk . EventHandler Ċ import Ġio . loc ally . eng age sdk . campaign s . Campaign Coordinator Ċ import Ġio . loc ally . eng age sdk . common . TIMER _ DELAY Ċ import Ġio . loc ally . eng age sdk . common . Utils Ċ import Ġio . loc ally . eng age sdk . data models . ge of ences . Ge ofence Ċ import Ġio . loc ally . eng age sdk . data models . ge of ences . Ge ofence . Coverage Type . POLYGON Ċ import Ġio . loc ally . eng age sdk . data models . imp ression . Prox imity Ċ import Ġio . loc ally . eng age sdk . data models . imp ression . Prox imity . ENTER Ċ import Ġio . loc ally . eng age sdk . data models . imp ression . Prox imity . EXIT Ċ import Ġio . loc ally . eng age sdk . managers . Location Manager Ċ import Ġio . loc ally . eng age sdk . managers . Location Manager . Location Delegate Ċ import Ġio . loc ally . eng age sdk . network . services . ge of ences . Ge ofence Services Ċ import Ġorg . jetbrains . ank o . do Async Ċ import Ġjava . util .* Ċ import Ġkotlin . concurrent . schedule Ċ Ċ class ĠGe ofence Monitor ( val Ġcontext : ĠContext ) Ġ: ĠLocation Delegate Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Ge ofence Monitor " ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtimer : ĠTimer ĊĠĠĠ Ġprivate Ġval Ġlocation Manager : ĠLocation Manager Ġ= ĠLocation Manager ( context ) ĊĠĠĠ Ġprivate Ġvar Ġge of encing Client : ĠGe of encing Client Ġ= ĠLocation Services . get Ge of encing Client ( context ) ĊĠĠĠ Ġprivate Ġvar Ġge of ences : ĠList < Ge ofence > Ġ= ĠlistOf () ĊĠĠĠ Ġprivate Ġval Ġge ofence Inside Ġ= Ġarray ListOf < String >() ĊĠĠĠ Ġprivate Ġval Ġge of ences Mon itored Ġ= Ġarray ListOf < com . google . android . gms . location . Ge ofence >() ĊĠĠĠ Ġprivate Ġval Ġge ofence Pending Intent : ĠPending Intent Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠGe ofence Transitions :: class . java ) ĊĠĠĠĠĠĠĠ ĠPending Intent . getService ( context , Ġ 0 , Ġintent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġbound ings : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġge ofence Response Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrigger Ġ= Ġintent ?. getString Extra (" prox imity ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġintent ?. getString Extra (" ge ofence Id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrigger ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( trigger ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ENTER " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġge of ences . find Ġ{ Ġg Ġ-> Ġg . id . toString () Ġ== Ġid Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġge ofence Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ge ofence ?. type Ġ== ĠPOL YGON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEventHandler . listener ?. imp ression Update (" Enter ing ĠBounding ĠCircle Ġ- ĠLat (${ ge ofence . center . lat }) ĠL ng (${ ge ofence . center . lng }) ĠRadius (${ ge ofence . center . radius })", ĠUtils . log Time ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( bound ings Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Manager . start Monitoring () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEventHandler . listener ?. imp ression Update (" Starting Ġscan Ġfor ĠPolygon ĠGe ofence ", ĠUtils . log Time ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbound ings . inc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġge ofence Inside . contains ( id ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this . not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Manager . current Location Ġ{ Ġcurrent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent ?. let Ġ{ ĠEventHandler . listener ?. imp ression Update (" Enter ing ĠCircle ĠGe ofence Ġ- ĠLat (${ ge ofence ?. center ?. lat }) ĠL ng (${ ge ofence ?. center ?. lng }) ĠRadius (${ ge ofence ?. center ?. radius })", ĠUtils . log Time ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Campaign ( ENTER , Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" EXIT " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġge of ences . find Ġ{ Ġg Ġ-> Ġg . id . toString () Ġ== Ġid Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġge ofence Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this ?. type Ġ== ĠPOL YGON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbound ings . dec () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEventHandler . listener ?. imp ression Update (" Le aving ĠBounding ĠCircle Ġ- ĠLat (${ ge ofence ?. center ?. lat }) ĠL ng (${ ge ofence ?. center ?. lng }) ĠRadius (${ ge ofence ?. center ?. radius })", ĠUtils . log Time ()) ĊĊ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( bound ings Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEventHandler . listener ?. imp ression Update (" Stopping Ġscan Ġfor ĠPolygon ĠGe ofence ", ĠUtils . log Time ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Manager . stop Monitoring () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġge ofence Inside . contains ( id ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Manager . current Location Ġ{ Ġcurrent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent ?. let Ġ{ ĠEventHandler . listener ?. imp ression Update (" Le aving ĠCircle ĠGe ofence Ġ- ĠLat (${ ge ofence ?. center ?. lat }) ĠL ng (${ ge ofence ?. center ?. lng }) ĠRadius (${ ge ofence ?. center ?. radius })", ĠUtils . log Time ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Campaign ( EXIT , Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Monitoring ( radius : ĠInt , Ġrefresh : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbound ings Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġlocation Manager . start Monitoring () ĊĠĠĠĠĠĠĠ Ġge ofence Inside . clear () ĊĠĠĠĠĠĠĠ Ġtimer Ġ= ĠTimer (" Ge ofence Refresh ", Ġtrue ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschedule ( TIMER _ DELAY , Ġrefresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Manager . current Location Ġ{ Ġcheck Sur rounding ( it , Ġradius ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. register Receiver ( ge ofence Response , ĠIntent Filter (" ge of encing ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġprivate Ġfun Ġupdate Monitor () Ġ{ ĊĠĠĠĠĠĠĠ Ġge of ences Mon itored . clear () ĊĠĠĠĠĠĠĠ Ġge of ences . forEach Ġ{ Ġge ofence Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠIf Ġcenter Ġcomes Ġcorrectly Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġge of ences Mon itored . add ( Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set RequestId ( ge ofence . id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Circular Region ( ge ofence . center . lat , Ġge ofence . center . lng , Ġ( ge ofence . center . radius Ġ* Ġ 1 6 0 9 . 3 4 4 ). toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Expiration Duration ( NE VER _ EXPI RE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Transition Types ( GE OF ENCE _ TRANS ITION _ ENTER Ġor ĠG EOF ENCE _ TRANS ITION _ EXIT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Error Ġto Ġmonitor Ġge ofence [ ${ ge ofence . id } ]: Ġ${ e . localized Message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ge of ences Mon itored . isNotEmpty ()) Ġge of encing Client . add Ge of ences ( get Ge of encing Request (), Ġge ofence Pending Intent ) ĊĠĠĠĠĠĠĠ Ġlocation Manager . delegate Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġlocation Manager . stop Monitoring () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Monitoring () Ġ{ ĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( context ). unregister Receiver ( ge ofence Response ) ĊĠĠĠĠĠĠĠ Ġlocation Manager . delegate Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġlocation Manager . stop Monitoring () ĊĠĠĠĠĠĠĠ Ġ:: timer . isInitialized . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . purge () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġge of encing Client . remove Ge of ences ( ge ofence Pending Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Sur rounding ( location : ĠLocation ?, Ġradius : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlocation ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGe ofence Services . in Range ( it . latitude , Ġit . longitude , Ġradius ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġge of ences Ġ= Ġresult . data ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Monitor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġerr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Error Ġgetting Ġge of ences Ġin Ġrange : Ġ${ err . localized Message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Ge of encing Request (): ĠGe of encing Request Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGe of encing Request . Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Initial Trigger ( Ge of encing Request . INITIAL _ TRIGGER _ ENTER Ġor ĠGe of encing Request . INITIAL _ TRIGGER _ DW ELL Ġor ĠGe of encing Request . INITIAL _ TRIGGER _ EXIT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Ge of ences ( ge of ences Mon itored ) ĊĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdid Location Updated ( location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġge of ences . filter Ġ{ Ġge ofence Ġ-> Ġge ofence . type Ġ== ĠPOL YGON Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġpolygon Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoints Ġ= Ġpolygon . points ?. map Ġ{ Ġpoint Ġ-> ĠLat Lng ( point . lat , Ġpoint . lng ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPoly Util . contains Location ( location . latitude , Ġlocation . longitude , Ġpoints , Ġfalse ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġge ofence Inside . contains ( polygon . id . toString ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEventHandler . listener ?. imp ression Update (" Entered ĠPolygon ĠGe ofence Ġ- ĠLat (${ location . latitude }) ĠL ng (${ location . longitude })", ĠUtils . log Time ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Campaign ( ENTER , Ġpolygon . id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġge ofence Inside . contains ( polygon . id . toString ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEventHandler . listener ?. imp ression Update (" Le aved ĠPolygon ĠGe ofence Ġ- ĠLat (${ location . latitude }) ĠL ng (${ location . longitude })", ĠUtils . log Time ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Campaign ( EXIT , Ġpolygon . id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Campaign ( prox imity : ĠPro x imity , Ġid : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( prox imity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠENTER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCampaign Coordinator . request Ge ofence Campaign ( prox imity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġge ofence Inside . add ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEXIT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCampaign Coordinator . request Ge ofence Campaign ( prox imity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġge ofence Inside . remove ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }