package Ġdev . hi rog ak ata ger i . sandbox . ui . chat Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . input method . Editor Info Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġdev . hi rog ak ata ger i . core . fragment . Core ViewModel Fragment Ċ import Ġdev . hi rog ak ata ger i . sandbox . databinding . Fragment Chat Binding Ċ import Ġdev . hi rog ak ata ger i . sandbox . util . enable Multi Line Done Action Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . k oin . android . ext . android . inject Ċ import Ġorg . k oin . android x . view model . ext . android . viewModel Ċ Ċ class ĠFire Chat Fragment Ġ: ĠCore ViewModel Fragment < Fragment Chat Binding , ĠFire Chat ViewModel >() Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcontroller : ĠFire Chat Msg Controller Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġchat Observer Ġby Ġlazy Ġ{ ĠChat Observer () Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġvm : ĠFire Chat ViewModel Ġby ĠviewModel () ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Binding ( container : ĠViewGroup ?): ĠFragment Chat Binding Ġ= ĊĠĠĠĠĠĠĠ ĠFragment Chat Binding . inflate ( layout Inflater , Ġcontainer , Ġfalse ) ĊĊĠĠĠ Ġoverride Ġfun ĠFragment Chat Binding . bind () Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Message Input () ĊĠĠĠĠĠĠĠ Ġsetup Messages () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch When Started Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġobserve Messages () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġvm . listen To Conversation () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġbinding ?. re cyclerView ?. adapter ?. unregister Adapter Data Observer ( chat Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Message Input () Ġ= Ġbinding Ġ{ ĊĠĠĠĠĠĠĠ Ġtxt Message Input . enable Multi Line Done Action () ĊĠĠĠĠĠĠĠ Ġtxt Message Input . setOn Editor ActionListener Ġ{ Ġview , Ġaction Id , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Id Ġ== ĠEditor Info . IME _ ACTION _ DONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġview . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . text Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . isNotBlank ()) Ġvm . sendMessage ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Messages () Ġ= Ġbinding Ġ{ ĊĠĠĠĠĠĠĠ Ġre cyclerView . set Controller ( controller ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter ?. register Adapter Data Observer ( chat Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġobserve Messages () Ġ= Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvm . messages . collect Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . messages Ġ= Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . request Model Build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠChat Observer Ġ: ĠRecyclerView . Adapter Data Observer () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Inserted ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Item Range Inserted ( position Start , Ġitem Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ?. re cyclerView ?. smooth Scroll To Position ( controller . adapter . item Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ