package Ġlive . h ms . app 2 . ui . meeting . pinned video Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . annotation . MainThread Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġlive . h ms . app 2 . databinding . ListItem Video Binding Ċ import Ġlive . h ms . app 2 . ui . meeting . Meeting Track Ċ import Ġlive . h ms . app 2 . util . Name Utils Ċ import Ġlive . h ms . app 2 . util . Surface View Renderer Util Ċ import Ġlive . h ms . app 2 . util . crash ly t ics Log Ċ import Ġorg . webrtc . Renderer Common Ċ Ċ class ĠVideo ListAdapter ( ĊĠ Ġprivate Ġval Ġon Video Item Click : Ġ( item : ĠMeeting Track ) Ġ-> ĠUnit Ċ ) Ġ: ĠRecyclerView . Adapter < Video ListAdapter . Video Item ViewHolder >() Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Video ListAdapter " ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetItem Id ( position : ĠInt ) Ġ= Ġitems [ position ]. id ĊĊĠ Ġoverride Ġfun Ġon View Attached To Window ( holder : ĠVideo Item ViewHolder ) Ġ{ ĊĠĠĠ Ġsuper . on View Attached To Window ( holder ) ĊĠĠĠ ĠLog . d ( TAG , Ġ" on View Attached To Window ($ holder )") ĊĠĠĠ Ġholder . bind Surface View () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon View Detached From Window ( holder : ĠVideo Item ViewHolder ) Ġ{ ĊĠĠĠ Ġsuper . on View Detached From Window ( holder ) ĊĠĠĠ ĠLog . d ( TAG , Ġ" on View Detached From Window ($ holder )") ĊĠĠĠ Ġholder . unbind Surface View () ĊĠ Ġ} ĊĊĠ Ġinner Ġclass ĠVideo Item ViewHolder ( ĊĠĠĠ Ġval Ġbinding : ĠListItem Video Binding ĊĠ Ġ) Ġ: ĠRecyclerView . ViewHolder ( binding . root ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġitem Ref : ĠVideo ListItem ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġis Surface View Bin ded Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġbind ( item : ĠVideo ListItem ) Ġ{ ĊĠĠĠĠĠ Ġbinding . name Initial s . text Ġ= ĠName Utils . get Initial s ( item . track . peer . name ) ĊĠĠĠĠĠ Ġbinding . name . text Ġ= Ġitem . track . peer . name ĊĠĠĠĠĠ Ġbinding . icon Screen Share . visibility Ġ= Ġif Ġ( item . track . is Screen ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĊĠĠĠĠĠ Ġbinding . surface View . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġset Enable Hardware Scaler ( true ) ĊĠĠĠĠĠĠĠ Ġset Scaling Type ( Renderer Common . Scaling Type . SCALE _ AS PECT _ FIT ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠMean while Ġuntil Ġthe Ġvideo Ġis Ġnot Ġbin ded , Ġhide Ġthe Ġview . ĊĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġreference Ġsuch Ġthat Ġwhen Ġview Ġis Ġattached Ġto Ġwindow ĊĠĠĠĠĠĠĠ Ġ// Ġsurface Ġview Ġis Ġinitialized Ġwith Ġcorrect Ġ[ Video Track ] ĊĠĠĠĠĠĠĠ Ġitem Ref Ġ= Ġitem ĊĠĠĠĠĠĠĠ Ġis Surface View Bin ded Ġ= Ġfalse ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġbinding . root . setOnClickListener Ġ{ Ġon Video Item Click ( item . track ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbind Surface View () Ġ{ ĊĠĠĠĠĠ Ġif Ġ( is Surface View Bin ded ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" bind Surface View : ĠSurface Ġview Ġalready Ġinitialized ") ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġitem Ref ?. let Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠ ĠSurface View Renderer Util . bind ( ĊĠĠĠĠĠĠĠĠĠ Ġbinding . surface View , ĊĠĠĠĠĠĠĠĠĠ Ġitem . track , ĊĠĠĠĠĠĠĠĠĠ Ġ" Video Item ViewHolder :: bind Surface View " ĊĠĠĠĠĠĠĠ Ġ). let Ġ{ Ġsuccess Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . surface View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Surface View Bin ded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġun bind Surface View () Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! is Surface View Bin ded ) Ġreturn ĊĊĠĠĠĠĠ Ġitem Ref ?. let Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠ ĠSurface View Renderer Util . unbind ( ĊĠĠĠĠĠĠĠĠĠ Ġbinding . surface View , ĊĠĠĠĠĠĠĠĠĠ Ġitem . track , ĊĠĠĠĠĠĠĠĠĠ Ġ" Video Item ViewHolder :: unbind Surface View " ĊĠĠĠĠĠĠĠ Ġ). let Ġ{ Ġsuccess Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . surface View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Surface View Bin ded Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġitems Ġ= ĠArrayList < Video ListItem >() ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ@ param Ġnew Items : ĠComplete Ġlist Ġof Ġvideo Ġitems Ġwhich Ġneeds ĊĠĠ Ġ* Ġ Ġto Ġbe Ġupdated Ġin Ġthe ĠVideo Grid ĊĠĠ Ġ*/ ĊĠ Ġ@ MainThread ĊĠ Ġfun Ġset Items ( new Items : ĠMutable List < Meeting Track >) Ġ{ ĊĠĠĠ Ġval Ġnew Video Items Ġ= Ġnew Items . map Indexed Ġ{ Ġindex , Ġtrack Ġ-> ĠVideo ListItem ( index . to Long (), Ġtrack ) Ġ} ĊĊĠĠĠ Ġval Ġcallback Ġ= ĠVideo ListItem Diff Util ( items , Ġnew Video Items ) ĊĠĠĠ Ġval Ġdiff Ġ= ĠDiff Util . calculate Diff ( callback ) ĊĠĠĠ Ġitems . clear () ĊĠĠĠ Ġitems . addAll ( new Video Items ) ĊĠĠĠ Ġdiff . dispatch Updates To ( this ) ĊĊĠĠĠ Ġcrash ly t ics Log ( TAG , Ġ" Updated Ġvideo Ġlist : Ġsize =${ items . size }") ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠVideo Item ViewHolder Ġ{ ĊĠĠĠ Ġval Ġbinding Ġ= ĠListItem Video Binding . inflate ( ĊĠĠĠĠĠ ĠLayoutInflater . from ( parent . context ), ĊĠĠĠĠĠ Ġparent , ĊĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn ĠVideo Item ViewHolder ( binding ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠVideo Item ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠ Ġcrash ly t ics Log ( TAG , Ġ" on Bind ViewHolder : Ġ${ items [ position ]} ") ĊĠĠĠ Ġholder . bind ( items [ position ]) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Bind ViewHolder ( ĊĠĠĠ Ġholder : ĠVideo Item ViewHolder , ĊĠĠĠ Ġposition : ĠInt , ĊĠĠĠ Ġpayload s : ĠMutable List < Any > ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġif Ġ( payload s . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġsuper . on Bind ViewHolder ( holder , Ġposition , Ġpayload s ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcrash ly t ics Log ( ĊĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠ Ġ" on Bind ViewHolder : ĠMan ually Ġupdating Ġ$ holder Ġwith Ġ${ items [ position ]} Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ"[ payload s =$ payload s ]" ĊĠĠĠ Ġ) ĊĠĠĠ Ġholder . unbind Surface View () Ġ// ĠFree Ġthe Ġcontext Ġinitialized Ġfor Ġthe Ġprevious Ġitem ĊĠĠĠ Ġholder . bind ( items [ position ]) ĊĠĠĠ Ġholder . bind Surface View () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetItem Count () Ġ= Ġitems . size Ċ }