/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠNet E ase , ĠInc . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġa ĠMIT Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġcom . net ease . yun xin . app . wis dom . edu . logic . service . impl Ċ Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mediator LiveData Ċ import Ġandroidx . lifecycle . map Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . JsonArray Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġcom . net ease . l ava . n ert c . sdk . video . NER tc Video View Ċ import Ġcom . net ease . yun xin . app . wis dom . base . network . NER es ult Ċ import Ġcom . net ease . yun xin . app . wis dom . edu . logic . impl . NE E du ManagerImpl Ċ import Ġcom . net ease . yun xin . app . wis dom . edu . logic . model .* Ċ import Ġcom . net ease . yun xin . app . wis dom . edu . logic . net . service . Base Service Ċ import Ġcom . net ease . yun xin . app . wis dom . edu . logic . net . service . Room Service Repository Ċ import Ġcom . net ease . yun xin . app . wis dom . edu . logic . net . service . Stream Service Repository Ċ import Ġcom . net ease . yun xin . app . wis dom . edu . logic . net . service . UserService Repository Ċ import Ġcom . net ease . yun xin . app . wis dom . edu . logic . net . service . request . Batch Req Ċ import Ġcom . net ease . yun xin . app . wis dom . edu . logic . net . service . request . Common Req Ċ import Ġcom . net ease . yun xin . app . wis dom . edu . logic . net . service . request . NE E du Member Properties Type Ċ import Ġcom . net ease . yun xin . app . wis dom . edu . logic . net . service . request . NE E du Update Member Property Req Ċ import Ġcom . net ease . yun xin . app . wis dom . edu . logic . service . NE E du Rtc Service Ċ import Ġcom . net ease . yun xin . app . wis dom . edu . logic . service . widget . NE E du Rtc Video View Pool Ċ import Ġcom . net ease . yun xin . app . wis dom . rtc . Rtc Manager Ċ import Ġcom . net ease . yun xin . kit . alog . AL og Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġh z sun yj Ġon Ġ 2 0 2 1 / 5 / 2 0 . Ċ Ġ*/ Ċ internal Ġclass ĠN EE du Rtc ServiceImpl Ġ: ĠN EE du Rtc Service () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġstream Change LD : ĠMed iator LiveData < Pair < NE E du Member , ĠBoolean >> Ġ= ĠMed iator LiveData () ĊĊĠĠĠ Ġprivate Ġval Ġgson Ġ= ĠGson () ĊĊĠĠĠ Ġ// Ġremember Ġlast Ġvalue Ġ, Ġotherwise Ġwhen Ġnetwork Ġreconnect Ġwill Ġnotify Ġmore ĊĠĠĠ Ġprivate Ġvar Ġlast Mute All Audio Time : ĠLong ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġmute All Audio LD : ĠMed iator LiveData < Boolean > Ġ= ĠMed iator LiveData () ĊĊĠĠĠ Ġprivate Ġval Ġr tc Manager : ĠR tc Manager Ġ= ĠN EE du ManagerImpl . rtc Manager ĊĊĠĠĠ Ġoverride Ġfun Ġlocal User Video Enable ( video Enabled : ĠBoolean ): ĠLive Data < NER es ult < Void >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( video Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStream Service Repository . update Stream Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du ManagerImpl . get Room (). room Uuid , ĠN EE du ManagerImpl . getEntry Member (). user Uuid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du Stream Type . VIDEO . type , ĠCommon Req ( value Ġ= ĠN EE du State Value . OPEN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ER es ult ( it . code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStream Service Repository . delete Stream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du ManagerImpl . get Room (). room Uuid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du ManagerImpl . getEntry Member (). user Uuid , ĠN EE du Stream Type . VIDEO . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ER es ult ( it . code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlocal User Audio Enable ( audio Enabled : ĠBoolean ): ĠLive Data < NER es ult < Void >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( audio Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStream Service Repository . update Stream Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du ManagerImpl . get Room (). room Uuid , ĠN EE du ManagerImpl . getEntry Member (). user Uuid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du Stream Type . AUDIO . type , ĠCommon Req ( value Ġ= ĠN EE du State Value . OPEN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ER es ult ( it . code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStream Service Repository . delete Stream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du ManagerImpl . get Room (). room Uuid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du ManagerImpl . getEntry Member (). user Uuid , ĠN EE du Stream Type . AUDIO . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ER es ult ( it . code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlocal User Video Audio Enable ( ĊĠĠĠĠĠĠĠ Ġvideo Enabled : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġaudio Enabled : ĠBoolean , ĊĠĠĠ Ġ): ĠLive Data < Pair < NER es ult < Void >, ĠN ER es ult < Void >>> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Param Ġ= ĠJson Array () ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġif Ġ( video Enabled ) ĠN EE du HttpMethod . PUT . method Ġelse ĠN EE du HttpMethod . DELETE . method ĊĠĠĠĠĠĠĠ Ġval Ġoperation Id Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( video Enabled ) ĠBase Service . UPDATE _ STREAM _ INFO Ġelse ĠBase Service . DELETE _ STREAM ĊĠĠĠĠĠĠĠ Ġval Ġvideo Param Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du Batch Stream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Ġ= ĠN EE du Batch Param Key . MEMBER _ STREAM S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Uuid Ġ= ĠN EE du ManagerImpl . getEntry Member (). user Uuid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= ĠN EE du Stream Type . VIDEO . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġif Ġ( video Enabled ) ĠN EE du State ( value Ġ= ĠN EE du State Value . OPEN ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġbody Param . add ( gson . toJson Tree ( video Param )) ĊĠĠĠĠĠĠĠ Ġval Ġmethod 1 Ġ= Ġif Ġ( audio Enabled ) ĠN EE du HttpMethod . PUT . method Ġelse ĠN EE du HttpMethod . DELETE . method ĊĠĠĠĠĠĠĠ Ġval Ġoperation Id 1 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( audio Enabled ) ĠBase Service . UPDATE _ STREAM _ INFO Ġelse ĠBase Service . DELETE _ STREAM ĊĠĠĠĠĠĠĠ Ġval Ġaudio Param Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du Batch Stream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Ġ= ĠN EE du Batch Param Key . MEMBER _ STREAM S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Id 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Uuid Ġ= ĠN EE du ManagerImpl . getEntry Member (). user Uuid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= ĠN EE du Stream Type . AUDIO . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġif Ġ( audio Enabled ) ĠN EE du State ( value Ġ= ĠN EE du State Value . OPEN ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġbody Param . add ( gson . toJson Tree ( audio Param )) ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠBatch Req ( body Param ) ĊĠĠĠĠĠĠĠ Ġreturn ĠStream Service Repository . batch Streams ( NE E du ManagerImpl . get Room (). room Uuid , Ġbody ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . success () Ġ|| Ġit . data Ġ== Ġnull Ġ|| Ġit . data !!. list . size Ġ!= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( first Ġ= ĠN ER es ult ( it . code ), Ġsecond Ġ= ĠN ER es ult ( it . code )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobservable Type Ġ= ĠStream Service Repository . getMethod Observable Type ( operation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata : ĠN ER es ult < Any > Ġ= ĠBase Service . gson . fromJson ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase Service . gson . toJson ( it . data !!. list [ 0 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Token . get ( observable Type ). type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobservable Type 1 Ġ= ĠStream Service Repository . getMethod Observable Type ( operation Id 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata 1 : ĠN ER es ult < Any > Ġ= ĠBase Service . gson . fromJson ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase Service . gson . toJson ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . data !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. list [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĠType Token . get ( observable Type 1 ). type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( first Ġ= ĠN ER es ult ( data . code ), Ġsecond Ġ= ĠN ER es ult ( data 1 . code )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremote User Video Enable ( userId : ĠString , Ġvideo Enabled : ĠBoolean ): ĠLive Data < NER es ult < Void >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du Update Member Property Req ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Ġ= Ġif Ġ( video Enabled ) ĠN EE du State Value . OPEN Ġelse ĠN EE du State Value . CLOSE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠN EE du State Value . OPEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠUserService Repository . update Property ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du ManagerImpl . get Room (). room Uuid , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserId , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du Member Properties Type . STRE AMA V . type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreq ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremote User Audio Enable ( userId : ĠString , Ġaudio Enabled : ĠBoolean ): ĠLive Data < NER es ult < Void >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du Update Member Property Req ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Ġ= Ġif Ġ( audio Enabled ) ĠN EE du State Value . OPEN Ġelse ĠN EE du State Value . CLOSE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠN EE du State Value . OPEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠUserService Repository . update Property ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du ManagerImpl . get Room (). room Uuid , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserId , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du Member Properties Type . STRE AMA V . type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreq ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmute All Audio ( room Uuid : ĠString , Ġstate : ĠInt ): ĠLive Data < NER es ult < Void >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommon Req Ġ= ĠCommon Req ( state ) ĊĠĠĠĠĠĠĠ Ġreturn ĠRoom Service Repository . update Room States ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroom Id Ġ= Ġroom Uuid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommon Req Ġ= Ġcommon Req , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= ĠN EE du Room States . STATE _ M UTE AUDIO ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Mute All Audio (): ĠLive Data < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmute All Audio LD ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Mute All Audio ( mute State : ĠN EE du State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mute State . time Ġ!= Ġlast Mute All Audio Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Mute All Audio Time Ġ= Ġmute State . time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmute All Audio LD . value Ġ= Ġmute State . value Ġ== ĠN EE du State Value . OPEN ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Legal Member ( member : ĠN EE du Member ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( NE E du ManagerImpl . room Config . is Big ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmember . is Host () Ġ|| Ġmember . is On Stage () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Rtc Audio ( member : ĠN EE du Member ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġenable Ġ= Ġmember . has Audio () ĊĠĠĠĠĠĠĠ Ġif Ġ( NE E du ManagerImpl . is Self ( member . user Uuid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Manager . setup Local Audio ( enable ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Manager . setup Remote Audio ( member . rtc Uid , Ġenable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġenable Local Video ( member : ĠN EE du Member ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( NE E du ManagerImpl . is Self ( member . user Uuid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Manager . enable Local Video ( member . has Video ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Audio Video ( member : ĠN EE du Member ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Legal Member ( member )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Rtc Audio ( member ) ĊĠĠĠĠĠĠĠ Ġenable Local Video ( member ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Rtc Video ( rtc View : ĠViewGroup ?, Ġmember : ĠN EE du Member ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġvideo View : ĠN ER tc Video View ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ ĠA Log . i (" update Rtc Video , Ġr tc View : Ġ$ rtc View Ġmember Ġ$ member Ġ Ġmember . has Video (): Ġ${ member . has Video () }") ĊĠĠĠĠĠĠĠ Ġif Ġ( rtc View Ġ== Ġnull Ġ|| Ġ! member . has Video ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du Rtc Video View Pool . recycle Rtc Video ( member . rtc Uid ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View Ġ= ĠN EE du Rtc Video View Pool . obtain Rtc Video ( member . rtc Uid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc View . removeAll Views () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc View . addView ( video View ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( NE E du ManagerImpl . is Self ( member . user Uuid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Manager . setup Local Video ( video View ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Manager . setup Remote Video ( video View , Ġmember . rtc Uid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Rtc Sub Video ( rtc View : ĠViewGroup ?, Ġmember : ĠN EE du Member ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġvideo View : ĠN ER tc Video View ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( rtc View Ġ== Ġnull Ġ|| Ġ! member . has Sub Video ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN EE du Rtc Video View Pool . recycle Rtc Sub Video ( member . rtc Uid ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View Ġ= ĠN EE du Rtc Video View Pool . obtain Rtc Sub Video ( member . rtc Uid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc View . removeAll Views () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc View . addView ( video View ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( NE E du ManagerImpl . is Self ( member . user Uuid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Manager . setup Local Sub Video ( video View ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Manager . setup Remote Sub Video ( video View , Ġmember . rtc Uid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stream Change (): ĠLive Data < Pair < NE E du Member , ĠBoolean >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstream Change LD ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Stream Change ( member : ĠN EE du Member , Ġupdate Video : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Audio Video ( member ) ĊĠĠĠĠĠĠĠ Ġstream Change LD . value Ġ= ĠPair ( member , Ġupdate Video ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Stream Remove ( member : ĠN EE du Member , Ġupdate Video : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Audio Video ( member ) ĊĠĠĠĠĠĠĠ Ġstream Change LD . post Value ( Pair ( member , Ġupdate Video )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Snapshot Member ( list : ĠMutable List < NE E du Member >) Ġ{ ĊĠĠĠĠĠĠĠ ĠN EE du Rtc Video View Pool . batch Re cycle Without Keep Member ( list ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Member Join ( list : ĠMutable List < NE E du Member >, Ġincrement : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Audio Video ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Member Leave ( list : ĠMutable List < NE E du Member >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . streams ?. reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Audio Video ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Rtc Video ( null , Ġmember Ġ= Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Rtc Sub Video ( null , Ġmember Ġ= Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Member Off Stage Stream Change ( member : ĠN EE du Member ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmember . streams ?. reset () ĊĠĠĠĠĠĠĠ Ġupdate Audio Video ( member ) ĊĠĠĠĠĠĠĠ Ġupdate Rtc Video ( null , Ġmember Ġ= Ġmember ) ĊĠĠĠĠĠĠĠ Ġupdate Rtc Sub Video ( null , Ġmember Ġ= Ġmember ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġleave () Ġ{ ĊĠĠĠĠĠĠĠ Ġr tc Manager . leave () ĊĠĠĠ Ġ} Ċ Ċ }