package Ġv ip . y azil im . p 2 g . android . ui . room . room chat Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . view . View Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . bump tech . glide . request . RequestOptions Ċ import Ġcom . st f alcon . chat kit . commons . Image Loader Ċ import Ġcom . st f alcon . chat kit . messages . Message Hold ers Ċ import Ġcom . st f alcon . chat kit . messages . Messages ListAdapter Ċ import Ġkotlinx . android . synt hetic . main . fragment _ room _ chat .* Ċ import Ġkotlinx . android . synt hetic . main . item _ incoming _ message . view .* Ċ import Ġv ip . y azil im . p 2 g . android . R Ċ import Ġv ip . y azil im . p 2 g . android . activity . Room Activity Ċ import Ġv ip . y azil im . p 2 g . android . constant . WebSocket Actions . ACTION _ MESSAGE _ SEND Ċ import Ġv ip . y azil im . p 2 g . android . model . p 2 g . ChatMessage Ċ import Ġv ip . y azil im . p 2 g . android . ui . Fragment Base Ċ import Ġv ip . y azil im . p 2 g . android . ui . room . Room ViewModel Ċ import Ġv ip . y azil im . p 2 g . android . util . glide . G lide App Ċ import Ġv ip . y azil im . p 2 g . android . util . helper . Time Helper ĊĊ Ċ /** Ċ Ġ* Ġ@ author Ġmust af aar if sis man Ġ- Ġ 1 0 . 0 3 . 2 0 2 0 Ċ Ġ* Ġ@ contact Ġmust af aar if sis man @ gmail . com Ċ Ġ*/ Ċ class ĠRoom Chat Fragment Ġ: ĊĠĠĠ ĠFragment Base ( R . layout . fragment _ room _ chat ) Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmessages Adapter : ĠMessages ListAdapter < ChatMessage > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsender Id : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġroom ViewModel : ĠRoom ViewModel ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġroom ViewModel Ġ= ĠViewModel Provider ( activity Ġas ĠRoom Activity ). get ( Room ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġsender Id Ġ= Ġroom ViewModel . room User Model . value ?. room User ?. userId . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsetup UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimage Loader Ġ= ĠImage Loader Ġ{ ĠimageView , Ġurl , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG lide App . with ( imageView ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply ( RequestOptions . circle Crop Transform ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( imageView ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġhold ers Config Ġ= ĠMessage Hold ers () ĊĠĠĠĠĠĠĠ Ġhold ers Config . set Incoming Text Layout ( R . layout . item _ incoming _ message ) ĊĠĠĠĠĠĠĠ Ġhold ers Config . set Incoming Text Holder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCustom Incoming Message ViewHolder :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . item _ incoming _ message ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġmessages Adapter Ġ= ĠMessages ListAdapter < ChatMessage >( sender Id , Ġhold ers Config , Ġimage Loader ) ĊĠĠĠĠĠĠĠ Ġmessages _ list . setAdapter ( messages Adapter ) ĊĊĠĠĠĠĠĠĠ Ġinput . setInput Listener Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setInput Listener Ġmessage Input Handler ( input ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsetup ViewModel () Ġ{ ĊĠĠĠĠĠĠĠ Ġroom ViewModel . new Message . observe ( this , Ġrender New Message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġload Messages () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmessage Input Handler ( input : ĠCharSequence ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchat Message Ġ= ĠChat Message ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroom ViewModel . room User Model . value ?. room User , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTime Helper . getLocal DateTime Z oned UTC () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠsendMessage To WebSocket ( chat Message ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Messages () Ġ{ ĊĠĠĠĠĠĠĠ ĠHandler (). post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessages : ĠMutable List < ChatMessage >? Ġ= Ġroom ViewModel . messages ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessages ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages Adapter . upsert ( it , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 5 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsendMessage To WebSocket ( chat Message : ĠChat Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠACTION _ MESSAGE _ SEND ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( ACTION _ MESSAGE _ SEND , Ġchat Message ) ĊĠĠĠĠĠĠĠ Ġactivity ?. send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġrender New Message Ġ= ĠObserver < ChatMessage > Ġ{ Ġchat Message Ġ-> ĊĠĠĠĠĠĠĠ Ġroom ViewModel . messages . add ( chat Message ) ĊĠĠĠĠĠĠĠ Ġmessages Adapter . addTo Start ( chat Message , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠCustom Incoming Message ViewHolder ( item View : ĠView ?, Ġpayload : ĠAny ?) Ġ: ĊĠĠĠĠĠĠĠ ĠMessage Hold ers . Incoming Text Message ViewHolder < ChatMessage ? >( item View , Ġpayload ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ( message : ĠChat Message ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Bind ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . message _ author . text Ġ= Ġmessage ?. room User ?. name Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }