package Ġcom . uw cs 4 4 6 . social sport s . ui . host Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Array Adapter Ċ import Ġandroid . widget . Auto Complete TextView Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . EditText Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . core . view . isIn visible Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . navigation . Navigation Ċ import Ġcom . google . android . gms . common . api . Status Ċ import Ġcom . google . android . libraries . places . api . model . Place Ċ import Ġcom . google . android . libraries . places . widget . Autocomplete Support Fragment Ċ import Ġcom . google . android . libraries . places . widget . listener . Place Selection Listener Ċ import Ġcom . uw cs 4 4 6 . social sport s . R Ċ import Ġcom . uw cs 4 4 6 . social sport s . databinding . Fragment Host Edit Details Binding Ċ import Ġcom . uw cs 4 4 6 . social sport s . domain . datetime picker . DateTime Picker Ċ import Ġcom . uw cs 4 4 6 . social sport s . domain . match . Match Location Ċ import Ġcom . uw cs 4 4 6 . social sport s . domain . match . Sport Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . Zone Id Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util . Calendar Ċ Ċ @ Android EntryPoint Ċ class ĠHost Details Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġthis :: class . simple Name ĊĠĠĠ Ġprivate Ġval Ġhost Details ViewModel : ĠHost Details ViewModel Ġby Ġview Models () ĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠFragment Host Edit Details Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate View ( in flater , Ġcontainer , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠFragment Host Edit Details Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġroot : ĠView Ġ= Ġbinding . root ĊĊĠĠĠĠĠĠĠ Ġ// ĠViews ĊĠĠĠĠĠĠĠ Ġval Ġlocation Search Ġ= Ġbinding . host Search Choose AL ocation Card View ĊĠĠĠĠĠĠĠ Ġval Ġlocation Card Ġ= Ġbinding . host Card Selected Location ĊĠĠĠĠĠĠĠ Ġval Ġlocation Title TextView : ĠTextView Ġ= Ġbinding . host Selected Location Title ĊĠĠĠĠĠĠĠ Ġval Ġlocation Address TextView : ĠTextView Ġ= Ġbinding . host Selected Location Address ĊĠĠĠĠĠĠĠ Ġval Ġtitle TextView : ĠEditText Ġ= Ġbinding . host Input Game Title ĊĠĠĠĠĠĠĠ Ġval Ġs port TextView : ĠAuto Complete TextView Ġ= Ġbinding . host Input Game Sport ĊĠĠĠĠĠĠĠ Ġval Ġdate TextView : ĠEditText Ġ= Ġbinding . host Input Game Date ĊĠĠĠĠĠĠĠ Ġval Ġtime TextView : ĠEditText Ġ= Ġbinding . host Input Game Time ĊĠĠĠĠĠĠĠ Ġval Ġduration Hour TextView : ĠEditText Ġ= Ġbinding . host Input Duration Hour ĊĠĠĠĠĠĠĠ Ġval Ġduration Minute TextView : ĠEditText Ġ= Ġbinding . host Input Duration Minute ĊĠĠĠĠĠĠĠ Ġval Ġrules TextView : ĠEditText Ġ= Ġbinding . host Input Description ĊĠĠĠĠĠĠĠ Ġval Ġhost Game Button : ĠButton Ġ= Ġbinding . host Button Host ĊĊĠĠĠĠĠĠĠ Ġ// ĠLocation Ġsearch ĊĠĠĠĠĠĠĠ Ġvar Ġmatch Location : ĠMatch Location ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġlocation Search Fragment Ġ= Ġchild FragmentManager . find Fragment ById ( R . id . host _ search _ choose _ a _ location ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġas ĠAuto complete Support Fragment ĊĠĠĠĠĠĠĠ Ġlocation Search Fragment . set Hint ( getString ( R . string . host _ hint _ search _ location )) ĊĠĠĠĠĠĠĠ Ġlocation Search Fragment . set Place Fields ( listOf ( Place . Field . ADDRESS , ĠPlace . Field . LAT _ L NG , ĠPlace . Field . NAME , ĠPlace . Field . ID )) ĊĠĠĠĠĠĠĠ Ġlocation Search Fragment . setOn Place Selected Listener ( object Ġ: ĠPlace Selection Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Place Selected ( place : ĠPlace ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprintln (" Place : Ġ${ place . name }, Ġ${ place . address }, Ġ${ place . lat Lng }, Ġ${ place . id }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Location Ġ= ĠMatch Location ( place . id !! , Ġplace . lat Lng !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Title TextView . text Ġ= Ġplace . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Address TextView . text Ġ= Ġplace . address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Search . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Card . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( status : ĠStatus ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Something Ġwent Ġwrong Ġwhile Ġsearching Ġfor Ġplaces . ĠStatus Ġcode : Ġ$ status ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠLocation Ġand Ġmatch Ġdetails Ġof Ġsaved Ġcontext ĊĠĠĠĠĠĠĠ Ġhost Details ViewModel . edit Match Flow . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Search . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Card . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhost Details ViewModel . location Name . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Title TextView . text Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhost Details ViewModel . location Address . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Address TextView . text Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmatch StartTime Ġ= Ġhost Details ViewModel . match StartTime ĊĠĠĠĠĠĠĠ Ġval Ġmatch EndTime Ġ= Ġhost Details ViewModel . match EndTime ĊĊĠĠĠĠĠĠĠ Ġtitle TextView . setText ( host Details ViewModel . match Title ) ĊĠĠĠĠĠĠĠ Ġs port TextView . setText ( host Details ViewModel . sport Type . toString ()) ĊĠĠĠĠĠĠĠ Ġrules TextView . setText ( host Details ViewModel . match Description ) ĊĊĠĠĠĠĠĠĠ Ġdate TextView . setText ( match StartTime ?. at Zone ( Zone Id . system Default ()) ?. format ( DateTime Picker (). getDate Formatter ())) ĊĠĠĠĠĠĠĠ Ġtime TextView . setText ( match StartTime ?. at Zone ( Zone Id . system Default ()) ?. format ( DateTime Picker (). getTime Formatter ())) ĊĊĠĠĠĠĠĠĠ Ġvar Ġduration : ĠDuration ĊĠĠĠĠĠĠĠ Ġif Ġ( match StartTime Ġ!= Ġnull Ġ&& Ġmatch EndTime Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= ĠDuration . between ( match StartTime , Ġmatch EndTime ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= ĠDuration . ZERO ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġduration Hour TextView . setText ( duration . to Hours (). toString ()) ĊĠĠĠĠĠĠĠ Ġduration Minute TextView . setText (( duration . to Minutes () Ġ- Ġduration . to Hours () Ġ* Ġ 6 0 ). toString ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPopulate Ġs port Ġtype Ġlist ĊĠĠĠĠĠĠĠ Ġval Ġtype ListAdapter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArray Adapter ( require Context (), ĠR . layout . sport _ type _ item , ĠS port . values ()) ĊĠĠĠĠĠĠĠ Ġs port TextView . setAdapter ( type ListAdapter ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġdate Ġpicker ĊĠĠĠĠĠĠĠ Ġdate TextView . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Picker Ġ= ĠDateTime Picker (). getDate Picker () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate Picker . add On Positive Button ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠInstant . of Epoch Milli ( it ). at Zone ( Zone Id . of (" UTC ")). to LocalDate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Date Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate . format ( DateTime Picker (). getDate Formatter ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate TextView . setText ( formatted Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate Picker . show ( parent FragmentManager , Ġ" date Picker ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġtime Ġpicker ĊĠĠĠĠĠĠĠ Ġtime TextView . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Picker Ġ= ĠDateTime Picker (). getTime Picker () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Picker . add On Positive Button ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . HOUR _ OF _ DAY , Ġtime Picker . hour ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . MINUTE , Ġtime Picker . minute ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Formatter Ġ= ĠSimpleDateFormat (" HH : mm ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġformatted Time Ġ= Ġview Formatter . format ( calendar . time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime TextView . setText ( formatted Time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Picker . show ( parent FragmentManager , Ġ" time Picker ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠClick ĠMatch Location Ġcard Ġon Ġhost Ġdetails Ġfragment Ġto Ġedit Ġselected Ġlocation ĊĠĠĠĠĠĠĠ Ġlocation Card . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Search . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Card . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠHost ĠGame ĠButton ĊĠĠĠĠĠĠĠ Ġhost Game Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( location Card . isIn visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Search Fragment . set Hint (" Location Ġis Ġrequired ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( title TextView . text . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle TextView . error Ġ= Ġ" Please Ġenter Ġa Ġgame Ġtitle " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sport TextView . text . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs port TextView . error Ġ= Ġ" Please Ġselect Ġa Ġs port Ġtype " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( date TextView . text . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate TextView . error Ġ= Ġ" Please Ġselect Ġa Ġdate " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( time TextView . text . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime TextView . error Ġ= Ġ" Please Ġselect Ġtime " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( duration Hour TextView . text . isBlank () Ġ&& Ġduration Minute TextView . text . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Minute TextView . error Ġ= Ġ" Please Ġspecify Ġmatch Ġduration " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠLocalDateTime . parse ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ date TextView . text } Ġ${ time TextView . text }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDateTime Formatter . of Pattern (" yyyy - MM - dd ĠHH : mm ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. at Zone ( Zone Id . system Default ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Instant () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= ĠDuration . of Hours ( duration Hour TextView . text . toString (). to Long ()). plus ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDuration . of Minutes ( duration Minute TextView . text . toString (). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠendTime Ġ= ĠstartTime . plus ( duration ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġuser Ġinput Ġin Ġview Ġmodel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match Location Ġ!= Ġnull ) Ġhost Details ViewModel . match Location Ġ= Ġmatch Location Ġas ĠMatch Location ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Details ViewModel . match Title Ġ= Ġtitle TextView . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Details ViewModel . sport Type Ġ= Ġs port TextView . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Details ViewModel . match StartTime Ġ= ĠstartTime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Details ViewModel . match EndTime Ġ= ĠendTime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Details ViewModel . match Description Ġ= Ġrules TextView . text . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġclick Ġin Ġview Ġmodel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Details ViewModel . on Save Click () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedit Match Flow Ġ= Ġhost Details ViewModel . edit Match Flow . value Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( edit Match Flow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreturn Ġto Ġprevious Ġpage Ġ( which Ġis Ġthe Ġdetails Ġpage ) Ġwhen Ġfinish ing Ġthe Ġediting Ġflow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). on Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreturn Ġto Ġhome Ġpage Ġwhen Ġfinish ing Ġthe Ġhosting Ġflow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation . find Nav Controller ( require View ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. navigate ( R . id . navigation _ home ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġroot ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ