package Ġcom . map swith me . maps . location Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . location . Location Ċ import Ġandroidx . annotation . Ui Thread Ċ import Ġcom . google . android . gms . common . Connection Result Ċ import Ġcom . google . android . gms . common . Google Api Availability Ċ import Ġcom . map swith me . maps . Framework Ċ import Ġcom . map swith me . maps . Framework . Router Type Ċ import Ġcom . map swith me . maps . M wm Application Ċ import Ġcom . map swith me . maps . bookmarks . data . Feature Id Ċ import Ġcom . map swith me . maps . bookmarks . data . Map Object Ċ import Ġcom . map swith me . maps . bookmarks . data . Map Object . Companion . create Map Object Ċ import Ġcom . map swith me . maps . location . Location State . Location Pending Timeout Listener Ċ import Ġcom . map swith me . maps . location . Location State . Mode ChangeListener Ċ import Ġcom . map swith me . maps . routing . Routing Controller Ċ import Ġcom . map swith me . util .* Ċ import Ġcom . map swith me . util . log . LoggerFactory Ċ Ċ enum Ġclass ĠLocation Helper Ġ{ ĊĠĠĠ ĠINSTANCE ; ĊĊĠĠĠ Ġprivate Ġval Ġm On Transition Ġ= ĊĠĠĠĠĠĠĠ ĠTransition Listener () ĊĠĠĠ Ġprivate Ġval Ġm Core Location Listener : ĠLocation Listener Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠLocation Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Location Updated ( location : ĠLocation ) Ġ{ Ġ// ĠIf Ġwe Ġare Ġstill Ġin Ġthe Ġfirst Ġrun Ġmode , Ġi . e . Ġuser Ġis Ġstay ing Ġon Ġthe Ġfirst Ġrun Ġscreens , Ċ // Ġnot Ġon Ġthe Ġmap , Ġwe Ġmust n 't Ġpost Ġlocation Ġupdate Ġto Ġthe Ġcore . ĠOnly Ġthis Ġpre serving Ġallows Ġus Ċ // Ġto Ġplay Ġnice Ġzoom Ġanimation Ġonce Ġa Ġuser Ġwill Ġleave Ġfirst Ġscreens Ġand Ġwill Ġsee Ġa Ġmap . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m In First Run ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Location Ġupdate Ġis Ġobtained Ġand Ġmust Ġbe Ġignored , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" because Ġthe Ġapp Ġis Ġin Ġa Ġfirst Ġrun Ġmode " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative Location Updated ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . longitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . accuracy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . altitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . speed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . be aring ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Ui Callback Ġ!= Ġnull ) Ġm Ui Callback !!. on Location Updated ( location ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Comp ass Updated ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmagnetic North : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue North : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccuracy : ĠDouble ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( compass Data Ġ== Ġnull ) Ġcomp ass Data Ġ= ĠComp ass Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomp ass Data !!. update ( mag netic North , Ġtrue North ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Ui Callback Ġ!= Ġnull ) Ġm Ui Callback !!. on Comp ass Updated ( compass Data !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Location Error ( errorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Location Error ĠerrorCode Ġ= Ġ$ errorCode ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThrowable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative On Location Error ( errorCode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" native On Location Error ĠerrorCode Ġ= Ġ" Ġ+ ĠerrorCode Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ", Ġcurrent Ġstate Ġ= Ġ" Ġ+ ĠLocation State . name Of ( my Position Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Ui Callback Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Ui Callback !!. on Location Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Location Helper . m Core Location Listener " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġm Logger Ġ= ĊĠĠĠĠĠĠĠ ĠLoggerFactory . INSTANCE . getLogger ( LoggerFactory . Type . LOCATION ) ĊĠĠĠ Ġprivate Ġval Ġm Listeners Ġ= ĊĠĠĠĠĠĠĠ ĠList eners < Location Listener >() ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠOb t ains Ġlast Ġknown Ġsaved Ġlocation . ĠIt Ġdepends Ġon Ġ" My Ġposition " Ġbutton Ġmode Ġand Ġis Ġer ased Ġon Ġ" No Ġfollow , Ġno Ġposition " Ġone . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġyou Ġneed Ġthe Ġlocation Ġregardless Ġof Ġthe Ġbutton 's Ġstate , Ġuse Ġ[. getLast Known Location ]. ĊĠĠĠĠ Ġ* Ġ@ return Ġ` null ` Ġif Ġno Ġlocation Ġis Ġsaved Ġor Ġ" My Ġposition " Ġbutton Ġis Ġin Ġ" No Ġfollow , Ġno Ġposition " Ġmode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġsaved Location : ĠLocation ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġvar Ġm My Position : ĠMap Object ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġsaved Location Time : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġval Ġm Sensor Helper Ġ= ĠSensor Helper () ĊĠĠĠ Ġprivate Ġvar Ġm Location Provider : ĠBase Location Provider ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Ui Callback : ĠUi Callback ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġinterval : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġcomp ass Data : ĠComp ass Data ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġvar Ġm In First Run Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Location Update Stopped ByUser : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġm My Position Mode Listener Ġ= Ġobject Ġ: ĠMode ChangeListener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon My Position Mode Changed ( new Mode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify My Position Mode Changed ( new Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on My Position Mode Changed Ġmode Ġ= Ġ" Ġ+ ĠLocation State . name Of ( new Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Ui Callback Ġ== Ġnull ) Ġm Logger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" UI Ġis Ġnot Ġready Ġto Ġlisten Ġmy Ġposition Ġchanges , Ġi . e . Ġit 's Ġnot Ġattached Ġyet ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġm Location Pending Timeout Listener Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠLocation Pending Timeout Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Location Pending Timeout () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Location Utils . are Location Services Turn ed On ()) Ġnotify Location NotFound () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġinitialize () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Provider () ĊĠĠĠĠĠĠĠ ĠLocation State . native Set Listener ( m My Position Mode Listener ) ĊĠĠĠĠĠĠĠ ĠLocation State . native Set Location Pending Timeout Listener ( m Location Pending Timeout Listener ) ĊĠĠĠĠĠĠĠ ĠM wm Application . background Tracker ()?. addListener ( m On Transition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Provider () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" init Provider ", ĠThrowable ()) ĊĠĠĠĠĠĠĠ Ġval Ġapplication Ġ= ĠM wm Application . get () ĊĠĠĠĠĠĠĠ Ġval Ġcontains Google Services Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGoogle Api Availability . getInstance (). is Google Play Services Available ( application ) Ġ== ĠConnection Result . SUCCESS ĊĠĠĠĠĠĠĠ Ġval Ġgoogle Services Turn ed In Settings Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . use Google Services () ĊĠĠĠĠĠĠĠ Ġif Ġ( contains Google Services Ġ&& Ġgoogle Services Turn ed In Settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" Use Ġf used Ġprovider .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Location Provider Ġ= ĠGoogle F used Location Provider ( F used Location Fix Checker ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Native Provider () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit Native Provider () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" Use Ġnative Ġprovider ") ĊĠĠĠĠĠĠĠ Ġm Location Provider Ġ= ĠAndroid Native Provider ( Default Location Fix Checker ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Location Updated ( location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsaved Location Ġ= Ġlocation ĊĠĠĠĠĠĠĠ Ġm My Position Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsaved Location Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĠMap Object . MY _ POSITION , Ġnull Ġif Ġlocation Ġis Ġnot Ġyet Ġdetermined Ġor Ġ" My Ġposition " Ġbutton Ġis Ġswitched Ġoff . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġmy Position : ĠMap Object ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Location State . is Turn ed On ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm My Position Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( saved Location Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m My Position Ġ== Ġnull ) Ġm My Position Ġ= Ġcreate Map Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFeature Id . EMPTY , ĠMap Object . MY _ POSITION , Ġ"", Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsaved Location !!. latitude , Ġsaved Location !!. longitude ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm My Position ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġswitch To Next Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" switch To Next Mode () ") ĊĠĠĠĠĠĠĠ ĠLocation State . native Switch To Next Mode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġabout Ġwhether Ġa Ġlocation Ġprovider Ġis Ġpolling Ġlocation Ġupdates Ġright Ġnow Ġor Ġnot . ĊĠĠĠĠ Ġ* Ġ@ see ĠBase Location Provider . isActive ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval ĠisActive : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm Location Provider Ġ!= Ġnull Ġ&& Ġm Location Provider !!. isActive ĊĊĠĠĠ Ġfun Ġset Stop Location Update ByUser ( is Stopped : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" Set Ġstop Ġlocation Ġupdate Ġby Ġuser : Ġ$ is Stopped ") ĊĠĠĠĠĠĠĠ Ġis Location Update Stopped ByUser Ġ= Ġis Stopped ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnotify Comp ass Updated ( ĊĠĠĠĠĠĠĠ Ġtime : ĠLong , ĊĠĠĠĠĠĠĠ Ġmagnetic North : ĠDouble , ĊĠĠĠĠĠĠĠ Ġtrue North : ĠDouble , ĊĠĠĠĠĠĠĠ Ġaccuracy : ĠDouble ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( listener Ġin Ġm Listeners ) Ġlistener . on Comp ass Updated ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmagnetic North , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue North , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccuracy ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġm Listeners . finish Iterate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnotify Location Updated () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( saved Location Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" No Ġsaved Ġlocation Ġ- Ġskip ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( listener Ġin Ġm Listeners ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Location Updated ( saved Location !! ) ĊĠĠĠĠĠĠĠ Ġm Listeners . finish Iterate () ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġconsider Ġto Ġcreate Ġcallback Ġmechanism Ġto Ġtransfer Ġ' ROUTE _ IS _ FINISHED ' Ġevent Ġfrom Ċ // Ġthe Ġcore Ġto Ġthe Ġplatform Ġcode Ġ( https :// jira . mail . ru / browse / MA PS ME - 3 6 7 5 ), Ċ // Ġbecause Ġcalling Ġthe Ġnative Ġmethod Ġ' native Is Route Finished ' Ċ // Ġtoo Ġoften Ġcan Ġresult Ġin Ġpoor ĠUI Ġperformance . ĊĠĠĠĠĠĠĠ Ġif Ġ( Routing Controller . get (). is Navig ating Ġ&& ĠFramework . native Is Route Finished ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" End Ġpoint Ġis Ġreached ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Ui Callback Ġ!= Ġnull ) Ġm Ui Callback !!. on Routing Finish () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRouting Controller . get (). cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify Location Updated ( listener : ĠLocation Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" notify Location Updated (), Ġlistener : Ġ$ listener ") ĊĠĠĠĠĠĠĠ Ġif Ġ( saved Location Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" No Ġsaved Ġlocation Ġ- Ġskip ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlistener . on Location Updated ( saved Location !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify Location Error ( err Code : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" notify Location Error (): Ġ$ err Code ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( listener Ġin Ġm Listeners ) Ġlistener . on Location Error ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerr Code ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġm Listeners . finish Iterate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify My Position Mode Changed ( new Mode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" notify My Position Mode Changed (): Ġ" Ġ+ ĠLocation State . name Of ( new Mode ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThrowable () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Ui Callback Ġ!= Ġnull ) Ġm Ui Callback !!. on My Position Mode Changed ( new Mode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify Location NotFound () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" notify Location NotFound () ") ĊĠĠĠĠĠĠĠ Ġif Ġ( m Ui Callback Ġ!= Ġnull ) Ġm Ui Callback !!. on Location NotFound () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġlistener Ġto Ġobtain Ġlocation Ġupdates . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠĠĠ Ġlistener Ġto Ġbe Ġregistered . ĊĠĠĠĠ Ġ* Ġ@ param Ġforce Update Ġinstant ly Ġnotify Ġgiven Ġlistener Ġabout Ġavailable Ġlocation , Ġif Ġany . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġadd Listener ( ĊĠĠĠĠĠĠĠ Ġlistener : ĠLocation Listener , ĊĠĠĠĠĠĠĠ Ġforce Update : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" addListener (): Ġ$ listener , Ġforce Update : Ġ$ force Update " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" Ġ- Ġlistener Ġcount Ġwas : Ġ" Ġ+ Ġm Listeners . getSize ()) ĊĠĠĠĠĠĠĠ Ġm Listeners . register ( listener ) ĊĠĠĠĠĠĠĠ Ġif Ġ( force Update ) Ġnotify Location Updated ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġlistener Ġto Ġobtain Ġlocation Ġupdates . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener Ġlistener Ġto Ġbe Ġregistered . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġadd Listener ( listener : ĠLocation Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Listener ( listener , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠRemoves Ġgiven Ġlocation Ġlistener . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlistener Ġlistener Ġto Ġunregister . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Listener ( listener : ĠLocation Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" remove Listener (), Ġlistener : Ġ$ listener ") ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" Ġ- Ġlistener Ġcount Ġwas : Ġ" Ġ+ Ġm Listeners . getSize ()) ĊĠĠĠĠĠĠĠ Ġm Listeners . unregister ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Sensors () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Sensor Helper . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Mag netic Field ( location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Sensor Helper . reset Mag netic Field ( saved Location , Ġlocation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalc Location Updates Interval () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" calc Location Updates Interval () ") ĊĠĠĠĠĠĠĠ Ġif Ġ( Routing Controller . get (). is Navig ating ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" calc Location Updates Interval (), Ġit 's Ġnavigation Ġmode " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Router Type Ġval Ġrouter Ġ= ĠFramework . native Get Router () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( router ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFramework . ROUT ER _ TYPE _ PE DE STR IAN Ġ-> Ġinterval Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINTER VAL _ NAV IG ATION _ PE DE STR IAN _ MS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFramework . ROUT ER _ TYPE _ VE H IC LE Ġ-> Ġinterval Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINTER VAL _ NAV IG ATION _ VE H IC LE _ MS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFramework . ROUT ER _ TYPE _ B ICY CLE Ġ-> Ġinterval Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINTER VAL _ NAV IG ATION _ B ICY CLE _ MS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFramework . ROUT ER _ TYPE _ TRANS IT Ġ-> Ġ Ġ// ĠTODO : Ġwhat Ġis Ġthe Ġinterval Ġshould Ġbe Ġfor Ġtransit Ġtype ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterval Ġ= ĠINTER VAL _ NAV IG ATION _ PE DE STR IAN _ MS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unsupported Ġrouter Ġtype : Ġ$ router ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġmy Position Mode ĊĠĠĠĠĠĠĠ Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocation State . FOLLOW Ġ-> Ġinterval Ġ= ĠINTER VAL _ FOLLOW _ MS ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocation State . FOLLOW _ AND _ ROT ATE Ġ-> Ġinterval Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINTER VAL _ FOLLOW _ AND _ ROT ATE _ MS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġinterval Ġ= ĠINTER VAL _ NOT _ FOLLOW _ MS ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSto ps Ġthe Ġcurrent Ġprovider . ĠThen Ġinitialize Ġthe Ġlocation Ġprovider Ġagain , ĊĠĠĠĠ Ġ* Ġbecause Ġlocation Ġsettings Ġcould Ġbe Ġchanged Ġand Ġa Ġnew Ġlocation Ġprovider Ġcan Ġbe Ġused , ĊĠĠĠĠ Ġ* Ġsuch Ġas ĠGoogle Ġf used Ġprovider . ĠAnd Ġwe Ġthink Ġthat ĠGoogle Ġf used Ġprovider Ġis Ġprefer able ĊĠĠĠĠ Ġ* Ġfor Ġthe Ġmost Ġcases . ĠAnd Ġstarts Ġthe Ġinitialized Ġlocation Ġprovider . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġ. start ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrestart () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" restart () ") ĊĠĠĠĠĠĠĠ Ġcheck Provider Initialization () ĊĠĠĠĠĠĠĠ Ġstop Internal () ĊĠĠĠĠĠĠĠ Ġinit Provider () ĊĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe Ġ[. m Core Location Listener ] Ġto Ġlisten Ġlocation Ġupdates Ġand Ġnotify ĠUI . ĊĠĠĠĠ Ġ* ĠNot ifies Ġabout Ġ[. ERROR _ DEN IED ] Ġif Ġthere Ġare Ġno Ġenabled Ġlocation Ġproviders . ĊĠĠĠĠ Ġ* ĠCalculates Ġminimum Ġtime Ġinterval Ġfor Ġlocation Ġupdates . ĊĠĠĠĠ Ġ* ĠStarts Ġpolling Ġlocation Ġupdates . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Location Update Stopped ByUser ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Location Ġupdates Ġare Ġstopped Ġby Ġthe Ġuser Ġmanually , Ġso Ġskip Ġprovider Ġstart " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġuntil Ġthe Ġuser Ġstarts Ġit Ġmanually ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Provider Initialization () ĊĠĠĠĠĠĠĠ Ġif Ġ( m Location Provider !!. isActive ) Ġthrow ĠAssertionError ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Location Ġprovider Ġ'" Ġ+ Ġm Location Provider ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"' Ġmust Ġbe Ġstopped Ġfirst " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġadd Listener ( m Core Location Listener , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! Location Utils . check Providers Availability ()) Ġ{ Ġ// ĠNo Ġneed Ġto Ġnotify Ġabout Ġan Ġerror Ġin Ġfirst Ġrun Ġmode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m In First Run ) Ġnotify Location Error ( ERROR _ DEN IED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġold Interval Ġ= Ġinterval ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" Old Ġtime Ġinterval Ġ( ms ): Ġ$ old Interval ") ĊĠĠĠĠĠĠĠ Ġcalc Location Updates Interval () ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" start (), Ġparams : Ġ" Ġ+ Ġinterval ) ĊĠĠĠĠĠĠĠ Ġstart Internal () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSto ps Ġthe Ġpolling Ġlocation Ġupdates , Ġi . e . Ġremoves Ġthe Ġ[. m Core Location Listener ] Ġand Ġstops ĊĠĠĠĠ Ġ* Ġthe Ġcurrent Ġactive Ġprovider . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" stop () ") ĊĠĠĠĠĠĠĠ Ġcheck Provider Initialization () ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Location Provider !!. isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Provider Ġ'$ m Location Provider ' Ġis Ġalready Ġstopped " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġremove Listener ( m Core Location Listener ) ĊĠĠĠĠĠĠĠ Ġstop Internal () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠActually Ġstarts Ġlocation Ġpolling . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart Internal () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" start Internal (), Ġcurrent Ġprovider Ġis Ġ'" Ġ+ Ġm Location Provider ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"' Ġ, Ġmy Ġposition Ġmode Ġ= Ġ" Ġ+ ĠLocation State . name Of ( my Position Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ", Ġm In First Run Ġ= Ġ" Ġ+ Ġm In First Run ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! Permissions Utils . is Location Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . w ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Dynamic Ġpermission ĠACCESS _ CO AR SE _ LOCATION / ACCESS _ F INE _ LOCATION Ġis Ġnot Ġgranted ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThrowable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Provider Initialization () ĊĠĠĠĠĠĠĠ Ġm Location Provider !!. start () ĊĠĠĠĠĠĠĠ Ġm Logger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Location Provider !!. isActive ) Ġ" SUCCESS " Ġelse Ġ" FAILURE " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Provider Initialization () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Location Provider Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġ" A Ġlocation Ġprovider Ġmust Ġbe Ġinitialized !" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . e ( TAG , Ġerror , ĠThrowable ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError ( error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠActually Ġstops Ġlocation Ġpolling . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstop Internal () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" stop Internal () ") ĊĠĠĠĠĠĠĠ Ġcheck Provider Initialization () ĊĠĠĠĠĠĠĠ Ġm Location Provider !!. stop () ĊĠĠĠĠĠĠĠ Ġm Sensor Helper . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAttach ĠUI Ġto Ġhelper . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġattach ( callback : ĠUi Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" attach () Ġcallback Ġ= Ġ$ callback ") ĊĠĠĠĠĠĠĠ Ġif Ġ( m Ui Callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" Ġ- Ġalready Ġattached . ĠSkip .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Ui Callback Ġ= Ġcallback ĊĠĠĠĠĠĠĠ ĠUtils . keep Screen On ( true , Ġm Ui Callback !!. activity . window ) ĊĠĠĠĠĠĠĠ Ġm Ui Callback !!. on My Position Mode Changed ( my Position Mode ) ĊĠĠĠĠĠĠĠ Ġif Ġ( compass Data Ġ!= Ġnull ) Ġm Ui Callback !!. on Comp ass Updated ( compass Data !! ) ĊĠĠĠĠĠĠĠ Ġcheck Provider Initialization () ĊĠĠĠĠĠĠĠ Ġif Ġ( m Location Provider !!. isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" attach () Ġprovider Ġ'$ m Location Provider ' Ġis Ġactive , Ġjust Ġadd Ġthe Ġlistener " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Listener ( m Core Location Listener , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDet ach ĠUI Ġfrom Ġhelper . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġdetach ( delayed : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" detach (), Ġdelayed : Ġ$ delayed ") ĊĠĠĠĠĠĠĠ Ġif Ġ( m Ui Callback Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . d ( TAG , Ġ" Ġ- Ġalready Ġdet ached . ĠSkip .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠUtils . keep Screen On ( false , Ġm Ui Callback !!. activity . window ) ĊĠĠĠĠĠĠĠ Ġm Ui Callback Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġon Entered Into First Run () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . i ( TAG , Ġ" on Entered Into First Run ") ĊĠĠĠĠĠĠĠ Ġm In First Run Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġon Exit From First Run () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Logger . i ( TAG , Ġ" on Exit From First Run ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! m In First Run ) Ġthrow ĠAssertionError (" Must Ġbe Ġcalled Ġonly Ġafter Ġ' on Entered Into First Run ' Ġmethod !") ĊĠĠĠĠĠĠĠ Ġm In First Run Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( my Position Mode Ġ!= ĠLocation State . NOT _ FOLLOW _ NO _ POSITION ) Ġthrow ĠAssertionError ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" My Ġposition Ġmode Ġmust Ġbe Ġequal ĠNOT _ FOLLOW _ NO _ POSITION " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġis Ġa Ġlocation Ġwe Ġneed Ġjust Ġto Ġpass Ġit Ġto Ġthe Ġlisteners , Ġso Ġthat Ċ // Ġmy Ġposition Ġstate Ġmachine Ġwill Ġbe Ġswitched Ġto Ġthe ĠFOL LOW Ġstate . ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġsaved Location ĊĠĠĠĠĠĠĠ Ġif Ġ( location Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Location Updated () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Current Ġlocation Ġis Ġavailable , Ġso Ġplay Ġthe Ġnice Ġzoom Ġanimation " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFramework . native Run First Launch Animation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Provider Initialization () ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġlocation Ġhasn 't Ġbeen Ġobtained Ġyet Ġwe Ġneed Ġto Ġswitch Ġto Ġthe Ġnext Ġmode Ġand Ġwait Ġfor Ġlocations . Ċ // ĠOtherwise , Ġtry Ġto Ġrestart Ġlocation Ġupdates Ġpolling . Ċ // Ġno inspection ĠConstant Conditions ĊĠĠĠĠĠĠĠ Ġif Ġ( m Location Provider !!. isActive ) Ġswitch To Next Mode () Ġelse Ġrestart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOb t ains Ġlast Ġknown Ġlocation Ġregardless Ġof Ġ" My Ġposition " Ġbutton Ġstate . ĊĠĠĠĠ Ġ* Ġ@ return Ġ` null ` Ġon Ġfailure . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġlast Known Location : ĠLocation ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( saved Location Ġ!= Ġnull ) Ġsaved Location Ġelse ĠAndroid Native Provider . Companion . find Best Location () ĊĊĠĠĠ Ġ@ get : Location State . Value ĊĠĠĠ Ġval Ġmy Position Mode : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠLocation State . native Get Mode () ĊĊĠĠĠ Ġinterface ĠUi Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity : ĠActivity ĊĠĠĠĠĠĠĠ Ġfun Ġon My Position Mode Changed ( new Mode : ĠInt ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Location Updated ( location : ĠLocation ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Comp ass Updated ( compass : ĠComp ass Data ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Location Error () ĊĠĠĠĠĠĠĠ Ġfun Ġon Location NotFound () ĊĠĠĠĠĠĠĠ Ġfun Ġon Routing Finish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThese Ġconstants Ġshould Ġcorrespond Ġto Ġvalues Ġdefined Ġin Ġplatform / location . hpp Ċ // ĠLeave Ġ 0 - value Ġas Ġno Ġany Ġerror . ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠERROR _ NOT _ SUPPORTED Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠERROR _ DEN IED Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠERROR _ GPS _ OFF Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠERROR _ UNKNOWN Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINTER VAL _ FOLLOW _ AND _ ROT ATE _ MS : ĠLong Ġ= Ġ 3 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINTER VAL _ FOLLOW _ MS : ĠLong Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINTER VAL _ NOT _ FOLLOW _ MS : ĠLong Ġ= Ġ 3 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINTER VAL _ NAV IG ATION _ VE H IC LE _ MS : ĠLong Ġ= Ġ 5 0 0 ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ( trash kal mar ): ĠCorrect Ġvalue ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINTER VAL _ NAV IG ATION _ B ICY CLE _ MS : ĠLong Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINTER VAL _ NAV IG ATION _ PE DE STR IAN _ MS : ĠLong Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠLocation Helper :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġprivate Ġexternal Ġfun Ġnative On Location Error ( errorCode : ĠInt ) ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġprivate Ġexternal Ġfun Ġnative Location Updated ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime : ĠLong , Ġlat : ĠDouble , Ġlon : ĠDouble , Ġaccuracy : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalt itude : ĠDouble , Ġspeed : ĠFloat , Ġbe aring : ĠFloat ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġexternal Ġfun Ġnative Update Comp ass Sensor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġind : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarr : ĠFloat Array ? ĊĠĠĠĠĠĠĠ Ġ): ĠFloat Array ? ĊĠĠĠ Ġ} Ċ }