package Ġio . jo ao fig . ved map . view models Ċ Ċ import Ġio . jo ao fig . ved map . App Scope Ċ import Ġio . jo ao fig . ved map . clients . Cluster Client Ċ import Ġio . jo ao fig . ved map . messages . Cluster Action Ċ import Ġio . jo ao fig . ved map . messages . Cluster Message Ċ import Ġio . jo ao fig . ved map . models . Cluster Ċ import Ġio . jo ao fig . ved map . models . Geo Multi Polygon Ċ import Ġio . jo ao fig . ved map . models . Trajectory Ċ import Ġio . jo ao fig . ved map . repositories . Cluster Repository Ċ import Ġio . jo ao fig . ved map . repositories . Trip Repository Ċ import Ġio . k vision . maps . external s . leaflet . geo . LatLng Ċ import Ġio . k vision . state . Observable List Wrapper Ċ import Ġio . k vision . state . Observable Value Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠMap ViewModel : ĠViewModel () Ġ{ ĊĠĠĠ Ġval Ġclusters Ġ= ĠObservable List Wrapper < Map Cluster >( mutable ListOf ()) ĊĠĠĠ Ġval Ġcluster Points Ġ= ĠObservable List Wrapper < Cluster Point >( mutable ListOf ()) ĊĠĠĠ Ġval Ġtrip Cluster Ini Ġ= ĠObservable Value < Map Cluster ? >( null ) ĊĠĠĠ Ġval Ġtrip Cluster End Ġ= ĠObservable Value < Map Cluster ? >( null ) ĊĠĠĠ Ġval Ġtra ject ories Ġ= ĠObservable List Wrapper < Trajectory >( mutable ListOf ()) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠMessage Hub . cluster Messenger . subscribe Ġ{ Ġhandle Cluster Message ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Inbound Clusters ( cluster Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠApp Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclusters Ġ= ĠCluster Repository . get Inbound Clusters ( cluster Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clusters Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( cluster Ġin Ġclusters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewModel Hub . select Cluster ( cluster , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Outbound Clusters ( cluster Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠApp Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclusters Ġ= ĠCluster Repository . get Outbound Clusters ( cluster Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clusters Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( cluster Ġin Ġclusters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewModel Hub . select Cluster ( cluster , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Cluster Points ( cluster Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠApp Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoints Ġ= ĠCluster Client . get Cluster Points ( cluster Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcluster Points . addAll ( points . map Ġ{ ĠCluster Point ( cluster Id , ĠLat Lng ( it . latitude , Ġit . longitude )) }) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhide Cluster Points ( cluster Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcluster Points . removeAll Ġ{ Ġit . cluster Id Ġ== Ġcluster Id Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Cluster Message ( msg : ĠCluster Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( msg . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCluster Action . SELECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpolygon Ġ= ĠCluster Repository . get Cluster Polygon ( msg . cluster . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( polygon Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Cluster Ġ= ĠMap Cluster ( msg . cluster , Ġpolygon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclusters . add ( map Cluster ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠCluster Action . DE SELECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġclusters . find Ġ{ Ġit . cluster . id Ġ== Ġmsg . cluster . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclusters . remove ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcluster Points . removeAll Ġ{ Ġit . cluster Id Ġ== Ġmsg . cluster . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠCluster Action . SHOW _ START Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpolygon Ġ= ĠCluster Repository . get Cluster Polygon ( msg . cluster . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( polygon Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrip Cluster Ini . value Ġ= ĠMap Cluster ( msg . cluster , Ġpolygon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrip Cluster End . value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠCluster Action . SHOW _ END Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtra ject ories . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpolygon Ġ= ĠCluster Repository . get Cluster Polygon ( msg . cluster . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( polygon Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrip Cluster End . value Ġ= ĠMap Cluster ( msg . cluster , Ġpolygon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcluster Ini Ġ= Ġtrip Cluster Ini . value ?. cluster ?. id Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcluster End Ġ= Ġtrip Cluster End . value ?. cluster ?. id Ġ?: Ġ- 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cluster Ini Ġ>= Ġ 0 Ġ&& Ġcluster End Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtri ps Ġ= ĠTrip Repository . get Cluster Tri ps ( cluster Ini , Ġcluster End ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tri ps Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( trip Ġin Ġtri ps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrajectory Ġ= ĠTrip Repository . get Single Vehicle Trip ( trip ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( trajectory Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtra ject ories . add ( trajectory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠCluster Action . CLEAR _ START Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrip Cluster Ini . value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrip Cluster End . value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtra ject ories . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠCluster Action . CLEAR _ END Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrip Cluster End . value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtra ject ories . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠMap Cluster ( ĊĠĠĠ Ġval Ġcluster : ĠCluster , ĊĠĠĠ Ġval Ġpolygon : ĠGeo Multi Polygon Ċ ) Ċ Ċ data Ġclass ĠCluster Point ( ĊĠĠĠ Ġval Ġcluster Id : ĠInt , ĊĠĠĠ Ġval Ġlocation : ĠLat Lng Ċ ) Ċ