package Ġpl . si enc zy km . temp l bn . ui . list . common Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . location . Location Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mediator LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġpl . si enc zy km . temp l bn . R Ċ import Ġpl . si enc zy km . temp l bn . db . model . Base Station Model Ċ import Ġpl . si enc zy km . temp l bn . ui . common . Base Refresh ViewModel Ċ import Ġpl . si enc zy km . temp l bn . utils . ha vers ine Ċ Ċ abstract Ġclass ĠBase Station List ViewModel < T Ġ: ĠBase Station Model >( application : ĠApplication ) Ġ: ĊĠĠĠ ĠBase Refresh ViewModel < Base Refresh List Navigator >( application ) Ġ{ ĊĊĠĠĠ Ġprotected Ġvar Ġis Ref reshed OnInit Ġ= Ġfalse ĊĊĠĠĠ Ġ// ĠTODO : Ġchange Ġthis ĠBase Station Model Ġto ĠT Ġwhen Ġdatab ind ing Ġlib Ġis Ġfixed ĊĠĠĠ Ġval Ġstations Ġ= ĠMed iator LiveData < List < Base Station Model >>() ĊĊĠĠĠ Ġabstract Ġval Ġstations LiveData : ĠLive Data < List < T >> ĊĊĠĠĠ Ġprivate Ġvar Ġscroll To Top Ġ= Ġtrue ĊĊĠĠĠ Ġvar Ġcoordinates : ĠLocation ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstations LiveData . value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstations . value Ġ= Ġsort St ations ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scrollTo Top ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Navigator ()?. scrollTo Top () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll To Top Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsort St ations ( stations : ĠList < T >): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( coordinates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġstations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġit . distance Ġ= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted With ( compare By ({ Ġ! it . favorite Ġ}, Ġ{ Ġit . getName () Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġstations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . distance Ġ= Ġha vers ine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoordinates !!. latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoordinates !!. longitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . longitude ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted With ( compare By ({ Ġ! it . favorite Ġ}, Ġ{ Ġit . distance Ġ}, Ġ{ Ġit . getName () Ġ})) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : Ġchange Ġthis ĠBase Station Model Ġto ĠT Ġwhen Ġdatab ind ing Ġlib Ġis Ġfixed ĊĠĠĠ Ġabstract Ġsuspend Ġfun Ġupdate F avour ite ( station : ĠBase Station Model ): ĠInt ĊĊĠĠĠ Ġabstract Ġfun Ġrefresh IfNeeded ( stations : ĠList < T >) ĊĊĠĠĠ Ġfun Ġhandle Favorite ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstation Ġ= Ġstations . value ?. get ( position ) Ġ?: Ġthrow ĠException (" Station Ġis Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( update F avour ite ( station ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! station . favorite ) Ġget Navigator ()?. show Info ( R . string . added _ to _ favorites ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġget Navigator ()?. show Info ( R . string . removed _ from _ favorites ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Navigator ()?. scrollTo Top () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }