package Ġcom . net guru . ar local izer view . location Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . location . Location Ċ import Ġcom . google . android . gms . location . Location Request Ċ import Ġcom . pat lo ew . rx location . Rx Location Ċ import Ġio . reactivex . Back pressure Strategy Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġkotlin . math . round ToInt Ċ Ċ internal Ġclass ĠLocation Provider ( private Ġval Ġrx Location : ĠRx Location ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLOC ATION _ REQUEST _ INTERVAL Ġ= Ġ 5 0 0 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFAST EST _ REQUEST _ INTERVAL Ġ= Ġ 2 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSM ALLE ST _ DIS PLACE MENT _ NOT IC ED Ġ= Ġ 1 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlocation Request Ġ= ĠLocation Request (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġinterval Ġ= ĠLOC ATION _ REQUEST _ INTERVAL ĊĠĠĠĠĠĠĠ Ġfast est Interval Ġ= ĠFAST EST _ REQUEST _ INTERVAL ĊĠĠĠĠĠĠĠ Ġsmallest Dis placement Ġ= ĠSM ALLE ST _ DIS PLACE MENT _ NOT IC ED ĊĠĠĠĠĠĠĠ Ġpriority Ġ= ĠLocation Request . PRIORITY _ HIGH _ AC CUR ACY ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġfun Ġget Location Updates (): ĠFlow able < Location Data > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrx Location . settings (). check And Handle Resolution ( location Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġrx Location . location (). updates ( location Request ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . computation ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Schedulers . computation ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Flow able ( Back pressure Strategy . LATE ST ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġlocation Ġ-> ĠFlow able . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . longitude ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Distance Between Points ( current Location : ĠLocation Data ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Location : ĠLocation Data ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocation A Ġ= ĠLocation (" A ") ĊĊĠĠĠĠĠĠĠ Ġlocation A . latitude Ġ= Ġcurrent Location ?. latitude Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġlocation A . longitude Ġ= Ġcurrent Location ?. longitude Ġ?: Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġlocation B Ġ= ĠLocation (" B ") ĊĊĠĠĠĠĠĠĠ Ġlocation B . latitude Ġ= Ġdestination Location ?. latitude Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġlocation B . longitude Ġ= Ġdestination Location ?. longitude Ġ?: Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlocation A . distance To ( location B ). round ToInt () ĊĠĠĠ Ġ} Ċ } Ċ