package Ġcom . in no . in no chat . ui Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 4 . app . Fragment Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . support . v 7 . widget . Linear LayoutManager Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . util . Log Ċ import Ġandroid . view .* Ċ import Ġandroid . view . input method . Editor Info Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ Ċ import Ġcom . in no . in no chat . R Ċ import Ġcom . in no . in no chat . adapter . Messaging Adapter Ċ import Ġcom . in no . in no chat . model . Message Ċ import Ġcom . in no . in no chat . model . Messaging Model Ċ import Ġcom . in no . in no chat . model . User Ċ import Ġcom . in no . in no chat . model . Users Model Ċ import Ġcom . in no . in no chat . x mpp . In no Chat Connection Ċ import Ġcom . in no . in no chat . x mpp . In no Chat Connection Service Ċ import Ġio . realm . Realm ChangeListener Ċ import Ġio . realm . Realm Results Ċ import Ġkotlinx . android . synt hetic . main . fragment _ chat .* Ċ Ċ /** Ċ Ġ* ĠThis Ġfragment Ġis Ġused Ġto Ġdisplay Ġchat Ġconversation Ġscreen Ġwhere Ġusers Ġcan Ġcommunicate Ġeach Ġother . Ċ Ġ* Ċ Ġ* Ġ@ author ĠSan deep ĠN ound la Ċ Ġ* Ġ*/ Ċ class ĠChat Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" Chat Fragment " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ RECE IVER Ġ= Ġ" EXTRA _ RECE IVER " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġm Navigation Listener Ġ: ĠNavigation Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Receiver User Ġ: ĠUser ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter Ġ: ĠMessaging Adapter ĊĠĠĠ Ġprivate Ġvar Ġm Realm Messages : ĠRealm Results < Message >? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġm RecyclerView : ĠRecyclerView Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlinear LayoutManager Ġ= ĠLinearLayoutManager ( context !! , ĠLinearLayoutManager . VERTICAL , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġlinear LayoutManager . reverse Layout Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġre y cl er view _ message _ list ?. layout Manager Ġ= Ġlinear LayoutManager ĊĠĠĠĠĠĠĠ Ġre y cl er view _ message _ list . set Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠ Ġre y cl er view _ message _ list ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġlayout Ġfor Ġthis Ġfragment ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ chat , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĠĠĠĠĠĠĠ Ġload Arguments () ĊĠĠĠĠĠĠĠ Ġif Ġ( m Receiver User != null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Title ( m Receiver User !!. name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= ĠMessaging Adapter ( context !! , Ġm Receiver User !!. avatar ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton _ chat box _ send . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess SendMessage () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit text _ chat box . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( text : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// enable Ġthe Ġsend Ġbutton Ġif Ġthe Ġtext Ġis Ġnot Ġempty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton _ chat box _ send . isEnabled Ġ= Ġ!( text . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( p 0 : ĠCharSequence ?, Ġp 1 : ĠInt , Ġp 2 : ĠInt , Ġp 3 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( p 0 : ĠCharSequence ?, Ġp 1 : ĠInt , Ġp 2 : ĠInt , Ġp 3 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm RecyclerView . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Messages () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context !! , Ġ" Internal Ġproblem Ġoccured , Ġplease Ġtry Ġagain .", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attach ( context : ĠContext ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attach ( context ) ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġis ĠNavigation Listener ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Navigation Listener Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detach () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detach () ĊĠĠĠĠĠĠĠ Ġm Navigation Listener Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġm Realm Messages ?. removeAll Change Listeners () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoads Ġthe Ġinitial Ġconversation Ġmessages Ġfrom Ġlocal Ġdatabase Ġand Ġdisplays Ġon ĠUI ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġload Messages () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Realm Messages Ġ= ĠMessaging Model . get Messages ( m Receiver User !!. id , ĠUsers Model . getInstance (). currentUser !!. id ) ĊĠĠĠĠĠĠĠ Ġadapter . items Ġ= Ġm Realm Messages ĊĠĠĠĠĠĠĠ Ġm RecyclerView . scrollTo Position ( 0 ) ĊĠĠĠĠĠĠĠ Ġ// ĠListen Ġfor Ġnew Ġmessages ĊĠĠĠĠĠĠĠ Ġm Realm Messages !!. add ChangeListener ( object Ġ: ĠRealm ChangeListener < Realm Results < Message >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChange ( users : ĠRealm Results < Message > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġthe Ġmessages Ġin Ġconversation Ġwindow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . items Ġ= Ġm Realm Messages ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm RecyclerView . scrollTo Position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoads Ġarguments Ġpassed Ġto Ġthis Ġfragment ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġload Arguments () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( arguments Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arguments !!. containsKey ( EXTRA _ RECE IVER )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Receiver User Ġ= Ġarguments !!. get Parcelable ( EXTRA _ RECE IVER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġthe Ġscreen Ġtitle Ġwith Ġuser Ġname ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Title ( to : String ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġactivity Ġas ĠAppCompatActivity ĊĠĠĠĠĠĠĠ Ġactivity . support ActionBar . let Ġ{ Ġaction Bar Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Bar !!. title Ġ= Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Bar . set Display Home As Up Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProcess Ġthe Ġsend Ġmessage Ġaction . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġprocess SendMessage () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġedit text _ chat box . text ĊĠĠĠĠĠĠĠ Ġif Ġ( text . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( In no Chat Connection Service . getState (). equals ( In no Chat Connection . Connection State . CONNECTED )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" The Ġclient Ġis Ġconnected Ġto Ġthe Ġserver , Sending ĠMessage ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Send Ġthe Ġmessage Ġto Ġthe Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġedit text _ chat box . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( In no Chat Connection Service . SEND _ MESSAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( In no Chat Connection Service . B UNDLE _ MESSAGE _ BODY , Ġbody ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( In no Chat Connection Service . B UNDLE _ TO , Ġm Receiver User !!. id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. send Broadcast ( intent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMessaging Model . addMessage ( body , ĠUsers Model . getInstance (). currentUser !!. id , Ġm Receiver User !!. id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit text _ chat box . text Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Client Ġnot Ġconnected Ġto Ġserver Ġ, Message Ġnot Ġsent !", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( item ?. itemId ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . id . home Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Navigation Listener ?. show UserList Screen () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} Ċ } Ċ