package Ġcom . deep ak . chat app . view . ui Ċ Ċ import Ġandroid . content . Clip Data Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . deep ak . chat app . R Ċ import Ġcom . deep ak . chat app . service . model . ChatMessage Ċ import Ġcom . deep ak . chat app . service . model . User Ċ import Ġcom . deep ak . chat app . util .* Ċ import Ġcom . firebase . ui . common . Change EventType Ċ import Ġcom . firebase . ui . firestore . Fire store Recycler Adapter Ċ import Ġcom . firebase . ui . firestore . Fire store Recycler Options Ċ import Ġcom . google . firebase . Timestamp Ċ import Ġcom . google . firebase . firestore .* Ċ import Ġkotlinx . android . synt hetic . main . activity _ chat .* Ċ import Ġkotlinx . android . synt hetic . main . item _ message _ sent .* Ċ import Ġkotlinx . android . synt hetic . main . toolbar _ chat .* Ċ import Ġorg . jetbrains . ank o . clipboard Manager Ċ import Ġorg . jetbrains . ank o . find Ċ import Ġorg . jetbrains . ank o . sdk 2 7 . coroutines . onClick Ċ import Ġorg . jetbrains . ank o . sdk 2 7 . coroutines . on Long Click Ċ import Ġorg . jetbrains . ank o . selector Ċ import Ġorg . jetbrains . ank o . toast Ċ Ċ /** Ċ Ġ* ĠThe ĠChat Activity Ġfrom Ġwhich Ġthe Ġuser Ġwill Ġchat Ġto Ġthe Ġanother Ġuser Ċ Ġ* Ġusing Ġthe Ġfire store Ġadapter Ċ Ġ*/ Ċ class ĠChat Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġfire store : ĠFirebase Fire store ĊĠĠĠĠĠĠĠĠĠĠĠ Ġby Ġlazy Ġ{ ĠFirebase Fire store . getInstance () Ġ} ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġref Sender Ch ats : ĠCollection Reference ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġref Receiver Ch ats : ĠCollection Reference ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsender Uid : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġreceiver Uid : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġto UserName : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġto User Email : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠFire store Recycler Adapter < ChatMessage , ĠChat ViewHolder > ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ chat ) ĊĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠĠĠĠĠ Ġinit Toolbar () ĊĠĠĠĠĠĠĠ Ġload Profile Image () ĊĊĠĠĠĠĠĠĠ Ġval Ġchat Options Ġ= ĠlistOf (" Copy ", Ġ" Delete ĠFor ĠMe ") ĊĊĠĠĠĠĠĠĠ Ġ// get Ġall Ġthe Ġchat Ġmessages Ġfrom Ġthe Ġsub collection Ġmy Ch ats Ġmapped Ġto Ġthe Ġreceiver Uid Ġuser ĊĠĠĠĠĠĠĠ Ġref Sender Ch ats Ġ= Ġfire store . collection (" chat "). document ( sender Uid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collection (" my Ch ats "). document ( receiver Uid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collection (" all Ch ats ") ĊĊĠĠĠĠĠĠĠ Ġref Receiver Ch ats Ġ= Ġfire store . collection (" chat "). document ( receiver Uid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collection (" my Ch ats "). document ( sender Uid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collection (" all Ch ats ") ĊĊĠĠĠĠĠĠĠ Ġset Messages To Read () ĊĊĠĠĠĠĠĠĠ Ġval Ġchat Query Ġ= Ġref Sender Ch ats . orderBy ( SENT _ AT , ĠQuery . Direction . ASC ENDING ) ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠFire store Recycler Options . Builder < ChatMessage >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Query ( chat Query , ĠChat Message :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġadapter Ġ= Ġobject Ġ: ĠFire store Recycler Adapter < ChatMessage , ĠChat ViewHolder >( options ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠChat ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( view Type Ġ== ĠR . layout . item _ message _ sent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ). inflate ( R . layout . item _ message _ sent , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat ViewHolder ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ). inflate ( R . layout . item _ message _ received , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat ViewHolder ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender Uid Ġ!= ĠgetItem ( position ). sender Id Ġ-> ĠR . layout . item _ message _ received ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠR . layout . item _ message _ sent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠChat ViewHolder , Ġposition : ĠInt , Ġmodel : ĠChat Message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item ChatMessage . text Ġ= Ġmodel . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item Chat Timestamp . text Ġ= Ġmodel . sent At ?. timestamp ToString () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item ChatMessage . on Long Click Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselector (" Message ĠOptions ", Ġchat Options ) Ġ{ Ġ_, Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( i ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġcopy Text (" Chat ĠMessage ", Ġmodel . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġdelete Message ( model . doc Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Changed ( type : ĠChange EventType , Ġsnapshot : ĠDocument Snapshot , Ġnew Index : ĠInt , Ġold Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Child Changed ( type , Ġsnapshot , Ġnew Index , Ġold Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( snapshot . get (" message "). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cycler _ view _ chat . layout Manager ?. scrollTo Position ( item Count Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġre cycler _ view _ chat . init ( application Context ) ĊĠĠĠĠĠĠĠ Ġre cycler _ view _ chat . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĊĠĠĠĠĠĠĠ Ġfab _ send . onClick Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġmessage _ edit _ text . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . isNotBlank () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage _ edit _ text . setText ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( this @ Chat Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load Image ( R . drawable . ic _ not _ sent , Ġis _ message _ sent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtoast (" Message Ġis ĠBl ank ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsetting Ġ= ĠFirebase Fire store Settings . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Persistence Enabled ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġfire store . firestore Settings Ġ= Ġsetting ĊĊĠĠĠĠĠĠĠ Ġsender Uid Ġ= Ġintent ?. getString Extra ( USER _ ID ). toString () ĊĠĠĠĠĠĠĠ Ġreceiver Uid Ġ= Ġintent ?. getString Extra ( TO _ USER _ ID ). toString () ĊĠĠĠĠĠĠĠ Ġto UserName Ġ= Ġintent ?. getString Extra ( TO _ USER _ NAME ). toString () ĊĠĠĠĠĠĠĠ Ġto User Email Ġ= Ġintent ?. getString Extra ( TO _ USER _ EMAIL ). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Toolbar () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar _ chat ) ĊĠĠĠĠĠĠĠ Ġtoolbar _ title . text Ġ= Ġto UserName ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. title Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Show Title Enabled ( false ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Home As Up Indicator ( R . drawable . ic _ back ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoad Ġthe Ġprofile Ġimage Ġinto Ġthe ĠImageView Ġin Ġthe ĠToolbar ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġload Profile Image () Ġ{ ĊĠĠĠĠĠĠĠ Ġfire store . collection (" users ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. document ( receiver Uid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Source . CACHE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserInfo Ġ= Ġit . result ?. toObject ( User :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser _ last _ seen . text Ġ= ĠuserInfo ?. is Online ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( this @ Chat Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load Image ( userInfo ?. imageUrl !! , Ġuser _ display _ image _ chat , ĠR . drawable . ic _ person ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġsend Ġmessage Ġto Ġthe Ġreceiver . ĊĠĠĠĠ Ġ* ĠThe Ġmessage Ġmap Ġwill Ġbe Ġsent Ġto Ġthe Ġboth Ġsender Ġand Ġreceiver 's Ġchat Ġsub Collection ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠsendMessage ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġref Sender Ch ats . document (). id ĊĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= ĠTimestamp . now () ĊĠĠĠĠĠĠĠ Ġval Ġchat Map Sender Ġ= Ġmutable Map Of < String , ĠAny >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMESSAGE Ġto Ġmessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ENDER _ ID Ġto Ġsender Uid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRE CE IVER _ ID Ġto Ġreceiver Uid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIS _ READ Ġto Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDOC _ ID Ġto Ġdoc Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ENT _ AT Ġto Ġtimestamp ) ĊĊĠĠĠĠĠĠĠ Ġ// send Ġmessage Ġto Ġsender Ġand Ġadd Ġit Ġto Ġthe Ġmy Ch ats Ġsub collection ĊĠĠĠĠĠĠĠ Ġref Sender Ch ats . document ( doc Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( chat Map Sender ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . is Successful Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( this @ Chat Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load Image ( R . drawable . ic _ sent , Ġis _ message _ sent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" message Ġsent Ġto Ġuser ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtoast ( task . exception ?. message . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// send Ġmessage Ġto Ġreceiver Ġand Ġadd Ġit Ġto Ġthe Ġmy Ch ats Ġsub collection ĊĠĠĠĠĠĠĠ Ġref Receiver Ch ats . document ( doc Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( chat Map Sender ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . is Successful Ġ-> Ġlog (" message Ġsent Ġto Ġreceiver ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtoast ( task . exception ?. message . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset Last Message Sent At ( timestamp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLAST _ MESSAGE _ SENT _ AT Ġfield Ġin Ġthe Ġsub Collection Ġmy Contacts Ġwill Ġbe Ġused Ġto Ġdet . Ġthe ĊĠĠĠĠ Ġ* Ġrecent Ġchat Ġand Ġso Ġthe Ġcontact Ġlist Ġcan Ġbe Ġorder Ġby Ġthis Ġfield ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Last Message Sent At ( timestamp : ĠTimestamp ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġref Contacts Ġ= Ġfire store . collection (" contacts ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. document ( sender Uid ). collection (" my Contacts ") ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < String , ĠAny >( LAST _ MESSAGE _ SENT _ AT Ġto Ġtimestamp ) ĊĊĠĠĠĠĠĠĠ Ġref Contacts . document ( receiver Uid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( map , ĠSet Options . merge ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Successful Ġ-> Ġlog (" set Ġlast Message Sent At ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlog ( it . exception ?. message !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDelete Ġthe Ġmessage Ġonly Ġfor Ġthe Ġcurrent Ġlogged Ġin Ġ Ġuser ĊĠĠĠĠ Ġ* ĠThe Ġmessage Ġwill Ġbe Ġdeleted Ġusing Ġthe ĠDOC _ ID Ġfield ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdelete Message ( doc Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġref Sender Ch ats . document ( doc Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . is Successful Ġ-> Ġtoast (" Message Ġdeleted ĠSuccessfully ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtoast ( task . exception ?. message !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAs Ġthe Ġuser Ġopens Ġup Ġthe ĠChat Activity ĠSet Ġmessages Ġto Ġread Ġso Ġthat Ġin Ġthe ĊĠĠĠĠ Ġ* Ġcontacts Activity Ġwe Ġcan Ġcount Ġthe Ġno . Ġof Ġunread Ġmessages Ġand Ġcan Ġshow Ġit ĊĠĠĠĠ Ġ* Ġand Ġalso Ġsend Ġthe Ġpush Ġnotification ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// TODO Ġlook Ġat Ġthis Ġyou Ġhave Ġto Ġupdate Ġagain Ġat Ġboth Ġsender Ġand Ġreceiver Ġside Ġfor ĠIS _ READ ĊĠĠĠ Ġprivate Ġfun Ġset Messages To Read () Ġ{ ĊĠĠĠĠĠĠĠ Ġref Receiver Ch ats . document () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Source . CACHE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Successful Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat Ġ= Ġit . result ?. toObject ( ChatMessage :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chat ?. is Read !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( this @ Chat Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load Image ( R . drawable . ic _ read , Ġis _ message _ sent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" All Ġmessages Ġread ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlog ( it . exception ?. message !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy Text ( label : ĠString , Ġtext : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclipboard Manager . primary Clip Ġ= ĠClip Data . new Plain Text ( label , Ġtext ) ĊĠĠĠĠĠĠĠ Ġtoast (" Text ĠCop ied ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġadapter . start Listening () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġadapter . stop Listening () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinner Ġclass ĠChat ViewHolder ( view : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( view ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġitem ChatMessage Ġ= Ġview . find < TextView >( R . id . item _ chat _ message ) ĊĠĠĠĠĠĠĠ Ġvar Ġitem Chat Timestamp Ġ= Ġview . find < TextView >( R . id . item _ chat _ message _ timestamp ) ĊĠĠĠ Ġ} Ċ } Ċ