package Ġdev j del as en . com . clean u ilib Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Popup Window Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġdev j del as en . com . clean ui . chat . Chat Clean UI Ċ import Ġdev j del as en . com . clean ui . chat . Chat PopupMenu . models . PopupMenu Model Ċ import Ġdev j del as en . com . clean ui . chat . Type MessageBox . Type MessageBox Ċ import Ġdev j del as en . com . clean ui . chat . models . ChatMessage Model Abstract Ċ import Ġdev j del as en . com . clean ui . chat . models . On ChatMessage ItemClickListener Ċ import Ġdev j del as en . com . clean ui . chat . single . list . Rv Messages Chat Adapter Ċ import Ġkotlinx . android . synt hetic . main . activity _ chat .* Ċ import Ġnet . ys library . android . keyboard visibility event . Keyboard Visibility Event . set EventListener Ċ import Ġnet . ys library . android . keyboard visibility event . Keyboard Visibility EventListener ĊĊ Ċ class ĠChat Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġcan Scroll Down : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġval ĠSC ROLL _ DIRECTION _ DOWN Ġ= Ġ 1 ĊĠĠĠ Ġval ĠSC ROLL _ DIRECTION _ UP Ġ= Ġ- 1 ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ chat ) ĊĠĠĠĠĠĠĠ ĠUtils . tint StatusBar ( resources . getColor ( R . color . clean _ ui _ white , Ġnull ), Ġfalse , Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġset List ( get Messages ()) ĊĠĠĠĠĠĠĠ Ġset SendMessage Interaction () ĊĠĠĠĠĠĠĠ Ġset EventListener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠKeyboard Visibility EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Visibility Changed ( isOpen : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isOpen Ġ&& Ġ! can Scroll Down ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv ?. adapter ?. item Count ?. minus ( 1 )?. let Ġ{ Ġrv ?. scrollTo Position ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset SendMessage Interaction () Ġ{ ĊĠĠĠĠĠĠĠ Ġtype MessageBox ?. set ( object : ĠType MessageBox . On Interaction Listeners Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClick EditText () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Scroll Down Ġ= Ġrv ?. can Scroll Vert ically ( SCROLL _ DIRECTION _ DOWN ) Ġ?: Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Send ( message : ĠString ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset List ( messages : ĠArrayList < ChatMessage Model Abstract >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrv ?. adapter Ġ= ĠR v Messages Chat Adapter ( messages , Ġobject : ĠOn ChatMessage ItemClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Long Click ( message : ĠChat Message Model Abstract , Ġmessage View : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Clean UI . display My Message Options Menu ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . am IS ender (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage View , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . am IS ender ()) ĠR . menu . my _ message _ menu Ġelse ĠR . menu . my _ message _ menu , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠPopup Menu Model . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClick ( id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ Chat Activity , Ġ" id Ġ$ id ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPopup Window . On Dismiss Listener Ġ{ Ġ( rv ?. adapter Ġas ? ĠR v Messages Chat Adapter )?. close Menu () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( rv ?. adapter Ġas ? ĠR v Messages Chat Adapter )?. open Menu ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Options Click ( message : ĠChat Message Model Abstract , Ġmessage View : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Clean UI . display My Message Options Menu ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . am IS ender (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage View , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . am IS ender ()) ĠR . menu . my _ message _ menu Ġelse ĠR . menu . my _ message _ menu , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠPopup Menu Model . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClick ( id : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPopup Window . On Dismiss Listener Ġ{ Ġ( rv ?. adapter Ġas ? ĠR v Messages Chat Adapter )?. close Menu () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( rv ?. adapter Ġas ? ĠR v Messages Chat Adapter )?. open Menu ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Click ( message : ĠChat Message Model Abstract , Ġmessage View : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Image Item Click ( message : ĠChat Message Model Abstract , Ġmessage View : ĠView ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Avatar Click ( userId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClick ( p 0 : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġrv ?. layout Manager Ġ= ĠLinearLayoutManager ( this , ĠLinearLayoutManager . VERTICAL , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Messages (): ĠArrayList < ChatMessage Model Abstract > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠUtils . get Json From Assets ( this , Ġ" messages . json "); ĊĠĠĠĠĠĠĠ Ġreturn ĠJson Mapping . get Messages ( json ) ĊĠĠĠ Ġ} ĊĊ Ċ }