package Ġtin . th ure in . ha ul io _ test . activities Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Sender Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . location . Location Ċ import Ġandroid . location . Location Listener Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . google . android . gms . common . api . Res olvable ApiException Ċ import Ġcom . google . android . gms . location . Location Request Ċ import Ġcom . google . android . gms . location . Location Services Ċ import Ġcom . google . android . gms . location . Location Settings Request Ċ import Ġcom . google . android . gms . maps . Camera Update Factory Ċ import Ġcom . google . android . gms . maps . Google Map Ċ import Ġcom . google . android . gms . maps . On Map Ready Callback Ċ import Ġcom . google . android . gms . maps . Support Map Fragment Ċ import Ġcom . google . android . gms . maps . model .* Ċ import Ġdagger . android . Android Injection Ċ import Ġkotlinx . android . synt hetic . main . activity _ maps .* Ċ import Ġtin . th ure in . domain . models . Job Ċ import Ġtin . th ure in . domain . models . Progress Ċ import Ġtin . th ure in . ha ul io _ test . R Ċ import Ġtin . th ure in . ha ul io _ test . adapters . Job Search Adapter Ċ import Ġtin . th ure in . ha ul io _ test . common . Location Utils Ċ import Ġtin . th ure in . ha ul io _ test . common . Permission Utils Ċ import Ġtin . th ure in . ha ul io _ test . databinding . Activity Maps Binding Ċ import Ġtin . th ure in . ha ul io _ test . injection . ViewModel Factory Ċ import Ġtin . th ure in . ha ul io _ test . listeners . Job Search Adapter Listener Ċ import Ġtin . th ure in . ha ul io _ test . view models . Maps ViewModel Ċ import Ġjavax . inject . Inject ĊĊ Ċ class ĠMaps Activity Ġ: ĠBase Activity (), ĠOn Map Ready Callback , ĠLocation Listener , ĠJob Search Adapter Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Map : ĠGoogle Map ĊĊĠĠĠ Ġprivate Ġval ĠREQUEST _ CODE _ CHECK _ SETTINGS Ġ= Ġ 1 2 1 ĊĊĠĠĠ Ġprivate Ġval ĠLOC ATION _ UPDATE _ INTERVAL : ĠLong Ġ= Ġ 8 0 0 0 ĊĊĠĠĠ Ġprivate Ġval ĠLOC ATION _ UPDATE _ FAST EST _ INTERVAL : ĠLong Ġ= Ġ 8 0 0 0 ĊĊĠĠĠ Ġprivate Ġvar Ġsearch Result List : ĠMutable List < String > Ġ= ĠArrayList () ĊĊĠĠĠ Ġprivate Ġvar Ġresult Jobs : ĠMutable List < Job > Ġ= ĠArrayList () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġjob Search Adapter : ĠJob Search Adapter ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġvar ĠviewModel Factory : ĠViewModel Factory ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Maps Binding ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmaps ViewModel : ĠMaps ViewModel ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠData Binding Util . set ContentView ( this , ĠR . layout . activity _ maps ) ĊĠĠĠĠĠĠĠ ĠAndroid Injection . inject ( this ) ĊĠĠĠĠĠĠĠ Ġinit Data () ĊĊĠĠĠĠĠĠĠ Ġbinding . maps ViewModel Ġ= Ġmaps ViewModel ĊĊĠĠĠĠĠĠĠ Ġ// ĠObtain Ġthe ĠSupport Map Fragment Ġand Ġget Ġnotified Ġwhen Ġthe Ġmap Ġis Ġready Ġto Ġbe Ġused . ĊĠĠĠĠĠĠĠ Ġval Ġmap Fragment Ġ= Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Fragment ById ( R . id . map ) Ġas ĠSupport Map Fragment ĊĠĠĠĠĠĠĠ Ġmap Fragment . getMap Async ( this ) ĊĊĠĠĠĠĠĠĠ Ġet Search . setOn ItemClickListener Ġ{ Ġ_, Ġ_, Ġposition , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaps ViewModel . update Job ( result Jobs [ position ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Jobs . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Jobs . add ( maps ViewModel . job !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Job Markers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠLat Lng ( maps ViewModel . job ?. geo location ?. latitude !! , Ġmaps ViewModel . job ?. geo location ?. longitude !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Map . animate Camera ( Camera Update Factory . new LatLng Zoom ( position , Ġ 1 3 . 0 f )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMan ip ulates Ġthe Ġmap Ġonce Ġavailable . ĊĠĠĠĠ Ġ* ĠThis Ġcallback Ġis Ġtriggered Ġwhen Ġthe Ġmap Ġis Ġready Ġto Ġbe Ġused . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġwhere Ġwe Ġcan Ġadd Ġmarkers Ġor Ġlines , Ġadd Ġlisteners Ġor Ġmove Ġthe Ġcamera . ĠIn Ġthis Ġcase , ĊĠĠĠĠ Ġ* Ġwe Ġjust Ġadd Ġa Ġmarker Ġnear ĠSy dn ey , ĠA ustralia . ĊĠĠĠĠ Ġ* ĠIf ĠGoogle ĠPlay Ġservices Ġis Ġnot Ġinstalled Ġon Ġthe Ġdevice , Ġthe Ġuser Ġwill Ġbe Ġpromp ted Ġto Ġinstall ĊĠĠĠĠ Ġ* Ġit Ġinside Ġthe ĠSupport Map Fragment . ĠThis Ġmethod Ġwill Ġonly Ġbe Ġtriggered Ġonce Ġthe Ġuser Ġhas ĊĠĠĠĠ Ġ* Ġinstalled ĠGoogle ĠPlay Ġservices Ġand Ġreturned Ġto Ġthe Ġapp . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Map Ready ( google Map : ĠGoogle Map ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Map Ġ= Ġgoogle Map ĊĠĠĠĠĠĠĠ Ġm Map . setOn Marker ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( it . tag ) Ġis ĠJob ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaps ViewModel . update Job ( it . tag Ġas ĠJob ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġenable Location Settings () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠ Ġgoto Activity ( MainActivity :: class . java ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġmaps ViewModel Ġ= ĠViewModel Provider ( this , ĠviewModel Factory Ġas ĠViewModel Provider . Factory ). get ( Maps ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġmaps ViewModel . set Iv Left Src ( Activity Compat . get Drawable ( this , ĠR . drawable . back )) ĊĠĠĠĠĠĠĠ Ġmaps ViewModel . get Jobs () ĊĊĠĠĠĠĠĠĠ Ġmaps ViewModel . mutable Iv Left . observe ( this , ĠObserver Ġ{ Ġon Back Pressed () Ġ}) ĊĠĠĠĠĠĠĠ Ġmaps ViewModel . mutable Sign Out . observe ( this , ĠObserver Ġ{ Ġmodel Wrapper Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġmodel Wrapper . message , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( model Wrapper . progress Ġ== Ġ( Progress . SUCCESS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoto Activity ( Login Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġmaps ViewModel . mutable Jobs . observe ( this , ĠObserver Ġ{ Ġmodel Wrapper Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġmodel Wrapper . message , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( model Wrapper . progress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProgress . SUCCESS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Wrapper . model ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Jobs . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Jobs . addAll ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Job Markers () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Search Adapter Ġ= ĠJob Search Adapter ( this , ĠR . layout . job _ filter _ layout , Ġsearch Result List , Ġit , Ġresult Jobs , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġet Search . setAdapter ( job Search Adapter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġmodel Wrapper . message , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Marker ( job : ĠJob ?, Ġlocation : ĠLocation ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġjob ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠLat Lng ( it . geo location ?. latitude !! , Ġit . geo location ?. longitude !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmarker Ġ= Ġadd Marker ( position , ĠBitmap Descriptor Factory . default Marker ( if Ġ( job . is Accepted ) ĠBitmap Descriptor Factory . H UE _ GREEN Ġelse ĠBitmap Descriptor Factory . H UE _ AZURE )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmarker . tag Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlocation ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠLat Lng ( it . latitude , Ġit . longitude ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Marker ( position , ĠBitmap Descriptor Factory . default Marker ( Bitmap Descriptor Factory . H UE _ BLUE )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Map . animate Camera ( Camera Update Factory . new LatLng Zoom ( position , Ġ 1 3 . 0 f )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Marker ( position : ĠLat Lng , Ġbitmap Descriptor Factory : ĠBitmap Descriptor ?): ĠMarker Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Map ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Marker ( Marker Options () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. position ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. icon ( bitmap Descriptor Factory )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġbinding . unbind () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Location Changed ( location : ĠLocation ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlocation ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Marker ( null , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Status Changed ( p 0 : ĠString ?, Ġp 1 : ĠInt , Ġp 2 : ĠBundle ?) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Provider Enabled ( p 0 : ĠString ?) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Provider Disabled ( p 0 : ĠString ?) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠPermission Utils . MY _ PERMISSION S _ REQUEST _ LOCATION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results . isNotEmpty () Ġ&& Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Current Location () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable Location Settings () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocation Request : ĠLocation Request Ġ= ĠLocation Request . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Location Request . PRIORITY _ HIGH _ AC CUR ACY ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠLocation Settings Request . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Location Request ( location Request ) ĊĊĠĠĠĠĠĠĠ ĠLocation Services ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Settings Client ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. check Location Settings ( builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener ( this ) Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" On Success ", Ġ" OK ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Permission Utils . check Location Permission ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Current Location () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Location "," Added ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Canceled Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoto Activity ( MainActivity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener ( this ) Ġ{ Ġex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ex Ġis ĠRes olvable ApiException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" On Failure ", Ġ" OK ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShow Ġthe Ġdialog Ġby Ġcalling Ġstart Resolution For Result (), Ġ Ġand Ġcheck Ġthe Ġresult Ġin Ġon Activity Result (). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresol vable : ĠRes olvable ApiException Ġ= Ġex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresol vable . start Resolution For Result ( this , ĠREQUEST _ CODE _ CHECK _ SETTINGS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( send Ex : ĠIntent Sender . Send Intent Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Ex ", Ġsend Ex . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Current Location () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Marker ( null , ĠLocation Utils . getLocation ( this , Ġthis )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( REQUEST _ CODE _ CHECK _ SETTINGS Ġ== Ġrequest Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Activity . RESULT _ OK Ġ== ĠresultCode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Permission Utils . check Location Permission ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Current Location () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoto Activity ( MainActivity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Job Markers () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Map . clear () ĊĠĠĠĠĠĠĠ Ġresult Jobs . forEach Ġ{ Ġadd Marker ( it , Ġnull ) Ġ} ĊĠĠĠĠĠĠĠ Ġadd Current Location () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Job Markers () ĊĠĠĠ Ġ} Ċ } Ċ