package Ġcom . pr 0 gram m . app . ui . fragments . conversation Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . widget . AppCompat TextView Ċ import Ġandroidx . core . text . build Sp anned String Ċ import Ġandroidx . core . text . in Spans Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . pr 0 gram m . app . api . pr 0 gram m . Api Ċ import Ġcom . pr 0 gram m . app . databinding . Item Date Divider Binding Ċ import Ġcom . pr 0 gram m . app . databinding . Item Message Received Binding Ċ import Ġcom . pr 0 gram m . app . databinding . Item Message Sent Binding Ċ import Ġcom . pr 0 gram m . app . ui . Adapter Delegate Ċ import Ġcom . pr 0 gram m . app . ui . Adapter Delegate Manager Ċ import Ġcom . pr 0 gram m . app . ui . Adapters Ċ import Ġcom . pr 0 gram m . app . ui . adapters 2 . Delegating Paging Data Adapter Ċ import Ġcom . pr 0 gram m . app . util . Link ify Ċ import Ġcom . pr 0 gram m . app . util . setText Future Ċ import Ġcom . pr 0 gram m . app . util . sp Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* ĊĊ Ċ sealed Ġclass ĠCon versation Item Ġ{ ĊĠĠĠ Ġclass ĠMessage ( val Ġmessage : ĠApi . Conversation Message ) Ġ: ĠCon versation Item () ĊĠĠĠ Ġclass ĠDiv ider ( val Ġtext : ĠString ) Ġ: ĠCon versation Item () Ċ } Ċ Ċ class ĠCon versation Adapter Ġ: ĠDeleg ating Paging Data Adapter < Conversation Item >( Item Callback ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġmanager Ġ= ĠAdapter Delegate Manager ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Item Message ViewHolder ( true ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Item Message ViewHolder ( false ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Item Divider Adapter (), ĊĠĠĠ Ġ)) ĊĊĠĠĠ Ġval Ġmessages : ĠList < Api . Conversation Message > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġitems . map NotNull Ġ{ Ġitem Ġ-> Ġ( item Ġas ? ĠCon versation Item . Message )?. message Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠItem Callback Ġ: ĠDiff Util . Item Callback < Conversation Item >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠCon versation Item , Ġnew Item : ĠCon versation Item ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item Ġis ĠCon versation Item . Message Ġ&& Ġnew Item Ġis ĠCon versation Item . Message Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . message . id Ġ== Ġnew Item . message . id ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item Ġis ĠCon versation Item . Divider Ġ&& Ġnew Item Ġis ĠCon versation Item . Divider Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . text Ġ== Ġnew Item . text ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠCon versation Item , Ġnew Item : ĠCon versation Item ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġitems Ġare Ġthe Ġsame , Ġthe Ġcontents Ġis Ġalso Ġequal . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġconversation Item Message ViewHolder ( for Sent : ĠBoolean ): ĠAdapter Delegate < Conversation Item , ĠRecyclerView . ViewHolder > Ġ{ ĊĠĠĠ Ġval Ġformat Ġ= ĠSimpleDateFormat (" HH : mm ", ĠLocale . getDefault ()) ĊĊĠĠĠ Ġfun Ġbind To ( time View : ĠTextView , Ġmessage View : ĠAppCompat TextView , Ġvalue : ĠCon versation Item . Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext : ĠContext Ġ= Ġtime View . context ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġbuild Sp anned String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( Link ify . link ify ( context , Ġvalue . message . message Text )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Spans ( Space Span ( context . sp ( 3 2 f ). toInt ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmessage View . setText Future ( text ) ĊĊĠĠĠĠĠĠĠ Ġtime View . text Ġ= Ġvalue . message . creation Time . toString ( format ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġif Ġ( for Sent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Adapter Ġ= ĠAdapter s . For View Bindings ( Item Message Sent Binding :: inflate ) Ġ{ Ġ( views ), Ġitem : ĠCon versation Item . Message Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind To ( views . time , Ġviews . message , Ġitem ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAdapter s . adapt ( item Adapter ) Ġ{ Ġvalue : ĠCon versation Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( value Ġas ? ĠCon versation Item . Message )?. take If Ġ{ Ġmsg Ġ-> Ġmsg . message . sent Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Adapter Ġ= ĠAdapter s . For View Bindings ( Item Message Received Binding :: inflate ) Ġ{ Ġ( views ), Ġitem : ĠCon versation Item . Message Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind To ( views . time , Ġviews . message , Ġitem ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAdapter s . adapt ( item Adapter ) Ġ{ Ġvalue : ĠCon versation Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( value Ġas ? ĠCon versation Item . Message )?. take If Ġ{ Ġmsg Ġ-> Ġ! msg . message . sent Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġconversation Item Divider Adapter (): ĠAdapter Delegate < Conversation Item , ĠRecyclerView . ViewHolder > Ġ{ ĊĠĠĠ Ġval Ġitem Adapter Ġ= ĠAdapter s . For View Bindings ( Item Date Divider Binding :: inflate ) Ġ{ Ġ( views ), Ġitem : ĠCon versation Item . Divider Ġ-> ĊĠĠĠĠĠĠĠ Ġviews . text . text Ġ= Ġitem . text ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠAdapter s . adapt ( item Adapter ) Ġ{ Ġvalue : ĠCon versation Item Ġ-> Ġvalue Ġas ? ĠCon versation Item . Divider Ġ} Ċ } Ċ