package Ġr att club . grav trash Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ 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 Ġkotlinx . android . synt hetic . main . activity _ chat .* Ċ import Ġr att club . grav trash . pre val ent . Message Ċ import Ġr att club . grav trash . pre val ent . Message Adapter Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . collections . HashMap Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠChat Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġm Auth Ġ= ĠFirebase Auth . getInstance () ĊĠĠĠ Ġprivate Ġval Ġroot Ref Ġ= ĠFirebase Database . getInstance (). reference ĊĠĠĠ Ġprivate Ġvar Ġmessages List Ġ= ĠArrayList < Message ?> () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ chat ) ĊĊĠĠĠĠĠĠĠ Ġdisplay UserInfo () ĊĠĠĠĠĠĠĠ Ġdisplay Messages () ĊĊĠĠĠĠĠĠĠ Ġsend _ message _ btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay Messages () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Adapter Ġ= ĠMessage Adapter ( messages List Ġas ĠList < Message >) ĊĠĠĠĠĠĠĠ Ġval Ġuser Recycler Message List Ġ= ĠfindViewById < RecyclerView >( R . id . chat _ message _ list ) ĊĠĠĠĠĠĠĠ Ġval Ġlinear LayoutManager Ġ= ĠLinearLayoutManager ( this ) ĊĠĠĠĠĠĠĠ Ġuser Recycler Message List . layout Manager Ġ= Ġlinear LayoutManager ĊĠĠĠĠĠĠĠ Ġuser Recycler Message List . adapter Ġ= Ġmessage Adapter ĊĊĠĠĠĠĠĠĠ Ġval Ġreceiver ID : ĠString ? Ġ= Ġintent . getString Extra (" receiver _ uid ") ĊĠĠĠĠĠĠĠ Ġroot Ref . child (" Messages "). child ( m Auth . currentUser ?. uid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( receiver ID . toString ()). addChild EventListener ( object : ĠChild EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Moved ( p 0 : ĠData Snapshot , Ġp 1 : ĠString ?) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Changed ( p 0 : ĠData Snapshot , Ġp 1 : ĠString ?) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Removed ( p 0 : ĠData Snapshot ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Added ( p 0 : ĠData Snapshot , Ġp 1 : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġp 0 . getValue ( Message :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages List . add ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Recycler Message List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. smooth Scroll To Position (( user Recycler Message List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. adapter Ġas ĠMessage Adapter ). item Count ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" SimpleDateFormat ") ĊĠĠĠ Ġprivate Ġfun ĠsendMessage () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Text Ġ= Ġinput _ message . text . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( message Text . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Please Ġwrite Ġyour Ġmessage ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver ID : ĠString ? Ġ= Ġintent . getString Extra (" receiver _ uid ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Sender Ref Ġ= Ġ" Messages /${ m Auth . currentUser ?. uid }/ $ receiver ID " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Receiver Ref Ġ= Ġ" Messages /$ receiver ID /${ m Auth . currentUser ?. uid }" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate Ġunique Ġkey Ġfor Ġeach Ġmessage Ġsent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Message Key Ref Ġ= Ġroot Ref . child (" Messages ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( m Auth . currentUser ?. uid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( receiver ID . toString ()). push () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage ID Ġ= Ġuser Message Key Ref . key ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Date Ġ= ĠSimpleDateFormat (" MMM Ġdd , Ġy yyy ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcurrentTime Ġ= ĠSimpleDateFormat (" hh : mm Ġa ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmessage Details Map : ĠHashMap < String , ĠAny > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Details Map [" message ID "] Ġ= Ġmessage ID . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Details Map [" message "] Ġ= Ġmessage Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Details Map [" from "] Ġ= Ġm Auth . currentUser ?. uid . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Details Map [" to "] Ġ= Ġreceiver ID . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Details Map [" date "] Ġ= Ġcurrent Date . format ( calendar . time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Details Map [" time "] Ġ= ĠcurrentTime . format ( calendar . time ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreferencing Ġchild Ġnodes Ġlayout Ġin Ġdatabase Ġwith ĠHashMap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmessage Ref Map : ĠHashMap < String , ĠAny > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ref Map [" $ message Sender Ref /${ message ID . toString ()} "] Ġ= Ġmessage Details Map ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ref Map [" $ message Receiver Ref /${ message ID . toString ()} "] Ġ= Ġmessage Details Map ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Ref . update Children ( message Ref Map ). add On Complete Listener { task Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" sending _ message ", Ġ" Message Ġsent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ Chat Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġsend Ġmessage ", ĠToast . LENGTH _ SHORT ). show (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" sending _ message ", Ġ"${ task . exception }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput _ message . setText ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay UserInfo () Ġ{ ĊĠĠĠĠĠĠĠ ĠPic asso . get (). load ( intent . getString Extra (" receiver _ user _ profile _ image ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. placeholder ( R . drawable . profile ). into ( chat _ profile _ image ) ĊĠĠĠĠĠĠĠ Ġchat _ user _ name . text Ġ= Ġintent . getString Extra (" receiver _ user _ name ") ĊĊĠĠĠ Ġ} Ċ } Ċ