package Ġcom . d ani yel p . openstreetmap Ċ Ċ import Ġcom . d ani yel p . openstreetmap . api . O sm Api Ċ import Ġcom . d ani yel p . openstreetmap . repository . O sm Repository Ċ import Ġcom . google . android . gms . maps . model . LatLng Ċ import Ġcom . google . maps . android . Poly Util Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . converter . gson . Gson Converter Factory Ċ Ċ data Ġclass ĠCity ( val Ġname : ĠString , Ġval Ġpaths : ĠMutable List < List < LatLng >>, Ġval Ġboundary : ĠList < LatLng >) Ċ Ċ class ĠO sm Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġo sm Repository : ĠO sm Repository ĊĠĠĠ Ġval ĠDEFAULT _ ZO OM Ġ= Ġ 1 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġo sm Api Ġ= Ġprovide O sm Api () ĊĠĠĠĠĠĠĠ Ġo sm Repository Ġ= ĠO sm Repository ( osm Api ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget City With Boundary ( lat Lng : ĠLat Lng , Ġzoom : ĠInt Ġ= ĠDEFAULT _ ZO OM ) Ġ= ĊĠĠĠĠĠĠĠ Ġo sm Repository . get City With Boundary ( lat Lng , Ġzoom ) ĊĊĠĠĠ Ġprivate Ġfun Ġprovide O sm Api () Ġ: ĠO sm Api Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠOk HttpClient . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠRet rofit . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl (" https :// nom in at im . openstreetmap . org /") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( Gson Converter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. client ( client ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create ( O sm Api :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġsplit On City ( paths : ĠList < List < LatLng >>, Ġzoom : ĠInt Ġ= ĠDEFAULT _ ZO OM ) Ġ: ĠList < City > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcities Ġ= Ġmutable ListOf < City >() ĊĊĠĠĠĠĠĠĠ Ġfor ( cur Path Ġin Ġpaths ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst LatLng Ġ= Ġcur Path [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġ( cur City Name , Ġcur Boundary ) Ġ= Ġget City With Boundary ( first LatLng , Ġzoom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġaux Path Ġ= Ġmutable ListOf ( first LatLng ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġupdate Or Add City () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcity Ġ= Ġcities . filter Ġ{ Ġcity Ġ-> Ġcity . name Ġ== Ġcur City Name Ġ}. first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( city Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcities . add ( City ( cur City Name , Ġmutable ListOf ( aux Path ), Ġcur Boundary )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcity . paths . add ( aux Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( lat Lng Ġin Ġcur Path . sub List ( 1 , Ġcur Path . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠWe Ġcreate Ġa ĠCity Ġinstance Ġwith Ġthe Ġaux Path Ġwe Ġcreated Ġso Ġfar , ĠCity ( name , Ġlist ( aux Path ), Ġboundary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠBut Ġwe Ġcould Ġfind Ġthis ĠCity Ġpresent Ġin Ġour Ġcities Ġlist , Ġit Ġcould Ġhave Ġbeen Ġvisited Ġbefore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġthis Ġcase , Ġwe Ġappend Ġaux Path Ġto Ġthe Ġpaths Ġof Ġthat Ġalready Ġthere ĠCity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġthis Ġis Ġnot Ġthe Ġcase , Ġwe Ġjust Ġadd Ġthe Ġnew ĠCity Ġinstance Ġto Ġthe Ġcities Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Poly Util . contains Location ( lat Lng , Ġcur Boundary , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaux Path . add ( lat Lng ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Or Add City () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaux Path Ġ= Ġmutable ListOf ( lat Lng ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( get City With Boundary ( lat Lng , Ġzoom )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur City Name Ġ= Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Boundary Ġ= Ġsecond ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Or Add City () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcities ĊĠĠĠ Ġ} Ċ }