package Ġio . ag ora . meeting . ui . module . main . render . t iled Ċ Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . graphics . drawable . Color Drawable Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . Adapter View Ċ import Ġandroid . widget . Array Adapter Ċ import Ġandroid . widget . CheckBox Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . appcompat . widget . List Popup Window Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . lifecycle . observe Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . ListAdapter Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġio . ag ora . meeting . context . Video Target Ċ import Ġio . ag ora . meeting . context . bean . Render Info Ċ import Ġio . ag ora . meeting . context . bean . User Operation Ċ import Ġio . ag ora . meeting . ui . R Ċ import Ġio . ag ora . meeting . ui . base . Binding ViewHolder Ċ import Ġio . ag ora . meeting . ui . base . K Base Fragment Ċ import Ġio . ag ora . meeting . ui . databinding . Main Render Stats Layout Binding Ċ import Ġio . ag ora . meeting . ui . databinding . Main Render T iled Item Binding Ċ import Ġio . ag ora . meeting . ui . databinding . Main Render T iled Vp Page Binding Ċ import Ġio . ag ora . meeting . ui . util . Avatar Util Ċ import Ġio . ag ora . meeting . ui . util . UI Util Ċ import Ġkotlin . math . min Ċ Ċ class ĠT iled VP Page Frag ( ĊĠĠĠĠĠĠĠ Ġval Ġindex : ĠInt , ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠviewModel : ĠT iled Layout VM , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon ItemClickListener : Ġ(( View ?, ĠRender Info ) Ġ-> ĠUnit )? Ċ ) Ġ: ĠK Base Fragment () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTEXT URE _ VIEW _ ID Ġ= ĠView . generate View Id () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPAGE _ COLUMN Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPAGE _ ROW Ġ= Ġ 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġview Binding : ĠMain Render T iled Vp Page Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġadapter : ĠT iled Layout Adapter ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġopen Rv Anim Run Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġview Binding ?. re cyclerView ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUI Util . open RV Animator ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlast Visible Percent Ġ= Ġ 0 f ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġview Binding Ġ= ĠMain Render T iled Vp Page Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġview Binding !!. root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= Ġview Binding Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġbinding . re cyclerView . set Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠ Ġbinding . re cyclerView . addItem Decoration ( object Ġ: ĠRecyclerView . Item Decoration () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Offsets ( out Rect : ĠRect , Ġview : ĠView , Ġparent : ĠRecyclerView , Ġstate : ĠRecyclerView . State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= Ġview . layout Params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . width Ġ= Ġ(( parent . width Ġ- Ġoffset Ġ* Ġ 2 Ġ* ĠPAGE _ COLUMN ) Ġ/ ĠPAGE _ COLUMN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . height Ġ= Ġ(( parent . height Ġ- Ġoffset Ġ* Ġ 2 Ġ* ĠPAGE _ ROW ) Ġ/ ĠPAGE _ ROW ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . layout Params Ġ= Ġlayout Params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect [ offset , Ġoffset , Ġoffset ] Ġ= Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġbinding . re cyclerView . layout Manager Ġ= Ġobject : ĠGrid LayoutManager ( require Context (), ĠPAGE _ ROW ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcan Scroll Vert ically (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠT iled Layout Adapter () ĊĠĠĠĠĠĠĠ Ġbinding . re cyclerView . adapter Ġ= Ġadapter ĊĊĠĠĠĠĠĠĠ ĠviewModel . render List . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isSelected () Ġ|| Ġadapter ?. item Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ListAdapter ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! isSelected ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUI Util . close RV t Animator ( view Binding ?. re cyclerView ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate ListAdapter ( list : ĠList < T iled Layout VM . T iled Render Info > ?, Ġrun : ĠRunnable ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġfrom Index Ġ= Ġindex Ġ* ĠPAGE _ COLUMN Ġ* ĠPAGE _ ROW ĊĠĠĠĠĠĠĠ Ġval Ġto Index Ġ= Ġmin ( list . size , Ġ( index Ġ+ Ġ 1 ) Ġ* ĠPAGE _ ROW Ġ* ĠPAGE _ COLUMN ) ĊĠĠĠĠĠĠĠ Ġif Ġ( from Index Ġ< Ġlist . size Ġ&& Ġfrom Index Ġ< Ġto Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. submit List ( list . sub List ( from Index , Ġto Index ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( isVisible Ġ= Ġlast Visible Percent Ġ> Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġrun ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġcancel Open Rv Animator () ĊĠĠĠĠĠĠĠ Ġview Binding Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġadapter Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Selected Changed ( selected : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Selected Changed ( selected ) ĊĠĠĠĠĠĠĠ Ġif Ġ( selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ListAdapter ( viewModel . render List . value , ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Open Rv Animator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Open Rv Animator () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUI Util . close RV t Animator ( view Binding ?. re cyclerView ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ListAdapter ( viewModel . render List . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Visible Rect Changed ( percent : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Percent Ġ= Ġlast Visible Percent ĊĠĠĠĠĠĠĠ Ġlast Visible Percent Ġ= Ġpercent ĊĊĠĠĠĠĠĠĠ Ġif Ġ( last Percent Ġ== Ġ 0 f Ġ&& Ġpercent Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ListAdapter ( viewModel . render List . value ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( percent Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ListAdapter ( viewModel . render List . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpost Open Rv Animator () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isSelected ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding ?. re cyclerView ?. remove Callbacks ( open Rv Anim Run ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding ?. re cyclerView ?. post Delayed ( open Rv Anim Run , Ġ 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcancel Open Rv Animator () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Binding ?. re cyclerView ?. remove Callbacks ( open Rv Anim Run ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġalert Pop Window ( v : ĠCheckBox , Ġrender Info : ĠRender Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġv . context . application Context ĊĠĠĠĠĠĠĠ Ġval Ġoption Str List Ġ= Ġrender Info . options . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . resources . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Operation . Ab and on Host Ġ-> ĠR . string . more _ re no unce _ admin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Operation . Be Host Ġ-> ĠR . string . more _ be come _ admin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Operation . Set As Host Ġ-> ĠR . string . more _ set _ host ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Operation . Close Camera Ġ-> ĠR . string . more _ close _ video ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Operation . Close Mic Ġ-> ĠR . string . more _ mute _ audio ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠR . string . more _ move _ out ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ å¼¹ çªĹ ĊĠĠĠĠĠĠĠ Ġval Ġpopup Window Ġ= ĠList Popup Window ( context ) ĊĠĠĠĠĠĠĠ Ġpopup Window . width Ġ= Ġcontext . resources . get Dimension ( R . dim en . meeting _ pop _ dialog _ width ). toInt () ĊĠĠĠĠĠĠĠ Ġpopup Window . anchor View Ġ= Ġv ĊĠĠĠĠĠĠĠ Ġpopup Window . vertical Offset Ġ= Ġcontext . resources . get Dimension ( R . dim en . meeting _ pop _ dialog _ offset ). toInt () ĊĠĠĠĠĠĠĠ Ġpopup Window . set DropDown Gravity ( Gravity . END ) ĊĠĠĠĠĠĠĠ Ġpopup Window . setBackground Drawable ( require Context (). get Drawable ( R . drawable . bg _ video _ popup _ window )) ĊĠĠĠĠĠĠĠ Ġpopup Window . set List Selector ( Color Drawable ( Color . TRANSP ARENT )) ĊĠĠĠĠĠĠĠ Ġpopup Window . setAdapter ( object Ġ: ĠArray Adapter < String ? >( context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . layout _ video _ popup _ item , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . id . text 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption Str List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget View ( position : ĠInt , ĠconvertView : ĠView ?, Ġparent : ĠViewGroup ): ĠView Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġsuper . getView ( position , ĠconvertView , Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ!= Ġoption Str List . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . findViewById < View >( R . id . divider ). visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġpopup Window . setOn ItemClickListener Ġ{ Ġparent : ĠAdapter View < *> ?, Ġview : ĠView ?, Ġposition : ĠInt , Ġid : ĠLong Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . deal User Operation ( render Info , Ġrender Info . options [ position ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpopup Window . dismiss () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpopup Window . setOn Dismiss Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . isChecked Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . post Ġ{ Ġv . isEnabled Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġv . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġpopup Window . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Media Stream ( info : ĠT iled Layout VM . T iled Render Info , Ġcontainer : ĠViewGroup ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrender Info Ġ= Ġinfo . render Info ĊĠĠĠĠĠĠĠ Ġif Ġ( render Info . has Video Ġ&& Ġinfo . isVisible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġ( container . tag Ġas ? ĠVideo Target ) Ġ?: ĠviewModel . create Video Target ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . tag Ġ= Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . sub script Video ( render Info . userInfo . userId , Ġrender Info . stream Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . tag Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . un Sub script Video ( render Info . stream Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Stats Layout ( container : ĠFrame Layout , Ġrender Info : ĠRender Info , Ġis Stats Enable : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstats Layout Ġ= Ġcontainer . getChild At ( 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( stats Layout Ġ== Ġnull Ġ&& Ġis Stats Enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinf late Ġ= ĠMain Render Stats Layout Binding . inflate ( LayoutInflater . from ( container . context ), Ġcontainer , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinf late . info Ġ= Ġrender Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinf late . execute Pending Bindings () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Stats Enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstats Layout Binding Ġ= ĠData Binding Util . find Binding < Main Render Stats Layout Binding >( stats Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstats Layout Binding ?. info Ġ= Ġrender Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstats Layout Binding ?. execute Pending Bindings () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( stats Layout Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . remove View ( stats Layout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinner Ġclass ĠT iled Layout Adapter Ġ: ĠList Adapter < T iled Layout VM . T iled Render Info , ĠBinding ViewHolder < Main Render T iled Item Binding >>( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠT iled Render Info Diff Callback () ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBinding ViewHolder ( Main Render T iled Item Binding . inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayoutInflater . from ( parent . context ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent , Ġfalse )) ĊĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( view Holder : ĠBinding ViewHolder < Main Render T iled Item Binding >, Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠgetItem ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . binding . root . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrender Info Ġ= Ġitem . render Info ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . binding . root . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . binding . info Ġ= Ġrender Info ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . binding . execute Pending Bindings () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ç»ĳå®ļ è§Ĩé¢ĳ æµģ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind Media Stream ( item , ĠviewHolder . binding . fl Video ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġè®¾ç½® å¤´ åĥı ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAvatar Util . load Circle Avatar ( view Holder . binding . root , ĠviewHolder . binding . iv Avatar , Ġrender Info . userInfo . userName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ çĤ¹åĩ» è§Ĩé¢ĳ åĲİ åıĺ æĪĲ æ¼Ķ è®² èĢħ è§ĨåĽ¾ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= ĠviewHolder . binding . fl Video . getChild At ( 0 ) Ġ?: ĠviewHolder . binding . fl Video ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild . setOnClickListener Ġ{ Ġv : ĠView ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon ItemClickListener ?. invoke ( v , Ġrender Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæĽ´æĸ° ç»Łè®¡ æķ°æį® ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewModel . stats Display Enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Stats Layout ( view Holder . binding . stats Container , Ġrender Info , ĠviewModel . is Stats Enable ( render Info . id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild . setOn Long ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! viewModel . stats Display Enable ) Ġreturn @ setOn Long ClickListener Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenable Ġ= Ġ! viewModel . is Stats Enable ( render Info . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Stats Layout ( view Holder . binding . stats Container , Ġrender Info , Ġenable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . enable Stats ( render Info . id , Ġenable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæĽ´ å¤ļ èıľåįķ æĺ¾ç¤º çĤ¹åĩ» ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . binding . cb More . isVisible Ġ= Ġrender Info . options . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . binding . cb More . setOnClickListener Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert Pop Window ( view Holder . binding . cb More , Ġrender Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠçĶ¨æĪ· ç½® é¡¶ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . binding . cb Top . isChecked Ġ= Ġitem . is Top ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . binding . cb Top . setOnClickListener Ġ{ Ġbtn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Top ( item . index , ĠviewHolder . binding . cb Top . isChecked ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠT iled Render Info Diff Callback Ġ: ĠDiff Util . Item Callback < T iled Layout VM . T iled Render Info >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠT iled Layout VM . T iled Render Info , Ġnew Item : ĠT iled Layout VM . T iled Render Info ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . render Info . id Ġ== Ġnew Item . render Info . id ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠT iled Layout VM . T iled Render Info , Ġnew Item : ĠT iled Layout VM . T iled Render Info ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . render Info . userInfo . user Role Ġ== Ġnew Item . render Info . userInfo . user Role ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġold Item . render Info . has Video Ġ== Ġnew Item . render Info . has Video ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġold Item . render Info . has Audio Ġ== Ġnew Item . render Info . has Audio ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġold Item . is Top Ġ== Ġnew Item . is Top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġold Item . index Ġ== Ġnew Item . index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġold Item . render Info . options Ġ== Ġnew Item . render Info . options ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġold Item . isVisible Ġ== Ġnew Item . isVisible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġold Item . render Info . stats Info ?. update Time Ġ== Ġnew Item . render Info . stats Info ?. update Time ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Change Payload ( old Item : ĠT iled Layout VM . T iled Render Info , Ġnew Item : ĠT iled Layout VM . T iled Render Info ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊ Ċ }