package Ġcom . fresh digit able . ud on road 2 . timeline . list adapter Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . paging . Paging Data Adapter Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . fresh digit able . ud on road 2 . model . tweet . Tweet ListItem Ċ import Ġcom . fresh digit able . ud on road 2 . timeline . R Ċ import Ġcom . fresh digit able . ud on road 2 . timeline . Tweet ListItem ViewModel Ċ import Ġcom . fresh digit able . ud on road 2 . timeline . Tweet Media Item ViewModel Ċ import Ġcom . fresh digit able . ud on road 2 . timeline . User Icon ClickListener Ċ import Ġcom . fresh digit able . ud on road 2 . timeline . databinding . View Tweet ListItem Binding Ċ import Ġcom . fresh digit able . ud on road 2 . timeline . databinding . View Tweet List Quoted Item Binding Ċ Ċ class ĠTimeline Adapter ( ĊĠĠĠ Ġprivate Ġval Ġitem ViewModel : ĠTweet ListItem ViewModel , ĊĠĠĠ Ġprivate Ġval Ġmedia ViewModel : ĠTweet Media Item ViewModel , ĊĠĠĠ Ġprivate Ġval Ġuser Icon ClickListener : ĠUser Icon ClickListener , ĊĠĠĠ Ġprivate Ġval Ġlifecycle Owner : ĠLifecycle Owner Ċ ) Ġ: ĠP aging Data Adapter < Tweet ListItem , ĠTimeline Adapter . ViewHolder >( diff Util ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( ĊĠĠĠĠĠĠĠ Ġparent : ĠViewGroup , ĊĠĠĠĠĠĠĠ Ġview Type : ĠInt ĊĠĠĠ Ġ): ĠViewHolder Ġ= ĊĠĠĠĠĠĠĠ ĠViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Tweet ListItem Binding . inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayoutInflater . from ( parent . context ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠgetItem ( position ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġholder . binding . tweet Ġ= Ġitem ĊĠĠĠĠĠĠĠ Ġholder . binding . lifecycle Owner Ġ= Ġlifecycle Owner ĊĠĠĠĠĠĠĠ Ġif Ġ( item . quoted Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Quoted View ( holder ). tweet Ġ= Ġitem ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Quoted View ( holder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Attached To Window ( holder : ĠViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Attached To Window ( holder ) ĊĠĠĠĠĠĠĠ Ġholder . binding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem ViewModel Ġ= Ġthis @ Timeline Adapter . item ViewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia ViewModel Ġ= Ġthis @ Timeline Adapter . media ViewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Icon ClickListener Ġ= Ġthis @ Timeline Adapter . user Icon ClickListener ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġholder . quoted View ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem ViewModel Ġ= Ġthis @ Timeline Adapter . item ViewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia ViewModel Ġ= Ġthis @ Timeline Adapter . media ViewModel ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Detached From Window ( holder : ĠViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Detached From Window ( holder ) ĊĠĠĠĠĠĠĠ Ġholder . binding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem ViewModel Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia ViewModel Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Icon ClickListener Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġholder . quoted View ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem ViewModel Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia ViewModel Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Re cyc led ( holder : ĠViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Re cyc led ( holder ) ĊĠĠĠĠĠĠĠ Ġremove Quoted View ( holder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ ĠR . layout . view _ tweet _ list _ item ĊĊĠĠĠ Ġprivate Ġfun Ġensure Quoted View ( holder : ĠViewHolder ): ĠView Tweet List Quoted Item Binding Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġholder . quoted View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġget Quoted View Binding ( holder . root ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . root . addView ( it . root , Ġcreate Quoted Item LayoutParams ( it . root . context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . quoted View Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . lifecycle Owner Ġ= Ġlifecycle Owner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġquoted View Cache : ĠMutable List < View Tweet List Quoted Item Binding > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġfun Ġremove Quoted View ( holder : ĠViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġholder . quoted View ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . root . remove View ( it . root ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . item ViewModel Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquoted View Cache . add ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġholder . quoted View Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Quoted View Binding ( constraint Layout : ĠViewGroup ): ĠView Tweet List Quoted Item Binding Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( quoted View Cache . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Tweet List Quoted Item Binding . inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayoutInflater . from ( constraint Layout . context ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint Layout , Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquoted View Cache . remove At ( quoted View Cache . last Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Quoted Item LayoutParams ( context : ĠContext ): ĠViewGroup . LayoutParams Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠConstraint Layout . LayoutParams ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstraint Layout . LayoutParams . MATCH _ CONSTRAINT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstraint Layout . LayoutParams . WRAP _ CONTENT ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Margin Ġ= Ġcontext . resources . get Dimension Pixel Size ( R . dim en . margin _ half ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop To Bottom Ġ= ĠR . id . tweet Item _ via ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom To Bottom Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstraint Layout . LayoutParams . PARENT _ ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart To Start Ġ= ĠR . id . tweet Item _ names ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend ToEnd Ġ= ĠConstraint Layout . LayoutParams . PARENT _ ID ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠViewHolder ( ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġbinding : ĠView Tweet ListItem Binding , ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġquoted View : ĠView Tweet List Quoted Item Binding ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ: ĠRecyclerView . ViewHolder ( binding . root ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġroot : ĠViewGroup Ġ= ĠitemView Ġas ĠViewGroup ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval Ġdiff Util Ġ= Ġobject Ġ: ĠDiff Util . Item Callback < Tweet ListItem >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġare Items The Same ( ĊĠĠĠĠĠĠĠ Ġold Item : ĠTweet ListItem , ĊĠĠĠĠĠĠĠ Ġnew Item : ĠTweet ListItem ĊĠĠĠ Ġ): ĠBoolean Ġ= Ġold Item . original Id Ġ== Ġnew Item . original Id ĊĊĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( ĊĠĠĠĠĠĠĠ Ġold Item : ĠTweet ListItem , ĊĠĠĠĠĠĠĠ Ġnew Item : ĠTweet ListItem ĊĠĠĠ Ġ): ĠBoolean Ġ= Ġold Item Ġ== Ġnew Item Ċ } Ċ