package Ġcom . ns rom apa . f ren z app . say talk . activities Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Progress Dialog Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . provider . Media Store Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġcom . ns rom apa . f ren z app . say talk . models . Models Ċ import Ġcom . ns rom apa . f ren z app . say talk . utils . Firebase Utils Ċ import Ġcom . ns rom apa . f ren z app . say talk . utils . utils Ċ import Ġcom . firebase . ui . database . Firebase Recycler Adapter Ċ import Ġcom . firebase . ui . database . Firebase Recycler Options Ċ import Ġcom . google . android . gms . tasks . Continuation Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . google . firebase . database . Data Snapshot Ċ import Ġcom . google . firebase . database . Database Error Ċ import Ġcom . google . firebase . database . Value EventListener Ċ import Ġcom . google . firebase . storage . Firebase Storage Ċ import Ġcom . google . firebase . storage . Upload Task Ċ import Ġcom . ns rom apa . f ren z app . R Ċ import Ġkotlinx . android . synt hetic . main . activity _ forward .* Ċ import Ġkotlinx . android . synt hetic . main . item __ forward _ contact _ list . view .* Ċ import Ġkotlinx . android . synt hetic . main . item _ contact _ layout . view .* Ċ import Ġme . sh ao h ui . advanced l ub an . L ub an Ċ import Ġme . sh ao h ui . advanced l ub an . On Compress Listener Ċ import Ġorg . jetbrains . ank o . collections . forEach With Index Ċ import Ġorg . jetbrains . ank o . do AsyncResult Ċ import Ġorg . jetbrains . ank o . long Toast Ċ import Ġorg . jetbrains . ank o . onComplete Ċ import Ġorg . jetbrains . ank o . ui Thread Ċ import Ġjava . io . File Ċ import Ġjava . lang . Exception Ċ import Ġjava . util . concurrent . Future Ċ Ċ class ĠForward Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġval Ġselected UID s : Mutable List < String > Ġ= ĠArrayList () ĊĠĠĠ Ġval Ġselected Titles : Mutable List < String > Ġ= ĠArrayList () ĊĠĠĠ Ġval Ġselected Numbers : Mutable List < String > Ġ= ĠArrayList () ĊĊĠĠĠ Ġval Ġall F requ ent UID s : Mutable List < String > Ġ= ĠArrayList () ĊĊĠĠĠ Ġvar Ġis Image From Intent Ġ= Ġfalse ĊĠĠĠ Ġvar Ġis Video From Intent Ġ= Ġfalse ĊĠĠĠ Ġvar Ġis Text From Intent Ġ= Ġfalse ĊĊĠĠĠ Ġval Ġall F requ ent Con ver station : Mutable List < Models . Last Message Detail > Ġ= ĠArrayList () ĊĊĠĠĠ Ġ// number Ġlist Ġhas Ġ 1 0 Ġdigit Ġformatted Ġnumber ĊĠĠĠ Ġvar Ġnumber List : Mutable List < Models . Contact > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġvar Ġregistered Available User : Mutable List < Models . Contact > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġvar Ġname Of Recipient Ġ: String Ġ= Ġ"" ĊĊĠĠĠ Ġprivate Ġvar Ġall Contact Adapter : ĠRecyclerView . Adapter < ViewHolder >? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġcontext Ġ= Ġthis @ Forward Activity ĊĠĠĠ Ġprivate Ġvar Ġmy UID : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġvar Ġfwd _ sn ackbar : ĠSn ackbar ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġmessage Models : ĠMutable List < Models . Message Model >? Ġ= ĠArrayList () ĊĊĠĠĠ Ġvar Ġprogress Dialog : Progress Dialog ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġcurrent Message ID Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġasync Loader : ĠFuture < Unit >? Ġ= Ġnull ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ forward ) ĊĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĊĊĠĠĠĠĠĠĠ Ġif ( support ActionBar != null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĊĠĠĠĠĠĠĠ Ġif (! Firebase Utils . is LoggedIn ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( package Manager . get Launch Intent For Package ( packageName )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfwd _ sn ackbar Ġ= ĠSn ackbar . make ( send Btn , Ġ"", ĠSn ackbar . LENGTH _ IN DEFIN ITE ) ĊĊĠĠĠĠĠĠĠ Ġcaption _ layout . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠ Ġre cycler Layout . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġasync Loader Ġ= Ġdo AsyncResult Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Thread Ġ{ Ġset F requ ent Adapter () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete Ġ{ Ġui Thread Ġ{ Ġre cycler Layout . visibility Ġ= ĠView . VISIBLE Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmy UID Ġ= ĠFirebase Utils . get Uid () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Models Ġ= Ġintent . get Serializable Extra ( utils . constants . KEY _ MSG _ MODEL ) Ġas ĠMutable List < Models . Message Model > ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : Exception ){ Ġmessage Models Ġ= ĠArrayList ()} ĊĊĠĠĠĠĠĠĠ Ġif ( message Models . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Incoming Intent s ( intent ) ĊĊĊĠĠĠĠĠĠĠ Ġsend Btn ?. setOnClickListener Ġ{ ĊĊ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Image From Intent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// image Ġis Ġsent Ġvia Ġintent ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( bitmap != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage ID Ġ= Ġ" MSG ${ System . currentTimeMillis () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent File Ġ= Ġutils . save Bitmap To Sent ( context , Ġbitmap !! , Ġmessage ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ub an . compress ( context , ĠFile ( current File )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Gear ( L ub an . TH IRD _ GE AR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. launch ( object Ġ: ĠOn Compress Listener { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( file : ĠFile ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload And Forward ( message ID , Ġfile !! , ĠFile ( current File ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġutils . constants . FILE _ TYPE _ IMAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload And Forward ( message ID , ĠFile ( current File ), ĠFile ( current File ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġutils . constants . FILE _ TYPE _ IMAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Forward Activity ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" onError : Ġfailed Ġto Ġcompress Ġoriginal Ġimage , Ġuploading Ġoriginal Ġimage " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Dialog ?. setMessage (" Please Ġwait ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Dialog ?. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġutils . toast ( context , Ġ" Image Ġmight Ġbe Ġcorrupted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif ( is Video From Intent ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( current Video File != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage ID Ġ= Ġ" MSG ${ System . currentTimeMillis () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Dialog ?. setMessage (" Please Ġwait ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Dialog ?. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload And Forward ( message ID , Ġcurrent Video File !! , Ġcurrent Video File !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġutils . constants . FILE _ TYPE _ VIDEO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Forward To Selected UID s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġon Forward To Selected UID s () Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġselected UID s . forEach With Index Ġ{ Ġi , Ġit -> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmessage ID Ġ= Ġ" MSG ${ System . currentTimeMillis () }" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( current Message ID . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ID Ġ= Ġcurrent Message ID ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget UID Ġ= Ġit ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition In Main List Ġ= Ġall F requ ent UID s . indexOf ( it ) ĊĊĊĠĠĠĠĠĠĠ Ġfor Ġ( model Ġin Ġmessage Models !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . from Ġ= Ġmy UID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . time In Millis Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . reverse TimeStamp Ġ= Ġmodel . time In Millis Ġ* Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . to Ġ= Ġtarget UID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . caption Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( caption _ layout . visibility Ġ== ĠView . VISIBLE Ġ&& Ġcaption EditText . text . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . caption Ġ= Ġcaption EditText . text . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Model Ġ= Ġmodel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Or Number : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtype : ĠString ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( position In Main List Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Or Number Ġ= Ġall F requ ent Con ver station [ position In Main List ]. name Or Number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġall F requ ent Con ver station [ position In Main List ]. type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Or Number Ġ= Ġregistered Available User . filter Ġ{ Ġit . uid Ġ== Ġtarget UID Ġ} [ 0 ]. number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠFirebase Utils . KEY _ CONVER S ATION _ SINGLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( name Or Number . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Or Number Ġ= Ġif ( utils . is GroupID ( target UID ) Ġ|| Ġutils . is Channel ID ( target UID )) Ġselected Titles [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġselected Numbers [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// send Ġto Ġmy Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . ref . get Chat Ref ( my UID , Ġtarget UID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( message ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( current Model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . setMessage Status To DB ( message ID , Ġmy UID , Ġtarget UID , Ġtrue , Ġis Read Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Or Channel Name If Ġ= Ġname Or Number ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . ref . last Message ( my UID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( target UID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModels . Last Message Detail ( name Or Number Ġ= Ġ Ġname Or Number Ġ, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Model . file _ local _ path Ġ= Ġ"" ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( utils . is GroupID ( target UID )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// send Ġto Ġgroup Ġmembers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Forward Activity ", Ġ" on Forward To Selected UID s : Ġgroup Ġid Ġ= Ġ$ target UID ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Message To Group Members ( message ID , Ġcurrent Model , Ġtarget UID , Ġname Or Number ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ Ġif ( utils . is Channel ID ( target UID )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// send Ġto Ġchannel Ġmembers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Forward Activity ", Ġ" on Forward To Selected UID s : Ġchannel Ġid Ġ= Ġ$ target UID ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Message To Channel Members ( message ID , Ġcurrent Model , Ġtarget UID , Ġname Or Number ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// send Ġto Ġtarget Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . ref . get Chat Ref ( target UID , ĠFirebase Utils . get Uid ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( message ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( current Model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . setMessage Status To DB ( message ID , Ġtarget UID , Ġmy UID , Ġfalse , Ġis Read Ġ= Ġfalse , group Or Channel Name If Ġ= Ġ"") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . ref . last Message ( target UID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( my UID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( Models . Last Message Detail ( name Or Number Ġ= ĠFirebase Utils . get PhoneNumber (), Ġtype Ġ= Ġtype )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠ Ġif ( selected UID s . size Ġ== Ġ 1 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġstart Activities ( array Of ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , ĠHome Activity :: class . java ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Flags ( Intent . FLAG _ ACTIVITY _ CLEAR _ TOP ), Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , ĠMessage Activity :: class . java ). apply Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Firebase Utils . KEY _ UID , Ġselected UID s [ 0 ]) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( utils . constants . KEY _ NAME _ OR _ NUMBER Ġ, Ġall F requ ent Con ver station [ 0 ]. name Or Number ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠ Ġelse ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( context , ĠHome Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Flags ( Intent . FLAG _ ACTIVITY _ CLEAR _ TOP )) ĊĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġvar Ġbitmap : Bitmap ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġcurrent Video File : File ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Incoming Intent s ( intent : ĠIntent ){ ĊĊĠĠĠĠĠĠĠ Ġprogress Dialog Ġ= ĠProgress Dialog ( this ) ĊĠĠĠĠĠĠĠ Ġprogress Dialog ?. set Cancel able ( false ) ĊĊĠĠĠĠĠĠĠ Ġcaption _ layout . visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠ Ġif ( intent . action Ġ== ĠIntent . ACTION _ SEND ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . type Ġ== Ġ" text / plain " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġintent . getString Extra ( Intent . EXTRA _ TEXT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Models !!. add ( Models . Message Model ( text Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Text From Intent Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaption _ layout . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . type ?. startsWith ( Ġ" image /") ?: false Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! utils . has Storage Permission ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġutils . toast ( this , Ġ" App Ġdoes Ġnot Ġhave Ġstorage Ġpermission ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage URI Ġ= Ġintent . get Parcelable Extra < Parcelable >( Intent . EXTRA _ STREAM ) Ġas ĠUri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= ĠMedia Store . Images . Media . get Bitmap ( content Resolver , Ġimage URI ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Image From Intent Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaption _ layout . visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview . setImage Bitmap ( bitmap ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . type ?. startsWith (" video /") ?: false Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! utils . has Storage Permission ( this )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġutils . toast ( this , Ġ" App Ġdoes Ġnot Ġhave Ġstorage Ġpermission ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay _ icon . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Length . visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Uri Ġ= Ġintent . get Parcelable Extra < Parcelable >( Intent . EXTRA _ STREAM ) Ġas ĠUri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Forward Activity ", Ġ" handle Incoming Intent s : Ġinitial Ġvideo Ġpath Ġ= Ġ${ video Uri . path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo File Ġ= Ġ ĠFile ( utils . get Real Path From URI ( this , Ġvideo Uri )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Forward Activity ", Ġ" handle Incoming Intent s : Ġreal Ġvideo Ġpath Ġ= Ġ${ video File . path }") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! video File . exists ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġutils . toast ( context , Ġ" Something Ġwent Ġwrong Ġin Ġvideo Ġfile ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Length . text Ġ= Ġutils . get Video Length ( context , Ġvideo File . path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġutils . set Video Thumbnail From Web Async ( context , Ġvideo File . path , Ġpreview ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( video File . length () Ġ> Ġ( 1 6 Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġutils . toast ( context , Ġ" Please Ġchoose Ġa Ġfile Ġsmaller Ġthan Ġ 1 6 ĠMB ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Video File Ġ= Ġvideo File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Video From Intent Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : Exception ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlong Toast (" Failed Ġto Ġload Ġvideo ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaption _ layout . visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġupload And Forward ( ĊĠĠĠĠĠĠĠ Ġmessage ID : String , ĊĠĠĠĠĠĠĠ Ġfile : ĠFile , ĊĠĠĠĠĠĠĠ Ġoriginal File : ĠFile , ĊĠĠĠĠĠĠĠ ĠfileType : ĠString ĊĠĠĠ Ġ){ ĊĊĊĠĠĠĠĠĠĠ Ġcurrent Message ID Ġ= Ġmessage ID ĊĊ ĊĠĠĠĠĠĠ Ġval Ġref Ġ= ĠFirebase Storage . getInstance (). reference ĊĠĠĠĠĠĠĠĠĠĠ Ġ. child ( fileType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( message ID ) ĊĊĠĠĠĠĠĠĠĠĠĠ Ġval Ġupload Task Ġ= Ġref . put File ( utils . get Uri FromFile ( context , Ġfile )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Task ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Progress Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpercentage : Double Ġ= Ġ( 1 0 0 . 0 Ġ* Ġit . bytes Transfer red ) Ġ/ Ġit . total Byte Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpercent Ġ= ĠString . format ("% . 2 f ", percentage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Dialog !!. setMessage (" Up loading Ġmedia Ġ$ percent % ") Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. continue With Task ( Continuation < Upload Task . Task Snapshot , ĠTask < Uri >> Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . exception ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . store File MetaData ( message ID , Ġtask . result !!. metadata !! ) Ċ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Continuation Ġref . download Url ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġtask -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Dialog !!. dismiss () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġ( Models . Message Model ( task . result . toString (), Ġis File Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile _ local _ path Ġ= Ġoriginal File . path , Ġfile _ size _ in _ bytes Ġ= Ġfile . length (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Type Ġ= ĠfileType )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Models !!. add ( model ) ĊĊ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . store File MetaData ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModels . File ( message ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . time In Millis , ĠfileType Ġ= ĠfileType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfileSize InBytes Ġ= Ġfile . length (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbucket _ path Ġ= Ġref . bucket , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile _ url Ġ= Ġtask . result . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile _ extension Ġ= Ġutils . getFile Extension ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Forward To Selected UID s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġadapter : ĠFirebase Recycler Adapter < Models . Last Message Detail , ĠViewHolder >? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġset F requ ent Adapter (){ ĊĊĠĠĠĠĠĠĠ Ġval Ġlast Msg Query Ġ= ĠFirebase Utils . ref . last Message ( Firebase Utils . get Uid ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy Child ( Firebase Utils . KEY _ RE VERSE _ TIMESTAMP ) ĊĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠFirebase Recycler Options . Builder < Models . Last Message Detail >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Query ( last Msg Query , ĠModels . Last Message Detail :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġadapter Ġ= Ġobject Ġ: ĠFirebase Recycler Adapter < Models . Last Message Detail , ĠViewHolder >( options ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( p 0 : ĠViewGroup , Ġp 1 : ĠInt ): ĠViewHolder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Inflater . inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . item __ forward _ contact _ list , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt , Ġmodel : ĠModels . Last Message Detail ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuid Ġ= Ġsuper . get Ref ( position ). key . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġmodel . type ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind Holder ( holder , Ġuid , model . name Or Number , Ġtype ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfrequent RecyclerView . adapter Ġ= Ġadapter ĊĊĠĠĠĠĠĠĠ Ġadapter ?. start Listening () ĊĊĠĠĠĠĠĠĠ Ġlast Msg Query . addListener For Single Value Event ( object Ġ: ĠValue EventListener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( p 0 . exists ()){ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġp 0 . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! all F requ ent UID s . contains ( item . key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall F requ ent UID s . add ( item . key !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall F requ ent Con ver station . add ( item . getValue ( Models . Last Message Detail :: class . java ) !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Registered Users () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġprivate Ġfun Ġset All Contact Adapter (){ ĊĊĠĠĠĠĠĠĠ ĠLog . d (" Forward Activity ", Ġ" set All Contact Adapter : Ġ$ registered Available User ") ĊĊĠĠĠĠĠĠĠ Ġall Contact Adapter Ġ= Ġobject Ġ: ĠRecyclerView . Adapter < ViewHolder > (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( p 0 : ĠViewGroup , Ġp 1 : ĠInt ): ĠViewHolder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Inflater . inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . item __ forward _ contact _ list , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ= Ġregistered Available User . size ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġp 1 : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuid Ġ= Ġregistered Available User [ p 1 ]. uid ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind Holder ( holder , Ġuid , Ġregistered Available User [ p 1 ]. number Ġ, ĠFirebase Utils . KEY _ CONVER S ATION _ SINGLE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġall Contact RecyclerView . adapter Ġ= Ġall Contact Adapter ĊĊĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Suppress Lint (" Restricted Api ") ĊĠĠĠ Ġprivate Ġfun Ġbind Holder ( holder : ĠViewHolder , Ġuid : String , Ġphone : String , Ġtype : String ){ ĊĊĠĠĠĠĠĠĠ Ġval Ġis Group Ġ= Ġtype Ġ== ĠFirebase Utils . KEY _ CONVER S ATION _ GROUP ĊĠĠĠĠĠĠĠ Ġval Ġis Channel Ġ= Ġtype Ġ== ĠFirebase Utils . KEY _ CONVER S ATION _ CHANNEL ĊĊĠĠĠĠĠĠĠ Ġif ( forward _ progressbar . visibility Ġ== ĠView . VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforward _ progressbar . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠ Ġholder . title . text Ġ= Ġphone ĊĊĊĊĠĠĠĠĠĠĠ Ġif ( is Group ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . load Group Pic Thumbnail ( context , Ġuid , Ġholder . pic ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( phone . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . set GroupName ( uid , Ġholder . title ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif ( is Channel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . load Channel Pic Thumbnail ( context , Ġuid , Ġholder . pic ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( phone . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . set Channel Name ( uid , Ġholder . title ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . load Profile Thumbnail ( context , Ġuid , Ġholder . pic ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( phone . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . title . text Ġ= Ġutils . getName From Number ( context , Ġphone ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . setUser Detail From UID ( context , Ġholder . title , Ġuid , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġholder . title . setTextColor ( Color . BLACK ) ĊĊĠĠĠĠĠĠĠ Ġif ( is Group ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġif Ġnot Ġin Ġgroup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck If In Group ( uid , Ġholder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif ( is Channel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġif Ġnot Ġin Ġchannel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck If In Channel ( uid , Ġholder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġif Ġuser Ġis Ġblocked ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck If Blocked ( uid , Ġholder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĊĠĠĠĠĠĠĠ Ġholder . item View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . checkBox . isChecked Ġ= Ġ! holder . checkBox . isChecked ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( holder . checkBox . isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected UID s . add ( uid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Titles . add ( holder . title . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Numbers . add ( phone ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected UID s . remove ( uid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Titles . remove ( holder . title . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Numbers . remove ( phone ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Of Recipient Ġ Ġ= Ġselected Titles . join ToString (", Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġfwd _ sn ackbar ?. setText ("> Ġ Ġ${ name Of Recipient . trim () }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Btn . visibility Ġ= Ġif ( selected UID s . isEmpty ()) ĠView . GONE Ġelse ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( selected UID s . isEmpty ()) Ġ{ fwd _ sn ackbar !!. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Of Recipient Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ Ġif (! fwd _ sn ackbar !!. is Shown ) Ġfwd _ sn ackbar !!. show () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Registered Users (){ ĊĊĠĠĠĠĠĠĠ Ġnumber List Ġ= Ġutils . get Contact List ( this ) ĊĊĠĠĠĠĠĠĠ ĠFirebase Utils . ref . all User () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Value EventListener ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! p 0 . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġutils . toast ( context , Ġ" No Ġregistered Ġusers ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistered Available User . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( post Ġin Ġp 0 . children ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Model Ġ= Ġpost . getValue ( Models . User Ġ:: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= Ġutils . get Formatted Ten Digit Number ( user Model !!. phone ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuid Ġ= Ġuser Model . uid ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( uid Ġ== ĠFirebase Utils . get Uid ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor (( index , Ġitem ) Ġin Ġnumber List . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . number Ġ== Ġnumber Ġ|| Ġitem . number . contains ( number )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumber List [ index ]. uid Ġ= Ġuid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! all F requ ent UID s . any Ġ{ Ġit Ġ== Ġuid Ġ} Ġ&& Ġ! registered Available User . any { Ġit Ġ== Ġnumber List [ index ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! registered Available User . any Ġ{ Ġit . number Ġ== Ġnumber Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistered Available User . add ( number List [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset All Contact Adapter () ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// for Ġgroup Ġmembers ĊĠĠĠ Ġprivate Ġfun Ġadd Message To Group Members ( message ID : ĠString , Ġmessage Model : ĠModels . Message Model , ĠgroupId : String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠgroupName : String ) Ġ{ ĊĊĠĠĠĠĠĠĠ ĠFirebase Utils . ref . group Members ( groupId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy Child (" removed "). equalTo ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addListener For Single Value Event ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Members : Mutable List < Models . Group Member > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( post Ġin Ġp 0 . children ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Members . add ( post . getValue ( Models . Group Member :: class . java ) !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Members . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember ID Ġ= Ġit . uid ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// setting Ġ Ġmessage Ġto Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( member ID Ġ!= Ġmy UID ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Message Activity ", Ġ" addMessage To Group Members : Ġtargets Ġ-> Ġ$ member ID ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . ref . get Chat Ref ( member ID , ĠgroupId ) Ġ Ġ// Ġmust Ġbe Ġ( participant , Ġgroup ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( message ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( message Model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . setMessage Status To DB ( message ID , Ġmember ID , ĠgroupId , Ġfalse , Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgroupName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . ref . last Message ( member ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( groupId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModels . Last Message Detail ( type Ġ= ĠFirebase Utils . KEY _ CONVER S ATION _ GROUP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġname Or Number Ġ= ĠgroupName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĊĊ ĊĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ// for Ġchannel Ġmembers ĊĠĠĠ Ġprivate Ġfun Ġadd Message To Channel Members ( message ID : ĠString , Ġmessage Model : ĠModels . Message Model , Ġchannel Id : String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġchannel Name : String ) Ġ{ ĊĊĠĠĠĠĠĠĠ ĠFirebase Utils . ref . channel Members ( channelId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy Child (" removed "). equalTo ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addListener For Single Value Event ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Members : Mutable List < Models . Channel Member > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( post Ġin Ġp 0 . children ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Members . add ( post . getValue ( Models . Channel Member :: class . java ) !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Members . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember ID Ġ= Ġit . uid ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// setting Ġ Ġmessage Ġto Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( member ID Ġ!= Ġmy UID ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Message Activity ", Ġ" addMessage To Channel Members : Ġtargets Ġ-> Ġ$ member ID ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . ref . get Chat Ref ( member ID , Ġchannel Id ) Ġ Ġ// Ġmust Ġbe Ġ( participant , Ġchannel ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( message ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( message Model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . setMessage Status To DB ( message ID , Ġmember ID , Ġchannel Id , Ġfalse , Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . ref . last Message ( member ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( channelId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModels . Last Message Detail ( type Ġ= ĠFirebase Utils . KEY _ CONVER S ATION _ CHANNEL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġname Or Number Ġ= Ġchannel Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĊĊ ĊĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġclass ĠViewHolder ( view : View ): ĠRecyclerView . ViewHolder ( view ){ ĊĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġview . name !! ĊĠĠĠĠĠĠĠĠ Ġval Ġpic Ġ= Ġview . pic !! ĊĠĠĠĠĠĠĠĠ Ġval ĠcheckBox Ġ= Ġview . checkbox !! ĊĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġasync Loader ?. cancel ( true ) ĊĠĠĠĠĠĠĠ Ġadapter ?. stop Listening () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcheck If Blocked ( uid : ĠString , Ġholder : ĠViewHolder ){ ĊĠĠĠĠĠĠĠ ĠFirebase Utils . ref . blocked User ( my UID , Ġuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addListener For Single Value Event ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p 0 . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . isEnabled Ġ= Ġ! p 0 . value . toString (). to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . is Clickable Ġ= Ġholder . item View . isEnabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . title . setTextColor ( if Ġ( holder . item View . isEnabled ) ĠColor . BLACK Ġelse ĠColor . LT GRAY ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠFirebase Utils . ref . blocked User ( uid , Ġmy UID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addListener For Single Value Event ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p 0 . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . isEnabled Ġ= Ġ! p 0 . value . toString (). to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . is Clickable Ġ= Ġholder . item View . isEnabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . title . setTextColor ( if Ġ( holder . item View . isEnabled ) ĠColor . BLACK Ġelse ĠColor . LT GRAY ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcheck If In Group ( selected GroupID : String , Ġholder : ĠViewHolder ){ ĊĊĠĠĠĠĠĠĠ Ġholder . item View . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġholder . item View . is Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġholder . title . setTextColor ( if ( holder . item View . isEnabled ) ĠColor . BLACK Ġelse ĠColor . LT GRAY ) ĊĊĊĊĠĠĠĠĠĠĠ ĠFirebase Utils . ref . group Members ( selected GroupID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy Child (" removed "). equalTo ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addListener For Single Value Event ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// only Ġavailable Ġmembers Ġwill Ġbe Ġreturned ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Me Removed Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Me Removed Ġ= Ġif (! p 0 . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! p 0 . children . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getValue ( Models . Group Member :: class . java )?. uid Ġ== Ġmy UID Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Forward Activity ", Ġ" bind Holder : Ġgroup Ġname Ġ= Ġ${ holder . title . text }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Forward Activity ", Ġ" bind Holder : Ġgroup Ġid Ġ= Ġ$ selected GroupID ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Forward Activity ", Ġ" on Data Change : Ġremoved Ġ= Ġ$ is Me Removed ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . isEnabled Ġ= Ġ! is Me Removed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . is Clickable Ġ= Ġholder . item View . isEnabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . title . setTextColor ( if ( holder . item View . isEnabled ) ĠColor . BLACK Ġelse ĠColor . LT GRAY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : Exception ){} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck If In Channel ( selected Channel ID : String , Ġholder : ĠViewHolder ){ ĊĊĠĠĠĠĠĠĠ Ġholder . item View . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġholder . item View . is Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġholder . title . setTextColor ( if ( holder . item View . isEnabled ) ĠColor . BLACK Ġelse ĠColor . LT GRAY ) ĊĊĊĊĠĠĠĠĠĠĠ ĠFirebase Utils . ref . channel Members ( selected Channel ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy Child (" removed "). equalTo ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addListener For Single Value Event ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// only Ġavailable Ġmembers Ġwill Ġbe Ġreturned ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Me Removed : ĠBoolean ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Me Removed Ġ= Ġif (! p 0 . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! p 0 . children . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getValue ( Models . Channel Member :: class . java )?. uid Ġ== Ġmy UID Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Forward Activity ", Ġ" bind Holder : Ġchannel Ġname Ġ= Ġ${ holder . title . text }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Forward Activity ", Ġ" bind Holder : Ġchannel Ġid Ġ= Ġ$ selected Channel ID ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Forward Activity ", Ġ" on Data Change : Ġremoved Ġ= Ġ$ is Me Removed ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Utils . ref . channel Member ( selected Channel ID , my UID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Value EventListener ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Me Removed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . isEnabled Ġ= Ġ! is Me Removed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . is Clickable Ġ= Ġholder . item View . isEnabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . title . setTextColor ( if ( holder . item View . isEnabled ) ĠColor . BLACK Ġelse ĠColor . LT GRAY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( p 0 . exists ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember Ġ= Ġp 0 . getValue ( Models . Channel Member :: class . java ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! member . admin ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Me Removed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Me Removed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . isEnabled Ġ= Ġ! is Me Removed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . is Clickable Ġ= Ġholder . item View . isEnabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . title . setTextColor ( if ( holder . item View . isEnabled ) ĠColor . BLACK Ġelse ĠColor . LT GRAY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : Exception ){} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ Ċ } Ċ