package Ġcom . j erry . ch itch at čĊč Ċ import Ġandroidx . appcompat . app . AppCompatActivity č Ċ import Ġandroid . os . Bundle č Ċ import Ġandroid . util . Log č Ċ import Ġcom . google . firebase . auth . Firebase Auth č Ċ import Ġcom . google . firebase . database . Child EventListener č Ċ import Ġcom . google . firebase . database . Data Snapshot č Ċ import Ġcom . google . firebase . database . Database Error č Ċ import Ġcom . google . firebase . database . Firebase Database č Ċ import Ġcom . squareup . pic asso . Pic asso č Ċ import Ġcom . x wr ay . group ie . Group Adapter č Ċ import Ġcom . x wr ay . group ie . Item č Ċ import Ġcom . x wr ay . group ie . ViewHolder č Ċ import Ġkotlinx . android . synt hetic . main . activity _ personal _ chat .* č Ċ import Ġkotlinx . android . synt hetic . main . rec ie ving . view .* č Ċ import Ġkotlinx . android . synt hetic . main . sending . view .* čĊč Ċ class ĠPersonal Chat Activity Ġ: ĠAppCompatActivity () Ġ{ čĊčĊĠĠĠ Ġval Ġadapter Ġ= ĠGroup Adapter < ViewHolder >() čĊĠĠĠ Ġvar Ġto User Ġ: ĠUser ? Ġ= Ġnull čĊčĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) čĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ personal _ chat ) čĊčĊĠĠĠĠĠĠĠ Ġchat message _ recycler . adapter Ġ= Ġadapter čĊčĊč ĊĠĠĠĠĠ Ġto User Ġ= Ġintent . get Parcelable Extra < User >( New Message Activity . USER _ KEY ) čĊčĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. title Ġ= Ġto User ?. username čĊĠĠĠĠĠĠ Ġ// Ġdummy Chat () čĊčĊč ĊĠĠĠĠĠĠ Ġlisten For Messages () čĊĠĠĠĠĠĠĠ Ġsend _ messages . setOnClickListener Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġperform SendMessage () čĊčĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġprivate Ġfun Ġlisten For Messages () Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġfrom Id Ġ= ĠFirebase Auth . getInstance (). uid čĊĠĠĠĠĠĠĠ Ġval Ġto Id Ġ= Ġto User ?. uid čĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= ĠFirebase Database . getInstance (). getReference ("/ user - messages /$ from Id /$ to Id ") čĊčĊĠĠĠĠĠĠĠ Ġref . addChild EventListener ( object : ĠChild EventListener Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Added ( p 0 : ĠData Snapshot , Ġp 1 : ĠString ?) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat Message Ġ= Ġp 0 . getValue ( ChatMessage :: class . java ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chat Message Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" chat message ", Ġchat Message . text ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chat Message . from Id Ġ== ĠFirebase Auth . getInstance (). uid ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcurrentUser Ġ= ĠNew Message Activity . currentUser Ġ?: Ġreturn čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . add ( Chat From Item ( chat Message . text , ĠcurrentUser )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . add ( Chat To Item ( chat Message . text , to User !! )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat message _ recycler . scrollTo Position ( adapter . item Count - 1 Ġ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Changed ( p 0 : ĠData Snapshot , Ġp 1 : ĠString ?) Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Moved ( p 0 : ĠData Snapshot , Ġp 1 : ĠString ?) Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Removed ( p 0 : ĠData Snapshot ) Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ}) čĊčĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġperform SendMessage () Ġ{ čĊĠĠĠĠĠĠĠ Ġ// Ġhow Ġdo Ġwe Ġactually Ġsend Ġa Ġmessage Ġto Ġfirebase ... čĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġedit message _ chat _ log . text . toString () čĊčĊĠĠĠĠĠĠĠ Ġval Ġfrom Id Ġ= ĠFirebase Auth . getInstance (). uid čĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġintent . get Parcelable Extra < User >( New Message Activity . USER _ KEY ) čĊĠĠĠĠĠĠĠ Ġval Ġto Id Ġ= Ġuser . uid čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( from Id Ġ== Ġnull ) Ġreturn čĊčĊĠĠĠĠĠĠĠ Ġval Ġreference Ġ= ĠFirebase Database . getInstance (). getReference ("/ user - messages /$ from Id /$ to Id "). push () čĊĠĠĠĠĠĠĠ Ġval Ġto Reference Ġ= ĠFirebase Database . getInstance (). getReference ("/ user - messages /$ to Id /$ from Id "). push () čĊčĊĠĠĠĠĠĠĠ Ġval Ġchat Message Ġ= ĠChat Message ( reference . key !! , Ġtext , Ġfrom Id , Ġto Id , ĠSystem . currentTimeMillis () Ġ/ Ġ 1 0 0 0 ) čĊĠĠĠĠĠĠĠ Ġreference . setValue ( chat Message ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" chat message ", Ġ" Saved Ġour Ġchat Ġmessage : Ġ${ reference . key }") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedit message _ chat _ log . text . clear () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġto Reference . setValue ( chat Message ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġlatest Message Ref Ġ= ĠFirebase Database . getInstance (). getReference ("/ latest - messages /$ from Id /$ to Id ") čĊĠĠĠĠĠĠĠ Ġlatest Message Ref . setValue ( chat Message ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġlatest Message To Ref Ġ= ĠFirebase Database . getInstance (). getReference ("/ latest - messages /$ to Id /$ from Id ") čĊĠĠĠĠĠĠĠ Ġlatest Message To Ref . setValue ( chat Message ) čĊčĊčĊĠĠĠ Ġ} čĊč Ċ } č Ċ class ĠChat To Item ( val Ġtext : ĠString , Ġval Ġuser : ĠUser ): ĠItem < ViewHolder > (){ čĊĠĠĠ Ġoverride Ġfun Ġget Layout (): ĠInt Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn ĠR . layout . rec ie ving čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġbind ( view Holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġ// Ġwill Ġdo čĊĠĠĠĠĠĠĠ ĠviewHolder . item View . rec ie ving _ text . text Ġ= Ġtext čĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġuser . profile ImageUrl čĊĠĠĠĠĠĠĠ Ġval Ġtargeted Image Ġ= ĠviewHolder . item View . image view _ chat _ from _ row čĊĠĠĠĠĠĠĠ ĠPic asso . get (). load ( uri ). into ( target ed Image Ġ Ġ) čĊčĊĠĠĠ Ġ} čĊčĊč Ċ } čĊč Ċ class ĠChat From Item ( val Ġtext : ĠString , Ġval Ġuser : ĠUser ): ĠItem < ViewHolder > (){ čĊĠĠĠ Ġoverride Ġfun Ġget Layout (): ĠInt Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn ĠR . layout . sending čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġbind ( view Holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġ// Ġwill Ġdo čĊčĊĠĠĠĠĠĠĠ ĠviewHolder . item View . sending _ text . text Ġ= Ġtext čĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġuser . profile ImageUrl čĊĠĠĠĠĠĠĠ Ġval Ġtargeted Image Ġ= ĠviewHolder . item View . image view _ chat _ to _ row čĊĠĠĠĠĠĠĠ ĠPic asso . get (). load ( uri ). into ( target ed Image Ġ Ġ) čĊčĊčĊĠĠĠ Ġ} čĊčĊč Ċ }