package Ġcom . mal li ina . bo attr acker . ui . map Ċ Ċ import Ġandroid . graphics . Color Ċ import Ġcom . mal li ina . bo attr acker .* Ċ import Ġcom . mapbox . geojson .* Ċ import Ġcom . mapbox . mapbox sdk . maps . Map box Map Ċ import Ġcom . mapbox . mapbox sdk . maps . Style Ċ import Ġcom . mapbox . mapbox sdk . style . expressions . Expression Ċ import Ġcom . mapbox . mapbox sdk . style . layers . Line Layer Ċ import Ġcom . mapbox . mapbox sdk . style . layers . Property Factory Ċ import Ġcom . mapbox . mapbox sdk . style . layers . Symbol Layer Ċ import Ġcom . mapbox . mapbox sdk . style . sources . Geo Json Source Ċ import Ġcom . squareup . mos hi . Json Adapter Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber Ċ Ċ interface ĠA IS Messages Ġ{ ĊĠĠĠ Ġfun Ġon V esse ls ( ves se ls : ĠList < V essel >, Ġmap : ĠMap box Map ) Ċ } Ċ Ċ class ĠV esse ls Renderer ( val Ġconf : ĠA is Layers , Ġval Ġicons : ĠIcons Conf , Ġval Ġlang : ĠLang ) Ġ: ĠA IS Messages Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv essel Adapter : ĠJson Adapter < V essel > Ġ= ĠJson . mos hi . adapter ( V essel :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġui Scope Ġ= ĠCor outine Scope ( Dispatch ers . Main ) ĊĠĠĠ Ġprivate Ġval Ġmax Trail Length Ġ= Ġ 1 0 0 ĊĠĠĠ Ġprivate Ġval Ġv essel History : ĠMutable Map < M msi , ĠList < V essel >> Ġ= Ġmutable Map Of () ĊĠĠĠ Ġprivate Ġval Ġv essel Tr ails Id Ġ= Ġ" tr ails - ves se ls " ĊĠĠĠ Ġprivate Ġval Ġv essel Points Id Ġ= Ġ" points - ves se ls " ĊĊĠĠĠ Ġoverride Ġfun Ġon V esse ls ( ves se ls : ĠList < V essel >, Ġmap : ĠMap box Map ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . i (" Rendering Ġ${ ves se ls . size } Ġv esse ls ...") ĊĠĠĠĠĠĠĠ Ġv esse ls . forEach Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhistory Ġ= Ġv essel History [ v . m msi ] Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtail Ġ= Ġ( listOf ( v ) Ġ+ Ġhistory ). take ( max Trail Length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv essel History [ v . m msi ] Ġ= Ġtail ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap . style ?. let Ġ{ Ġstyle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate V esse ls ( ves se ls , Ġstyle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtr ails Ġ= Ġv essel History . values . map Ġ{ Ġhistory Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLine String . from Lng L ats ( history . map Ġ{ Ġto Point ( it . coord ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġge os Ġ= ĠMulti Line String . from Line Strings ( tr ails ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtr ails Src Ġ= Ġstyle . getSource As < Geo Json Source >( ves sel Tr ails Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tr ails Src Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠGeo Json Source ( ves sel Tr ails Id , Ġge os ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle . add Source ( src ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtr ails Layer Ġ= ĠLine Layer ( ves sel Tr ails Id , Ġsrc . id ). with Properties ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Factory . lineWidth ( 1 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Factory . line Color ( Color . BLACK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle . add Layer ( tr ails Layer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtr ails Src . set Geo Json ( ge os ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate V esse ls ( ves se ls : ĠList < V essel >, Ġstyle : ĠStyle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfeatures Ġ= Ġv esse ls . map Ġ{ Ġv essel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġto Point ( ves sel . coord ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJson . to Gson ( ves sel , Ġv essel Adapter ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFeature . from Geometry ( point , Ġjson ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcoll Ġ= ĠFeature Collection . from Features ( features ) ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġstyle . getSource As < Geo Json Source >( ves sel Points Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( src Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle . add Source ( Geo Json Source ( ves sel Points Id , Ġcoll )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayer Ġ= ĠSymbol Layer ( ves sel Points Id , Ġv essel Points Id ). with Properties ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Factory . icon Image ( icons . boat ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Factory . icon Size ( Map Fragment . Bo at Icon Size ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Factory . icon Rotate ( Expression . get ( V essel . heading Key )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Factory . icon Rotation Alignment (" map ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle . add Layer ( layer ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc . set Geo Json ( coll ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear ( style : ĠStyle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Source And Layer IfExists ( ves sel Tr ails Id , Ġstyle ) ĊĠĠĠĠĠĠĠ Ġremove Source And Layer IfExists ( ves sel Points Id , Ġstyle ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Source And Layer IfExists ( id : ĠString , Ġstyle : ĠStyle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstyle . getSource As < Geo Json Source >( id )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle . remove Layer ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle . remove Source ( id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Point ( c : ĠCoord ) Ġ= ĠPoint . from Lng Lat ( c . lng , Ġc . lat ) Ċ } Ċ