package Ġnet . v on for st . ev map . view model Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroidx . lifecycle .* Ċ import Ġcom . car 2 go . maps . Any Map Ċ import Ġcom . car 2 go . maps . model . LatLng Ċ import Ġcom . car 2 go . maps . model . LatLng Bounds Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġnet . v on for st . ev map . api . availability . Charge Location Status Ċ import Ġnet . v on for st . ev map . api . availability . get Availability Ċ import Ġnet . v on for st . ev map . api . distance Between Ċ import Ġnet . v on for st . ev map . api . going electric .* Ċ import Ġnet . v on for st . ev map . storage .* Ċ import Ġnet . v on for st . ev map . ui . cluster Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response Ċ import Ġjava . io . IOException Ċ Ċ data Ġclass ĠMap Position ( val Ġbounds : ĠLat Lng Bounds , Ġval Ġzoom : ĠFloat ) Ċ Ċ data Ġclass ĠPlace With Bounds ( val Ġlat Lng : ĠLat Lng , Ġval Ġviewport : ĠLat Lng Bounds ?) Ċ Ċ internal Ġfun Ġget Cluster Distance ( zoom : ĠFloat ): ĠInt ? Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( zoom ) Ġ{ ĊĠĠĠĠĠĠĠ Ġin Ġ 0 . 0 .. 7 . 0 Ġ-> Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġin Ġ 7 . 0 .. 1 1 . 5 Ġ-> Ġ 7 5 ĊĠĠĠĠĠĠĠ Ġin Ġ 1 1 . 5 .. 1 2 . 5 Ġ-> Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġin Ġ 1 2 . 5 .. 1 3 . 0 Ġ-> Ġ 4 5 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠMap ViewModel ( application : ĠApplication , Ġge ApiKey : ĠString ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġapi Ġ= ĠGo ing Electric Api . create ( ge ApiKey , Ġcontext Ġ= Ġapplication ) ĊĠĠĠ Ġprivate Ġvar Ġdb Ġ= ĠApp Database . getInstance ( application ) ĊĠĠĠ Ġprivate Ġvar Ġprefs Ġ= ĠPreference DataSource ( application ) ĊĠĠĠ Ġprivate Ġvar Ġcharge point Loader : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġbottom Sheet State : ĠMutable LiveData < Int > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Int >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmap Position : ĠMutable LiveData < Map Position > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Map Position >() ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġfilter Values : ĠLive Data < List < Filter Value >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMed iator LiveData < List < Filter Value >> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsource : ĠLive Data < List < Filter Value >> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( filter Status ) Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource ?. let Ġ{ Ġremove Source ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġdb . filter Value Dao (). get Filter Values ( status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( source !! ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġplug s : ĠLive Data < List < Plug >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠPlug Repository ( api , ĠviewModel Scope , Ġdb . plug Dao (), Ġprefs ). get Plug s () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġnetworks : ĠLive Data < List < Network >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠNetwork Repository ( api , ĠviewModel Scope , Ġdb . network Dao (), Ġprefs ). get Networks () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġcharge Cards : ĠLive Data < List < Charge Card >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠCharge Card Repository ( api , ĠviewModel Scope , Ġdb . charge Card Dao (), Ġprefs ). get Charge Cards () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġfilters Ġ= Ġget Filters ( application , Ġplug s , Ġnetworks , Ġcharge Cards ) ĊĊĠĠĠ Ġprivate Ġval Ġfilter sWith Value : ĠLive Data < List < Filter WithValue < out ĠFilter Value >>> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġfilter sWith Value ( filters , Ġfilter Values ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfilter Profiles : ĠLive Data < List < Filter Profile >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġdb . filter Profile Dao (). get Profiles () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcharge Card Map : ĠLive Data < Map < Long , ĠCharge Card >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMed iator LiveData < Map < Long , ĠCharge Card >> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( charge Cards ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġcharge Cards . value ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . id Ġto Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfilters Count : ĠLive Data < Int > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMed iator LiveData < Int >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( filter sWith Value ) Ġ{ Ġfilter sWith Value Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġfilter sWith Value . count Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . filter . defaultValue () Ġ!= Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġcharge points : ĠMed iator LiveData < Resource < List < Charge point ListItem >>> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMed iator LiveData < Resource < List < Charge point ListItem >> >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠResource . loading ( emptyList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( map Position , Ġfilter sWith Value ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreload Charge points () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġfiltered Connectors : ĠMutable LiveData < Set < String >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Set < String >>() ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġfiltered Charge Cards : ĠMutable LiveData < Set < Long >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Set < Long >>() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġch arger Sparse : ĠMutable LiveData < Charge Location > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Charge Location >() ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġch arger Details : ĠMed iator LiveData < Resource < Charge Location >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMed iator LiveData < Resource < Charge Location >> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( ch arger Sparse ) Ġ{ Ġch arger Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ch arger Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Ch arger Details ( ch arger ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġch arger : ĠMed iator LiveData < Resource < Charge Location >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMed iator LiveData < Resource < Charge Location >> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( ch arger Details ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġwhen Ġ( it ?. status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . SUCCESS Ġ-> ĠResource . success ( it . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . LOADING Ġ-> ĠResource . loading ( ch arger Sparse . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . ERROR Ġ-> ĠResource . error ( it . message , Ġch arger Sparse . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġch arger Distance : ĠMed iator LiveData < Double > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMed iator LiveData < Double >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġ{ Ġ_: ĠAny ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloc Ġ= Ġlocation . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġch arger Ġ= Ġch arger Sparse . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġif Ġ( loc Ġ!= Ġnull Ġ&& Ġch arger Ġ!= Ġnull Ġ&& Ġmy Location Enabled . value Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Between ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloc . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloc . longitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch arger . coordinates . lat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch arger . coordinates . lng ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( ch arger Sparse , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( location , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( my Location Enabled , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġlocation : ĠMutable LiveData < LatLng > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < LatLng >() ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġavailability : ĠMed iator LiveData < Resource < Charge Location Status >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMed iator LiveData < Resource < Charge Location Status >> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( ch arger Sparse ) Ġ{ Ġch arger Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ch arger Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Availability ( ch arger ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġmy Location Enabled : ĠMutable LiveData < Boolean > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġlayers Menu Open : ĠMutable LiveData < Boolean > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Boolean >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfavor ites : ĠLive Data < List < Charge Location >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġdb . charge Locations Dao (). getAll Charge Locations () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsearch Result : ĠMutable LiveData < Place With Bounds > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Place With Bounds >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmap Type : ĠMutable LiveData < Any Map . Type > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Any Map . Type >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠAny Map . Type . NORMAL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmap Traffic Enabled : ĠMutable LiveData < Boolean > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Boolean >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfilter Status : ĠMutable LiveData < Long > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Long >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġprefs . filter Status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve Fore ver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . filter Status Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= ĠFILTER S _ DISABLED ) Ġprefs . last Filter Profile Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreload Prefs () Ġ{ ĊĠĠĠĠĠĠĠ Ġfilter Status . value Ġ= Ġprefs . filter Status ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtoggle Filters () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filter Status . value Ġ== ĠFILTER S _ DISABLED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Status . value Ġ= Ġprefs . last Filter Profile ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Status . value Ġ= ĠFILTER S _ DISABLED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġcopy Filters To Custom () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filter Status . value Ġ== ĠFILTER S _ CUSTOM ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġdb . filter Value Dao (). delete Filter Values For Profile ( FILTER S _ CUSTOM ) ĊĠĠĠĠĠĠĠ Ġfilter Values . value ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . profile Ġ= ĠFILTER S _ CUSTOM ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . filter Value Dao (). insert ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Map Type ( type : ĠAny Map . Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmap Type . value Ġ= Ġtype ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinsert Favorite ( ch arger : ĠCharge Location ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . charge Locations Dao (). insert ( ch arger ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Favorite ( ch arger : ĠCharge Location ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . charge Locations Dao (). delete ( ch arger ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreload Charge points () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġmap Position . value Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġfilters Ġ= Ġfilter sWith Value . value Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġload Charge points ( pos , Ġfilters ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Charge points ( ĊĠĠĠĠĠĠĠ Ġmap Position : ĠMap Position , ĊĠĠĠĠĠĠĠ Ġfilters : ĠList < Filter WithValue < out ĠFilter Value >> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcharge point Loader ?. cancel () ĊĊĠĠĠĠĠĠĠ Ġcharge points . value Ġ= ĠResource . loading ( charge points . value ?. data ) ĊĠĠĠĠĠĠĠ Ġfiltered Connectors . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfiltered Charge Cards . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġbounds Ġ= Ġmap Position . bounds ĊĠĠĠĠĠĠĠ Ġval Ġzoom Ġ= Ġmap Position . zoom ĊĠĠĠĠĠĠĠ Ġcharge point Loader Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġget Charge points With Filters ( bounds , Ġzoom , Ġfilters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Connectors . value Ġ= Ġresult . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Charge Cards . value Ġ= Ġresult . third ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharge points . value Ġ= Ġresult . first ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Charge points With Filters ( ĊĠĠĠĠĠĠĠ Ġbounds : ĠLat Lng Bounds , ĊĠĠĠĠĠĠĠ Ġzoom : ĠFloat , ĊĠĠĠĠĠĠĠ Ġfilters : ĠList < Filter WithValue < out ĠFilter Value >> ĊĠĠĠ Ġ): ĠTrip le < Resource < List < Charge point ListItem >>, ĠSet < String > ?, ĠSet < Long > ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfree ch arging Ġ= Ġget Boolean Value ( filters , Ġ" free ch arging ") ĊĠĠĠĠĠĠĠ Ġval Ġfree park ing Ġ= Ġget Boolean Value ( filters , Ġ" free park ing ") ĊĠĠĠĠĠĠĠ Ġval Ġopen 2 4 7 Ġ= Ġget Boolean Value ( filters , Ġ" open _ 2 4 7 ") ĊĠĠĠĠĠĠĠ Ġval Ġbarrier free Ġ= Ġget Boolean Value ( filters , Ġ" barrier free ") ĊĠĠĠĠĠĠĠ Ġval Ġexclude Fault s Ġ= Ġget Boolean Value ( filters , Ġ" exclude _ fault s ") ĊĠĠĠĠĠĠĠ Ġval Ġmin Power Ġ= Ġget Slider Value ( filters , Ġ" min _ power ") ĊĠĠĠĠĠĠĠ Ġval Ġmin Connectors Ġ= Ġget Slider Value ( filters , Ġ" min _ connectors ") ĊĊĠĠĠĠĠĠĠ Ġval Ġconnector s Val Ġ= Ġget Multiple Choice Value ( filters , Ġ" connectors ") ĊĠĠĠĠĠĠĠ Ġif Ġ( connectors Val . values . isEmpty () Ġ&& Ġ! connectors Val . all ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġconnector s Ġchosen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( Resource . success ( emptyList ()), Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġconnector s Ġ= Ġformat Multiple Choice ( connectors Val ) ĊĠĠĠĠĠĠĠ Ġval Ġfiltered Connectors Ġ= Ġif Ġ( connectors Val . all ) Ġnull Ġelse Ġconnector s Val . values ĊĊĠĠĠĠĠĠĠ Ġval Ġcharge Cards Val Ġ= Ġget Multiple Choice Value ( filters , Ġ" charge cards ") ĊĠĠĠĠĠĠĠ Ġif Ġ( charge Cards Val . values . isEmpty () Ġ&& Ġ! charge Cards Val . all ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġcharge Cards Ġchosen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( Resource . success ( emptyList ()), Ġfiltered Connectors , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcharge Cards Ġ= Ġformat Multiple Choice ( charge Cards Val ) ĊĠĠĠĠĠĠĠ Ġval Ġfiltered Charge Cards Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( charge Cards Val . all ) Ġnull Ġelse Ġcharge Cards Val . values . map Ġ{ Ġit . to Long () Ġ}. toSet () ĊĊĠĠĠĠĠĠĠ Ġval Ġnetworks Val Ġ= Ġget Multiple Choice Value ( filters , Ġ" networks ") ĊĠĠĠĠĠĠĠ Ġif Ġ( networks Val . values . isEmpty () Ġ&& Ġ! networks Val . all ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġnetworks Ġchosen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( Resource . success ( emptyList ()), Ġfiltered Connectors , Ġfiltered Charge Cards ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnetworks Ġ= Ġformat Multiple Choice ( networks Val ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcategories Val Ġ= Ġget Multiple Choice Value ( filters , Ġ" categories ") ĊĠĠĠĠĠĠĠ Ġif Ġ( categories Val . values . isEmpty () Ġ&& Ġ! categories Val . all ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġcategories Ġchosen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( Resource . success ( emptyList ()), Ġfiltered Connectors , Ġfiltered Charge Cards ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcategories Ġ= Ġformat Multiple Choice ( categories Val ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġnot Ġuse Ġclustering Ġif Ġfilters Ġneed Ġto Ġbe Ġapplied Ġlocally . ĊĠĠĠĠĠĠĠ Ġval Ġuse Cluster ing Ġ= Ġzoom Ġ< Ġ 1 3 ĊĠĠĠĠĠĠĠ Ġval Ġge Cluster ing Available Ġ= Ġmin Connectors Ġ<= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġuse Ge Cluster ing Ġ= Ġuse Cluster ing Ġ&& Ġge Cluster ing Available ĊĠĠĠĠĠĠĠ Ġval Ġcluster Distance Ġ= Ġif Ġ( use Cluster ing ) Ġget Cluster Distance ( zoom ) Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġvar Ġstart key : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġmutable ListOf < Charge point ListItem >() ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġload Ġall Ġpages Ġof Ġthe Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġapi . get Charge points ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . sout hw est . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . sout hw est . longitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . northeast . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . northeast . longitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclustering Ġ= Ġuse Ge Cluster ing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzoom Ġ= Ġzoom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcluster Distance Ġ= Ġcluster Distance , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfree ch arging Ġ= Ġfree ch arging , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Power Ġ= Ġmin Power , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfree park ing Ġ= Ġfree park ing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen 2 4 7 Ġ= Ġopen 2 4 7 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbarrier free Ġ= Ġbarrier free , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexclude Fault s Ġ= Ġexclude Fault s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplug s Ġ= Ġconnector s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharge cards Ġ= Ġcharge Cards , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetworks Ġ= Ġnetworks , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategories Ġ= Ġcategories , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart key Ġ= Ġstart key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful Ġ|| Ġresponse . body () !!. status Ġ!= Ġ" ok ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResource . error ( response . message (), Ġcharge points . value ?. data ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġresponse . body () !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . addAll ( body . charge locations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart key Ġ= Ġbody . start key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResource . error ( e . message , Ġcharge points . value ?. data ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Connectors , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Charge Cards ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( start key Ġ!= Ġnull Ġ&& Ġstart key Ġ< Ġ 1 0 0 0 0 ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġdata . filter Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġapply Ġfilters Ġwhich ĠGo ing Electric Ġdoes Ġnot Ġsupport Ġn atively ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠCharge Location ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . charge points ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . power Ġ>= Ġmin Power Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġif Ġ(! connectors Val . all ) Ġit . type Ġin Ġconnector s Val . values Ġelse Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sum By Ġ{ Ġit . count Ġ} Ġ>= Ġmin Connectors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! ge Cluster ing Available Ġ&& Ġuse Cluster ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġapply Ġlocal Ġclustering Ġif Ġserver Ġside Ġclustering Ġis Ġnot Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDispatch ers . IO . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġcluster ( result , Ġzoom , Ġcluster Distance !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( Resource . success ( result ), Ġfiltered Connectors , Ġfiltered Charge Cards ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Multiple Choice ( connectors Val : ĠMultiple Choice Filter Value ) Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( connectors Val . all ) Ġnull Ġelse Ġconnector s Val . values . join ToString (",") ĊĊĠĠĠ Ġprivate Ġfun Ġget Boolean Value ( ĊĠĠĠĠĠĠĠ Ġfilters : ĠList < Filter WithValue < out ĠFilter Value >>, ĊĠĠĠĠĠĠĠ Ġkey : ĠString ĊĠĠĠ Ġ) Ġ= Ġ( filters . find Ġ{ Ġit . value . key Ġ== Ġkey Ġ} !!. value Ġas ĠBoolean Filter Value ). value ĊĊĠĠĠ Ġprivate Ġfun Ġget Slider Value ( ĊĠĠĠĠĠĠĠ Ġfilters : ĠList < Filter WithValue < out ĠFilter Value >>, ĊĠĠĠĠĠĠĠ Ġkey : ĠString ĊĠĠĠ Ġ) Ġ= Ġ( filters . find Ġ{ Ġit . value . key Ġ== Ġkey Ġ} !!. value Ġas ĠSlider Filter Value ). value ĊĊĠĠĠ Ġprivate Ġfun Ġget Multiple Choice Filter ( ĊĠĠĠĠĠĠĠ Ġfilters : ĠList < Filter WithValue < out ĠFilter Value >>, ĊĠĠĠĠĠĠĠ Ġkey : ĠString ĊĠĠĠ Ġ) Ġ= Ġfilters . find Ġ{ Ġit . value . key Ġ== Ġkey Ġ} !!. filter Ġas ĠMultiple Choice Filter ĊĊĠĠĠ Ġprivate Ġfun Ġget Multiple Choice Value ( ĊĠĠĠĠĠĠĠ Ġfilters : ĠList < Filter WithValue < out ĠFilter Value >>, ĊĠĠĠĠĠĠĠ Ġkey : ĠString ĊĠĠĠ Ġ) Ġ= Ġfilters . find Ġ{ Ġit . value . key Ġ== Ġkey Ġ} !!. value Ġas ĠMultiple Choice Filter Value ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġload Availability ( ch arger : ĠCharge Location ) Ġ{ ĊĠĠĠĠĠĠĠ Ġavailability . value Ġ= ĠResource . loading ( null ) ĊĠĠĠĠĠĠĠ Ġavailability . value Ġ= Ġget Availability ( ch arger ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Ch arger Details ( ch arger : ĠCharge Location ) Ġ{ ĊĠĠĠĠĠĠĠ Ġch arger Details . value Ġ= ĠResource . loading ( null ) ĊĠĠĠĠĠĠĠ Ġapi . get Charge point Detail ( ch arger . id ). enqueue ( object Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCallback < Charge point List > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Charge point List >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch arger Details . value Ġ= ĠResource . error ( t . message , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall : ĠCall < Charge point List >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠResponse < Charge point List > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful Ġ|| Ġresponse . body () !!. status Ġ!= Ġ" ok ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch arger Details . value Ġ= ĠResource . error ( response . message (), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch arger Details . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResource . success ( response . body () !!. charge locations [ 0 ] Ġas ĠCharge Location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ }