package Ġio . customer ly . activity . chat Ċ Ċ /* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠCustomer ly Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . view . WindowManager Ċ import Ġandroid . widget . Toast Ċ import Ġio . customer ly . Customer ly Ċ import Ġio . customer ly . R Ċ import Ġio . customer ly . activity . CL Y INPUT _ EXTRA _ MUST _ SHOW _ BACK Ċ import Ġio . customer ly . activity . C ly I Input Activity Ċ import Ġio . customer ly . alert . show C ly Alert Message Ċ import Ġio . customer ly . api .* Ċ import Ġio . customer ly . entity . C ly Admin Full Ċ import Ġio . customer ly . entity . chat .* Ċ import Ġio . customer ly . entity . iam Lead Ċ import Ġio . customer ly . entity . ping . C ly Next Office Hours Ċ import Ġio . customer ly . sx dependencies .* Ċ import Ġio . customer ly . sx dependencies . annotations . SX Color Int Ċ import Ġio . customer ly . sx dependencies . annotations . SX String Res Ċ import Ġio . customer ly . sx dependencies . annotations . SX Ui Thread Ċ import Ġio . customer ly . utils . download . image handler . C ly Image Request Ċ import Ġio . customer ly . utils . download . start File Download Ċ import Ġio . customer ly . utils . get Contrast BW Ċ import Ġio . customer ly . utils . gg k ext .* Ċ import Ġio . customer ly . utils . network . C ly Sn tp Client Ċ import Ġio . customer ly . utils . ui . Rv Progress ive Scroll Listener Ċ import Ġkotlinx . android . synt hetic . main . io _ customer ly __ activity _ chat .* Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . util .* Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠG i ann i Ġon Ġ 0 3 / 0 9 / 1 6 . Ċ Ġ* ĠProject : ĠCustomer ly ĠAndroid ĠSDK Ċ Ġ*/ Ċ Ċ private Ġconst Ġval ĠEX TRA _ CONVER S ATION _ ID Ġ= Ġ" EXTRA _ CONVER S ATION _ ID " Ċ private Ġconst Ġval ĠEX TRA _ MESSAGE _ CONTENT Ġ= Ġ" EXTRA _ MESSAGE _ CONTENT " Ċ private Ġconst Ġval ĠEX TRA _ MESSAGE _ ATTACH MENTS Ġ= Ġ" EXTRA _ MESSAGE _ ATTACH MENTS " Ċ private Ġconst Ġval ĠMESS AGES _ PER _ PAGE Ġ= Ġ 2 0 Ċ internal Ġconst Ġval ĠTYP ING _ NO _ ONE Ġ= Ġ 0 L Ċ private Ġconst Ġval ĠPER MISSION _ REQUEST __ WRITE _ EXTERNAL _ STORAGE Ġ= Ġ 4 3 2 1 Ċ Ċ internal Ġfun ĠActivity . start C ly Chat Activity ( conversation Id : ĠLong , Ġmessage Content : String ? Ġ= Ġnull , Ġattachments : ĠArrayList < C ly Attachment >? Ġ= Ġnull , Ġmust Show Back : ĠBoolean Ġ= Ġtrue , Ġrequest Code : ĠInt Ġ= Ġ- 1 ) Ġ{ ĊĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠC ly Chat Activity :: class . java ) ĊĠĠĠ Ġif Ġ( conversation Id Ġ!= ĠCON VER S ATION ID _ UNKNOWN _ FOR _ MESSAGE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( EXTRA _ CONVER S ATION _ ID , Ġconversation Id ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( message Content Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( EXTRA _ MESSAGE _ CONTENT , Ġmessage Content ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( attachments Ġ!= Ġnull Ġ&& Ġattachments . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġintent . put Parcelable ArrayList Extra ( EXTRA _ MESSAGE _ ATTACH MENTS , Ġattachments ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( request Code Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠC ly Chat Activity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// If Ġi Ġam Ġstarting Ġa ĠI Act _ Chat ĠActivity Ġfrom Ġa ĠI Act _ Chat Ġactivity Ġi 'll Ġshow Ġthe Ġback Ġbutton Ġonly Ġif Ġit Ġis Ġvisible Ġin Ġthe Ġcurrent ĠI Act _ Chat Ġactivity . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Then Ġi Ġfinish Ġthe Ġcurrent Ġactivity Ġto Ġavoid Ġlong Ġstack Ġof ĠI Act _ Chat Ġactivities ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . startActivity ( intent . putExtra ( CL Y INPUT _ EXTRA _ MUST _ SHOW _ BACK , Ġthis . must Show Back )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . finish () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . startActivity ( intent . putExtra ( CL Y INPUT _ EXTRA _ MUST _ SHOW _ BACK , Ġmust Show Back )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . startActivity For Result ( intent . putExtra ( CL Y INPUT _ EXTRA _ MUST _ SHOW _ BACK , Ġmust Show Back ), Ġrequest Code ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠC ly Chat Activity Ġ: ĠC ly I Input Activity () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġconversation Id : ĠLong Ġ= ĠCON VER S ATION ID _ UNKNOWN _ FOR _ MESSAGE ĊĠĠĠ Ġinternal Ġvar Ġtyping AccountId Ġ= ĠTYP ING _ NO _ ONE ĊĠĠĠ Ġinternal Ġvar Ġtyping AccountName : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġchat List Ġ= ĠArrayList < C ly Message >( 0 ) ĊĠĠĠ Ġinternal Ġvar Ġconversation Full Admin : ĠC ly Admin Full ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġconversation Full Admin From Messages AccountId : ĠLong ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġon Bottom Reached Listener Ġ= Ġobject Ġ: ĠFunction 1 < Rv Progress ive Scroll Listener , Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġw Activity Ġ: ĠWeak Reference < C ly Chat Activity > Ġ= Ġthis @ C ly Chat Activity . weak () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( scroll Listener : ĠR v Progress ive Scroll Listener ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . w Activity . get ()?. let Ġ{ Ġactivity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ly . check Configured Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . conversation Id . take If Ġ{ Ġit Ġ!= ĠCON VER S ATION ID _ UNKNOWN _ FOR _ MESSAGE Ġ} ?. also Ġ{ Ġconversation Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ly ApiRequest ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġthis . w Activity . get (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġendpoint Ġ= ĠEND POINT _ MESSAGE _ RE TR IE VE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Token Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrials Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Pre Execute Ġ= Ġ{ Ġthis . w Activity . get ()?. io _ customer ly __ progress _ view ?. visibility Ġ= ĠView . VISIBLE Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠjsonObject Converter Ġ= Ġ{ Ġit . parse Messages List () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Ġ= Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC ly ApiResponse . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . w Activity . get ()?. let Ġ{ Ġactivity Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . result . sortBy Descending Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Chat List Ġ= ĠArrayList ( activity . chat List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Size Ġ= Ġnew Chat List . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscroll To Last Un read Ġ= Ġresponse . result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġnew Chat List . contains ( it ) Ġ}// Avoid Ġduplicates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed NotNull Ġ{ Ġindex , Ġc ly Message Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Chat List . add ( cl y Message )// Add Ġnew Ġnot Ġduplicate Ġmessage Ġto Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cl y Message . isNot Seen ) Ġ{// If Ġnot Ġseen Ġmap Ġit Ġto Ġhis Ġindex , Ġdiscard Ġit Ġotherwise ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. min () Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadded Messages Count Ġ= Ġnew Chat List . size Ġ- Ġprevious Size ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . io _ customer ly __ progress _ view . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( added Messages Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . chat List Ġ= Ġnew Chat List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( activity . io _ customer ly __ recycler _ view . layout Manager Ġas ? ĠSX Linear LayoutManager )?. let Ġ{ Ġll m Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ll m . findFirst Comp let ely Visible Item Position () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġll m . scrollTo Position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( previous Size Ġ== Ġ 0 Ġ&& Ġscroll To Last Un read Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġll m . scrollTo Position ( scrollTo Last Un read ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( activity . io _ customer ly __ recycler _ view . adapter Ġas ? ĠC ly Chat Adapter )?. let Ġ{ Ġadapter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( previous Size Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify Item Changed ( adapter . list Index 2 position ( previous Size Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify Item Range Inserted ( adapter . list Index 2 position ( previous Size ), Ġadapter . list Index 2 position ( added Messages Count )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . update Account Infos () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . result . first OrNull ()?. take If Ġ{ Ġit . isNot Seen Ġ} ?. let Ġ{ Ġactivity . send Seen ( message Id Ġ= Ġit . id ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( previous Size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . io _ customer ly __ recycler _ view . layout Manager ?. scrollTo Position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . result . size Ġ>= ĠMESS AGES _ PER _ PAGE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll Listener . on Finished Updating () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC ly ApiResponse . Failure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . w Activity . get ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . io _ customer ly __ progress _ view ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( it . application Context , ĠR . string . io _ customer ly __ connection _ error , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. p ( key Ġ= Ġ" conversation _ id ", Ġvalue Ġ= Ġconversation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. p ( key Ġ= Ġ" per _ page ", Ġvalue Ġ= ĠMESS AGES _ PER _ PAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. p ( key Ġ= Ġ" messages _ before _ id ", Ġvalue Ġ= Ġactivity . chat List . map NotNull Ġ{ Ġmsg Ġ-> Ġif ( msg . id Ġ> Ġ 0 ) Ġmsg . id Ġelse Ġnull Ġ}. min () Ġ?: ĠLong . MAX _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. p ( key Ġ= Ġ" lead _ hash ", Ġvalue Ġ= ĠCustomer ly . currentUser . lead Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġprogress ive Scroll Listener : ĠR v Progress ive Scroll Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpermission Request Pending FileName : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpermission Request Pending Path : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( this . onCreate Layout ( R . layout . io _ customer ly __ activity _ chat )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ action layout . set BackgroundColor ( Customer ly . last Ping . widget Color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ progress _ view . in determinate Drawable . setColor Filter Multiply ( color Ġ= ĠCustomer ly . last Ping . widget Color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ recycler _ view . also Ġ{ Ġre cyclerView Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ= ĠSX Linear LayoutManager ( this . application Context ). also Ġ{ Ġll m Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġll m . reverse Layout Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR v Progress ive Scroll Listener ( ll m Ġ= Ġll m , Ġon Bottom Reached Ġ= Ġthis . on Bottom Reached Listener ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . progress ive Scroll Listener Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . add On Scroll Listener ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . item Animator Ġ= ĠSX Default Item Animator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . set Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= ĠC ly Chat Adapter ( chat Activity Ġ= Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconversation Id : ĠLong Ġ= Ġthis . intent . getLong Extra ( EXTRA _ CONVER S ATION _ ID , ĠCON VER S ATION ID _ UNKNOWN _ FOR _ MESSAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( conversation Id Ġ!= ĠCON VER S ATION ID _ UNKNOWN _ FOR _ MESSAGE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . on Conversation Id ( conversation Id Ġ= Ġconversation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . update Account Infos ( fallback User On Last Active Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ progress _ view . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Content : String ? Ġ= Ġthis . intent . getString Extra ( EXTRA _ MESSAGE _ CONTENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( message Content Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . on SendMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġmessage Content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattachments Ġ= Ġthis . intent . get Parcelable ArrayList Extra < C ly Attachment >( EXTRA _ MESSAGE _ ATTACH MENTS )?. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġempty Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . update Account Infos ( fallback User On Last Active Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Conversation Id ( conversation Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . conversation Id Ġ= Ġconversation Id ĊĠĠĠĠĠĠĠ Ġthis . input Layout ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġval Ġweak Rv Ġ= Ġthis . io _ customer ly __ recycler _ view . weak () ĊĊĠĠĠĠĠĠĠ ĠCustomer ly . cl y Socket . typing Listener Ġ= Ġ{ Ġp Conversation Id , ĠaccountId , Ġaccount Name , Ġp Typing Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (( p Typing Ġ&& Ġtyping AccountId Ġ!= ĠaccountId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(! p Typing Ġ&& Ġtyping AccountId Ġ!= ĠTYP ING _ NO _ ONE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( conversation Id Ġ== Ġp Conversation Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweak Rv . get ()?. post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( p Typing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġwhen ( this . typing AccountId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTYP ING _ NO _ ONE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . typing AccountId Ġ= ĠaccountId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . typing AccountName Ġ= Ġaccount Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweak Rv . get ()?. also Ġ{ Ġre cyclerView Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . adapter ?. notify Item Inserted ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( re cyclerView . layout Manager Ġas ? ĠSX Linear LayoutManager )?. take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . findFirst Comp let ely Visible Item Position () Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. scrollTo Position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . typing AccountId Ġ= ĠaccountId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . typing AccountName Ġ= Ġaccount Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweak Rv . get ()?. adapter ?. notify Item Changed ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . typing AccountId Ġ= ĠTYP ING _ NO _ ONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . typing AccountName Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweak Rv . get ()?. adapter ?. notify Item Removed ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . input Input ?. add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ly . cl y Socket . send Stop Typing ( conversation Id Ġ= Ġconversation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ly . cl y Socket . send Start Typing ( conversation Id Ġ= Ġconversation Id , Ġpreview Text Ġ= Ġs . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġweak Activity Ġ= Ġthis . weak () ĊĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ recycler _ view . post Delayed ( Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweak Activity . reference Ġ{ Ġactivity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( activity . chat List . count Ġ{ Ġit . writer . is Account Ġ} Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbot Message Content : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Office Hours : ĠC ly Next Office Hours ? Ġ= ĠCustomer ly . last Ping . next Office Hours ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( next Office Hours ?. is Office Open () Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbot Message Content Ġ= Ġnext Office Hours . get Bot Message ( context Ġ= Ġactivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ SX String Res Ġval Ġreply Time String Res Id : ĠInt ? Ġ= ĠCustomer ly . last Ping . reply Time ?. string Res Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( bot Message Content Ġ== Ġnull Ġ&& Ġreply Time String Res Id Ġ!= Ġnull Ġ&& Ġreply Time String Res Id Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbot Message Content Ġ= Ġactivity . getString ( reply Time String Res Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( bot Message Content Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . addMessage At 0 ( message Ġ= ĠC ly Message . Bot . Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmessageId Ġ= Ġactivity . chat List . opt At ( 0 )?. id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ- System . currentTimeMillis (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Id Ġ= Ġconversation Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġbot Message Content )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 3 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ recycler _ view . post Delayed ( Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweak Activity . reference Ġ{ Ġactivity Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Customer ly . currentUser . email Ġ== Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . addMessage At 0 ( message Ġ= ĠC ly Message . Bot . Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmessageId Ġ= Ġactivity . chat List . opt At ( 0 )?. id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ- System . currentTimeMillis (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Id Ġ= Ġconversation Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġactivity . getString ( R . string . io _ customer ly __ give _ us _ a _ way _ to _ reach _ you ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . io _ customer ly __ recycler _ view . post Delayed ( Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweak Activity . get ()?. addMessage At 0 ( message Ġ= ĠC ly Message . Bot . Form . Ask Email ( conversation Id Ġ= Ġconversation Id , ĠmessageId Ġ= Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( activity . chat List . count Ġ{ Ġit . writer . is Account Ġ} Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . try Load Form () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 4 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġthis . progress ive Scroll Listener ?. let Ġ{ Ġthis . on Bottom Reached Listener ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ ĠCustomer ly . cl y Socket . typing Listener Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġthis . conversation Id . take If Ġ{ Ġit Ġ!= ĠCON VER S ATION ID _ UNKNOWN _ FOR _ MESSAGE Ġ} ?. apply Ġ{ ĠCustomer ly . cl y Socket . send Stop Typing ( conversation Id Ġ= Ġthis ) Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Re connection () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . progress ive Scroll Listener ?. let Ġ{ Ġthis . on Bottom Reached Listener ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Logout User () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . finish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġstart Attachment Download ( filename : ĠString , Ġfull Path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( SX Context Compat . check Self Permission ( this , ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart File Download ( context Ġ= Ġthis , Ġfilename Ġ= Ġfilename , Ġfull Path Ġ= Ġfull Path ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . permission Request Pending FileName Ġ= Ġfilename ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . permission Request Pending Path Ġ= Ġfull Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( SX Activity Compat . should Show Request Permission R ationale ( this , ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSX AlertDialog Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . io _ customer ly __ permission _ request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . io _ customer ly __ permission _ request _ explanation _ write ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( android . R . string . ok ) Ġ{ Ġ_, Ġ_ Ġ-> ĠSX Activity Compat . request Permissions ( this , ĠarrayOf ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE ), ĠPER MISSION _ REQUEST __ WRITE _ EXTERNAL _ STORAGE ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSX Activity Compat . request Permissions ( this , ĠarrayOf ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE ), ĠPER MISSION _ REQUEST __ WRITE _ EXTERNAL _ STORAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < String >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPER MISSION _ REQUEST __ WRITE _ EXTERNAL _ STORAGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmin ( grant Results . size , Ġpermissions . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( permissions [ i ] Ġ== ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE Ġ&& Ġgrant Results [ i ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending FileName Ġ= Ġthis . permission Request Pending FileName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Path Ġ= Ġthis . permission Request Pending Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( pending FileName ?. isNotEmpty () Ġ== Ġtrue Ġ&& Ġpending Path ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . start Attachment Download ( filename Ġ= Ġpending FileName , Ġfull Path Ġ= Ġpending Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . permission Request Pending FileName Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . permission Request Pending Path Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this . application Context , ĠR . string . io _ customer ly __ permission _ den ied _ write , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Seen ( message Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġw Context Ġ= Ġthis . weak () ĊĠĠĠĠĠĠĠ ĠC ly Sn tp Client . getN tp Time Async ( context Ġ= Ġthis ) Ġ{ Ġtime Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġut c Ġ= Ġ( time Ġ?: ĠSystem . currentTimeMillis ()). ms As Seconds ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ly . cl y Socket . send Seen ( message Id Ġ= ĠmessageId , Ġseen Timestamp Ġ= Ġut c ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠC ly ApiRequest < Any >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġw Context . get (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġendpoint Ġ= ĠEND POINT _ MESSAGE _ SE EN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Token Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠjsonObject Converter Ġ= Ġ{ Ġit Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. p ( key Ġ= Ġ" conversation _ message _ id ", Ġvalue Ġ= ĠmessageId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. p ( key Ġ= Ġ" seen _ date ", Ġvalue Ġ= Ġut c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġstart SendMessage Request ( message : ĠC ly Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġweak Act Ġ= Ġthis . weak () ĊĠĠĠĠĠĠĠ ĠC ly ApiRequest ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġendpoint Ġ= ĠEND POINT _ MESSAGE _ SEND , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Token Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrials Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠjsonObject Converter Ġ= Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ly . cl y Socket . sendMessage ( timestamp Ġ= Ġresponse . opt Long (" timestamp ", Ġ- 1 L )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ly . currentUser . lead Hash Ġ= Ġresponse . opt String (" lead _ hash "). take If Ġ{ Ġit Ġ!= Ġ"" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . opt JSONObject (" message ") ?. parse Message () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Ġ= Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweak Act . get ()?. also Ġ{ Ġactivity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat List Ġ= Ġactivity . chat List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC ly ApiResponse . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat List . indexOf ( message ). take If Ġ{ Ġit Ġ!= Ġ- 1 Ġ} ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat List [ it ] Ġ= Ġresponse . result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . notify Item Changed In List ( message Ġ= Ġresponse . result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( activity . conversation Id Ġ== ĠCON VER S ATION ID _ UNKNOWN _ FOR _ MESSAGE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . on Conversation Id ( conversation Id Ġ= Ġresponse . result . conversation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC ly ApiResponse . Failure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . setState Failed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . notify Item Changed In List ( message Ġ= Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( activity . application Context , ĠR . string . io _ customer ly __ connection _ error , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . update Account Infos ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( message . conversation Id Ġ!= ĠCON VER S ATION ID _ UNKNOWN _ FOR _ MESSAGE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . p ( key Ġ= Ġ" conversation _ id ", Ġvalue Ġ= Ġmessage . conversation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. p ( key Ġ= Ġ" message ", Ġvalue Ġ= Ġmessage . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. p ( key Ġ= Ġ" attachments ", Ġvalue Ġ= Ġmessage . attachments . toJSON ( context Ġ= Ġthis )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. p ( key Ġ= Ġ" lead _ hash ", Ġvalue Ġ= ĠCustomer ly . currentUser . lead Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . id . home Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . finish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ SX Ui Thread ĊĠĠĠ Ġoverride Ġfun Ġon SendMessage ( content : ĠString , Ġattachments : ĠArray < C ly Attachment >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= ĠCustomer ly . jwt Token ?. userID ĊĠĠĠĠĠĠĠ Ġval Ġconversation Id Ġ= Ġthis . conversation Id ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ!= Ġnull Ġ-> ĠC ly Message . Human . User Local ( userId Ġ= ĠuserId , Ġconversation Id Ġ= Ġconversation Id , Ġcontent Ġ= Ġcontent , Ġattachments Ġ= Ġattachments ). also Ġ{ Ġmessage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . addMessage At 0 ( message Ġ= Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . start SendMessage Request ( message Ġ= Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ly . last Ping . allow Anonymous Chat Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Message Ġ= ĠC ly Message . Human . User Local ( conversation Id Ġ= Ġconversation Id , Ġcontent Ġ= Ġcontent , Ġattachments Ġ= Ġattachments ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . addMessage At 0 ( message Ġ= Ġpending Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweak Activity Ġ= Ġthis . weak () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ly ApiRequest ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġthis . application Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġendpoint Ġ= ĠEND POINT _ PING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠjsonObject Converter Ġ= Ġ{ ĠUnit Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Ġ= Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ly . jwt Token ?. userID ?. apply Ġ{ Ġpending Message . writer . id Ġ= Ġthis Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweak Activity . reference Ġ{ Ġc ly Chat Activity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC ly ApiResponse . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Message . setState Sending () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ly Chat Activity . notify Item Changed In List ( message Ġ= Ġpending Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ly Chat Activity . start SendMessage Request ( message Ġ= Ġpending Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC ly ApiResponse . Failure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Message . setState Failed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ly Chat Activity . notify Item Changed In List ( message Ġ= Ġpending Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. p ( key Ġ= Ġ" force _ lead ", Ġvalue Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . input Layout ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ly Message . Human . User Local ( conversation Id Ġ= Ġconversation Id , Ġcontent Ġ= Ġcontent , Ġattachments Ġ= Ġattachments ). also Ġ{ Ġpending Message Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . addMessage At 0 ( message Ġ= Ġpending Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . addMessage At 0 ( message Ġ= ĠC ly Message . Bot . Form . Ask Email ( conversation Id Ġ= Ġpending Message . conversation Id , ĠmessageId Ġ= Ġ 1 , Ġpending Message Ġ= Ġpending Message )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġtry Load Form () Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( Customer ly . iam Lead () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġthis . chat List . as Sequence (). none Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC ly Message . Bot . Form . Profiling Ġ-> Ġ! it . form . answer Confirmed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC ly Message . Bot . Form . Ask Email Ġ-> ĠCustomer ly . currentUser . email Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ly . last Ping . next Form Details ?. also Ġ{ Ġform Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . conversation Id . take If Ġ{ Ġit Ġ!= ĠCON VER S ATION ID _ UNKNOWN _ FOR _ MESSAGE Ġ} ?. also Ġ{ Ġconversation Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . addMessage At 0 ( message Ġ= ĠC ly Message . Bot . Form . Profiling ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmessageId Ġ= Ġthis . chat List . opt At ( 0 )?. id Ġ?: Ġ- System . currentTimeMillis (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Id Ġ= Ġconversation Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġform Ġ= Ġform )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Message At 0 ( message : ĠC ly Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . chat List . add ( 0 , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ recycler _ view ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . adapter Ġas ? ĠC ly Chat Adapter )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . notify Item Inserted ( this . list Index 2 position ( list Index Ġ= Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . layout Manager Ġas ? ĠSX Linear LayoutManager )?. take If Ġ{ Ġll m Ġ-> Ġll m . findFirst Comp let ely Visible Item Position () Ġ== Ġ 0 Ġ} ?. scrollTo Position ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ SX Ui Thread ĊĠĠĠ Ġoverride Ġfun Ġon New Socket Messages ( messages : ĠArrayList < C ly Message >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessages ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. last OrNull Ġ{ Ġit . conversation Id Ġ!= Ġthis . conversation Id } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġother Conversation Message Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . show C ly Alert Message ( message Ġ= Ġother Conversation Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception Ġ: ĠWindow Manager . Bad Token Exception ) Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Chat List Ġ= ĠArrayList ( this . chat List ) ĊĠĠĠĠĠĠĠ Ġmessages ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . conversation Id Ġ== Ġthis . conversation Id Ġ&& Ġ! new Chat List . contains ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġnew Chat List . add ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġnew Chat List . sortBy Descending Ġ{ Ġit . id Ġ}// Sorting Ġby Ġconversation _ message _ id ĠDESC ĊĊĠĠĠĠĠĠĠ Ġthis . chat List Ġ= Ġnew Chat List ĊĊĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ recycler _ view ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw Rv Ġ= Ġit . weak () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw Rv . get ()?. let Ġ{ Ġrv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv . adapter ?. notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( rv . layout Manager Ġas ? ĠSX Linear LayoutManager )?. take If Ġ{ Ġll m Ġ-> Ġll m . findFirst Comp let ely Visible Item Position () Ġ== Ġ 0 Ġ} ?. scrollTo Position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . update Account Infos () ĊĊĠĠĠĠĠĠĠ Ġnew Chat List . first OrNull ()?. take If Ġ{ Ġit . isNot Seen Ġ} ?. also Ġ{ Ġthis . send Seen ( message Id Ġ= Ġit . id ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Account Infos ( fallback User On Last Active : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast AccountId Ġ= Ġthis . chat List . first OrNull Ġ{ Ġit . writer . is Account Ġ} ?. writer ?. id ĊĊĠĠĠĠĠĠĠ Ġif ( this . conversation Full Admin Ġ== Ġnull Ġ|| Ġthis . conversation Full Admin From Messages AccountId Ġ!= Ġlast AccountId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCustomer ly . get Account Details Ġ{ Ġadmins Full Details Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfull Admin Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast AccountId Ġ!= Ġnull Ġ-> Ġadmins Full Details ?. first OrNull Ġ{ Ġit . accountId Ġ== Ġlast AccountId Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfallback User On Last Active Ġ-> Ġadmins Full Details ?. max By Ġ{ Ġit . last Active Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ SX Color Int Ġval Ġtitle TextColor Int Ġ= ĠCustomer ly . last Ping . widget Color . get Contrast BW () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( full Admin Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . conversation Full Admin Ġ= Ġfull Admin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . conversation Full Admin From Messages AccountId Ġ= Ġlast AccountId ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Admin . job Title ?. also Ġ{ Ġjob Title Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ job . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . text Ġ= Ġjob Title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setTextColor ( title TextColor Int ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ title . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . activity Ġas ? ĠC ly Chat Activity )?. also Ġ{ Ġchat Activity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Activity . io _ customer ly __ recycler _ view ?. layout Manager ?. also Ġ{ Ġll m Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . progress ive Scroll Listener ?. skip Next Bottom () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġll m . scrollTo Position ( ll m . item Count Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ icon . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ly Image Request ( context Ġ= Ġthis , Ġurl Ġ= Ġfull Admin . getImage Url ( size Px Ġ= Ġ 4 8 . dp 2 px )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fit Center () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Circle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. resize ( width Ġ= Ġ 4 8 . dp 2 px ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. placeholder ( placeholder Ġ= ĠR . drawable . io _ customer ly __ ic _ default _ admin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( imageView Ġ= Ġthis . io _ customer ly __ icon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ name . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . text Ġ= Ġfull Admin . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setTextColor ( title TextColor Int ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ recycler _ view . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this . adapter Ġas ? ĠC ly Chat Adapter )?. also Ġ{ Ġadapter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġll m Ġ= Ġthis . layout Manager Ġas ? ĠSX Linear LayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscroll To 0 Ġ= Ġll m ?. findFirst Comp let ely Visible Item Position () Ġ== Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify Account Card Changed () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scrollTo 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġll m ?. scrollTo Position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ icon . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . io _ customer ly __ name . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setText ( R . string . io _ customer ly __ activity _ title _ chat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setTextColor ( title TextColor Int ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnotify Item Changed In List ( message : ĠC ly Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . chat List . indexOf ( message ). take If Ġ{ Ġit Ġ!= Ġ- 1 Ġ} ?. also Ġ{ Ġlist Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( this . io _ customer ly __ recycler _ view . adapter Ġas ? ĠC ly Chat Adapter )?. also Ġ{ Ġadapter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify Item Changed ( adapter . list Index 2 position ( list Index )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ