package Ġsoftware . or ping ton . ro z klad mp k . home . map Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġkotlinx . coroutines . experimental . android . UI Ċ import Ġkotlinx . coroutines . experimental . launch Ċ import Ġsoftware . or ping ton . ro z klad mp k . data . model .* Ċ import Ġsoftware . or ping ton . ro z klad mp k . data . source . I DataSource Ċ import Ġsoftware . or ping ton . ro z klad mp k . data . source . Remote DataSource Ċ import Ġsoftware . or ping ton . ro z klad mp k . home . Stops And Routes Helper Ċ import Ġsoftware . or ping ton . ro z klad mp k . utils . Geo Location Ċ import Ġsoftware . or ping ton . ro z klad mp k . utils . Map Colo urs Helper Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . TimeUnit ĊĊ Ċ class ĠMap Presenter ( ĊĠĠĠ Ġprivate Ġval Ġremote DataSource : ĠRemote DataSource Ċ ) Ġ: ĠMap Contract . Presenter Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġview : ĠMap Contract . View ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġfun Ġattach View ( view : ĠMap Contract . View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . view Ġ= Ġview ĊĊĠĠĠĠĠĠĠ Ġval Ġinitial Delay Ġ= Ġ 6 1 L Ġ- ĠCalendar . getInstance (). get ( Calendar . SECOND ) ĊĠĠĠĠĠĠĠ Ġval Ġrate Ġ= Ġ 3 0 L ĊĠĠĠĠĠĠĠ Ġupdate Scheduler . schedule At Fixed Rate ( update Scheduler Callback , Ġinitial Delay , Ġrate , ĠTimeUnit . SECONDS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdetach View () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . view Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlast UpdateTime Ġ= Ġ 0 L ĊĠĠĠ Ġprivate Ġval Ġminimal Time Delta Between Updates Ġ= Ġ 3 0 Ġ* Ġ 1 0 0 0 Ġ// Ġ 3 0 Ġseconds ĊĠĠĠ Ġprivate Ġval Ġupdate Scheduler Ġ= ĠExec utors . new Single Thread Scheduled Executor () ĊĠĠĠ Ġprivate Ġval Ġupdate Scheduler Callback Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch ( UI ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcurrentTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentTime Ġ>= Ġ( last UpdateTime Ġ+ Ġminimal Time Delta Between Updates )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Depart ures ( last Stop Names ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Vehicle Locations () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Vehicle Locations () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroute IDs Ġ= Ġtracked Depart ures . values . flatten (). map Ġ{ Ġdepart ure Details Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Details . route ID ĊĠĠĠĠĠĠĠ Ġ}. distinct () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( route IDs . isEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġremote DataSource . get Vehicle Position ( route IDs , Ġobject Ġ: ĠI DataSource . Load Data Callback < Vehicle Positions > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Loaded ( data : ĠVehicle Positions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. draw Vehicle Markers ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Not Available () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġstops And Routes : ĠSto ps And Routes Ġ= ĠSto ps And Routes ( emptyList (), Ġempty List ()) ĊĠĠĠ Ġoverride Ġfun Ġload Stops () Ġ{ ĊĠĠĠĠĠĠĠ Ġview ?. show ProgressBar () ĊĠĠĠĠĠĠĠ Ġremote DataSource . get Stops And Routes ( object Ġ: ĠI DataSource . Load Data Callback < Stops And Routes > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Loaded ( data : ĠSto ps And Routes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstops And Routes Ġ= Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. hide ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Not Available () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. hide ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. report That Something W ent Wrong () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlast User Location : ĠGeo Location ĊĠĠĠ Ġoverride Ġfun Ġlocation Changed ( latitude : ĠDouble , Ġlongitude : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast User Location Ġ= ĠGeo Location . from Degrees ( latitude , Ġlongitude ) ĊĠĠĠĠĠĠĠ Ġval Ġhelper Ġ= ĠSto ps And Routes Helper () ĊĠĠĠĠĠĠĠ Ġval Ġnearby Stops Ġ= Ġhelper . filter Near by Stops ( stops And Routes . stops , Ġlast User Location ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( near by Stops . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ures Ġ= Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Stop Names Ġ= Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View Items () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġload Depart ures ( near by Stops . map Ġ{ Ġstop Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop . stop Name ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" SimpleDateFormat ") ĊĠĠĠ Ġprivate Ġfun ĠconvertTo View Items ( depart ures : ĠDep art ures ): ĠList < Depart ure View Item > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Items Ġ= Ġmutable ListOf < Depart ure View Item >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( depart ures . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Items . add ( Depart ure NotFound ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġview Items ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsorted Depart ures Ġ= Ġsort Depart ures ( depart ures ) ĊĠĠĠĠĠĠĠ Ġval Ġstop IDs Already Present Ġ= Ġsorted Depart ures . map Ġ{ Ġit . stop . stop ID Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtracked Depart ures ToAdd : ĠMutable List < Depart ure > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġstops Ġthat Ġuser Ġis Ġtracking , Ġbut Ġhis Ġlocation Ġhas Ġalready Ġchanged , Ġso Ġthey Ġaren 't ĊĠĠĠĠĠĠĠ Ġ// Ġpresent Ġin Ġdepart ures Ġreceived Ġfrom Ġserver ĊĠĠĠĠĠĠĠ Ġfor Ġ(( stop , Ġv ) Ġin Ġtracked Depart ures ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stop IDs Already Present . contains ( stop . stop ID )) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v . isEmpty ()) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracked Depart ures ToAdd . add ( Depart ure ( stop , Ġmutable ListOf ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( depart ure Ġin Ġtracked Depart ures ToAdd Ġ+ Ġsorted Depart ures ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Ġ= Ġdepart ure . stop ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Location Ġ= ĠGeo Location . from Degrees ( stop . latitude , Ġstop . longitude ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġearth Radius Ġ= Ġ 6 3 7 8 . 1 Ġ* Ġ 1 0 0 0 Ġ// Ġin Ġmeters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġstop Location . distance To ( last User Location , Ġearth Radius ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Items . add ( Depart ure Header ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop . stop Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop . stop ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadd Show More Button Ġ= Ġ! fully Expanded Stops . contains ( stop . stop ID ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtracked Depart ure Details ToAdd Ġ= Ġtracked Depart ures . getOrElse ( stop ) Ġ{ Ġmutable ListOf () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdepart ures ToAdd Ġ= Ġ( tracked Depart ure Details ToAdd Ġ+ Ġwhen Ġ( add Show More Button ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġdepart ure . depart ures . take ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġdepart ure . depart ures ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}). distinct By Ġ{ Ġdepart ure Details Ġ-> Ġdepart ure Details . trip ID Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġdepart ure Details Ġ-> Ġdepart ure Details . depart ure Time Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( depart ure Details Ġin Ġdepart ures ToAdd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimezone Ġ= ĠTime Zone . getTime Zone (" Europe / W ars aw ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformat Ġ= ĠSimpleDateFormat (" HH : mm ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat . time Zone Ġ= Ġtimezone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar Ġ= ĠCalendar . getInstance ( timezone ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdepart ure Time Ġ= Ġformat . parse ( depart ure Details . depart ure Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠDate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Time . year , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Time . month , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Time . date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . time . hours , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . time . minutes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= Ġdepart ure Time . time Ġ- Ġnow . time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= ĠTimeUnit . MILLISECONDS . to Minutes ( diff ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Bus Ġ= Ġstops And Routes . routes . find Ġ{ Ġroute Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . route ID Ġ== Ġdepart ure Details . route ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. is Bus Ġ?: Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Tracked Ġ= Ġtracked Depart ure Details ToAdd . contains ( depart ure Details ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Colour Ġ= Ġtracked Depart ures Colo urs . getOrElse ( depart ure Details . trip ID ) Ġ{ Ġ- 1 Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Items . add ( Depart ure Details ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Bus , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Details . route ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Details . direction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminutes . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Details . depart ure Time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Details . on Demand , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Details . trip ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Tracked , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Colour ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add Show More Button ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Items . add ( Depart ure Show More ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġview Items ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsort Depart ures ( depart ures : ĠDep art ures ): ĠDep art ures Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdepart ures . sorted By Ġ{ Ġdepart ure Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Location Ġ= ĠGeo Location . from Degrees ( depart ure . stop . latitude , Ġdepart ure . stop . longitude ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġearth Radius Ġ= Ġ 6 3 7 8 . 1 Ġ* Ġ 1 0 0 0 Ġ// Ġin Ġmeters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Location . distance To ( last User Location , Ġearth Radius ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate View Items () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Items Ġ= ĠconvertTo View Items ( depart ures ) ĊĠĠĠĠĠĠĠ Ġview ?. show Depart ures ( view Items ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġview Items : ĠList < Depart ure View Item > Ġ= Ġempty List () ĊĠĠĠ Ġprivate Ġvar Ġdepart ures : ĠDep art ures Ġ= Ġempty List () ĊĠĠĠ Ġprivate Ġvar Ġlast Stop Names : ĠList < String > Ġ= Ġempty List () ĊĊĠĠĠ Ġ@ get : Synchron ized ĊĠĠĠ Ġ@ set : Synchron ized ĊĠĠĠ Ġprivate Ġvar Ġis Trying To Load Depart ures : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġload Depart ures ( stop Names : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Stop Names Ġ= Ġstop Names ĊĠĠĠĠĠĠĠ Ġif Ġ( stop Names . isEmpty () Ġ|| Ġstops And Routes . stops . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( is Trying To Load Depart ures ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġis Trying To Load Depart ures Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġview ?. show ProgressBar () ĊĠĠĠĠĠĠĠ Ġremote DataSource . get Depart ures ( stop Names , Ġobject Ġ: ĠI DataSource . Load Data Callback < Depart ures > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Loaded ( data : ĠDep art ures ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ures Ġ= Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View Items () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. hide ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Trying To Load Depart ures Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast UpdateTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Not Available () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. hide ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. report That Something W ent Wrong () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Trying To Load Depart ures Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġfully Expanded Stops : ĠMutable List < Int > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġoverride Ġfun Ġon Show More Clicked ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstop ID Ġ= Ġview Items ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sub List ( 0 , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Depart ure Header >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. stop ID ĊĠĠĠĠĠĠĠ Ġfully Expanded Stops . add ( stop ID ) ĊĠĠĠĠĠĠĠ Ġupdate View Items () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdepart ure Clicked ( adapter Position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstop Name Ġ= Ġview Items ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sub List ( 0 , Ġadapter Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Depart ure Header >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. stop Name ĊĊĠĠĠĠĠĠĠ Ġval Ġtrip ID Ġ= Ġview Items . sub List ( 0 , Ġadapter Position Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Depart ure Details >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. trip ID ĊĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġview Items [ adapter Position ] ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDep art ure Details Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. navigate To Route Details ( item . route ID , Ġstop Name , Ġitem . direction , Ġitem . depart ure Time , Ġtrip ID ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġretry To Load Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( stops And Routes . stops . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Stops () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( depart ures . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Depart ures ( last Stop Names ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtracked Depart ures : ĠMutable Map < Stops And Routes . Stop , ĠMutable List < Depart ure . Depart ure Details >> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġ// ĠKey : ĠTrip ID , ĠValue : ĠColour ĊĠĠĠ Ġprivate Ġval Ġtracked Depart ures Colo urs : ĠMutable Map < Int , ĠInt > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġprivate Ġval Ġcolo urs Helper Ġ= ĠMap Colo urs Helper () ĊĠĠĠ Ġoverride Ġfun Ġon Track Button Clicked ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtrip ID Ġ= Ġview Items . sub List ( 0 , Ġposition Ġ+ Ġ 1 ) Ġ// Ġshould Ġbe Ġokay , Ġheaders Ġare Ġalways Ġfollowed Ġby Ġother Ġitems ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Depart ure Details >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. trip ID ĊĊĠĠĠĠĠĠĠ Ġval Ġstop ID Ġ= Ġview Items . sub List ( 0 , Ġposition Ġ+ Ġ 1 ) Ġ// Ġshould Ġbe Ġokay , Ġheaders Ġare Ġalways Ġfollowed Ġby Ġother Ġitems ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Depart ure Header >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. stop ID ĊĊĠĠĠĠĠĠĠ Ġval Ġdepart ure Details Ġ= Ġdepart ures . find Ġ{ Ġdepart ure Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure . stop . stop ID Ġ== Ġstop ID ĊĠĠĠĠĠĠĠ Ġ} ?. depart ures ?. find Ġ{ Ġdepart ure Details Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Details . trip ID Ġ== Ġtrip ID ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( depart ure Details Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġvehicle Ġalready Ġhas Ġdepart ed . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġit 's Ġnot Ġpresent Ġin Ġ' depart ures ' Ġlist , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbut Ġit Ġshould Ġbe Ġpresent Ġin Ġ' tracked Depart ures ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( k , Ġv ) Ġin Ġtracked Depart ures ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem ToRemove Ġ= Ġv . find Ġ{ Ġdepart ure Details Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Details . trip ID Ġ== Ġtrip ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item ToRemove Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . remove ( item ToRemove ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolo urs Helper . release Colour ( tracked Depart ures Colo urs [ trip ID ] Ġ?: Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracked Depart ures Colo urs . remove ( trip ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracked Depart ures . keys . find Ġ{ Ġstop Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop . stop ID Ġ== Ġstop ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġdepart ures . find Ġ{ Ġdepart ure Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure . stop . stop ID Ġ== Ġstop ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. stop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tracked Depart ures . containsKey ( stop )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracked Depart ures [ stop ] Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tracked Depart ures [ stop ] !!. contains ( depart ure Details )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracked Depart ures [ stop ] !!. remove ( depart ure Details ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolo urs Helper . release Colour ( tracked Depart ures Colo urs [ trip ID ] Ġ?: Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracked Depart ures Colo urs . remove ( depart ure Details . trip ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracked Depart ures [ stop ] !!. add ( depart ure Details ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracked Depart ures Colo urs [ depart ure Details . trip ID ] Ġ= Ġcolo urs Helper . getNext Color () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate View Items () ĊĠĠĠĠĠĠĠ Ġupdate Route Shapes () ĊĠĠĠĠĠĠĠ Ġupdate Vehicle Locations () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Route Shapes () Ġ{ ĊĠĠĠĠĠĠĠ Ġview ?. clear Shapes () ĊĠĠĠĠĠĠĠ Ġview ?. clear Stops () ĊĠĠĠĠĠĠĠ Ġview ?. clear Vehicle Markers () ĊĠĠĠĠĠĠĠ Ġview ?. show ProgressBar () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( tracked Depart ure Ġin Ġtracked Depart ures . toMap ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( tracked Depart ure Details Ġin Ġtracked Depart ure . value ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshape Colour Ġ= Ġtracked Depart ures Colo urs . getOrElse ( tracked Depart ure Details . trip ID ) Ġ{ Ġ- 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcb Ġ= Ġobject Ġ: ĠI DataSource . Load Data Callback < Map Data > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Loaded ( data : ĠMap Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. draw Shape ( data . shapes . first (), Ġshape Colour ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. draw Stops ( data . stops ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. hide ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Not Available () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. report That Something W ent Wrong () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. hide ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote DataSource . get Trip Map Data ( tracked Depart ure Details . trip ID , Ġcb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }