package Ġio . ag ora . flat . ui . activity . play Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . activity . view Models Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġco il . load Ċ import Ġco il . transform . Circle Crop Transformation Ċ import Ġdagger . h ilt . EntryPoint Ċ import Ġdagger . h ilt . Install In Ċ import Ġdagger . h ilt . android . EntryPoint Accessors Ċ import Ġdagger . h ilt . android . components . Activity Component Ċ import Ġio . ag ora . flat . R Ċ import Ġio . ag ora . flat . common . rtc . RTC EventListener Ċ import Ġio . ag ora . flat . data . model . Rtc User Ċ import Ġio . ag ora . flat . data . repository . UserRepository Ċ import Ġio . ag ora . flat . databinding . Component Fullscreen Binding Ċ import Ġio . ag ora . flat . databinding . Component Video List Binding Ċ import Ġio . ag ora . flat . di . interfaces . Rtc Api Ċ import Ġio . ag ora . flat . ui . anim ator . Simple Animator Ċ import Ġio . ag ora . flat . ui . manager . Room Overlay Manager Ċ import Ġio . ag ora . flat . ui . view . Padding Item Decoration Ċ import Ġio . ag ora . flat . ui . view model . Class Room Event Ċ import Ġio . ag ora . flat . ui . view model . Class Room ViewModel Ċ import Ġio . ag ora . flat . ui . view model . Rtc Video Controller Ċ import Ġio . ag ora . flat . util . dp 2 px Ċ import Ġio . ag ora . flat . util . show Toast Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠR tc Component ( ĊĠĠĠ Ġactivity : ĠClass Room Activity , ĊĠĠĠ Ġroot View : ĠFrame Layout , ĊĠĠĠ Ġprivate Ġval Ġfull Screen Layout : ĠFrame Layout , ĊĠĠĠ Ġprivate Ġval Ġshare Screen Container : ĠFrame Layout , Ċ ) Ġ: ĠBase Component ( activity , Ġroot View ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠTAG Ġ= ĠR tc Component :: class . simple Name ĊĊĠĠĠĠĠĠĠ Ġval ĠREQUEST ED _ PERMISSION S Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . RECORD _ AUDIO , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . CAMERA , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ EntryPoint ĊĠĠĠ Ġ@ Install In ( Activity Component :: class ) ĊĠĠĠ Ġinterface ĠR tc Component EntryPoint Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġuser Repository (): ĠUser Repository ĊĠĠĠĠĠĠĠ Ġfun Ġr tc Api (): ĠR tc Api ĊĠĠĠĠĠĠĠ Ġfun Ġr tc Video Controller (): ĠR tc Video Controller ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfull Screen Binding : ĠComponent Fullscreen Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġvideo List Binding : ĠComponent Video List Binding ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġuser Repository : ĠUser Repository ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġr tc Api : ĠR tc Api ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġr tc Video Controller : ĠR tc Video Controller ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠClass Room ViewModel Ġby Ġactivity . view Models () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠUser Video Adapter ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġvideo Area Animator : ĠSimple Animator ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfull Screen Animator : ĠSimple Animator ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( owner : ĠLifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinject Api () ĊĠĠĠĠĠĠĠ Ġinit View () ĊĠĠĠĠĠĠĠ Ġinit Listener () ĊĠĠĠĠĠĠĠ Ġcheck Permission (:: observe State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinject Api () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentry Point Ġ= ĠEntry Point Accessors . from Activity ( activity , ĠR tc Component EntryPoint :: class . java ) ĊĠĠĠĠĠĠĠ Ġuser Repository Ġ= Ġentry Point . user Repository () ĊĠĠĠĠĠĠĠ Ġr tc Api Ġ= Ġentry Point . rtc Api () ĊĠĠĠĠĠĠĠ Ġr tc Video Controller Ġ= Ġentry Point . rtc Video Controller () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve State () Ġ{ ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . video Users . collect Ġ{ Ġusers Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" video Users Ġchanged Ġto Ġ$ users ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . set DataSet ( users ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ å¤ĦçĲĨ çĶ¨æĪ· è¿Ľ åĩº æĹ¶çļĦ æĺ¾ç¤º ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user Call Out Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfind User Ġ= Ġusers . find Ġ{ Ġit . user UUID Ġ== Ġuser Call Out !!. user UUID Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( find User Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Call Out And Notify () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Animator . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Call Out Ġ= Ġfind User ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Call Out User () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . room Event . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠClass Room Event . R tm Channel Joined Ġ-> Ġjoin Rtc Channel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ; Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch When Res umed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Overlay Manager . observe Show Id (). collect Ġ{ Ġarea Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( area Id Ġ!= ĠRoom Overlay Manager . AREA _ ID _ VIDEO _ OP _ CALL _ OUT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Call Out () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo List Binding . click Handle View . show ( area Id Ġ!= ĠRoom Overlay Manager . AREA _ ID _ NO _ OVER LAY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Overlay Manager . set Shown ( Room Overlay Manager . AREA _ ID _ NO _ OVER LAY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . video Area Shown . collect Ġ{ Ġshown Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( shown ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Area Animator . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Area Animator . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġexpand Width Ġ= Ġactivity . resources . get Dimension Pixel Size ( R . dim en . room _ class _ video _ area _ width ) ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Video Container ( value : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= Ġvideo List Binding . root . layout Params ĊĠĠĠĠĠĠĠ Ġlayout Params . width Ġ= Ġ( value Ġ* Ġexpand Width ). toInt () ĊĠĠĠĠĠĠĠ Ġvideo List Binding . root . layout Params Ġ= Ġlayout Params ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġjoin Rtc Channel () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" call Ġr tc Ġjoin Channel ") ĊĠĠĠĠĠĠĠ ĠviewModel . room Play Info . value ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Api . join Channel ( rtc Token , Ġroom UUID , Ġr tc UID ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Video Controller . local Uid Ġ= Ġr tc UID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Video Controller . share Screen Uid Ġ= Ġr tc Share Screen . uid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Video Controller . share Screen Container Ġ= Ġshare Screen Container ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠonClick Listener Ġ= ĠView . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Binding . full Audio Opt , Ġvideo List Binding . audio Opt Ġ-> Ġuser Call Out ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . enable Audio (! it . isSelected , Ġuser UUID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Binding . full Video Opt , Ġvideo List Binding . video Opt Ġ-> Ġuser Call Out ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . enable Video (! it . isSelected , Ġuser UUID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Binding . exit FullScreen Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Animator . hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo List Binding . enter FullScreen Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Video List Opt Area () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Animator . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit View () Ġ{ ĊĠĠĠĠĠĠĠ Ġfull Screen Binding Ġ= ĠComponent Fullscreen Binding . inflate ( activity . layout Inflater , Ġfull Screen Layout , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġfull Screen Binding . exit FullScreen . setOnClickListener ( on ClickListener ) ĊĠĠĠĠĠĠĠ Ġfull Screen Binding . full Audio Opt . setOnClickListener ( on ClickListener ) ĊĠĠĠĠĠĠĠ Ġfull Screen Binding . full Video Opt . setOnClickListener ( on ClickListener ) ĊĠĠĠĠĠĠĠ Ġfull Screen Binding . root . setOnClickListener Ġ{ Ġ/* Ġdisable Ġclick Ġpass Ġthrough Ġ*/ Ġ} ĊĠĠĠĠĠĠĠ Ġfull Screen Binding . root . isVisible Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġvideo List Binding Ġ= ĠComponent Video List Binding . inflate ( activity . layout Inflater , Ġroot View , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġvideo List Binding . video Opt . setOnClickListener ( on ClickListener ) ĊĠĠĠĠĠĠĠ Ġvideo List Binding . audio Opt . setOnClickListener ( on ClickListener ) ĊĠĠĠĠĠĠĠ Ġvideo List Binding . enter FullScreen . setOnClickListener ( on ClickListener ) ĊĊĠĠĠĠĠĠĠ Ġshare Screen Container . setOnClickListener Ġ{ Ġ/* Ġdisable Ġclick Ġpass Ġthrough Ġ*/ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠUser Video Adapter ( ArrayList (), Ġr tc Video Controller ) ĊĠĠĠĠĠĠĠ Ġadapter . listener Ġ= Ġobject Ġ: ĠUser Video Adapter . Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Click ( position : ĠInt , Ġview : ĠViewGroup , Ġr tc User : ĠR tc User ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart . set ( getView Rect ( view , Ġfull Screen Layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend . set ( 0 , Ġ 0 , Ġfull Screen Layout . width , Ġfull Screen Layout . height ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user Call Out Ġ== Ġnull Ġ|| Ġuser Call Out Ġ!= Ġr tc User ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Call Out Ġ= Ġr tc User ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Video List Opt Area ( start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Overlay Manager . set Shown ( Room Overlay Manager . AREA _ ID _ VIDEO _ OP _ CALL _ OUT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Call Out And Notify () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClose S peak ( position : ĠInt , Ġitem Data : ĠR tc User ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . close S peak ( item Data . user UUID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvideo List Binding . video List . layout Manager Ġ= ĠLinearLayoutManager ( activity ) ĊĠĠĠĠĠĠĠ Ġvideo List Binding . video List . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġvideo List Binding . video List . addItem Decoration ( Padding Item Decoration ( vertical Ġ= Ġactivity . dp 2 px ( 4 ))) ĊĊĠĠĠĠĠĠĠ Ġvideo Area Animator Ġ= ĠSimple Animator ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate Ġ= Ġ:: update Video Container , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Show Start Ġ= Ġ{ Ġvideo List Binding . root . isVisible Ġ= Ġtrue Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Hide End Ġ= Ġ{ Ġvideo List Binding . root . isVisible Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġfull Screen Animator Ġ= ĠSimple Animator ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate Ġ= Ġ:: update View , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Show Start Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Binding . root . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Binding . full Video View . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Call Out ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Video Controller . enter FullScreen ( rtc UID ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Binding . full Video Disable Layout . isVisible Ġ= Ġ! video Open ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Video Controller . update FullScreen Video ( full Screen Binding . full Video View , Ġr tc UID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Binding . full Screen Avatar . load ( avatar URL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross fade ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformations ( Circle Crop Transformation ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Show End Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Binding . full Video Opt Area . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Hide Start Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Binding . full Video Opt Area . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Hide End Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Binding . root . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Binding . full Video View . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Binding . full Video Disable Layout . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Video Controller . exit FullScreen () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Call Out ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . update Video View ( rtc UID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuser Call Out Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Call Out And Notify () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget View Rect ( view : ĠView , Ġanchor View : ĠView ): ĠRect Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= ĠInt Array ( 2 ) ĊĠĠĠĠĠĠĠ Ġview . getLocation On Screen ( array ) ĊĊĠĠĠĠĠĠĠ Ġval Ġarray P Ġ= ĠInt Array ( 2 ) ĊĠĠĠĠĠĠĠ Ġanchor View . getLocation On Screen ( array P ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 0 ] Ġ- Ġarray P [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 1 ] Ġ- Ġarray P [ 1 ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 0 ] Ġ- Ġarray P [ 0 ] Ġ+ Ġview . width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 1 ] Ġ- Ġarray P [ 1 ] Ġ+ Ġview . height ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Video List Opt Area () Ġ{ ĊĠĠĠĠĠĠĠ Ġvideo List Binding . video List Opt Area . isVisible Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Video List Opt Area ( video Area : ĠRect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvideo List Binding . video List Opt Area . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlp Ġ= Ġlayout Params Ġas ĠFrame Layout . LayoutParams ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlp . top Margin Ġ= Ġvideo Area . bottom . coerce At Most ( max Top Margin ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params Ġ= Ġlp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Visible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate Call Out User () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmax Top Margin (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvideo List Binding . video List . height Ġ- Ġactivity . resources . get Dimension Pixel Size ( R . dim en . room _ class _ button _ size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠæĽ´æĸ° æĺ¾ç¤º æµ ® çªĹ åıĬ åħ¨ å±ı æĮīéĴ® çĬ¶æĢģ ĊĠĠĠ Ġprivate Ġfun Ġupdate Call Out User () Ġ= Ġuser Call Out ?. run Ġ{ ĊĠĠĠĠĠĠĠ Ġvideo List Binding . video Opt . isSelected Ġ= Ġvideo Open ĊĠĠĠĠĠĠĠ Ġvideo List Binding . audio Opt . isSelected Ġ= Ġaudio Open ĊĠĠĠĠĠĠĠ Ġfull Screen Binding . full Video Opt . isSelected Ġ= Ġvideo Open ĊĠĠĠĠĠĠĠ Ġfull Screen Binding . full Audio Opt . isSelected Ġ= Ġaudio Open ĊĊĠĠĠĠĠĠĠ Ġif Ġ( full Screen Binding . full Video View . isVisible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Screen Binding . full Video Disable Layout . isVisible Ġ= Ġ! video Open ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Call Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġuser Call Out Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġhide Video List Opt Area () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Call Out And Notify () Ġ{ ĊĠĠĠĠĠĠĠ Ġclear Call Out () ĊĠĠĠĠĠĠĠ ĠRoom Overlay Manager . set Shown ( Room Overlay Manager . AREA _ ID _ VIDEO _ OP _ CALL _ OUT , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġstart Ġ= ĠRect () ĊĠĠĠ Ġprivate Ġvar Ġend Ġ= ĠRect () ĊĠĠĠ Ġprivate Ġvar Ġuser Call Out : ĠR tc User ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġupdate View ( value : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġstart . left Ġ+ Ġ( end . left Ġ- Ġstart . left ) Ġ* Ġvalue ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġstart . right Ġ+ Ġ( end . right Ġ- Ġstart . right ) Ġ* Ġvalue ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġstart . top Ġ+ Ġ( end . top Ġ- Ġstart . top ) Ġ* Ġvalue ĊĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġstart . bottom Ġ+ Ġ( end . bottom Ġ- Ġstart . bottom ) Ġ* Ġvalue ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" left :$ left , right :$ right , top :$ top , bottom :$ bottom ") ĊĊĠĠĠĠĠĠĠ Ġfull Screen Binding . full Video View . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlp Ġ= Ġlayout Params Ġas ĠViewGroup . Margin LayoutParams ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlp . width Ġ= Ġ( right Ġ- Ġleft ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlp . height Ġ= Ġ( bottom Ġ- Ġtop ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlp . left Margin Ġ= Ġleft . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlp . top Margin Ġ= Ġtop . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params Ġ= Ġlp ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfull Screen Binding . full Video Disable Layout . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlp Ġ= Ġlayout Params Ġas ĠViewGroup . Margin LayoutParams ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlp . width Ġ= Ġ( right Ġ- Ġleft ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlp . height Ġ= Ġ( bottom Ġ- Ġtop ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlp . left Margin Ġ= Ġleft . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlp . top Margin Ġ= Ġtop . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params Ġ= Ġlp ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfull Screen Binding . full Screen Avatar . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize From Ġ= Ġactivity . resources . get Dimension Pixel Size ( R . dim en . room _ class _ video _ user _ avatar _ size _ normal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize To Ġ= Ġactivity . resources . get Dimension Pixel Size ( R . dim en . room _ class _ video _ user _ avatar _ size _ fullscreen ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlp Ġ= Ġlayout Params Ġas ĠViewGroup . Margin LayoutParams ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlp . width Ġ= Ġ( size From Ġ+ Ġsize To Ġ* Ġvalue ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlp . height Ġ= Ġ( size From Ġ+ Ġsize To Ġ* Ġvalue ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params Ġ= Ġlp ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy ( owner : ĠLifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġr tc Api . leave Channel () ĊĠĠĠĠĠĠĠ Ġr tc Api . removeEventListener ( event Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Permission ( action After Permission : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpermissions Ġ= ĠREQUEST ED _ PERMISSION S . filter Ġ{ Ġpermission Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠ Ġ}. to Typed Array () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( permissions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction After Permission () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" check Permission Ġrequest Ġ$ permissions ") ĊĠĠĠĠĠĠĠ Ġactivity . register For Activity Result ( Activity Result Contracts . Request Multiple Permissions ()) Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Granted Ġ= Ġit . map NotNull Ġ{ Ġit . key Ġ}. size Ġ== Ġit . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( all Granted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction After Permission () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . show Toast (" Permission ĠNot ĠGr anted ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. launch ( permissions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġr tc Api . addEventListener ( event Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġevent Listener Ġ= Ġobject Ġ: ĠRTC EventListener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon User Offline ( uid : ĠInt , Ġreason : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on User Offline Ġuid : Ġ$ uid Ġreason : Ġ$ reason ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Video Controller . handle Offline ( uid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon User Joined ( uid : ĠInt , Ġelapsed : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on User Joined Ġuid : Ġ$ uid Ġelapsed : Ġ$ elapsed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr tc Video Controller . handler Joined ( uid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ