package Ġcom . example . android . bucket _ quest . activities Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . ViewModel Providers Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . example . android . bucket _ quest . Event Ċ import Ġcom . example . android . bucket _ quest . My ViewModel Ċ import Ġcom . example . android . bucket _ quest . R Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . database .* Ċ import Ġcom . google . firebase . storage . Firebase Storage Ċ import Ġkotlinx . android . extensions . Layout Container Ċ import Ġkotlinx . android . synt hetic . main . activity _ event .* Ċ import Ġkotlinx . android . synt hetic . main . row _ comment . view .* ĊĊ Ċ class ĠEvent Activity : ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġevent : ĠEvent ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠMy ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠMy Comments Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdatabase : ĠDatabase Reference ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġauth : ĠFirebase Auth ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ event ) ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Providers . of ( this )[ My ViewModel :: class . java ] ĊĠĠĠĠĠĠĠ Ġdatabase Ġ= ĠFirebase Database . getInstance (). reference ĊĠĠĠĠĠĠĠ Ġauth Ġ= ĠFirebase Auth . getInstance () ĊĊĊĠĠĠĠĠĠĠ Ġsetup UI () ĊĠĠĠĠĠĠĠ Ġget Comments () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Comments () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpost Listener Ġ= Ġobject Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( data Snapshot : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost Ġ= Ġdata Snapshot . child (" events "). child ( event . state !! ). child ( event . city !! ). child ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlist : ĠArrayList < String > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( events Ġin Ġpost . children ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( events . key Ġ== Ġ" comments "){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġevents . value !! Ġas ĠArrayList < String > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( events . key Ġ== Ġ" name " Ġ&& Ġevents . value !! Ġ== Ġevent . name ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . replace Items ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( database Error : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGetting ĠPost Ġfailed , Ġlogging Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w (" get Events Near Location ", Ġ" load Post : on Cancelled ", Ġdatabase Error . to Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdatabase . addListener For Single Value Event ( post Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup UI (){ ĊĠĠĠĠĠĠĠ Ġval Ġstorage Ġ= ĠFirebase Storage . getInstance () ĊĠĠĠĠĠĠĠ Ġval Ġstorage Ref Ġ= Ġstorage . reference ĊĠĠĠĠĠĠĠ Ġval ĠimageView Ġ= ĠfindViewById < ImageView >( R . id . image view _ event ) ĊĊĠĠĠĠĠĠĠ Ġdatabase Ġ= ĠFirebase Database . getInstance (). reference ĊĊĠĠĠĠĠĠĠ Ġevent Ġ= Ġintent . extras ?. get Serializable (" event _ key ") Ġas ĠEvent ĊĠĠĠĠĠĠĠ Ġstorage Ref . child (" event - pictures /${ event . picture } "). download Url . add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGot Ġthe Ġdownload ĠURL Ġfor Ġ' event - pictures / farm ers . jpg "' ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( this ). load ( it ). into ( imageView ) ĊĊĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġany Ġerrors ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" evt _ img "," Failed Ġto Ġretrieve Ġimage .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĊĠĠĠĠĠĠĠ Ġtext view _ event _ name . text Ġ= Ġevent . name ĊĠĠĠĠĠĠĠ Ġtext view _ location . text Ġ= Ġevent . location ĊĠĠĠĠĠĠĠ Ġtext view _ up votes . text Ġ= Ġevent . up votes . toString () ĊĠĠĠĠĠĠĠ Ġtext view _ down votes . text Ġ= Ġevent . down votes . toString () ĊĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠMy Comments Adapter () ĊĠĠĠĠĠĠĠ Ġcomments RecyclerView . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġcomments RecyclerView . layout Manager Ġ= Ġandroidx . recyclerview . widget . Linear LayoutManager ( this ) ĊĊĠĠĠĠĠĠĠ Ġbutton Add Comment . setOnClickListener Ġ{ ĠviewModel . add Comment ( event . state !! , Ġevent . city !! , Ġevent . name , Ġedit Text Comment . text . toString ()) Ġ} ĊĠĠĠĠĠĠĠ Ġbutton Up vote . setOnClickListener Ġ{ Ġup vote () Ġ} ĊĠĠĠĠĠĠĠ Ġbutton Down vote . setOnClickListener Ġ{ Ġdown vote () Ġ} ĊĠĠĠĠĠĠĠ Ġtoggle Button State () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġtoggle Ġthe Ġbookmark Ġbutton Ġif Ġit Ġexists Ġin Ġthe Ġusers Ġto dol ist ĊĠĠĠ Ġprivate Ġfun Ġtoggle Button State () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠcurrentUser Ġ= Ġauth . currentUser ĊĠĠĠĠĠĠĠ Ġif Ġ( currentUser Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost Listener Ġ= Ġobject Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( data Snapshot : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Snapshot Ġ= Ġdata Snapshot . child (" users "). child ( currentUser . uid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Todo Ġ= Ġuser Snapshot . value Ġas ĠHashMap < String , ĠAny > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontain Ġ= Ġcontains Event ( user Todo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbookmark _ toggle . setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isChecked Ġ&& Ġ! contain ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(! isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( contain ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbookmark _ toggle . isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( database Error : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" user _ err "," Could Ġnot Ġget Ġdata Ġfor Ġthe Ġuser ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . addListener For Single Value Event ( post Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbookmark _ toggle . setOn Checked ChangeListener Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" toggle ", Ġ" Sorry Ġyou Ġneed Ġan Ġaccount Ġto Ġsave Ġevents ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcontains Event Ġ( user Event : ĠHashMap < String , ĠAny >) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( user Event . containsKey (" todo List ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtodo List Ġ= Ġuser Event [" todo List "] Ġas ĠArrayList < HashMap < String , ĠAny >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( todo Item Ġin Ġtodo List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( todo Item [" name "] ?. equals ( event . name ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġtodo Item [" city "] ?. equals ( event . city ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġtodo Item [" state "] ?. equals ( event . state ) !! ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" asdf "," Hello ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdown vote () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . down vote ( event . state !! , Ġevent . city !! , Ġevent . name ) ĊĠĠĠĠĠĠĠ Ġtext view _ down votes . text Ġ= Ġ( text view _ down votes . text . toString (). toInt () Ġ- Ġ 1 ). toString () ĊĠĠĠĠĠĠĠ Ġbutton Down vote . alpha Ġ= Ġ 0 . 2 5 f ĊĠĠĠĠĠĠĠ Ġbutton Down vote . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Down vote ĠAdded !", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġup vote () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . up vote ( event . state !! , Ġevent . city !! , Ġevent . name ) ĊĠĠĠĠĠĠĠ Ġtext view _ up votes . text Ġ= Ġ( text view _ up votes . text . toString (). toInt () Ġ+ Ġ 1 ). toString () ĊĠĠĠĠĠĠĠ Ġbutton Up vote . alpha Ġ= Ġ. 2 5 f ĊĠĠĠĠĠĠĠ Ġbutton Up vote . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Up vote ĠAdded !", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Event () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . save Event ( event ) ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Event ĠSaved !", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Event (){ ĊĠĠĠĠĠĠĠ ĠviewModel . remove Event ( event ) ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Event ĠRemoved !", ĠToast . LENGTH _ LONG ). show () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠMy Comments Adapter Ġ: Ġandroidx . recyclerview . widget . RecyclerView . Adapter < My Comments Adapter . ViewHolder >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġitems Ġ: ĠMutable List < String ?> Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ). inflate ( R . layout . row _ comment , Ġparent , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠViewHolder ( view ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġitems [ position ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . comment TextView . text Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġreplace Items ( items Ġ: ĠArrayList < String >) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . items Ġ= Ġitems Ġas ĠMutable List < String ?> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ= Ġitems . size ĊĊĠĠĠĠĠĠĠ Ġ// ĠNOTE : Ġneed Ġto Ġbind Ġhere Ġfirst Ġto Ġbe Ġable Ġto Ġhave Ġaccess Ġin Ġon Bind ViewHolder ĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠViewHolder ( override Ġval Ġcontainer View : ĠView ) Ġ: Ġandroidx . recyclerview . widget . RecyclerView . ViewHolder ( container View ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLayout Container Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment TextView : ĠTextView Ġ= Ġcontainer View . comment TextView ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }