package Ġcom . ric o . om ar w . rut as uru apan Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . Bitmap . create Bitmap Ċ import Ġandroid . os .* Ċ import Ġandroid . util . Sparse Array Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Tree Observer Ċ import Ġandroid . view . animation . Bo unce Interpolator Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . Relative Layout Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġcom . google . android . gms . location . F used Location Provider Client Ċ import Ġcom . google . android . gms . location . Location Services Ċ 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 . android . libraries . places . api . Places Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Behavior Ċ import Ġcom . google . android . material . dialog . Material AlertDialog Builder Ċ import Ġcom . google . android . material . tabs . Tab Layout Ċ import Ġcom . ric o . om ar w . rut as uru apan . Constants . BOUN CE _ DURATION Ċ import Ġcom . ric o . om ar w . rut as uru apan . Constants . CAMERA _ P ADDING _ MARKER Ċ import Ġcom . ric o . om ar w . rut as uru apan . Constants . INITIAL _ ZO OM Ċ import Ġcom . ric o . om ar w . rut as uru apan . Constants . LINE _ WIDTH Ċ import Ġcom . ric o . om ar w . rut as uru apan . Constants . LOCATION _ PERMISSION _ REQUEST Ċ import Ġcom . ric o . om ar w . rut as uru apan . Constants . Preference Keys Ċ import Ġcom . ric o . om ar w . rut as uru apan . Constants . REFRESH _ INTERVAL Ċ import Ġcom . ric o . om ar w . rut as uru apan . Constants . UR U AP AN _ LAT L NG Ċ import Ġcom . ric o . om ar w . rut as uru apan . Constants . V IB RATION _ DURATION Ċ import Ġcom . ric o . om ar w . rut as uru apan . Utils . hide Keyboard Ċ import Ġcom . ric o . om ar w . rut as uru apan . custom Widgets . Custom Image Button Ċ import Ġcom . ric o . om ar w . rut as uru apan . custom Widgets . OutOfBounds Toast Ċ import Ġcom . ric o . om ar w . rut as uru apan . database . App Database Ċ import Ġcom . ric o . om ar w . rut as uru apan . database . Point Ċ import Ġcom . ric o . om ar w . rut as uru apan . models . Route Model Ċ import Ġcom . ric o . om ar w . rut as uru apan . models . Zoom Level Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġkotlinx . coroutines .* Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠOn Map Ready Callback , ĊĠĠĠĠĠĠĠ ĠGoogle Map . On Marker Drag Listener , ĊĠĠĠĠĠĠĠ ĠGoogle Map . On Map Long ClickListener , ĊĠĠĠĠĠĠĠ ĠAll Routes Fragment . Interactions Interface , ĊĠĠĠĠĠĠĠ ĠSearch Fragment . On Fragment Interaction Listener , ĊĠĠĠĠĠĠĠ ĠResults Fragment . On Fragment Interaction Listener , ĊĠĠĠĠĠĠĠ ĠGoogle Map . On Camera Move Listener , ĊĠĠĠĠĠĠĠ ĠTab Layout . On Tab Selected Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġorigin Marker : ĠMarker ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġdestination Marker : ĠMarker ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġorigin Square : ĠPolygon ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġdestination Square : ĠPolygon ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsearch Fragment : ĠSearch Fragment ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġall Routes Fragment : ĠAll Routes Fragment ĊĠĠĠ Ġprivate Ġvar Ġresults Fragment : ĠResults Fragment ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġactive Fragment : ĠFragment ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsheet Behavior : ĠBottom Sheet Behavior < LinearLayout > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbottom Sheet : ĠLinearLayout ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmap : ĠGoogle Map ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlocation Client : ĠF used Location Provider Client ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġslide Indicator : ĠImageView ĊĠĠĠ Ġprivate Ġvar Ġrefresh StartTime : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstart Marker Position : ĠLat Lng ĊĠĠĠ Ġprivate Ġvar Ġui Scope Ġ= ĠCor outine Scope ( Dispatch ers . Main ) ĊĠĠĠ Ġprivate Ġval Ġdrawn Routes Ġ= ĠArrayList < Route Model >() ĊĠĠĠ Ġprivate Ġvar Ġmap Zoom Level : ĠInt Ġ= ĠINITIAL _ ZO OM . toInt () ĊĠĠĠ Ġprivate Ġvar Ġmap Height : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġshow Inform ative Dialog : ĠBoolean Ġ= Ġtrue ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġif (! Places . isInitialized ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmetaData Ġ= Ġpackage Manager . getApplication Info ( packageName , ĠPackage Manager . GET _ META _ DATA ). metaData ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPl aces . initialize ( this , ĠmetaData . getString (" com . google . android . geo . API _ KEY ") !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġlocation Client Ġ= ĠLocation Services . getF used Location Provider Client ( this ) ĊĊĠĠĠĠĠĠĠ Ġshow Inform ative Dialog Ġ= Ġ! Preference Manager . getDefault SharedPreferences ( this ). getBoolean ( Preference Keys . DIALOG _ 1 _ SHO WN , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġshow Dis claimer Ġ= Ġ! Preference Manager . getDefault SharedPreferences ( this ). getBoolean ( Preference Keys . DIS CL AIM ER _ SHO WN , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġbottom Sheet Ġ= ĠfindViewById ( R . id . bottom _ sheet ) ĊĠĠĠĠĠĠĠ Ġsheet Behavior Ġ= ĠBottom Sheet Behavior . from ( bottom Sheet ) ĊĠĠĠĠĠĠĠ Ġsheet Behavior . state Ġ= ĠBottom Sheet Behavior . STATE _ EXP AN DED ĊĠĠĠĠĠĠĠ Ġslide Indicator Ġ= ĠfindViewById ( R . id . image view _ slide _ indicator ) ĊĠĠĠĠĠĠĠ Ġ( slide Indicator . parent Ġas ĠView ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( sheet Behavior . state ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ EXP AN DED Ġ-> Ġsheet Behavior . state Ġ= ĠBottom Sheet Behavior . STATE _ COLL AP SED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ COLL AP SED Ġ-> Ġsheet Behavior . state Ġ= ĠBottom Sheet Behavior . STATE _ EXP AN DED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmap Fragment Ġ= Ġsupport FragmentManager . find Fragment ById ( R . id . map _ fragment ) Ġas ĠSupport Map Fragment ĊĊĠĠĠĠĠĠĠ Ġtab layout . add On Tab Selected Listener ( this ) ĊĊĠĠĠĠĠĠĠ Ġsheet Behavior . bottom Sheet Callback Ġ= Ġsheet Behavior Callback ĊĊĠĠĠĠĠĠĠ Ġsearch Fragment Ġ= ĠSearch Fragment . newInstance () ĊĠĠĠĠĠĠĠ Ġall Routes Fragment Ġ= ĠAll Routes Fragment . newInstance () ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . beginTransaction (). add ( R . id . fragment _ container , Ġsearch Fragment , ĠSearch Fragment . TAG ). commit () ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . beginTransaction (). add ( R . id . fragment _ container , Ġall Routes Fragment , ĠAll Routes Fragment . TAG ). hide ( all Routes Fragment ). commit () ĊĠĠĠĠĠĠĠ Ġactive Fragment Ġ= Ġsearch Fragment ĊĊĠĠĠĠĠĠĠ Ġmap Fragment . getMap Async ( this ) ĊĠĠĠĠĠĠĠ Ġshow Dis claimer ( show Dis claimer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Dis claimer ( show : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( show ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . dis claimer _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . dis claimer _ message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . accept ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPreference Manager . getDefault SharedPreferences ( this @ MainActivity ). edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Boolean ( Preference Keys . DIS CL AIM ER _ SHO WN , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . cancel () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Search Fragment Height (): ĠInt { ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( search Fragment . view Ġ== Ġnull Ġ|| Ġsearch Fragment . view !!. height Ġ== Ġ 0 ) Ġresources . get Dimension Pixel Size ( R . dim en . default _ fragment _ height ) Ġelse Ġsearch Fragment . view !!. height ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Fragment ( new Fragment : ĠFragment ){ ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. hide ( active Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show ( new Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠ Ġactive Fragment Ġ= Ġnew Fragment ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Marker Bo unce ( marker : ĠMarker ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠHandler () ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠSystem Clock . uptime Millis () ĊĠĠĠĠĠĠĠ Ġval Ġinterpol ator Ġ= ĠBo unce Interpolator () ĊĠĠĠĠĠĠĠ Ġhandler . post ( object Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelapsed Ġ= ĠSystem Clock . uptime Millis () Ġ- ĠstartTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= ĠMath . max ( 1 Ġ- Ġinterpol ator . get Interpolation (( elapsed / ĠBO UN CE _ DURATION )), Ġ 0 f ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarker . set Anchor ( 0 . 5 f , Ġ 1 . 0 f Ġ+ Ġ Ġt ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t Ġ> Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Delayed ( this , Ġ 1 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġoverride Ġfun Ġon Map Ready ( google Map : ĠGoogle Map ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmap Ġ= Ġgoogle Map ĊĠĠĠĠĠĠĠ Ġmap . setOn Map Long ClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġmap . setOn Marker Drag Listener ( this ) ĊĠĠĠĠĠĠĠ Ġmap . move Camera ( Camera Update Factory . new LatLng Zoom ( UR U AP AN _ LAT L NG , ĠINITIAL _ ZO OM )) ĊĠĠĠĠĠĠĠ Ġmap . setOn Camera Move Listener ( this ) ĊĠĠĠĠĠĠĠ Ġif Ġ( location Permission Enabled ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . is My Location Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġask Permission () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠMov es Ġthe ĠGoogle Ġlogo Ġto Ġthe Ġtop Ġleft Ġcorner Ġof Ġthe Ġscreen ĊĠĠĠĠĠĠĠ Ġval Ġgoogle Logo Ġ= ĠfindViewById < View >( R . id . main _ content ). find View With Tag < View >(" Google Watermark ") ĊĠĠĠĠĠĠĠ Ġval Ġlogo LP Ġ= Ġgoogle Logo . layout Params Ġas ĠRelative Layout . LayoutParams ĊĠĠĠĠĠĠĠ Ġlogo LP . add Rule ( Relative Layout . ALIGN _ PARENT _ BOTTOM , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġlogo LP . add Rule ( Relative Layout . ALIGN _ PARENT _ LEFT , ĠRelative Layout . TRUE ) ĊĠĠĠĠĠĠĠ Ġlogo LP . add Rule ( Relative Layout . ALIGN _ PARENT _ START , ĠRelative Layout . TRUE ) ĊĠĠĠĠĠĠĠ Ġlogo LP . add Rule ( Relative Layout . ALIGN _ PARENT _ TOP , ĠRelative Layout . TRUE ) ĊĠĠĠĠĠĠĠ Ġgoogle Logo . layout Params Ġ= Ġlogo LP ĊĊĠĠĠĠĠĠĠ Ġsetup Settings Button () ĊĊĠĠĠĠĠĠĠ Ġ// ĠOb serves Ġthe Ġdrawing Ġevents Ġof Ġthe Ġslide Indicator Ġto Ġknow Ġits Ġheight Ġand Ġtake Ġit Ġinto Ġconsideration Ġfor Ġthe Ġmap 's Ġbottom Ġpadding , Ġthen Ġit Ġremoves Ġitself . ĊĠĠĠĠĠĠĠ Ġ// Ġalso Ġtakes Ġthe Ġpoint Ġon Ġscreen Ġof Ġwhere Ġto Ġshow Ġthe Ġinform ative Ġdialog Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġlayout Listener Ġ= Ġobject Ġ: ĠView Tree Observer . On Global Layout Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Global Layout () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . set Padding ( 0 , Ġ 0 , Ġ 0 , Ġget Search Fragment Height () Ġ+ Ġslide Indicator . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! search Fragment . get Has Inform ative Dialog Been Shown ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Height Ġ= Ġ( support FragmentManager . find Fragment ById ( R . id . map _ fragment ) Ġas ĠSupport Map Fragment ). view ?. height ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMove Ġthe ĠGoogle Map Comp ass Ġbelow Ġthe Ġlogo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomp ass Ġ= ĠfindViewById < View >( R . id . main _ content ). find View With Tag < View >(" Google Map Comp ass ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomp ass LP Ġ= Ġcomp ass . layout Params Ġas ĠRelative Layout . LayoutParams ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomp ass LP . top Margin Ġ+= Ġgoogle Logo . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomp ass . layout Params Ġ= Ġcomp ass LP ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslide Indicator . view Tree Observer . remove On Global Layout Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġslide Indicator . view Tree Observer . add On Global Layout Listener ( layout Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Settings Button (){ ĊĠĠĠĠĠĠĠ Ġval Ġmain Content Ġ= ĠfindViewById < View >( R . id . main _ content ) ĊĠĠĠĠĠĠĠ Ġval Ġlocation Button Ġ= Ġmain Content . find View With Tag < ImageView >(" Google Map My Location Button ") ĊĠĠĠĠĠĠĠ Ġval Ġsettings Button LayoutParams Ġ= ĠRelative Layout . LayoutParams ( resources . get Dimension Pixel Size ( R . dim en . settings _ button _ size ), Ġresources . get Dimension Pixel Size ( R . dim en . settings _ button _ size )). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmargin End Ġ= Ġresources . get Dimension Pixel Size ( R . dim en . settings _ button _ margin End ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( location Button . visibility Ġ== ĠView . VISIBLE ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Rule ( Relative Layout . ALIGN _ TOP , Ġlocation Button . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Rule ( Relative Layout . START _ OF , Ġlocation Button . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Margin Ġ= Ġresources . get Dimension Pixel Size ( R . dim en . settings _ button _ margin End ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Rule ( Relative Layout . ALIGN _ PARENT _ TOP , ĠRelative Layout . TRUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Rule ( Relative Layout . ALIGN _ PARENT _ END , ĠRelative Layout . TRUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġsettings Button Ġ= Ġmain Content . find View With Tag < Custom Image Button >( Custom Image Button . TAG ) ĊĠĠĠĠĠĠĠ Ġif ( settings Button Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings Button Ġ= ĠCustom Image Button ( this @ MainActivity , Ġsettings Button LayoutParams ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ Ġshow Settings () Ġ}} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( location Button . parent Ġas ĠRelative Layout ). addView ( settings Button ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings Button . layout Params Ġ= Ġsettings Button LayoutParams ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Settings (){ ĊĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠSettings Activity :: class . java )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow OutOfBounds Error (){ ĊĠĠĠĠĠĠĠ ĠOut Of Bounds Toast ( this ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Map Long Click ( pos : ĠLat Lng ){ ĊĠĠĠĠĠĠĠ Ġvi br ate () ĊĠĠĠĠĠĠĠ Ġif (! Search Fragment . uru apan LatLng Bounds . contains ( pos )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow OutOfBounds Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Marker Ġ== Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Marker ( pos , ĠgetString ( R . string . marker _ title _ origin ), ĠSearch Fragment . Marker Type . Origin , Ġanimate Ġ= Ġfalse , Ġbo unce Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Fragment . one Time Update Position ( Search Fragment . Marker Type . Origin , Ġpos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Marker Ġ== Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Marker ( pos , ĠgetString ( R . string . marker _ title _ destination ), ĠSearch Fragment . Marker Type . Destination , Ġanimate Ġ= Ġfalse , Ġbo unce Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Fragment . one Time Update Position ( Search Fragment . Marker Type . Destination , Ġpos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Marker ( Search Fragment . Marker Type . Origin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Marker ( Search Fragment . Marker Type . Destination ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Fragment . clear Inputs () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults Fragment ?. back Button Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdraw Route Result ( route : ĠRoute Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( route . main Segment Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . setVisibility ( route . is Draw n . not ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= ĠColor . parse Color ( route . color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoints Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ App Database . getInstance ( this @ MainActivity )?. routes DAO ()?. get Points From ( Ġroute . id )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Segment Pol Opt Ġ= ĠPoly line Options (). apply { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor ( color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth ( LINE _ WIDTH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz Index ( 0 . 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Cap ( Custom Cap ( get Bitmap Descriptor ( R . drawable . ic _ route _ endpoint , Ġcolor ) !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Cap ( Custom Cap ( get Bitmap Descriptor ( R . drawable . ic _ route _ star tpoint , Ġcolor ) !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( route . get Main Segment ( points !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecondary Segment Pol Opt Ġ= ĠPoly line Options (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor ( color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth ( LINE _ WIDTH / 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjoint Type ( Joint Type . ROUND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpattern ( Route Model . das hed P atter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( route . get Secondary Segment ( points !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . main Segment Ġ= Ġmap . add Polyline ( main Segment Pol Opt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . secondary Segment Ġ= Ġmap . add Polyline ( secondary Segment Pol Opt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . direction al Markers Ġ= Ġdraw Direction al Markers ( route . get Main Segment Points ( points !! ), Ġcolor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawn Routes . add ( route ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġdebug Ġpurposes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . start Marker Ġ= Ġdraw Marker ( route . start Point !!. get LatLng (), Ġ" start Point ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . end Marker Ġ= Ġdraw Marker ( route . end Point !!. get LatLng (), Ġ" end Point ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . main Segment Markers Ġ= Ġdraw Markers ( route . get Main Segment Points ( points )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . is Draw n Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo : Ġthere Ġcould Ġbe Ġa Ġbetter Ġway Ġto Ġupdate Ġthe Ġvisible Ġdirection al Ar rows Ġat Ġthe Ġcurrent Ġzoom Ġlvl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Shown Direction al Ar rows ( 0 , Ġmap Zoom Level , Ġroute , Ġroute Visible Ġ= Ġroute . is Draw n ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdraw Route ( route : ĠRoute Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( route . poly line Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . setVisibility ( route . is Draw n . not ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= ĠColor . parse Color ( route . color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoints Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ App Database . getInstance ( this @ MainActivity )?. routes DAO ()?. get Points From ( Ġroute . id )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoly line Options Ġ= ĠPoly line Options () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoly line Options ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. color ( color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width ( LINE _ WIDTH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. joint Type ( Joint Type . ROUND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints ?. forEach Ġ{ Ġpoly line Options . add ( it . get LatLng ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . poly line Ġ= Ġmap . add Polyline ( poly line Options ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . direction al Markers Ġ= Ġdraw Direction al Markers ( points !! , Ġcolor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawn Routes . add ( route ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġdebug ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . main Segment Markers Ġ= Ġdraw Markers ( points ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . is Draw n Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo : Ġthere Ġcould Ġbe Ġa Ġbetter Ġway Ġto Ġupdate Ġthe Ġvisible Ġdirection al Ar rows Ġat Ġthe Ġcurrent Ġzoom Ġlvl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Shown Direction al Ar rows ( 0 , Ġmap Zoom Level , Ġroute , Ġroute Visible Ġ= Ġroute . is Draw n ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Direction al Markers ( source Points : ĠList < Point >, Ġcolor : ĠInt ): ĠSparse Array < Iterable < Marker >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarrow Cap Ġ= Ġget Bitmap Descriptor ( R . drawable . ic _ arrow , Ġcolor ) ĊĊĠĠĠĠĠĠĠ Ġval Ġzoom Lv ls : ĠList < Zoom Level > Ġ= ĠArrayList < Zoom Level >(). apply { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Zoom Level ( 1 2 , Ġ 3 2 0 0 , Ġ 0 , ĠArrayList ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Zoom Level ( 1 3 , Ġ 1 6 0 0 , Ġ 0 , ĠArrayList ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Zoom Level ( 1 4 , Ġ 8 0 0 , Ġ 0 , ĠArrayList ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Zoom Level ( 1 6 , Ġ 4 0 0 , Ġ 0 , ĠArrayList ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Zoom Level ( 1 7 , Ġ 2 0 0 , Ġ 0 , ĠArrayList ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Zoom Level ( 1 8 , Ġ 1 0 0 , Ġ 0 , ĠArrayList ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġdist Counter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor ( x Ġin Ġsource Points . indices ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġsource Points [ x ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdist Counter Ġ+= Ġpoint . distance To Next Point ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( z Ġin Ġzoom Lv ls ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz . counter Ġ+= Ġpoint . distance To Next Point ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( z . counter Ġ>= Ġz . distance Interval Ġ&& Ġ( x Ġ+ Ġ 1 Ġ< Ġsource Points . size )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz . markers . add ( map . add Marker ( Marker Options () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. icon ( arrow Cap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. position ( point . get LatLng ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. rotation ( point . be aring To ( source Points [ x + 1 ]. lat , Ġsource Points [ x + 1 ]. lng Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. draggable ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flat ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. visible ( false ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġz . counter Ġ- Ġz . distance Interval ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzoom Lv ls . forEach Ġ{ Ġif ( it . zoom Level Ġ>= Ġz . zoom Level ) Ġit . counter Ġ= Ġd Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsparse Array Ġ= ĠSparse Array < Iterable < Marker >>() ĊĠĠĠĠĠĠĠ Ġfor ( z Ġin Ġzoom Lv ls ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsparse Array . append ( z . zoom Level , Ġz . markers ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsparse Array ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlocation Permission Enabled (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠContext Compat . check Self Permission ( this , ĠManifest . permission . ACCESS _ F INE _ LOCATION ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġask Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( Activity Compat . should Show Request Permission R ationale ( this , ĠManifest . permission . ACCESS _ F INE _ LOCATION )){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . permission _ location _ dialog _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . permission _ location _ dialog _ message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( getString ( R . string . ok )){ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠarrayOf ( Manifest . permission . ACCESS _ F INE _ LOCATION ), ĠLOC ATION _ PERMISSION _ REQUEST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( getString ( R . string . cancel ), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( request Code ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOC ATION _ PERMISSION _ REQUEST Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( grant Results . isNotEmpty () Ġ&& Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Fragment . restore Current Location ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . is My Location Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Settings Button () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Marker Drag Start ( m : ĠMarker ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( m Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġvi br ate () ĊĠĠĠĠĠĠĠ Ġstart Marker Position Ġ= Ġm . position ĊĠĠĠĠĠĠĠ Ġsearch Fragment . start Update Position ( m . tag Ġas ĠSearch Fragment . Marker Type , Ġm . position ) ĊĠĠĠĠĠĠĠ Ġresults Fragment ?. start Update () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Marker Drag End ( m : ĠMarker ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( m Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif (! Search Fragment . uru apan LatLng Bounds . contains ( m . position )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow OutOfBounds Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm . position Ġ= Ġstart Marker Position ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsearch Fragment . end Update Position ( m . tag Ġas ĠSearch Fragment . Marker Type , Ġm . position ) ĊĠĠĠĠĠĠĠ Ġif ( origin Marker Ġ!= Ġnull Ġ&& Ġdestination Marker Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults Fragment ?. end Update ( origin Marker !!. position , Ġdestination Marker !!. position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Marker Drag ( m : ĠMarker ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠOnly Ġupdate Ġdisplay Ġthe Ġcorresponding Ġlocation Ġon Ġthe Ġtext Field Ġevery ĠREF RESH _ INTERVAL Ġin Ġorder Ġto Ġprevent Ġgreater Ġlag Ġwhile Ġdragging Ġthe Ġmarker ĊĠĠĠĠĠĠĠ Ġif ( System . currentTimeMillis () Ġ- Ġrefresh StartTime Ġ> ĠREF RESH _ INTERVAL ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Fragment . update Position ( m ?. tag Ġas ĠSearch Fragment . Marker Type , Ġm . position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh StartTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Bitmap Descriptor (@ Drawable Res Ġid Res : ĠInt , Ġcolor : ĠInt ): ĠBitmap Descriptor ? { ĊĠĠĠĠĠĠĠ Ġval Ġdrawable Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Drawable ( id Res ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources . get Drawable ( id Res ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdrawable . setColor Filter ( color , ĠPort er D uff . Mode . MULTI PLY ) ĊĠĠĠĠĠĠĠ Ġdrawable . setBounds ( 0 , Ġ 0 , Ġdrawable . intrinsic Width , Ġdrawable . intrinsic Height ) ĊĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġcreate Bitmap ( drawable . intrinsic Width , Ġdrawable . intrinsic Height , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( bitmap ) ĊĠĠĠĠĠĠĠ Ġdrawable . draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠBitmap Descriptor Factory . from Bitmap ( bitmap ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvi br ate (){ ĊĠĠĠĠĠĠĠ Ġval Ġvi br ator Ġ= Ġget System Service ( Context . V IB R ATOR _ SERVICE ) Ġas ĠV ibr ator ĊĠĠĠĠĠĠĠ Ġif (! vi br ator . has V ibr ator ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvi br ator . vi br ate ( V ibration Effect . create One Shot ( V IB RATION _ DURATION , ĠV ibration Effect . DEFAULT _ AMP LIT UDE )) ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvi br ator . vi br ate ( V IB RATION _ DURATION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget LatLng Bounds From ( point 1 : ĠLat Lng , Ġpoint 2 : ĠLat Lng ) Ġ= ĊĠĠĠĠĠĠĠ ĠLat Lng Bounds . builder (). include ( point 1 ). include ( point 2 ). build () ĊĊĠĠĠ Ġoverride Ġfun Ġon Search ( origin : ĠLat Lng , Ġdestination : ĠLat Lng ){ ĊĠĠĠĠĠĠĠ Ġmap . animate Camera ( Camera Update Factory . new LatLng Bounds ( get LatLng Bounds From ( destination , Ġorigin ), ĠCAM ERA _ P ADDING _ MARKER )) ĊĠĠĠĠĠĠĠ Ġresults Fragment Ġ= ĠResults Fragment . newInstance ( get Search Fragment Height (), Ġorigin , Ġdestination ) ĊĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( R . id . fragment _ container , Ġresults Fragment !! , ĠResults Fragment . TAG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. hide ( search Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠ Ġactive Fragment Ġ= Ġresults Fragment !! ĊĠĠĠĠĠĠĠ Ġall Routes Fragment . re cyclerView . is Nested Scrolling Enabled Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinform ative Dialog 1 Shown (){ ĊĠĠĠĠĠĠĠ Ġval Ġpreference Editor Ġ= ĠPreference Manager . getDefault SharedPreferences ( application Context ). edit () ĊĠĠĠĠĠĠĠ Ġpreference Editor . put Boolean ( Preference Keys . DIALOG _ 1 _ SHO WN , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġpreference Editor . apply () ĊĠĠĠĠĠĠĠ Ġshow Inform ative Dialog Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Dummy LatLng (): ĠLat Lng { ĊĠĠĠĠĠĠĠ Ġval Ġmap Fragment Ġ= Ġsupport FragmentManager . find Fragment ById ( R . id . map _ fragment ) Ġas ĠSupport Map Fragment ĊĠĠĠĠĠĠĠ Ġval Ġmap Center Ġ= ĠPoint ( map Fragment . view !!. width / 2 , Ġmap Fragment . view !!. height / 2 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmap . projection . from Screen Location ( map Center ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġdraw Marker ( position : ĠLat Lng ?, Ġtitle : ĠString , Ġmarker Type : ĠSearch Fragment . Marker Type , Ġanimate : ĠBoolean , Ġbo unce : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpos Ġ= Ġposition Ġ?: Ġget Dummy LatLng () ĊĠĠĠĠĠĠĠ Ġvar Ġshould Animate Ġ= Ġanimate ĊĊĠĠĠĠĠĠĠ Ġif (! Search Fragment . uru apan LatLng Bounds . contains ( pos )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ= ĠU RU AP AN _ LAT L NG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshould Animate Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( should Animate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . animate Camera ( Camera Update Factory . new LatLng ( pos )) ĊĊĠĠĠĠĠĠĠ Ġif ( marker Type Ġ== ĠSearch Fragment . Marker Type . Origin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Marker ?. remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Marker Ġ= Ġmap . add Marker ( Marker Options (). title ( title ). position ( pos ). icon ( Bitmap Descriptor Factory . default Marker ( Bitmap Descriptor Factory . H UE _ AZURE )). draggable ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Marker ?. tag Ġ= Ġmarker Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( bounce ) Ġset Marker Bo unce ( origin Marker !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif ( marker Type Ġ== ĠSearch Fragment . Marker Type . Destination ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Marker ?. remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Marker Ġ= Ġmap . add Marker ( Marker Options (). title ( title ). position ( pos ). icon ( Bitmap Descriptor Factory . default Marker ( Bitmap Descriptor Factory . H UE _ RED )). draggable ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Marker ?. tag Ġ= Ġmarker Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( bounce ) Ġset Marker Bo unce ( destination Marker !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġif (( search Fragment . get Show Inform ative Dialog () Ġ&& Ġmap Height Ġ!= Ġnull )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuse Ġthe Ġmap Ġinitial Ġheight Ġas Ġvertical Ġoffset Ġfrom Ġthe Ġbottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbecause Ġthe Ġkeyboard Ġdoesn 't Ġhide Ġimmediately Ġand Ġthere 's Ġno Ġeasy Ġway Ġto Ġfind Ġout Ġthe Ġkeyboard 's Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvertical Offset Ġ= Ġmap Height !! / 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Offset Ġ+= Ġresources . get Dimension ( R . dim en . default _ marker _ height ). toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠInform ative Dialog . show ( this , Ġvertical Offset , ĠInform ative Dialog . Style . Center , ĠR . string . how _ to _ move _ markers _ message , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Interface . On Dismiss Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Fragment . set Has Inform ative Dialog Been Shown ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear Marker ( marker Type : ĠSearch Fragment . Marker Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( marker Type ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSearch Fragment . Marker Type . Origin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Marker ?. remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Marker Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSearch Fragment . Marker Type . Destination Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Marker ?. remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Marker Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back From Results ( removed Routes : ĠList < Route Model >? ){ ĊĠĠĠĠĠĠĠ Ġif ( removed Routes Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( removed Route Ġin Ġremoved Routes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawn Routes . remove ( removed Route ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġclear S quares () ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove ( results Fragment !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show ( search Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠ Ġactive Fragment Ġ= Ġsearch Fragment ĊĠĠĠĠĠĠĠ Ġresults Fragment Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġall Routes Fragment . re cyclerView . is Nested Scrolling Enabled Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsheet Behavior Callback Ġ= Ġobject Ġ: ĠBottom Sheet Behavior . Bottom Sheet Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Slide ( bottom Sheet : ĠView , Ġslide Offset : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġslide Indicator . rotation Ġ= Ġ 1 8 0 Ġ* Ġ( 1 - slide Offset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon StateChanged ( bottom Sheet : ĠView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( newState ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ COLL AP SED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Keyboard ( bottom Sheet . context , Ġwindow . decor View . window Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . set Padding ( 0 , Ġ 0 , Ġ 0 , Ġslide Indicator . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ EXP AN DED Ġ-> Ġmap . set Padding ( 0 , Ġ 0 , Ġ 0 , Ġget Search Fragment Height () Ġ+ Ġslide Indicator . height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( results Fragment ?. isVisible Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults Fragment !!. back Button Pressed () ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Camera Move () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( map Zoom Level Ġ!= Ġmap . camera Position . zoom . toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( route Ġin Ġdrawn Routes ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( route . is Draw n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Shown Direction al Ar rows ( map Zoom Level , Ġmap . camera Position . zoom . toInt (), Ġroute ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Zoom Level Ġ= Ġmap . camera Position . zoom . toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Tab Re selected ( tab : ĠTab Layout . Tab ? ){ ĊĠĠĠĠĠĠĠ Ġif ( sheet Behavior . state Ġ== ĠBottom Sheet Behavior . STATE _ COLL AP SED ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsheet Behavior . state Ġ= ĠBottom Sheet Behavior . STATE _ EXP AN DED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Tab Un selected ( tab : ĠTab Layout . Tab ?) Ġ= ĠUnit ĊĊĠĠĠ Ġoverride Ġfun Ġon Tab Selected ( tab : ĠTab Layout . Tab ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( tab ?. position ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Keyboard ( this , Ġwindow . decor View . window Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Routes Fragment . set Height ( search Fragment . view ?. height !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Routes Fragment . re cyclerView . is Nested Scrolling Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Fragment ( all Routes Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( results Fragment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Fragment ( results Fragment !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Routes Fragment . re cyclerView . is Nested Scrolling Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Fragment ( search Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( sheet Behavior . state Ġ== ĠBottom Sheet Behavior . STATE _ COLL AP SED ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsheet Behavior . state Ġ= ĠBottom Sheet Behavior . STATE _ EXP AN DED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// current Zoom L vl Ġh asta Ġque Ġn ivel Ġde Ġzoom Ġest an Ġvisible s Ġlos Ġm arc adores ĊĠĠĠ Ġprivate Ġfun Ġupdate Shown Direction al Ar rows ( current Zoom L vl : ĠInt , Ġnew Zoom L vl : ĠInt , Ġroute : ĠRoute Model , Ġroute Visible : ĠBoolean Ġ= Ġtrue ){ ĊĠĠĠĠĠĠĠ Ġif ( route . direction al Markers Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif ( current Zoom L vl Ġ< Ġnew Zoom L vl ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// route Visible Ġmarkers Ġbetween Ġcurrent Ġand Ġnew ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( x Ġin Ġ( current Zoom L vl + 1 ) .. new Zoom L vl ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( route . direction al Markers ! ![ x ] Ġ!= Ġnull ) Ġroute . direction al Markers ! ![ x ]. forEach Ġ{ Ġit . isVisible Ġ= Ġroute Visible Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// hide Ġmarkers Ġbetween Ġnew Ġand Ġcurrent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( x Ġin Ġ( new Zoom L vl + 1 ) .. current Zoom L vl ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( route . direction al Markers ! ![ x ] Ġ!= Ġnull ) Ġroute . direction al Markers ! ![ x ]. forEach Ġ{ Ġit . isVisible Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠĠĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġdebug Ġpur po uses ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdraw Marker ( lat Lng : ĠLat Lng , Ġtitle : ĠString ): ĠMarker ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif (! Preference Manager . getDefault SharedPreferences ( this ). getBoolean ( Preference Keys . DRAW _ START END _ POINTS , Ġfalse )) Ġnull ĊĠĠĠĠĠĠĠ Ġelse Ġmap . add Marker ( Marker Options (). title ( title ). position ( lat Lng ). icon ( Bitmap Descriptor Factory . default Marker ( Bitmap Descriptor Factory . H UE _ YELLOW )). draggable ( false )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Markers ( points : ĠList < Point >): ĠList < Marker >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif (! Preference Manager . getDefault SharedPreferences ( this ). getBoolean ( Preference Keys . DRAW _ ROUTE _ POINTS , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmarkers Ġ= ĠArrayList < Marker >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . forEach { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarkers . add ( map . add Marker ( Marker Options (). title ( it . number . toString ()). position ( it . get LatLng ()). icon ( Bitmap Descriptor Factory . default Marker ( Bitmap Descriptor Factory . H UE _ V IO LET )). draggable ( false ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmarkers ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdraw S quares ( walk ing Distance : ĠDouble ){ ĊĠĠĠĠĠĠĠ Ġif (! Preference Manager . getDefault SharedPreferences ( this ). getBoolean ( Preference Keys . DRAW _ S QUARE S , Ġfalse )) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġclear S quares () ĊĊĠĠĠĠĠĠĠ Ġorigin Square Ġ= Ġmap . add Polygon ( Polygon Options () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAll ( get Square From ( walk ing Distance , Ġorigin Marker !!. position )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. stroke Color ( Color . BLACK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Color ( Color . arg b ( 1 0 0 , 1 0 0 , 1 0 0 , 1 0 0 ))) ĊĠĠĠĠĠĠĠ Ġdestination Square Ġ= Ġmap . add Polygon ( Polygon Options () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAll ( get Square From ( walk ing Distance , Ġdestination Marker !!. position )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. stroke Color ( Color . BLACK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Color ( Color . arg b ( 1 0 0 , 1 0 0 , 1 0 0 , 1 0 0 ))) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear S quares (){ ĊĠĠĠĠĠĠĠ Ġorigin Square ?. remove () ĊĠĠĠĠĠĠĠ Ġdestination Square ?. remove () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Square From ( distance : ĠDouble , Ġcenter : ĠLat Lng ): ĠList < LatLng >{ ĊĠĠĠĠĠĠĠ Ġval Ġpoints Ġ= ĠArrayList < LatLng >( 4 ) ĊĊĠĠĠĠĠĠĠ Ġpoints . add ( LatLng ( center . latitude Ġ- Ġdistance , Ġcenter . longitude Ġ+ Ġdistance )) ĊĠĠĠĠĠĠĠ Ġpoints . add ( LatLng ( center . latitude Ġ+ Ġdistance , Ġcenter . longitude Ġ+ Ġdistance )) ĊĠĠĠĠĠĠĠ Ġpoints . add ( LatLng ( center . latitude Ġ+ Ġdistance , Ġcenter . longitude Ġ- Ġdistance )) ĊĠĠĠĠĠĠĠ Ġpoints . add ( LatLng ( center . latitude Ġ- Ġdistance , Ġcenter . longitude Ġ- Ġdistance )) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpoints ĊĠĠĠ Ġ} Ċ } Ċ