package Ġcom . sur rus . gal way bus . ui . view model Ċ Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . or h ano but . logger . Logger Ċ import Ġcom . sur rus . gal way bus . domain . inter actor . Get Nearest Bus Stops UseCase Ċ import Ġcom . sur rus . gal way bus . model . Bus Stop Ċ import Ġcom . sur rus . gal way bus . model . Location Ċ import Ġcom . sur rus . gal way bus . ui . data . Resource Ċ import Ġcom . sur rus . gal way bus . ui . data . Resource State Ċ import Ġcom . sur rus . gal way bus . model . Result Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . util .* Ċ import Ġkotlin . concurrent . fixed Rate Timer Ċ import Ġkotlin . coroutines . Coroutine Context ĊĊ Ċ class ĠNe arest Bus Stops ViewModel Ġconstructor ( private Ġval Ġget Nearest Bus Stops UseCase : ĠGet Nearest Bus Stops UseCase , Ġval Ġui Dispatcher : ĠCor outine Dispatcher Ġ= ĠDispatch ers . Main ) ĊĠĠĠ Ġ: ĠViewModel (), ĠCor outine Scope Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠviewModel Job Ġ= ĠJob () ĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġui Dispatcher Ġ+ ĠviewModel Job ĊĊĠĠĠ Ġvar Ġbus Stops : ĠMutable LiveData < Resource < List < Bus Stop >>> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġlocation : ĠMutable LiveData < Location > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġcamera Position : ĠMutable LiveData < Location > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġprivate Ġval Ġzoom Level : ĠMutable LiveData < Float > Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġprivate Ġvar Ġdepart ure Timer : ĠTimer ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġzoom Level . value Ġ= Ġ 1 5 . 0 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpoll For Nearest Bus Stop Times () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( location . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Timer ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Timer Ġ= Ġfixed Rate Timer (" get Depart es Timer ", Ġtrue , Ġ 0 , Ġ 3 0 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġget Nearest Bus Stops UseCase . get Nearest Bus Stops ( location . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbus Stops . post Value ( when Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Success Ġ-> ĠResource ( Resource State . SUCCESS , Ġresult . data , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Error Ġ-> ĠResource ( Resource State . ERROR , Ġnull , Ġresult . exception . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Polling () Ġ{ ĊĠĠĠĠĠĠĠ Ġdepart ure Timer ?. cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Camera Position ( loc : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcamera Position . value Ġ= Ġloc ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Location ( loc : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlocation . value Ġ= Ġloc ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Zoom Level ( zl : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġzoom Level . value Ġ= Ġz l ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Location (): ĠLocation ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlocation . value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Zoom Level (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġzoom Level . value !! ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ ĠLogger . d (" Nearest Bus Stops ViewModel . on Cle ared ") ĊĠĠĠĠĠĠĠ Ġstop Polling () ĊĠĠĠ Ġ} Ċ }