package Ġcom . ship now . way points algorithm čĊč Ċ import Ġandroid . content . DialogInterface č Ċ import Ġandroid . graphics . Color č Ċ import Ġandroidx . appcompat . app . AppCompatActivity č Ċ import Ġandroid . os . Bundle č Ċ import Ġandroid . util . Log č Ċ import Ġandroid . widget . Image Button č Ċ import Ġandroidx . lifecycle . Mutable LiveData čĊč Ċ import Ġcom . google . android . gms . maps . Camera Update Factory č Ċ import Ġcom . google . android . gms . maps . Google Map č Ċ import Ġcom . google . android . gms . maps . On Map Ready Callback č Ċ import Ġcom . google . android . gms . maps . Support Map Fragment č Ċ import Ġcom . google . android . gms . maps . model .* č Ċ import Ġcom . google . maps . Directions Api č Ċ import Ġcom . google . maps . Directions ApiRequest č Ċ import Ġcom . google . maps . Geo Api Context č Ċ import Ġcom . google . maps . Pending Result č Ċ import Ġcom . google . maps . android . Poly Util č Ċ import Ġcom . google . maps . model . Directions Result č Ċ import Ġcom . google . maps . model . Geo coded Waypoint č Ċ import Ġcom . google . maps . model . Travel Mode č Ċ import Ġcom . ship now . way points algorithm . com . Manage Items Dialog Fragment č Ċ import Ġjava . time . format . DateTime Formatter č Ċ import Ġjava . util . concurrent . TimeUnit čĊč Ċ class ĠMaps Activity Ġ: ĠAppCompatActivity (), ĠOn Map Ready Callback Ġ{ čĊčĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Map : ĠGoogle Map čĊĠĠĠ Ġprivate Ġvar Ġdirections Result : ĠMutable LiveData < Directions Result > Ġ= ĠMutable LiveData () čĊĠĠĠ Ġprivate Ġvar Ġmarkers : Mutable List < Marker Options > Ġ= Ġmutable ListOf () čĊĠĠĠ Ġprivate Ġvar Ġgeo coded Way points : Mutable LiveData < Mutable List < Geo coded Waypoint >> Ġ= ĠMutable LiveData () čĊčĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) čĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ maps ) čĊĠĠĠĠĠĠĠ Ġ// ĠObtain Ġthe ĠSupport Map Fragment Ġand Ġget Ġnotified Ġwhen Ġthe Ġmap Ġis Ġready Ġto Ġbe Ġused . čĊĠĠĠĠĠĠĠ Ġval Ġmap Fragment Ġ= Ġsupport FragmentManager čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Fragment ById ( R . id . map ) Ġas ĠSupport Map Fragment čĊĠĠĠĠĠĠĠ Ġmap Fragment . getMap Async ( this ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠMan ip ulates Ġthe Ġmap Ġonce Ġavailable . čĊĠĠĠĠ Ġ* ĠThis Ġcallback Ġis Ġtriggered Ġwhen Ġthe Ġmap Ġis Ġready Ġto Ġbe Ġused . čĊĠĠĠĠ Ġ* ĠThis Ġis Ġwhere Ġwe Ġcan Ġadd Ġmarkers Ġor Ġlines , Ġadd Ġlisteners Ġor Ġmove Ġthe Ġcamera . ĠIn Ġthis Ġcase , čĊĠĠĠĠ Ġ* Ġwe Ġjust Ġadd Ġa Ġmarker Ġnear ĠSy dn ey , ĠA ustralia . čĊĠĠĠĠ Ġ* ĠIf ĠGoogle ĠPlay Ġservices Ġis Ġnot Ġinstalled Ġon Ġthe Ġdevice , Ġthe Ġuser Ġwill Ġbe Ġpromp ted Ġto Ġinstall čĊĠĠĠĠ Ġ* Ġit Ġinside Ġthe ĠSupport Map Fragment . ĠThis Ġmethod Ġwill Ġonly Ġbe Ġtriggered Ġonce Ġthe Ġuser Ġhas čĊĠĠĠĠ Ġ* Ġinstalled ĠGoogle ĠPlay Ġservices Ġand Ġreturned Ġto Ġthe Ġapp . čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġoverride Ġfun Ġon Map Ready ( google Map : ĠGoogle Map ) Ġ{ čĊĠĠĠĠĠĠĠ Ġm Map Ġ= Ġgoogle Map čĊčĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġa Ġmarker Ġin ĠSy dn ey Ġand Ġmove Ġthe Ġcamera čĊĠĠĠĠĠĠĠ Ġval Ġco im bra Ġ= ĠLat Lng ( 4 0 . 2 0 5 6 4 , Ġ- 8 . 4 1 9 5 5 ) čĊĠĠĠĠĠĠĠ Ġm Map . add Marker ( Marker Options (). position ( co im bra ). title (" Marker Ġin ĠCo im bra "). icon ( Bitmap Descriptor Factory . default Marker ( Bitmap Descriptor Factory . H UE _ BLUE ))) čĊĠĠĠĠĠĠĠ Ġm Map . move Camera ( Camera Update Factory . new LatLng Zoom ( co im bra , Ġ 1 5 f )) čĊčĊčĊĠĠĠĠĠĠĠ ĠgetList Ten Points (). let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . forEach Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Map . add Marker ( it ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ// observe Ġfor Ġdirections čĊĠĠĠĠĠĠĠ Ġdirections Result . observe ( this , Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . routes . forEach Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecode Path Ġ= ĠPoly Util . decode ( it . overview Polyline . encoded Path ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoly line Ġ= ĠPoly line Options () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAll ( decode Path ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. color ( Color . GRAY ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width ( 2 f ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. joint Type ( Joint Type . BE VEL ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Map . add Polyline ( poly line ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" directions Result ", Ġ" 1 0 Ġitems ") čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" directions Result ", Ġ" routes . size Ġ= Ġ${ it . routes . size }") Ġ// result a Ġapenas Ġ 1 Ġro ta čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" directions Result ", Ġ" routes . leg s . size Ġ= Ġ${ it . routes [ 0 ]. leg s . size }") čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" directions Result ", Ġ" routes . leg s [ 0 ]. distance Ġ= Ġ${ it . routes [ 0 ]. leg s [ 0 ]. distance }") čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" directions Result ", Ġ" routes . leg s [ 0 ]. duration Ġ= Ġ${ it . routes [ 0 ]. leg s [ 0 ]. duration }") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log . d (" directions Result ", Ġ" routes . leg s [ 0 ]. ar ival Time Ġ= Ġ${ it . routes [ 0 ]. leg s [ 0 ]. arrival Time . format ( DateTime Formatter . of Pattern (" MM / dd / yyyy Ġ- ĠHH : mm : ss ĠZ ")) }") čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" directions Result ", Ġ" geo code Way points . size Ġ= Ġ${ it . geo coded Way points . size }") Ġ// result a Ġem Ġ 1 0 Ġway points čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" directions Result ", Ġit . geo coded Way points [ 0 ]. geo coder Status . name ) čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" directions Result ", Ġit . geo coded Way points [ 0 ]. types [ 0 ]. name ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// geo coded Way points . post Value ( it . geo coded Way points . to Mutable List ()) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// waypoint Ġorder , Ġcont em Ġa Ġlista Ġde Ġord ens Ġdos Ġstops čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// setup Ġorder Ġof Ġthe Ġlist Ġfor Ġoptimize Ġroute čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Optimize List ( it . routes [ 0 ]. waypoint Order ) čĊĠĠĠĠĠĠĠ Ġ}) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġorgan ize Ġlist Ġsync Ġwith Ġoptimize Ġoutput Ġof Ġway points čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġfun Ġsync Optimize List ( order : ĠInt Array ) Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġval Ġnew list : Mutable List < Marker Options > Ġ= Ġmutable ListOf () čĊĠĠĠĠĠĠĠ Ġnew list . add ( markers . first ()) čĊĠĠĠĠĠĠĠ Ġorder . forEach Indexed Ġ{ Ġindex , Ġi Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" arrays ", Ġ"$ index Ġ-> Ġ$ i ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew list . add ( markers [ i + 1 ]) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġnew list . add ( markers . last ()) čĊĠĠĠĠĠĠĠ Ġmarkers . clear () čĊĠĠĠĠĠĠĠ Ġmarkers Ġ= Ġnew list čĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġprivate Ġfun Ġget Geo Context (): ĠGeo Api Context Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn ĠGeo Api Context . Builder () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apiKey ( getString ( R . string . google _ maps _ key )) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () čĊĠĠĠ Ġ} čĊĠĠĠ Ġprivate Ġfun Ġget Directions ( list Points : Mutable List < Marker Options > ){ čĊčĊĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= Ġlist Points . first (). position čĊĠĠĠĠĠĠĠ Ġval Ġdestination Ġ= Ġlist Points . last (). position č Ċ // ĠĠĠĠĠĠĠ Ġvar Ġway points : Array < Directions ApiRequest . Waypoint > Ġ= ĠArray < Directions ApiRequest . Waypoint >( list Points . size Ġ- Ġ 2 ){ č Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠDirection s ApiRequest . Waypoint ("") č Ċ // ĠĠĠĠĠĠĠ Ġ} č Ċ // ĠĠĠĠĠĠĠ Ġlist Points . drop ( 1 ). drop Last ( 1 ). forEach Indexed () Ġ{ Ġi , Ġit Ġ-> č Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġway points [ i ] Ġ= ĠDirection s ApiRequest . Waypoint ( it . position . toString ()) č Ċ // ĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġvar Ġway points : Array < String > čĊĠĠĠĠĠĠĠ Ġlist Points . drop ( 1 ). drop Last ( 1 ). let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġway points Ġ= ĠArray < String >( it . size ){ Ġ"" Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġmutable ListOf < String >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . forEach Ġ{ m Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . add ("% s ,% s ". format ( m . position . latitude , Ġm . position . longitude )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġway points Ġ= Ġa . to Typed Array () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ ĠLog . d (" way points ", Ġ"$ way points ") čĊĠĠĠĠĠĠĠ Ġway points . forEach Indexed Ġ{ Ġi , Ġit Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" way points ", Ġ"$ i Ġ Ġ- Ġ Ġ$ it ") čĊĠĠĠĠĠĠĠ Ġ} čĊčĊčĊĠĠĠĠĠĠĠ Ġ// get Ġdirections Ġfrom Ġapi čĊčĊĠĠĠĠĠĠĠ ĠDirection s Api . new Request ( get Geo Context ()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. mode ( Travel Mode . DR IV ING ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. origin ( com . google . maps . model . LatLng ( origin . latitude , Ġorigin . longitude )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. destination ( com . google . maps . model . LatLng ( destination . latitude , Ġdestination . longitude )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. way points (* way points ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. optimize Way points ( true ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. depart ure Time Now () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Callback ( object Ġ: ĠPending Result . Callback < Directions Result >{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Result ( result : ĠDirection s Result ?) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ?. let { čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Directions Result ", Ġ"$ result ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirections Result . post Value ( it ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( e : ĠThrowable ?) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" on Failure ", Ġ"${ e ?. message }") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" on Failure ", Ġ"${ e ?. localized Message }") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ?. printStackTrace () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) čĊčĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġprivate Ġfun ĠgetList Ten Points (): Mutable List < Marker Options >{ čĊĠĠĠĠĠĠĠ Ġ/* čĊĠĠĠĠĠĠĠ Ġgeom ap ":{" location ":{" lat ": 4 0 . 1 9 6 5 6 3 4 ," lng ": - 8 . 4 1 2 8 1 1 1 } čĊĠĠĠĠĠĠĠ Ġ" geom ap ":{" location ":{" lat ": 4 0 . 2 0 6 4 5 2 8 1 3 4 2 3 ," lng ": - 8 . 4 0 0 9 1 9 } čĊĠĠĠĠĠĠĠ Ġ" geom ap ":{" location ":{" lat ": 4 0 . 2 0 6 4 5 2 8 1 3 4 2 3 ," lng ": - 8 . 4 0 0 9 1 9 } čĊĠĠĠĠĠĠĠ Ġ" geom ap ":{" location ":{" lat ": 4 0 . 2 0 3 4 7 4 7 ," lng ": - 8 . 4 0 9 9 2 5 4 } čĊĠĠĠĠĠĠĠ Ġ" geom ap ":{" location ":{" lat ": 4 0 . 2 0 6 4 5 2 8 1 3 4 2 3 ," lng ": - 8 . 4 0 0 9 1 9 } čĊĠĠĠĠĠĠĠ Ġ" geom ap ":{" location ":{" lat ": 4 0 . 1 9 3 2 1 5 9 ," lng ": - 8 . 4 1 0 2 5 4 5 } čĊĠĠĠĠĠĠĠ Ġ" geom ap ":{" location ":{" lat ": 4 0 . 2 0 6 4 5 2 8 1 3 4 2 3 ," lng ": - 8 . 4 0 0 9 1 9 } čĊĠĠĠĠĠĠĠ Ġ" geom ap ":{" location ":{" lat ": 4 0 . 2 1 0 9 7 5 6 7 4 5 7 ," lng ": - 8 . 4 0 2 3 7 8 1 2 1 7 0 4 1 } čĊĠĠĠĠĠĠĠ Ġ" geom ap ":{" location ":{" lat ": 4 0 . 2 7 2 2 8 9 4 ," lng ": - 8 . 5 2 0 9 9 7 3 } čĊĠĠĠĠĠĠĠ Ġgeom ap ":{" location ":{" lat ": 4 0 . 2 0 4 8 6 5 8 6 3 4 2 2 ," lng ": - 8 . 4 0 7 7 6 9 5 5 } čĊĠĠĠĠĠĠĠĠ Ġ*/ čĊčĊĠĠĠĠĠĠĠ Ġmarkers Ġ= Ġmutable ListOf () čĊĠĠĠĠĠĠĠ Ġmarkers . add ( Marker Options (). position ( LatLng ( 4 0 . 1 9 6 5 6 3 4 , Ġ- 8 . 4 1 2 8 1 1 1 )). title (" order Ġ 1 ")) čĊĠĠĠĠĠĠĠ Ġmarkers . add ( Marker Options (). position ( LatLng ( 4 0 . 2 0 6 4 5 2 8 1 3 4 2 3 ,- 8 . 4 0 0 9 1 9 )). title (" order Ġ 2 ")) č Ċ // ĠĠĠĠĠĠĠ Ġmarkers . add ( Marker Options (). position ( LatLng ( 4 0 . 2 0 6 4 5 2 8 1 3 4 2 3 ,- 8 . 4 0 0 9 1 9 )). title (" 2 Ġcopy ")) čĊĠĠĠĠĠĠĠ Ġmarkers . add ( Marker Options (). position ( LatLng ( 4 0 . 1 9 3 2 1 3 8 ,- 8 . 4 1 0 1 4 5 3 )). title (" order Ġ 3 ")) čĊĠĠĠĠĠĠĠ Ġmarkers . add ( Marker Options (). position ( LatLng ( 4 0 . 2 0 3 4 7 4 7 ,- 8 . 4 0 9 9 2 5 4 )). title (" order Ġ 4 ")) čĊĠĠĠĠĠĠĠ Ġmarkers . add ( Marker Options (). position ( LatLng ( 4 0 . 2 0 4 8 6 5 8 6 3 4 2 2 ,- 8 . 4 0 7 7 6 9 5 5 )). title (" order Ġ 5 ")) čĊĠĠĠĠĠĠĠ Ġmarkers . add ( Marker Options (). position ( LatLng ( 4 0 . 2 1 0 9 7 5 6 7 4 5 7 ,- 8 . 4 0 2 3 7 8 1 2 1 7 0 4 1 )). title (" order Ġ 6 ")) čĊĠĠĠĠĠĠĠ Ġmarkers . add ( Marker Options (). position ( LatLng ( 4 0 . 1 9 3 2 1 5 9 ,- 8 . 4 1 0 2 5 4 5 )). title (" order Ġ 7 ")) čĊĠĠĠĠĠĠĠ Ġmarkers . add ( Marker Options (). position ( LatLng ( 4 0 . 2 7 2 2 8 9 4 ,- 8 . 5 2 0 9 9 7 3 )). title (" order Ġ 8 ")) čĊĠĠĠĠĠĠĠ Ġmarkers . add ( Marker Options (). position ( LatLng ( 4 0 . 2 0 4 8 6 5 8 6 3 4 2 2 ,- 8 . 4 0 7 7 6 9 5 5 )). title (" order Ġ 9 ")) čĊĠĠĠĠĠĠĠ Ġmarkers . add ( Marker Options (). position ( LatLng ( 4 0 . 1 9 6 2 6 3 3 , Ġ- 8 . 4 2 9 9 1 1 6 )). title (" order Ġ 1 0 ")) čĊčĊčĊĠĠĠĠĠĠĠ Ġ// init Ġbtn čĊĠĠĠĠĠĠĠ ĠfindViewById < Image Button >( R . id . image Button ). setOnClickListener Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= ĠManage Items Dialog Fragment . newInstance ( markers ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġd . setOn Dismiss Listener ( DialogInterface . On Dismiss Listener { čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// reload čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// get Directions ( markers ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġd . show ( support FragmentManager , Ġ" Manage Items ") čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// make Ġrequest čĊĠĠĠĠĠĠĠ Ġget Directions ( markers ) čĊĠĠĠĠĠĠĠ Ġreturn Ġmarkers čĊĠĠĠ Ġ} č Ċ }