/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . google . samples . apps . ios ched . ui . map Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Dialog Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . Html Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . ViewGroup . Margin LayoutParams Ċ import Ġandroidx . activity . add Callback Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . view . Window Insets Compat Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . core . view . margin Bottom Ċ import Ġandroidx . core . view . update LayoutParams Ċ import Ġandroidx . core . view . update Padding Ċ import Ġandroidx . core . widget . Nested ScrollView Ċ import Ġandroidx . fragment . app . Dialog Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . google . android . gms . maps . MapView Ċ import Ġcom . google . android . material . dialog . Material AlertDialog Builder Ċ import Ġcom . google . maps . android . data . geojson . Geo Json Layer Ċ import Ġcom . google . maps . android . k tx . await Map Ċ import Ġcom . google . samples . apps . ios ched . R Ċ import Ġcom . google . samples . apps . ios ched . databinding . Fragment Map Binding Ċ import Ġcom . google . samples . apps . ios ched . shared . analytics . Analytics Helper Ċ import Ġcom . google . samples . apps . ios ched . ui . MainActivity ViewModel Ċ import Ġcom . google . samples . apps . ios ched . ui . Main Navigation Fragment Ċ import Ġcom . google . samples . apps . ios ched . ui . signin . setup Profile MenuItem Ċ import Ġcom . google . samples . apps . ios ched . util . do On Apply Window Insets Ċ import Ġcom . google . samples . apps . ios ched . util . launch And Repeat With View Lifecycle Ċ import Ġcom . google . samples . apps . ios ched . util . slide Offset To Alpha Ċ import Ġcom . google . samples . apps . ios ched . widget . Bottom Sheet Behavior Ċ import Ġcom . google . samples . apps . ios ched . widget . Bottom Sheet Behavior . Bottom Sheet Callback Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . th reet en . bp . Instant Ċ import Ġjavax . inject . Inject Ċ Ċ @ Android EntryPoint Ċ class ĠMap Fragment Ġ: ĠMain Navigation Fragment () Ġ{ ĊĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġanalytics Helper : ĠAnalytics Helper ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠMap ViewModel Ġby Ġview Models () ĊĠĠĠ Ġprivate Ġval Ġmain Activity ViewModel : ĠMainActivity ViewModel Ġby Ġactivity ViewModels () ĊĊĠĠĠ Ġprivate Ġvar Ġmap View Bundle : ĠBundle ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmap View : ĠMap View ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Map Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbottom Sheet Behavior : ĠBottom Sheet Behavior < *> ĊĊĠĠĠ Ġprivate Ġvar Ġfab Base Margin Bottom Ġ= Ġ 0 ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFR AG MENT _ MY _ LOCATION _ RATION ALE Ġ= Ġ" my _ location _ ration ale " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAP VIEW _ B UNDLE _ KEY Ġ= Ġ" MapView Bundle Key " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARG _ FEATURE _ ID Ġ= Ġ" arg . FEATURE _ ID " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARG _ FEATURE _ START _ TIME Ġ= Ġ" arg . FEATURE _ START _ TIME " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ LOCATION _ PERMISSION Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ// ĠThreshold Ġfor Ġwhen Ġthe Ġmarker Ġdescription Ġreaches Ġmaximum Ġalpha . ĠShould Ġbe Ġa Ġvalue ĊĠĠĠĠĠĠĠ Ġ// Ġbetween Ġ 0 Ġand Ġ 1 , Ġinclusive , Ġcoin cid ing Ġwith Ġa Ġpoint Ġbetween Ġthe Ġbottom Ġsheet 's ĊĠĠĠĠĠĠĠ Ġ// Ġcollapsed Ġ( 0 ) Ġand Ġexpanded Ġ( 1 ) Ġstates . ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAL PH A _ TRANS ITION _ END Ġ= Ġ 0 . 5 f ĊĊĠĠĠĠĠĠĠ Ġ// ĠThreshold Ġfor Ġwhen Ġthe Ġmarker Ġdescription Ġreaches Ġminimum Ġalpha . ĠShould Ġbe Ġa Ġvalue ĊĠĠĠĠĠĠĠ Ġ// Ġbetween Ġ 0 Ġand Ġ 1 , Ġinclusive , Ġcoin cid ing Ġwith Ġa Ġpoint Ġbetween Ġthe Ġbottom Ġsheet 's ĊĠĠĠĠĠĠĠ Ġ// Ġcollapsed Ġ( 0 ) Ġand Ġexpanded Ġ( 1 ) Ġstates . ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAL PH A _ TRANS ITION _ START Ġ= Ġ 0 . 1 f ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( feature Id : ĠString , Ġfeature StartTime : ĠLong ): ĠMap Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMap Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( ARG _ FEATURE _ ID , Ġfeature Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Long ( ARG _ FEATURE _ START _ TIME , Ġfeature StartTime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap View Bundle Ġ= ĠsavedInstanceState . get Bundle ( MAP VIEW _ B UNDLE _ KEY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrequire Activity (). on Back Pressed Dispatcher . add Callback ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Map Binding . inflate ( in flater , Ġcontainer , Ġfalse ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġview Lifecycle Owner ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġthis @ Map Fragment . viewModel ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmap View Ġ= Ġbinding . map . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonCreate ( map View Bundle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMap Fragment Args . from Bundle ( arguments Ġ?: ĠBundle . EMPTY ). let Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . feature Id . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . request Highlight Feature ( it . feature Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariant Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . map Variant Ġ!= Ġnull Ġ-> ĠMap Variant . valueOf ( it . map Variant ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . startTime Ġ> Ġ 0 L Ġ-> ĠMap Variant . for Time ( Instant . of Epoch Milli ( it . startTime )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠMap Variant . for Time () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Map Variant ( variant ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġfab Base Margin Bottom Ġ= Ġbinding . map Mode Fab . margin Bottom ĊĊĠĠĠĠĠĠĠ Ġbinding . toolbar . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Profile MenuItem ( main Activity ViewModel , Ġview Lifecycle Owner ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . action _ my _ location )?. let Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch And Repeat With View Lifecycle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . show My Location Option . collect Ġ{ Ġoption Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . isVisible Ġ= Ġoption ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On MenuItem ClickListener Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== ĠR . id . action _ my _ location ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable My Location ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbottom Sheet Behavior Ġ= ĠBottom Sheet Behavior . from ( binding . bottom Sheet ) ĊĠĠĠĠĠĠĠ Ġval Ġbottom Sheet Callback Ġ= Ġobject Ġ: ĠBottom Sheet Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon StateChanged ( bottom Sheet : ĠView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOrient Ġthe Ġexpand / collapse Ġicon Ġaccordingly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotation Ġ= Ġwhen Ġ( newState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ EXP AN DED Ġ-> Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ COLL AP SED Ġ-> Ġ 1 8 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ HIDDEN Ġ-> Ġ 1 8 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . expand Icon . animate (). rotation X ( rotation ). start () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnalytics ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newState Ġ== ĠBottom Sheet Behavior . STATE _ EXP AN DED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . log View ed Marker Details () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Slide ( bottom Sheet : ĠView , Ġslide Offset : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDue Ġto Ġcontent Ġbeing Ġvisible Ġbene ath Ġthe Ġnavigation Ġbar , Ġapply Ġa Ġshort Ġalpha ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtransition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . description Scroll view . alpha Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslide Offset To Alpha ( slide Offset , ĠAL PH A _ TRANS ITION _ START , ĠAL PH A _ TRANS ITION _ END ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( slide Offset Ġ> Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . map Mode Fab . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . map Mode Fab . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTranslate ĠF AB Ġto Ġmake Ġroom Ġfor Ġthe Ġpeek ing Ġsheet . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġty Ġ= Ġ( bottom Sheet . top Ġ- Ġfab Base Margin Bottom Ġ- Ġbinding . map Mode Fab . bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. coerce At Most ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . map Mode Fab . translation Y Ġ= Ġty . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbottom Sheet Behavior . add Bottom Sheet Callback ( bottom Sheet Callback ) ĊĠĠĠĠĠĠĠ Ġ// ĠTrigger Ġthe Ġcallbacks Ġonce Ġon Ġlayout Ġto Ġset Ġthe Ġstate Ġof Ġthe Ġsheet Ġcontent Ġ& ĠF AB . ĊĠĠĠĠĠĠĠ Ġbinding . bottom Sheet . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġbottom Sheet Behavior . state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġslide Offset Ġ= Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ EXP AN DED Ġ-> Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ COLL AP SED Ġ-> Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ- 1 f Ġ// ĠBottom Sheet Behavior . STATE _ HIDDEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet Callback . on StateChanged ( binding . bottom Sheet , Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet Callback . on Slide ( binding . bottom Sheet , Ġslide Offset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġoriginal Peek Height Ġ= Ġbottom Sheet Behavior . peek Height ĊĠĠĠĠĠĠĠ Ġbinding . root . do On Apply Window Insets Ġ{ Ġ_, Ġin sets , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Bars Ġ= Ġin sets . get Insets ( Window Insets Compat . Type . system Bars ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . status Bar . update LayoutParams < Constraint Layout . LayoutParams > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġsystem Bars . top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . status Bar . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . status Bar . request Layout () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe ĠMap Ġpadding Ġso Ġthat Ġthe Ġcopyright , Ġetc Ġis Ġnot Ġdisplayed Ġin Ġnav Ġbar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġbinding . map . await Map () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . set Padding ( 0 , Ġ 0 , Ġ 0 , Ġsystem Bars . bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . map Mode Fab . update LayoutParams < Margin LayoutParams > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Margin Ġ= Ġfab Base Margin Bottom Ġ+ Ġsystem Bars . bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . description Scroll view . update Padding ( bottom Ġ= Ġsystem Bars . bottom ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġpeek Ġheight Ġshould Ġuse Ġthe Ġbottom Ġsystem Ġgesture Ġinset Ġsince Ġit Ġis Ġa Ġscrolling ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwidget ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgesture Insets Ġ= Ġin sets . get Insets ( Window Insets Compat . Type . system Gest ures ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet Behavior . peek Height Ġ= Ġgesture Insets . bottom Ġ+ Ġoriginal Peek Height ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġthe Ġheader Ġclick able . ĊĠĠĠĠĠĠĠ Ġbinding . click able . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bottom Sheet Behavior . state Ġ== ĠBottom Sheet Behavior . STATE _ COLL AP SED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet Behavior . state Ġ= ĠBottom Sheet Behavior . STATE _ EXP AN DED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet Behavior . state Ġ= ĠBottom Sheet Behavior . STATE _ COLL AP SED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠM imic Ġelevation Ġchange Ġby Ġactiv ating Ġheader Ġshadow . ĊĠĠĠĠĠĠĠ Ġbinding . description Scroll view ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setOn Scroll ChangeListener Ġ{ Ġv : ĠNested ScrollView , Ġ_: ĠInt , Ġ_: ĠInt , Ġ_: ĠInt , Ġ_: ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sheet Header Shadow . is Activated Ġ= Ġv . can Scroll Vert ically (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . map Mode Fab . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMap Variant Selection Dialog Fragment (). show ( child FragmentManager , Ġ" MAP _ MODE _ DIALOG ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize ĠMap View ĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap View . await Map (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset On Map ClickListener Ġ{ ĠviewModel . dismiss Feature Details () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset On Camera Move Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on Zoom Changed ( camera Position . zoom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable My Location () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlaunch And Repeat With View Lifecycle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOb serve ĠViewModel Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . map Variant . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap View . await Map (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Map Features ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġcenter Ġof Ġthe Ġmap 's Ġcamera . ĠCall Ġthis Ġevery Ġtime Ġthe Ġuser Ġselects Ġa Ġmarker . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . map Center Event . collect Ġ{ Ġupdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap View . getMap Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . animate Camera ( update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . bottom Sheet State Event . collect Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . from ( binding . bottom Sheet ). state Ġ= Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . geo Json Layer . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Markers ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . selected Marker Info . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Info Sheet ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġanalytics Helper . send Screen View (" Map ", Ġrequire Activity ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Info Sheet ( marker Info : ĠMarker Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġicon Res Ġ= Ġget Drawable Resource For Icon ( binding . marker Icon . context , Ġmarker Info . icon Name ) ĊĠĠĠĠĠĠĠ Ġbinding . marker Icon . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Image Resource ( icon Res ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= Ġif Ġ( icon Res Ġ== Ġ 0 ) ĠView . GONE Ġelse ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . marker Title . text Ġ= Ġmarker Info . title ĊĠĠĠĠĠĠĠ Ġbinding . marker Subtitle . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġmarker Info . subtitle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Visible Ġ= Ġ! marker Info . subtitle . isNull OrEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdescription Ġ= ĠHtml . from Html ( marker Info . description Ġ?: Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġhas Description Ġ= Ġdescription . isNotEmpty () ĊĠĠĠĠĠĠĠ Ġbinding . marker Description . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġdescription ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Visible Ġ= Ġhas Description ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠHide / disable Ġexpansion Ġaff ord ances Ġwhen Ġthere Ġis Ġno Ġdescription . ĊĠĠĠĠĠĠĠ Ġbinding . expand Icon . isVisible Ġ= Ġhas Description ĊĠĠĠĠĠĠĠ Ġbinding . click able . isVisible Ġ= Ġhas Description ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Back Pressed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(:: bottom Sheet Behavior . isInitialized Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet Behavior . state Ġ== ĠBottom Sheet Behavior . STATE _ EXP AN DED ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet Behavior . state Ġ= ĠBottom Sheet Behavior . STATE _ COLL AP SED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġval Ġmap View Bundle Ġ= Ġout State . get Bundle ( MAP VIEW _ B UNDLE _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠBundle (). apply Ġ{ Ġput Bundle ( MAP VIEW _ B UNDLE _ KEY , Ġthis ) Ġ} ĊĠĠĠĠĠĠĠ Ġmap View . on Save InstanceState ( map View Bundle ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġmap View . on Resume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġmap View . onStart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġmap View . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġmap View . on Pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġmap View . on Destroy () ĊĠĠĠĠĠĠĠ ĠviewModel . on Map Destroyed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Low Memory () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Low Memory () ĊĠĠĠĠĠĠĠ Ġmap View . on Low Memory () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Markers ( geo Json Layer : ĠGeo Json Layer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgeo Json Layer . add Layer ToMap () ĊĠĠĠĠĠĠĠ Ġgeo Json Layer . setOn Feature ClickListener Ġ{ Ġfeature Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFeature ĠID Ġcan Ġbe Ġa Ġcomma - separated Ġlist . ĠIn Ġthat Ġcase Ġuse Ġonly Ġthe Ġfirst ĠID . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . request Highlight Feature ( feature . id . split (", ")[ 0 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Location Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġcontext Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( context , ĠManifest . permission . ACCESS _ F INE _ LOCATION ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( should Show Request Permission R ationale ( Manifest . permission . ACCESS _ F INE _ LOCATION )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMy Location R ationale Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show ( child FragmentManager , ĠFR AG MENT _ MY _ LOCATION _ RATION ALE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequest Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . ACCESS _ F INE _ LOCATION ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ LOCATION _ PERMISSION ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠREQUEST _ LOCATION _ PERMISSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results . size Ġ== Ġ 1 Ġ&& Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable My Location () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMy Location R ationale Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show ( child FragmentManager , ĠFR AG MENT _ MY _ LOCATION _ RATION ALE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable My Location ( request Permission : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġcontext Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( context , ĠManifest . permission . ACCESS _ F INE _ LOCATION ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . PERMISSION _ GRAN TED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmap View . await Map () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . is My Location Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . opt Into My Location () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permission Ġ-> Ġrequest Location Permission () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠviewModel . opt Into My Location ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠMy Location R ationale Fragment Ġ: ĠDialog Fragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate Dialog ( savedInstanceState : ĠBundle ?): ĠDialog Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMaterial AlertDialog Builder ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . my _ location _ ration ale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( android . R . string . ok ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Parent Fragment (). request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . ACCESS _ F INE _ LOCATION ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ LOCATION _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( android . R . string . cancel , Ġnull ) Ġ// ĠGive Ġup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ