package Ġcom . example . est acion app Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . location . Address Ċ import Ġandroid . location . Geo coder Ċ import Ġandroid . location . Location Ċ import Ġandroid . location . Location Manager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Environment Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . ActionBar Drawer Toggle Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . widget . Toolbar Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . content . File Provider Ċ import Ġandroidx . core . location . Location Manager Compat Ċ import Ġandroidx . core . view . Gravity Compat Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . drawer layout . widget . Drawer Layout Ċ import Ġcom . example . est acion app . auth . Auth Activity Ċ import Ġcom . example . est acion app . utils . are EqualTo Ċ import Ġcom . example . est acion app . utils . to ArrayList Of Strings Ċ import Ġcom . google . android . gms . location . F used Location Provider Client Ċ import Ġcom . google . android . gms . location . Location Services Ċ import Ġcom . google . android . gms . maps .* Ċ import Ġcom . google . android . gms . maps . model .* Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Dialog Ċ import Ġcom . google . android . material . navigation . Navigation View Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . squareup . pic asso . Pic asso Ċ import Ġio . socket . client . IO Ċ import Ġio . socket . client . Socket Ċ import Ġio . socket . emitter . Emitter Ċ import Ġio . socket . engine io . client . transport s . WebSocket Ċ import Ġkotlinx . android . synt hetic . main . activity _ maps .* Ċ import Ġkotlinx . android . synt hetic . main . layout _ bottom _ sheet . view .* Ċ import Ġkotlinx . android . synt hetic . main . navigation _ menu .* Ċ import Ġokhttp 3 . MediaType . Companion . to MediaType OrNull Ċ import Ġokhttp 3 . Multipart Body Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . RequestBody Ċ import Ġokhttp 3 . RequestBody . Companion . as RequestBody Ċ import Ġokhttp 3 . RequestBody . Companion . to RequestBody Ċ import Ġokhttp 3 . ResponseBody Ċ import Ġorg . json . JSONArray Ċ import Ġorg . json . JSONObject Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Response Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . converter . gson . Gson Converter Factory Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . concurrent . schedule Ċ Ċ private Ġconst Ġval ĠREQUEST _ CODE Ġ= Ġ 4 2 Ċ Ċ fun Ġget Camera Update ( location : ĠLat Lng ): ĠCamera Update Ġ{ ĊĠĠĠ Ġval Ġcamera Position Ġ= ĠCamera Position . builder () ĊĠĠĠĠĠĠĠ Ġ. zoom ( 1 6 F ) ĊĠĠĠĠĠĠĠ Ġ. tilt ( 4 5 F ) ĊĠĠĠĠĠĠĠ Ġ. target ( LatLng ( location . latitude , Ġlocation . longitude )) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġreturn ĠCamera Update Factory . new Camera Position ( camera Position ) Ċ } Ċ Ċ class ĠMaps Activity Ġ: ĠAppCompatActivity (), ĠOn Map Ready Callback , ĠGoogle Map . On Marker ClickListener , ĊĠĠĠ ĠNavigation View . On Navigation ItemSelected Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmap : ĠGoogle Map ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġf used Location Client : ĠF used Location Provider Client ĊĠĠĠ Ġprivate Ġvar Ġlast Location : ĠLocation ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgeo coder : ĠGeo coder ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsocket : ĠSocket ĊĠĠĠ Ġprivate Ġvar Ġpositions : ĠArrayList < Pair < Marker , ĠArrayList < String >>> Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġvar Ġreserved Position : ĠMarker ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdialog : ĠBottom Sheet Dialog ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġphoto File : ĠFile ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpreferences : ĠSharedPreferences ĊĠĠĠ Ġprivate Ġvar ĠcurrentUser Ġ= ĠFirebase Auth . getInstance (). currentUser ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLOC ATION _ PERMISSION _ REQUEST _ CODE Ġ= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ maps ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmap Fragment Ġ= Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Fragment ById ( R . id . map ) Ġas ĠSupport Map Fragment ĊĠĠĠĠĠĠĠ Ġmap Fragment . getMap Async ( this ) ĊĊĠĠĠĠĠĠĠ Ġpreferences Ġ= Ġget SharedPreferences (" preferences ", ĠContext . MODE _ PRIVATE ) ĊĊĠĠĠĠĠĠĠ Ġthis . my Location Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent LatLng : ĠLat Lng ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Location Manager Compat . is Location Enabled ( getSystem Service ( Context . LOCATION _ SERVICE ) Ġas ĠLocation Manager )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( getString ( R . string . location _ disabled _ title )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( getString ( R . string . location _ disabled _ text )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button (" OK ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( last Location Ġ!== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent LatLng Ġ= ĠLat Lng ( last Location !!. latitude , Ġlast Location !!. longitude ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . animate Camera ( get Camera Update ( current LatLng )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . report Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentUser Ġ!= Ġnull ) Ġreport ar Sensor () Ġelse ĠstartActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth Activity :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtoolbar : ĠToolbar Ġ= ĠfindViewById ( R . id . main _ toolbar ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĠĠĠĠĠĠĠ Ġval Ġdrawer : ĠDraw er Layout Ġ= ĠfindViewById ( R . id . drawer _ layout ) ĊĠĠĠĠĠĠĠ Ġval Ġnav View : ĠNavigation View Ġ= ĠfindViewById ( R . id . nav _ view ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtoggle Ġ= Ġobject Ġ: ĠAction Bar Drawer Toggle ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . open _ nav _ drawer , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . close _ nav _ drawer ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Drawer Slide ( drawer View : ĠView , Ġslide Offset : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Drawer Slide ( drawer View , Ġslide Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav View . menu . find Item ( R . id . logout ). isVisible Ġ= ĠcurrentUser Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav View . menu . find Item ( R . id . login ). isVisible Ġ= ĠcurrentUser Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav View . menu . find Item ( R . id . report ar ). isVisible Ġ= ĠcurrentUser Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdrawer . add Drawer Listener ( toggle ) ĊĠĠĠĠĠĠĠ Ġtoggle . sync State () ĊĠĠĠĠĠĠĠ Ġnav View . set Navigation ItemSelected Listener ( this ) ĊĠĠĠĠĠĠĠ Ġnav View . item Icon Tint List Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġnav View . set Navigation ItemSelected Listener ( this ) ĊĊĠĠĠĠĠĠĠ Ġval Ġopts Ġ= ĠIO . Options () ĊĠĠĠĠĠĠĠ Ġopts . transport s Ġ= ĠarrayOf ( WebSocket . NAME ) ĊĠĠĠĠĠĠĠ Ġopts . query Ġ= Ġ" room = park ings " ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Ġ= ĠIO . socket ( getString ( R . string . server _ url ), Ġopts ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsocket . on ( Socket . EVENT _ CONNECT ) Ġ{ Ġprintln (" Socket ĠConnect ...") Ġ} ĊĠĠĠĠĠĠĠ Ġsocket . on ( Socket . EVENT _ DIS CONNECT ) Ġ{ Ġprintln (" Socket ĠDis connect ...") Ġ} ĊĠĠĠĠĠĠĠ Ġsocket . on ( Socket . EVENT _ CONNECT _ ERROR ) Ġ{ Ġprintln (" Socket ĠError ...") Ġ} ĊĠĠĠĠĠĠĠ Ġsocket . on ( Socket . EVENT _ CONNECT _ TIMEOUT ) Ġ{ Ġprintln (" Socket ĠTimeout ...") Ġ} ĊĊĠĠĠĠĠĠĠ Ġsocket . on (" initial _ locations ", Ġon Initial Par k ings ) ĊĠĠĠĠĠĠĠ Ġsocket . on (" new _ locations ", Ġon New Par king ) ĊĠĠĠĠĠĠĠ Ġsocket . on (" deleted _ locations ", ĠonDelete Par king ) ĊĊĠĠĠĠĠĠĠ Ġsocket . connect () ĊĊĠĠĠĠĠĠĠ Ġf used Location Client Ġ= ĠLocation Services . getF used Location Provider Client ( this ) ĊĊĠĠĠĠĠĠĠ Ġgeo coder Ġ= ĠGeo coder ( this , ĠLocale . getDefault ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġon Initial Par k ings Ġ= ĠEmit ter . Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJSONArray ( it [ 0 ]. toString ()) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġdata . length ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġdata . getJSONObject ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphotos Ġ= Ġitem . get JSONArray (" photos "). to ArrayList Of Strings () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplace Marker On Map ( LatLng ( item . getDouble (" latitude "), Ġitem . getDouble (" longitude ")), Ġphotos ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġon New Par king Ġ= ĠEmit ter . Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠJSONObject ( it [ 0 ]. toString ()) ĊĠĠĠĠĠĠĠ Ġval Ġphotos Ġ= Ġdata . get JSONArray (" photos "). to ArrayList Of Strings () ĊĠĠĠĠĠĠĠ Ġplace Marker On Map ( LatLng ( data . getDouble (" latitude "), Ġdata . getDouble (" longitude ")), Ġphotos ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar ĠonDelete Par king Ġ= ĠEmit ter . Listener Ġ{ Ġdeleted Body Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġdeleted Position Ġ= ĠJSONObject ( deleted Body [ 0 ]. toString ()) ĊĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleted Marker Ġ= Ġpositions . find Ġ{ Ġit . first . are EqualTo ( deleted Position ) Ġ&& Ġ! it . first . are EqualTo ( reserved Position ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeleted Marker ?. first ?. remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositions . remove ( deleted Marker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( deleted Marker Ġ!== Ġnull ) Ġplace Temporal Marker On Map ( deleted Marker . first . position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Map Ready ( google Map : ĠGoogle Map ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmap Ġ= Ġgoogle Map ĊĠĠĠĠĠĠĠ Ġmap . setOn Marker ClickListener ( this ) ĊĠĠĠĠĠĠĠ ĠsetUp Map () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Marker Click ( marker : ĠMarker ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġdialog Ġ= ĠBottom Sheet Dialog ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġlayout Inflater . inflate ( R . layout . layout _ bottom _ sheet , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġval Ġphotos Ġ= Ġpositions . find Ġ{ Ġit . first . are EqualTo ( marker ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġview . close . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġphotos ?. second ?. take ( 3 )?. forEach Indexed Ġ{ Ġindex , Ġphoto Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPic asso . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( photo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. placeholder ( R . drawable . park ing _ placeholder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. resize ( 1 3 0 , Ġ 1 3 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( view . findViewById ( resources . getIdentifier (" photo ${ index }", Ġ" id ", ĠpackageName )) Ġas ĠImageView ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview . re ser var Ah ora Button . tag Ġ= Ġmarker ĊĠĠĠĠĠĠĠ Ġval Ġis Reserved Ġ= Ġmarker . are EqualTo ( reserved Position ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Reserved ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . title . text Ġ= ĠgetString ( R . string . l ugar _ re serv ado ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . re ser var Ah ora Button . text Ġ= ĠgetString ( R . string . cancel ar _ re serv a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . re ser var Ah ora Button . set BackgroundColor ( Context Compat . getColor ( this , ĠR . color . white )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . re ser var Ah ora Button . stroke Color Ġ= ĠContext Compat . getColor State List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . color . primary ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . re ser var Ah ora Button . stroke Width Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . re ser var Ah ora Button . setTextColor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . getColor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . color . primary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview . re ser var Ah ora Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentUser Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Reserved ) Ġcancel Par king ( view . re ser var Ah ora Button ) Ġelse Ġreserve Par king ( view . re ser var Ah ora Button ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠAuth Activity :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview . address . text Ġ= Ġget Address ( marker . position ) ĊĠĠĠĠĠĠĠ Ġdialog . set ContentView ( view ) ĊĠĠĠĠĠĠĠ Ġdialog . show () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Map () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ F INE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . ACCESS _ F INE _ LOCATION ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOC ATION _ PERMISSION _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmap . is My Location Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġmap . ui Settings . is My Location Button Enabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġf used Location Client . last Location . add On Success Listener ( this ) Ġ{ Ġlocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( location Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Location Ġ= Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Float (" last Latitude ", Ġlocation . latitude . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Float (" last Longitude ", Ġlocation . longitude . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . animate Camera ( get Camera Update ( LatLng ( location . latitude , Ġlocation . longitude ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Preferences Ġ= ĠLat Lng ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . get Float (" last Latitude ", Ġ 0 F ). toDouble (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . get Float (" last Longitude ", Ġ 0 F ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( location Preferences . latitude Ġ!= Ġ. 0 Ġ&& Ġlocation Preferences . longitude Ġ!= Ġ. 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . animate Camera ( get Camera Update ( location Preferences )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplace Marker On Map ( location : ĠLat Lng , Ġphotos : ĠArrayList < String >, ĠisEmpty : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmarker Options Ġ= ĠMarker Options (). position ( location ) ĊĊĠĠĠĠĠĠĠ Ġmarker Options . icon ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Descriptor Factory . from Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isEmpty ) ĠR . drawable . empty _ place Ġelse ĠR . drawable . reserved _ place ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Marker Ġ= Ġpositions . find Ġ{ Ġit . first . are EqualTo ( location ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Marker ?. first ?. remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositions . remove ( prev Marker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmarker Ġ= Ġmap . add Marker ( marker Options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositions . add ( Pair ( marker , Ġphotos )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplace Temporal Marker On Map ( location : ĠLat Lng ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmarker Options Ġ= ĠMarker Options (). position ( location ) ĊĊĠĠĠĠĠĠĠ Ġmarker Options . icon ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Descriptor Factory . from Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . temporal _ place ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmarker Ġ= Ġmap . add Marker ( marker Options ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimer (). schedule ( 5 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarker . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Address ( lat Lng : ĠLat Lng ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaddresses : ĠList < Address >? Ġ= Ġgeo coder . get From Location ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlat Lng . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlat Lng . longitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( addresses Ġ!= Ġnull ) Ġaddresses [ 0 ]. getAddress Line ( 0 ) Ġelse Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreserve Par king ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmarker Ġ= Ġview . tag Ġas ĠMarker ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠ Ġval Ġprev Reserved Body Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠ Ġval Ġphotos Ġ= Ġpositions . find Ġ{ Ġit . first . are EqualTo ( marker ) Ġ} ?. second ĊĊĠĠĠĠĠĠĠ Ġbody . put (" latitude ", Ġmarker . position . latitude ) ĊĠĠĠĠĠĠĠ Ġbody . put (" longitude ", Ġmarker . position . longitude ) ĊĊĠĠĠĠĠĠĠ Ġsocket . emit (" reserve _ location ", Ġbody ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( reserved Position Ġ!== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Reserved Body . put (" latitude ", Ġreserved Position !!. position . latitude ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Reserved Body . put (" longitude ", Ġreserved Position !!. position . longitude ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . emit (" cancel _ reserve _ location ", Ġprev Reserved Body ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreserved Position Ġ= Ġmarker ĊĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠR . string . confirm acion _ re serv a , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġplace Marker On Map ( LatLng ( marker . position . latitude , Ġmarker . position . longitude ), Ġphotos !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcancel Par king ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠJSONObject () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( reserved Position Ġ!== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . put (" latitude ", Ġreserved Position !!. position . latitude ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . put (" longitude ", Ġreserved Position !!. position . longitude ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . emit (" cancel _ reserve _ location ", Ġbody ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreserved Position Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠR . string . confirm acion _ re serv a _ cancel ada , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlogout () Ġ{ ĊĠĠĠĠĠĠĠ ĠFirebase Auth . getInstance (). sign Out () ĊĠĠĠĠĠĠĠ ĠcurrentUser Ġ= Ġnull ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠR . string . logout , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġsocket . disconnect () ĊĠĠĠĠĠĠĠ Ġsocket . off (" locations ", Ġon New Par king ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreport ar Sensor () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtake Picture Intent Ġ= ĠIntent ( Media Store . ACTION _ IMAGE _ CAPTURE ) ĊĠĠĠĠĠĠĠ Ġphoto File Ġ= Ġget Photo File () ĊĠĠĠĠĠĠĠ Ġval Ġfile Provider Ġ= ĠFile Provider . get Uri For File ( this , Ġ" com . example . file provider ", Ġphoto File ) ĊĠĠĠĠĠĠĠ Ġtake Picture Intent . putExtra ( Media Store . EXTRA _ OUTPUT , Ġfile Provider ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( take Picture Intent . resolve Activity ( this . package Manager ) Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( take Picture Intent , ĠREQUEST _ CODE ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this ," Unable Ġto Ġopen Ġcamera ", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Photo File (): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstorage Directory Ġ= Ġget External Files Dir ( Environment . DIRECTORY _ PI CTURE S ) ĊĠĠĠĠĠĠĠ Ġreturn ĠFile . create TempFile (" report -${ Date () }", Ġ". jpg ", Ġstorage Directory ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠREQUEST _ CODE Ġ&& ĠresultCode Ġ== ĠActivity . RESULT _ OK ) Ġupload Image ( photo File ) ĊĠĠĠĠĠĠĠ Ġelse Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Image ( file Ġ: ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġretrofit : ĠRet rofit Ġ= Ġget Ret rofit () ĊĠĠĠĠĠĠĠ Ġval Ġcurrent UserId Ġ= ĠcurrentUser ?. uid Ġ?: Ġ" 4 0 4 " ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Body : ĠRequest Body Ġ= Ġfile . as RequestBody (" image /* ". to MediaType OrNull ()) ĊĠĠĠĠĠĠĠ Ġval Ġimage Part : ĠMultip art Body . Part Ġ= ĠMultip art Body . Part . create FormData (" image ", Ġfile . name , Ġrequest Body ) ĊĠĠĠĠĠĠĠ Ġval ĠuserId Part : ĠRequest Body Ġ= Ġcurrent UserId . to RequestBody (" text / plain ". to MediaType OrNull ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġcall : ĠCall < ResponseBody > Ġ= Ġretrofit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create ( Upload Apis :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. upload Image ( image Part , ĠuserId Part ) ĊĊĠĠĠĠĠĠĠ Ġcall . enqueue ( object Ġ: Ġretrofit 2 . Callback < ResponseBody > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < ResponseBody >, Ġresponse : ĠResponse < ResponseBody >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġif Ġ( response . is Successful ) ĠgetString ( R . string . report _ success ) Ġelse ĠgetString ( R . string . report _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , Ġmessage , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < ResponseBody >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. makeText ( application Context , ĠgetString ( R . string . server _ error ), ĠToast . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Ret rofit () Ġ: ĠRet rofit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġokhttp client Ġ: ĠOk HttpClient Ġ= ĠOk HttpClient . Builder (). build () ĊĠĠĠĠĠĠĠ Ġreturn ĠRet rofit . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( getString ( R . string . server _ url )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( Gson Converter Factory . create ()). client ( okhttp client ). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Navigation ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . logout Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( app Menu Drawer Ġ!= Ġnull ) Ġapp Menu Drawer . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer _ layout . close Drawer ( Gravity Compat . START ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . login Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠAuth Activity :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . report ar Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport ar Sensor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ