/* čĊ Ġ* ĠCopyright Ġ 2 0 1 9 ĠI ce Rock ĠMAG ĠInc . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . čĊ Ġ*/ čĊč Ċ package Ġdev . icer ock . mo ko . geo čĊč Ċ import Ġandroid . content . Context č Ċ import Ġandroid . content . Intent Sender č Ċ import Ġandroid . location . Location Manager č Ċ import Ġandroidx . core . location . Location Manager Compat č Ċ import Ġcom . google . android . gms . common . api . Res olvable ApiException č Ċ import Ġcom . google . android . gms . location .* č Ċ import Ġcom . google . android . gms . tasks . Task č Ċ import Ġkotlinx . coroutines . suspend C ancellable Coroutine č Ċ import Ġkotlin . coroutines . resume čĊč Ċ actual Ġclass ĠGP SS ensor Helper ( čĊĠĠĠ Ġval Ġapp Context : ĠContext , čĊĠĠĠ Ġval Ġgps Lifecycle Observer : ĠGP SL ifecycle Observer č Ċ ) Ġ{ čĊĠĠĠ Ġprivate Ġval Ġlocation Request Ġ= ĠLocation Request . create (). apply Ġ{ čĊĠĠĠĠĠĠĠ Ġinterval Ġ= Ġ 1 0 0 0 0 čĊĠĠĠĠĠĠĠ Ġfast est Interval Ġ= Ġ 5 0 0 0 čĊĠĠĠĠĠĠĠ Ġpriority Ġ= ĠLocation Request . PRIORITY _ HIGH _ AC CUR ACY čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġactual Ġsuspend Ġfun Ġis GPS Enabled (): ĠBoolean Ġ= Ġsuspend C ancellable Coroutine Ġ{ Ġcontinuation Ġ-> čĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif ĠGPS Ġis Ġenabled čĊĠĠĠĠĠĠĠ Ġval Ġis Location Enabled Ġ= ĠLocation Manager Compat . is Location Enabled ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context . getSystem Service ( Context . LOCATION _ SERVICE ) Ġas ĠLocation Manager čĊĠĠĠĠĠĠĠ Ġ) čĊčĊĠĠĠĠĠĠĠ Ġif Ġ(! is Location Enabled ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGPS Ġis Ġnot Ġenabled čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġask Ġthe Ġuser Ġto Ġturn ĠGPS Ġon čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠLocation Settings Request . Builder () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Location Request ( location Request ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient : ĠSettings Client Ġ= ĠLocation Services . get Settings Client ( app Context ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask : ĠTask < Location Settings Response > Ġ= Ġclient . check Location Settings ( builder . build ()) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . add On Success Listener Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGPS Ġis Ġenabled čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( true ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . add On Failure Listener Ġ{ Ġexception Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGPS Ġis Ġnot Ġenabled čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exception Ġis ĠRes olvable ApiException ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLocation Ġsettings Ġare Ġnot Ġsatisfied , Ġbut Ġthis Ġcan Ġbe Ġfixed čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġby Ġshowing Ġthe Ġuser Ġa Ġdialog . čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsend Ġan Ġintent Ġand Ġreceive Ġthe Ġactivity Ġresult Ġvia Ġthe Ġcustom Ġobserver čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps Lifecycle Observer . resolve Exception ( exception Ġ= Ġexception ) Ġ{ Ġis GPS enabled Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( is GPS enabled ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( true ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( false ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( send Ex : ĠIntent Sender . Send Intent Exception ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġthe Ġerror . čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( false ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġunknown Ġexception čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( false ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGPS Ġis Ġalready Ġenabled čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( true ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ }