/* Ċ Ġ* ĠCopyright ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ Ċ package Ġcom . amazonaws . services . ch ime . sdk demo . fragment Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . media . projection . Media Projection Manager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Power Manager Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . input method . Editor Info Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . EditText Ċ import Ġandroid . widget . Image Button Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . analytics . Event Analytics Observer Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . analytics . Event Attributes Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . analytics . Event Name Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . analytics . toJson String Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . At tendee Info Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . Audio Video Facade Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . Audio Video Observer Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . Signal Update Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . Volume Update Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . audio . act ives peaker detector . Active Speaker Observer Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . audio . act ives peaker policy . Default Active Speaker Policy Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . content share . Content Share Observer Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . content share . Content Share Status Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . metric . Metrics Observer Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . metric . Observable Metric Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . video . Video Pause State Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . video . Video Tile Observer Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . video . Video Tile State Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . video . capture . Camera Capture Source Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . video . capture . Capture Source Error Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . video . capture . Capture Source Observer Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . video . capture . Default Screen Capture Source Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . video . capture . Default Surface Texture Capture Source Factory Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . audio video . video . gl . E gl Core Factory Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . device . Device Change Observer Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . device . Media Device Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . device . Media DeviceType Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . realtime . Realtime Observer Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . realtime . dat ame ssage . Data Message Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . realtime . dat ame ssage . Data Message Observer Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . session . Meeting Session Credentials Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . session . Meeting Session Status Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . session . Meeting Session StatusCode Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . utils . Default Modal ity Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . utils . Modal ity Type Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . utils . logger . Console Logger Ċ import Ġcom . amazonaws . services . ch ime . sdk . meet ings . utils . logger . LogLevel Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . R Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . activity . Home Activity Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . activity . Meeting Activity Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . adapter . Device Adapter Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . adapter . Message Adapter Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . adapter . Metric Adapter Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . adapter . R oster Adapter Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . adapter . Video Adapter Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . data . Message Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . data . Metric Data Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . data . R oster At tendee Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . data . Video Collection Tile Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . device . Audio Device Manager Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . device . Screen Share Manager Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . model . Meeting Model Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . service . Screen Capture Service Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . utils . Cpu Video Processor Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . utils . Gpu Video Processor Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . utils . Post Logger Ċ import Ġcom . amazonaws . services . ch ime . sdk demo . utils . is Land scape Mode Ċ import Ġcom . google . android . material . tabs . Tab Layout Ċ import Ġcom . google . gson . Gson Ċ import Ġjava . util . Calendar Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ Ċ class ĠMeeting Fragment Ġ: ĠFragment (), ĊĠĠĠ ĠReal time Observer , ĠAudio Video Observer , ĠVideo Tile Observer , ĊĠĠĠ ĠMetrics Observer , ĠActive Speaker Observer , ĠDevice Change Observer , ĠData Message Observer , ĠContent Share Observer , ĠEvent Analytics Observer Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠConsole Logger ( LogLevel . DEBUG ) ĊĠĠĠ Ġprivate Ġval Ġmutex Ġ= ĠMutex () ĊĠĠĠ Ġprivate Ġval Ġui Scope Ġ= ĠCor outine Scope ( Dispatch ers . Main ) ĊĠĠĠ Ġprivate Ġval Ġmeeting Model : ĠMeeting Model Ġby Ġlazy Ġ{ ĠViewModel Provider ( this )[ Meeting Model :: class . java ] Ġ} ĊĠĠĠ Ġprivate Ġvar Ġdevice Dialog : ĠAlertDialog ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġscreen Share Manager : ĠScreen Share Manager ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġgson Ġ= ĠGson () ĊĠĠĠ Ġprivate Ġval ĠappName Ġ= Ġ" SDK Events " ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmedia Projection Manager : ĠMedia Projection Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpower Manager : ĠPower Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcredentials : ĠMeeting Session Credentials ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġaudio Video : ĠAudio Video Facade ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera Capture Source : ĠCamera Capture Source ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgpu Video Processor : ĠG pu Video Processor ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcpu Video Processor : ĠC pu Video Processor ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġe gl Core Factory : ĠE gl Core Factory ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlistener : ĠR oster View EventListener ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpost Logger : ĠPost Logger ĊĊĠĠĠ Ġoverride Ġval Ġscore Callback Interval Ms : ĠInt ? Ġget () Ġ= Ġ 1 0 0 0 ĊĊĠĠĠ Ġprivate Ġval ĠWEB RTC _ PERMISSION _ REQUEST _ CODE Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġval ĠSCREEN _ CAPTURE _ REQUEST _ CODE Ġ= Ġ 2 ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Meeting Fragment " ĊĊĠĠĠ Ġ// ĠAppend Ġto Ġat tendee Ġname Ġif Ġit 's Ġfor Ġcontent Ġshare ĊĠĠĠ Ġprivate Ġval ĠCONTENT _ NAME _ SUFFIX Ġ= Ġ"<< Content >> " ĊĊĠĠĠ Ġprivate Ġval ĠDATA _ MESSAGE _ TOPIC Ġ= Ġ" chat " ĊĠĠĠ Ġprivate Ġval ĠDATA _ MESSAGE _ LI F ETIME _ MS Ġ= Ġ 3 0 0 0 0 0 ĊĊĠĠĠ Ġenum Ġclass ĠSub Tab ( val Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAtt ende es ( 0 ), ĊĠĠĠĠĠĠĠ ĠChat ( 1 ), ĊĠĠĠĠĠĠĠ ĠVideo ( 2 ), ĊĠĠĠĠĠĠĠ ĠScreen ( 3 ), ĊĠĠĠĠĠĠĠ ĠMetrics ( 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġno Video Or Screen Share Available : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġedit Text Message : ĠEditText ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbutton Mute : ĠImage Button ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbutton Camera : ĠImage Button ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdevice AlertDialog Builder : ĠAlertDialog . Builder ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadditional Options AlertDialog Builder : ĠAlertDialog . Builder ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġview Chat : ĠLinearLayout ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView Metrics : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView R oster : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġview Video : ĠLinearLayout ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView Video Collection : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġprev Video Page Button : ĠButton ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnext Video Page Button : ĠButton ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView Screen Share Collection : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView Messages : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdevice ListAdapter : ĠDevice Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmetrics Adapter : ĠMetric Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġro ster Adapter : ĠR oster Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġvideo Tile Adapter : ĠVideo Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġscreen Tile Adapter : ĠVideo Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmessage Adapter : ĠMessage Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtab Layout : ĠTab Layout ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġaudio Device Manager : ĠAudio Device Manager ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( meeting Id : ĠString ): ĠMeeting Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= ĠMeeting Fragment () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . arguments Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBundle (). apply Ġ{ Ġput String ( Home Activity . ME ET ING _ ID _ KEY , Ġmeeting Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfragment ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠR oster View EventListener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Leave Meeting () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attach ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attach ( context ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġis ĠR oster View EventListener ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( TAG , Ġ"$ context Ġmust Ġimplement ĠR oster View EventListener .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠClass CastException ("$ context Ġmust Ġimplement ĠR oster View EventListener .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview : ĠView Ġ= Ġinflater . inflate ( R . layout . fragment _ meeting , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġactivity Ġas ĠContext ĊĊĠĠĠĠĠĠĠ Ġcredentials Ġ= Ġ( activity Ġas ĠMeeting Activity ). get Meeting Session Credentials () ĊĠĠĠĠĠĠĠ Ġaudio Video Ġ= Ġactivity . get Audio Video () ĊĠĠĠĠĠĠĠ Ġe gl Core Factory Ġ= Ġactivity . get E gl Core Factory () ĊĠĠĠĠĠĠĠ Ġcamera Capture Source Ġ= Ġactivity . get Camera Capture Source () ĊĠĠĠĠĠĠĠ Ġgpu Video Processor Ġ= Ġactivity . get Gpu Video Processor () ĊĠĠĠĠĠĠĠ Ġcpu Video Processor Ġ= Ġactivity . getC pu Video Processor () ĊĠĠĠĠĠĠĠ Ġscreen Share Manager Ġ= Ġactivity . get Screen Share Manager () ĊĠĠĠĠĠĠĠ Ġaudio Device Manager Ġ= ĠAudio Device Manager ( audio Video ) ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġif Ġ( getString ( R . string . test _ url ). endsWith ("/ ")) ĠgetString ( R . string . test _ url ) Ġelse Ġ"${ getString ( R . string . test _ url ) }/ " ĊĠĠĠĠĠĠĠ Ġpost Logger Ġ= ĠPost Logger ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠappName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . get Meeting Session Configuration (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ url } log _ meeting _ event ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogLevel . INFO ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġmedia Projection Manager Ġ= Ġactivity . getSystem Service ( Context . MEDIA _ PRO JECTION _ SERVICE ) Ġas ĠMedia Projection Manager ĊĠĠĠĠĠĠĠ Ġpower Manager Ġ= Ġactivity . getSystem Service ( Context . POWER _ SERVICE ) Ġas ĠPower Manager ĊĊĠĠĠĠĠĠĠ Ġview . findViewById < TextView >( R . id . textView Meeting Id )?. text Ġ= Ġarguments ?. getString ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHome Activity . ME ET ING _ ID _ KEY ĊĠĠĠĠĠĠĠ Ġ) Ġas ĠString ĊĠĠĠĠĠĠĠ Ġsetup Buttons Bar ( view ) ĊĠĠĠĠĠĠĠ Ġsetup Sub Views ( view ) ĊĠĠĠĠĠĠĠ Ġsetup Tab ( view ) ĊĠĠĠĠĠĠĠ Ġsetup Audio Device Selection Dialog () ĊĠĠĠĠĠĠĠ Ġsetup Additional Options Dialog () ĊĊĠĠĠĠĠĠĠ Ġno Video Or Screen Share Available Ġ= Ġview . findViewById ( R . id . no Video Or Screen Share Available ) ĊĠĠĠĠĠĠĠ Ġrefresh No Videos Or Screen Share Available Text () ĊĊĠĠĠĠĠĠĠ Ġselect Tab ( meeting Model . tab Index ) ĊĠĠĠĠĠĠĠ Ġsubscribe To At tendee Change Handlers () ĊĠĠĠĠĠĠĠ Ġaudio Video . start () ĊĠĠĠĠĠĠĠ Ġaudio Video . start Remote Video () ĊĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Buttons Bar ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbutton Mute Ġ= Ġview . findViewById ( R . id . button Mute ) ĊĠĠĠĠĠĠĠ Ġbutton Mute . setImage Resource ( if Ġ( meeting Model . is Mut ed ) ĠR . drawable . button _ mute _ on Ġelse ĠR . drawable . button _ mute ) ĊĠĠĠĠĠĠĠ Ġbutton Mute . setOnClickListener Ġ{ Ġtoggle Mute () Ġ} ĊĊĠĠĠĠĠĠĠ Ġbutton Camera Ġ= Ġview . findViewById ( R . id . button Camera ) ĊĠĠĠĠĠĠĠ Ġbutton Camera . setImage Resource ( if Ġ( meeting Model . is Camera On ) ĠR . drawable . button _ camera _ on Ġelse ĠR . drawable . button _ camera ) ĊĠĠĠĠĠĠĠ Ġbutton Camera . setOnClickListener Ġ{ Ġtoggle Video () Ġ} ĊĊĠĠĠĠĠĠĠ Ġview . findViewById < Image Button >( R . id . button More ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . setOnClickListener Ġ{ Ġtoggle Additional Options Menu () Ġ} ĊĊĠĠĠĠĠĠĠ Ġview . findViewById < Image Button >( R . id . button Speaker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . setOnClickListener Ġ{ Ġtoggle Speaker () Ġ} ĊĊĠĠĠĠĠĠĠ Ġview . findViewById < Image Button >( R . id . button Leave ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . setOnClickListener Ġ{ Ġend Meeting () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Sub Views ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠR oster ĊĠĠĠĠĠĠĠ Ġre cyclerView R oster Ġ= Ġview . findViewById ( R . id . re cyclerView R oster ) ĊĠĠĠĠĠĠĠ Ġre cyclerView R oster . layout Manager Ġ= ĠLinearLayoutManager ( activity ) ĊĠĠĠĠĠĠĠ Ġro ster Adapter Ġ= ĠR oster Adapter ( meeting Model . current R oster . values ) ĊĠĠĠĠĠĠĠ Ġre cyclerView R oster . adapter Ġ= Ġro ster Adapter ĊĠĠĠĠĠĠĠ Ġre cyclerView R oster . visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠ Ġ// ĠVideo Ġ( camera Ġ& Ġcontent ) ĊĠĠĠĠĠĠĠ Ġview Video Ġ= Ġview . findViewById ( R . id . sub View Video ) ĊĠĠĠĠĠĠĠ Ġview Video . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠ Ġprev Video Page Button Ġ= Ġview . findViewById ( R . id . prev Video Page Button ) ĊĠĠĠĠĠĠĠ Ġprev Video Page Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . can Go To Prev Video Page ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current Video Page Index Ġ-= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Video Page Updated () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnext Video Page Button Ġ= Ġview . findViewById ( R . id . next Video Page Button ) ĊĠĠĠĠĠĠĠ Ġnext Video Page Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . can Go To Next Video Page ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current Video Page Index Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Video Page Updated () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġre cyclerView Video Collection Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . findViewById ( R . id . re cyclerView Video Collection ) ĊĠĠĠĠĠĠĠ Ġre cyclerView Video Collection . layout Manager Ġ= Ġcreate Linear LayoutManager For Orientation () ĊĠĠĠĠĠĠĠ Ġvideo Tile Adapter Ġ= ĠVideo Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . video States In Current Page , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . user Paused Video Tile Ids , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Capture Source , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġre cyclerView Video Collection . adapter Ġ= Ġvideo Tile Adapter ĊĊĠĠĠĠĠĠĠ Ġre cyclerView Screen Share Collection Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . findViewById ( R . id . re cyclerView Screen Share Collection ) ĊĠĠĠĠĠĠĠ Ġre cyclerView Screen Share Collection . layout Manager Ġ= ĠLinearLayoutManager ( activity ) ĊĠĠĠĠĠĠĠ Ġscreen Tile Adapter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVideo Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current Screen Tiles , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . user Paused Video Tile Ids , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġre cyclerView Screen Share Collection . adapter Ġ= Ġscreen Tile Adapter ĊĠĠĠĠĠĠĠ Ġre cyclerView Screen Share Collection . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠ Ġre cyclerView Metrics Ġ= Ġview . findViewById ( R . id . re cyclerView Metrics ) ĊĠĠĠĠĠĠĠ Ġre cyclerView Metrics . layout Manager Ġ= ĠLinearLayoutManager ( activity ) ĊĠĠĠĠĠĠĠ Ġmetrics Adapter Ġ= ĠMetric Adapter ( meeting Model . current Metrics . values ) ĊĠĠĠĠĠĠĠ Ġre cyclerView Metrics . adapter Ġ= Ġmetrics Adapter ĊĠĠĠĠĠĠĠ Ġre cyclerView Metrics . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠ Ġ// ĠChat ĊĠĠĠĠĠĠĠ Ġview Chat Ġ= Ġview . findViewById ( R . id . sub View Chat ) ĊĠĠĠĠĠĠĠ Ġre cyclerView Messages Ġ= Ġview . findViewById ( R . id . re cyclerView Messages ) ĊĠĠĠĠĠĠĠ Ġre cyclerView Messages . layout Manager Ġ= ĠLinearLayoutManager ( activity ) ĊĠĠĠĠĠĠĠ Ġmessage Adapter Ġ= ĠMessage Adapter ( meeting Model . current Messages ) ĊĠĠĠĠĠĠĠ Ġre cyclerView Messages . adapter Ġ= Ġmessage Adapter ĊĊĠĠĠĠĠĠĠ Ġedit Text Message Ġ= Ġview . findViewById ( R . id . edit Text Chat Box ) ĊĠĠĠĠĠĠĠ Ġedit Text Message . setOn Editor ActionListener Ġ{ Ġ_, Ġaction Id , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Editor ActionListener Ġwhen Ġ( action Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEditor Info . IME _ ACTION _ SEND Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview . findViewById < Image Button >( R . id . button Submit Message )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setOnClickListener Ġ{ ĠsendMessage () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview Chat . visibility Ġ= ĠView . GONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Tab ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtab Layout Ġ= Ġview . findViewById ( R . id . tab Layout Meeting View ) ĊĠĠĠĠĠĠĠ ĠSub Tab . values (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtab Layout . add Tab ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab Layout . new Tab (). setText ( it . name ). setContent Description ("${ it . name } ĠTab ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtab Layout . add On Tab Selected Listener ( object Ġ: ĠTab Layout . On Tab Selected Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tab Selected ( tab : ĠTab Layout . Tab ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow View At ( tab ?. position Ġ?: ĠSub Tab . At tendees . position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tab Re selected ( tab : ĠTab Layout . Tab ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tab Un selected ( tab : ĠTab Layout . Tab ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tab ?. position Ġ== ĠSub Tab . Video . position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause All Remote Videos () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Video Surface Views Visibility ( View . GONE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( tab ?. position Ġ== ĠSub Tab . Screen . position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause All Content Shares () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Screen Surface Views Visibility ( View . GONE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Video Surface Views Visibility ( visibility : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmeeting Model . local Video Tile State ?. set Render View Visibility ( visibility ) ĊĠĠĠĠĠĠĠ Ġmeeting Model . remote Video Tile States . forEach Ġ{ Ġit . set Render View Visibility ( visibility ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Screen Surface Views Visibility ( visibility : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmeeting Model . current Screen Tiles . forEach Ġ{ Ġit . set Render View Visibility ( visibility ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow View At ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġre cyclerView R oster . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġview Chat . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġview Video . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġre cyclerView Screen Share Collection . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġre cyclerView Metrics . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠ Ġmeeting Model . tab Index Ġ= Ġindex ĊĠĠĠĠĠĠĠ Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Tab . At tendees . position Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView R oster . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Tab . Chat . position Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Chat . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll To Last Message () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Tab . Video . position Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Video . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Video Surface Views Visibility ( View . VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Video Page Updated () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Tab . Screen . position Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Screen Share Collection . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Screen Surface Views Visibility ( View . VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresume All Content Shares Except User Paused Videos () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub Tab . Metrics . position Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Metrics . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrefresh No Videos Or Screen Share Available Text () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect Tab ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtab Layout . select Tab ( tab Layout . get Tab At ( index )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Linear LayoutManager For Orientation (): ĠLinearLayoutManager Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Land scape Mode ( activity )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayoutManager ( activity , ĠLinearLayoutManager . HORIZONTAL , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayoutManager ( activity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Audio Device Selection Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġmeeting Model . current Media Devices Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . list Audio Devices (). filter Ġ{ Ġdevice Ġ-> Ġdevice . type Ġ!= ĠMedia DeviceType . OTHER Ġ} ĊĠĠĠĠĠĠĠ Ġdevice ListAdapter Ġ= ĠDevice Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . layout . simple _ list _ item _ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current Media Devices , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Device Manager ) ĊĠĠĠĠĠĠĠ Ġdevice AlertDialog Builder Ġ= ĠAlertDialog . Builder ( activity ) ĊĠĠĠĠĠĠĠ Ġdevice AlertDialog Builder . setTitle ( R . string . alert _ title _ choose _ audio ) ĊĠĠĠĠĠĠĠ Ġdevice AlertDialog Builder . set Negative Button ( R . string . cancel ) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . is Device List Dialog On Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdevice AlertDialog Builder . setAdapter ( device ListAdapter ) Ġ{ Ġ_, Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . choose Audio Device ( meeting Model . current Media Devices [ which ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Device Manager . setActive Audio Device ( meeting Model . current Media Devices [ which ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . is Device List Dialog On Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdevice AlertDialog Builder . setOn Cancel Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . is Device List Dialog On Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . is Device List Dialog On ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Dialog Ġ= Ġdevice AlertDialog Builder . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Dialog ?. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Additional Options Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġadditional Options AlertDialog Builder Ġ= ĠAlertDialog . Builder ( activity ) ĊĠĠĠĠĠĠĠ Ġadditional Options AlertDialog Builder . setTitle ( R . string . alert _ title _ additional _ options ) ĊĠĠĠĠĠĠĠ Ġadditional Options AlertDialog Builder . set Negative Button ( R . string . cancel ) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . is Additional Options Dialog On Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadditional Options AlertDialog Builder . setOn Dismiss Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . is Additional Options Dialog On Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . is Additional Options Dialog On ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Options AlertDialog Builder . create (). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh Additional Options Dialog Items () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Voice Focus Enabled Ġ= Ġaudio Video . realtime Is Voice Focus Enabled () ĊĊĠĠĠĠĠĠĠ Ġval Ġadditional Toggle s Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. getString ( if Ġ( meeting Model . is Sharing Content ) ĠR . string . disable _ screen _ capture _ source Ġelse ĠR . string . enable _ screen _ capture _ source ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. getString ( if Ġ( is Voice Focus Enabled ) ĠR . string . disable _ voice _ focus Ġelse ĠR . string . enable _ voice _ focus ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. getString ( if Ġ( camera Capture Source . torch Enabled ) ĠR . string . disable _ flash light Ġelse ĠR . string . enable _ flash light ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. getString ( if Ġ( meeting Model . is Using Cpu Video Processor ) ĠR . string . disable _ cpu _ filter Ġelse ĠR . string . enable _ cpu _ filter ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. getString ( if Ġ( meeting Model . is Using Gpu Video Processor ) ĠR . string . disable _ gpu _ filter Ġelse ĠR . string . enable _ gpu _ filter ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. getString ( if Ġ( meeting Model . is Using Camera Capture Source ) ĠR . string . disable _ custom _ capture _ source Ġelse ĠR . string . enable _ custom _ capture _ source ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġadditional Options AlertDialog Builder . set Items ( additional Toggle s ) Ġ{ Ġ_, Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( which ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġtoggle Screen Capture () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġset Voice Focus Enabled (! is Voice Focus Enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġtoggle Flash light () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġtoggle Cpu Demo Filter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> Ġtoggle Gpu Demo Filter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 Ġ-> Ġtoggle Custom Capture Source () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Audio Device Changed ( fresh Audio Device List : ĠList < Media Device >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmeeting Model . current Media Devices Ġ= Ġfresh Audio Device List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġdevice Ġ-> Ġdevice . type Ġ!= ĠMedia DeviceType . OTHER Ġ} ĊĠĠĠĠĠĠĠ Ġaudio Device Manager . re configure Active Audio Device () ĊĠĠĠĠĠĠĠ Ġdevice ListAdapter . clear () ĊĠĠĠĠĠĠĠ Ġdevice ListAdapter . addAll ( meeting Model . current Media Devices ) ĊĠĠĠĠĠĠĠ Ġdevice ListAdapter . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Volume Changed ( volume Updates : ĠArray < Volume Update >) Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Updates . forEach Ġ{ Ġ( at tendee Info , Ġvolume Level ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current R oster [ at tendee Info . at tendee Id ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current R oster [ at tendee Info . at tendee Id ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR oster At tendee ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . at tendee Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . at tendee Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Level , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . signal Strength , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isActive Speaker ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġro ster Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Signal Strength Changed ( signal Updates : ĠArray < Signal Update >) Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Updates . forEach Ġ{ Ġ( at tendee Info , Ġsignal Strength ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Signal Strength Changed ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ at tendee Info . external UserId } Ġ$ signal Strength ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogLevel . DEBUG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current R oster [ at tendee Info . at tendee Id ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current R oster [ at tendee Info . at tendee Id ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR oster At tendee ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . at tendee Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . at tendee Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . volume Level , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Strength , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isActive Speaker ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġro ster Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon At tendees Joined ( at tendee Info : ĠArray < At tendee Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat tendee Info . forEach Ġ{ Ġ( at tendee Id , Ġexternal UserId ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Default Modal ity ( at tendee Id ). has Modal ity ( Modal ity Type . Content ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! is Self At tendee ( at tendee Id ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . is Sharing Content ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . stop Content Share () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Share Manager ?. stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġmeeting Model . current R oster [ Default Modal ity ( at tendee Id ). base ()] ?. at tendee Name Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Handler ("$ name Ġtook Ġover Ġthe Ġscreen Ġshare ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current R oster . get Or Put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat tendee Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR oster At tendee ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat tendee Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget At tendee Name ( at tendee Id , Ġexternal UserId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġro ster Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon At tendees Left ( at tendee Info : ĠArray < At tendee Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat tendee Info . forEach Ġ{ Ġ( at tendee Id , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current R oster . remove ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat tendee Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġro ster Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon At tendees Dropped ( at tendee Info : ĠArray < At tendee Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġat tendee Info . forEach Ġ{ Ġ(_, Ġexternal UserId ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Handler ("$ external UserId Ġdropped ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{} . java Class . enc lo sing Method ?. name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ external UserId Ġdropped " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat tendee Info . forEach Ġ{ Ġ( at tendee Id , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current R oster . remove ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat tendee Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġro ster Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon At tendees Mut ed ( at tendee Info : ĠArray < At tendee Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġat tendee Info . forEach Ġ{ Ġ( at tendee Id , Ġexternal UserId ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{} . java Class . enc lo sing Method ?. name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" At tendee Ġwith Ġat tendee Id Ġ$ at tendee Id Ġand Ġexternal UserId Ġ$ external UserId Ġmut ed " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon At tendees Un muted ( at tendee Info : ĠArray < At tendee Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġat tendee Info . forEach Ġ{ Ġ( at tendee Id , Ġexternal UserId ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" At tendee Ġwith Ġat tendee Id Ġ$ at tendee Id Ġand Ġexternal UserId Ġ$ external UserId Ġun muted " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Active Speaker Detected ( at tendee Info : ĠArray < At tendee Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġneed Update Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactive S peak ers Ġ= Ġat tendee Info . map Ġ{ Ġit . at tendee Id Ġ}. toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current R oster . values . forEach Ġ{ Ġat tendee Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active S peak ers . contains ( at tendee . at tendee Id ) Ġ!= Ġat tendee . isActive Speaker ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current R oster [ at tendee . at tendee Id ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR oster At tendee ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat tendee . at tendee Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat tendee . at tendee Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat tendee . volume Level , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat tendee . signal Strength , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! at tendee . isActive Speaker ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġneed Update Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( need Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . update Remote Video States Based On Active S peak ers ( at tendee Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Video Page Updated () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġro ster Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Active Speaker Score Changed ( scores : ĠMap < At tendee Info , ĠDouble >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscores Str Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscores . map Ġ{ Ġentry Ġ-> Ġ"${ entry . key . external UserId }: Ġ${ entry . value }" Ġ}. join ToString (",") ĊĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{} . java Class . enc lo sing Method ?. name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscores Str , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogLevel . DEBUG ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget At tendee Name ( at tendee Id : ĠString , Ġexternal UserId : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġat tendee Name Ġ= Ġexternal UserId . split ('# ')[ 1 ] ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Default Modal ity ( at tendee Id ). has Modal ity ( Modal ity Type . Content )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ at tendee Name Ġ$ CONTENT _ NAME _ SUFFIX " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat tendee Name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Mute () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . is Mut ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . realtime Local Un mute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Mute . setImage Resource ( R . drawable . button _ mute ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . realtime Local Mute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Mute . setImage Resource ( R . drawable . button _ mute _ on ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmeeting Model . is Mut ed Ġ= Ġ! meeting Model . is Mut ed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Speaker () Ġ{ ĊĠĠĠĠĠĠĠ Ġmeeting Model . current Media Devices Ġ= Ġaudio Video . list Audio Devices (). filter Ġ{ Ġit . type Ġ!= ĠMedia DeviceType . OTHER Ġ} ĊĠĠĠĠĠĠĠ Ġdevice ListAdapter . clear () ĊĠĠĠĠĠĠĠ Ġdevice ListAdapter . addAll ( meeting Model . current Media Devices ) ĊĠĠĠĠĠĠĠ Ġdevice ListAdapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġdevice Dialog Ġ= Ġdevice AlertDialog Builder . create () ĊĠĠĠĠĠĠĠ Ġdevice Dialog ?. show () ĊĠĠĠĠĠĠĠ Ġmeeting Model . is Device List Dialog On Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Voice Focus Enabled ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġif Ġ( enabled ) Ġ" enable " Ġelse Ġ" disable " ĊĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġaudio Video . realtime Set Voice Focus Enabled ( enabled ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Handler (" Voice ĠFocus Ġ${ action } d ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Handler (" Failed Ġto Ġ$ action ĠVoice ĠFocus ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Video () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . is Camera On ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Local Video () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Local Video () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmeeting Model . is Camera On Ġ= Ġ! meeting Model . is Camera On ĊĠĠĠĠĠĠĠ Ġrefresh No Videos Or Screen Share Available Text () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Additional Options Menu () Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh Additional Options Dialog Items () ĊĠĠĠĠĠĠĠ Ġadditional Options AlertDialog Builder . create () ĊĠĠĠĠĠĠĠ Ġadditional Options AlertDialog Builder . show () ĊĠĠĠĠĠĠĠ Ġmeeting Model . is Additional Options Dialog On Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Flash light () Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" To g gling Ġflash light Ġfrom Ġ${ camera Capture Source . torch Enabled } Ġto Ġ${ ! camera Capture Source . torch Enabled }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! meeting Model . is Using Camera Capture Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( TAG , Ġ" Cannot Ġtoggle Ġflash light Ġwithout Ġusing Ġcustom Ġcamera Ġcapture Ġsource ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . user _ notification _ flash light _ custom _ source _ error ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdesired Flash light Enabled Ġ= Ġ! camera Capture Source . torch Enabled ĊĠĠĠĠĠĠĠ Ġcamera Capture Source . torch Enabled Ġ= Ġdesired Flash light Enabled ĊĠĠĠĠĠĠĠ Ġif Ġ( camera Capture Source . torch Enabled Ġ!= Ġdesired Flash light Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( TAG , Ġ" Flash light Ġfailed Ġto Ġtoggle ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . user _ notification _ flash light _ un available _ error ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Cpu Demo Filter () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! meeting Model . is Using Camera Capture Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( TAG , Ġ" Cannot Ġtoggle Ġfilter Ġwithout Ġusing Ġcustom Ġcamera Ġcapture Ġsource ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . user _ notification _ filter _ custom _ source _ error ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . is Using Gpu Video Processor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( TAG , Ġ" Cannot Ġtoggle Ġfilter Ġwhen Ġother Ġfilter Ġis Ġenabled ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . user _ notification _ filter _ both _ enabled _ error ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" To g gling ĠCPU Ġdemo Ġfilter Ġfrom Ġ$ meeting Model . is Using Cpu Video Processor Ġto Ġ${ ! meeting Model . is Using Cpu Video Processor }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmeeting Model . is Using Cpu Video Processor Ġ= Ġ! meeting Model . is Using Cpu Video Processor ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . is Local Video Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Local Video () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Gpu Demo Filter () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! meeting Model . is Using Camera Capture Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( TAG , Ġ" Cannot Ġtoggle Ġfilter Ġwithout Ġusing Ġcustom Ġcamera Ġcapture Ġsource ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . user _ notification _ filter _ custom _ source _ error ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . is Using Cpu Video Processor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( TAG , Ġ" Cannot Ġtoggle Ġfilter Ġwhen Ġother Ġfilter Ġis Ġenabled ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . user _ notification _ filter _ both _ enabled _ error ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" To g gling ĠGPU Ġdemo Ġfilter Ġfrom Ġ$ meeting Model . is Using Gpu Video Processor Ġto Ġ${ ! meeting Model . is Using Gpu Video Processor }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmeeting Model . is Using Gpu Video Processor Ġ= Ġ! meeting Model . is Using Gpu Video Processor ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . is Local Video Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Local Video () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Custom Capture Source () Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" To g gling Ġusing Ġcustom Ġcamera Ġsource Ġfrom Ġ$ meeting Model . is Using Camera Capture Source Ġto Ġ${ ! meeting Model . is Using Camera Capture Source }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġwas Using Camera Capture Source Ġ= Ġmeeting Model . is Using Camera Capture Source ĊĠĠĠĠĠĠĠ Ġmeeting Model . is Using Camera Capture Source Ġ= Ġ! meeting Model . is Using Camera Capture Source ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . is Local Video Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( was Using Camera Capture Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Capture Source . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Local Video () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Screen Capture () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . is Sharing Content ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . stop Content Share () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Share Manager ?. stop () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Projection Manager . create Screen Capture Intent (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSCREEN _ CAPTURE _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh No Videos Or Screen Share Available Text () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . tab Index Ġ== ĠSub Tab . Video . position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . video States In Current Page . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Video Or Screen Share Available . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Video Or Screen Share Available . text Ġ= ĠgetString ( R . string . no _ videos _ available ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Video Or Screen Share Available . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( meeting Model . tab Index Ġ== ĠSub Tab . Screen . position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . current Screen Tiles . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Video Or Screen Share Available . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Video Or Screen Share Available . text Ġ= ĠgetString ( R . string . no _ screen _ share _ available ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Video Or Screen Share Available . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno Video Or Screen Share Available . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Local Video () Ġ{ ĊĠĠĠĠĠĠĠ Ġmeeting Model . is Local Video Started Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . is Using Camera Capture Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . is Using Gpu Video Processor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Capture Source . add Video Sink ( gpu Video Processor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . start Local Video ( gpu Video Processor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( meeting Model . is Using Cpu Video Processor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Capture Source . add Video Sink ( cpu Video Processor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . start Local Video ( cpu Video Processor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . start Local Video ( camera Capture Source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Capture Source . start () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . start Local Video () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbutton Camera . setImage Resource ( R . drawable . button _ camera _ on ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Local Video () Ġ{ ĊĠĠĠĠĠĠĠ Ġmeeting Model . is Local Video Started Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . is Using Camera Capture Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Capture Source . stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaudio Video . stop Local Video () ĊĠĠĠĠĠĠĠ Ġbutton Camera . setImage Resource ( R . drawable . button _ camera ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Video Page Updated () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRe calculate Ġvideos Ġin Ġthe Ġcurrent Ġpage Ġand Ġnotify Ġvideo Tile Adapter ĊĠĠĠĠĠĠĠ Ġmeeting Model . update Video States In Current Page () ĊĠĠĠĠĠĠĠ Ġre validate Video Page Index () ĊĠĠĠĠĠĠĠ Ġvideo Tile Adapter . notify DataSet Changed () ĊĊĠĠĠĠĠĠĠ Ġ// ĠPause / Resume Ġremote Ġvideos Ġaccordingly Ġbased Ġon Ġvideo Tile State Ġand Ġthe Ġtab Ġthat Ġuser Ġis Ġon ĊĠĠĠĠĠĠĠ Ġmeeting Model . remote Video Tile States . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠResume Ġpaused Ġvideos Ġin Ġthe Ġcurrent Ġpage Ġif Ġuser Ġis Ġon ĠVideo Ġtab Ġand Ġit Ġwas Ġnot Ġmanually Ġpaused Ġby Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . tab Index Ġ== ĠSub Tab . Video . position Ġ&& Ġmeeting Model . video States In Current Page . contains ( it ) Ġ&& Ġ! meeting Model . user Paused Video Tile Ids . contains ( it . video Tile State . tile Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . video Tile State . pause State Ġ== ĠVideo Pause State . Paused By UserRequest ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . resume Remote Video Tile ( it . video Tile State . tile Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . video Tile State . pause State Ġ!= ĠVideo Pause State . Paused By UserRequest ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . pause Remote Video Tile ( it . video Tile State . tile Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġupdate Ġvideo Ġpagination Ġcontrol Ġbuttons Ġstates ĊĠĠĠĠĠĠĠ Ġprev Video Page Button . isEnabled Ġ= Ġmeeting Model . can Go To Prev Video Page () ĊĠĠĠĠĠĠĠ Ġnext Video Page Button . isEnabled Ġ= Ġmeeting Model . can Go To Next Video Page () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresume All Content Shares Except User Paused Videos () Ġ{ ĊĠĠĠĠĠĠĠ Ġmeeting Model . current Screen Tiles . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! meeting Model . user Paused Video Tile Ids . contains ( it . video Tile State . tile Id ) Ġ&& Ġit . video Tile State . pause State Ġ== ĠVideo Pause State . Paused By UserRequest ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . resume Remote Video Tile ( it . video Tile State . tile Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpause All Remote Videos () Ġ{ ĊĠĠĠĠĠĠĠ Ġmeeting Model . remote Video Tile States . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . pause Remote Video Tile ( it . video Tile State . tile Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpause All Content Shares () Ġ{ ĊĠĠĠĠĠĠĠ Ġmeeting Model . current Screen Tiles . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . pause Remote Video Tile ( it . video Tile State . tile Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġre validate Video Page Index () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( meeting Model . can Go To Prev Video Page () Ġ&& Ġmeeting Model . remote Video Count In Current Page () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current Video Page Index Ġ-= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Video Page Updated () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWEB RTC _ PERMISSION _ REQUEST _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Missing Permission : ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Results . isEmpty () Ġ|| Ġgrant Results . any Ġ{ ĠPackage Manager . PERMISSION _ GRAN TED Ġ!= Ġit Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Missing Permission ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . user _ notification _ permission _ error ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Local Video () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( SCREEN _ CAPTURE _ REQUEST _ CODE Ġ== Ġrequest Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ!= ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . user _ notification _ screen _ share _ permission _ error ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ Ġstart Screen Share ( result Code , Ġit , Ġrequire Context ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Screen Share ( result Code : ĠInt , Ġdata : ĠIntent , Ġfragment Context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfragment Context . start Service ( Intent ( fragment Context , ĠScreen Capture Service :: class . java )) ĊĊĠĠĠĠĠĠĠ Ġval Ġscreen Capture Source Ġ= ĠDefault Screen Capture Source ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Surface Texture Capture Source Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe gl Core Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠresultCode , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġscreen Capture Source Observer Ġ= Ġobject Ġ: ĠCapture Source Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Capture Started () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Share Manager ?. let Ġ{ Ġsource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . start Content Share ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Capture Stopped () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Handler (" Screen Ġcapture Ġstopped ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Capture Failed ( error : ĠCapture Source Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Handler (" Screen Ġcapture Ġfailed Ġwith Ġerror Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . stop Content Share () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġscreen Share Manager Ġ= ĠScreen Share Manager ( screen Capture Source , Ġfragment Context ) ĊĠĠĠĠĠĠĠ Ġscreen Share Manager ?. add Observer ( screen Capture Source Observer ) ĊĠĠĠĠĠĠĠ Ġscreen Share Manager ?. start () ĊĠĠĠĠĠĠĠ Ġ( activity Ġas ĠMeeting Activity ). set Screen Share Manager ( screen Share Manager ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Content Share Started () Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler (" Content Ġshare Ġstarted ") ĊĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{} . java Class . enc lo sing Method ?. name ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmeeting Model . is Sharing Content Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Content Share Stopped ( status : ĠContent Share Status ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler (" Content Ġshare Ġstopped Ġwith Ġstatus Ġ${ status . statusCode }") ĊĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{} . java Class . enc lo sing Method ?. name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ status " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmeeting Model . is Sharing Content Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Video Tile ( tile State : ĠVideo Tile State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvideo Collection Tile Ġ= Ġcreate Video Collection Tile ( tile State ) ĊĠĠĠĠĠĠĠ Ġif Ġ( tile State . is Content ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current Screen Tiles . add ( video Collection Tile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Tile Adapter . notify DataSet Changed () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCurrently Ġnot Ġin Ġthe ĠScreen Ġtab , Ġno Ġneed Ġto Ġrender Ġthe Ġvideo Ġtile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . tab Index Ġ!= ĠSub Tab . Screen . position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . pause Remote Video Tile ( tile State . tile Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tile State . is Local Tile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . local Video Tile State Ġ= Ġvideo Collection Tile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Video Page Updated () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . remote Video Tile States . add ( video Collection Tile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Video Page Updated () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCurrently Ġnot Ġin Ġthe ĠVideo Ġtab , Ġno Ġneed Ġto Ġrender Ġthe Ġvideo Ġtile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . tab Index Ġ!= ĠSub Tab . Video . position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . pause Remote Video Tile ( tile State . tile Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Video Collection Tile ( tile State : ĠVideo Tile State ): ĠVideo Collection Tile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġat tendee Id Ġ= Ġtile State . at tendee Id ĊĠĠĠĠĠĠĠ Ġval Ġat tendee Name Ġ= Ġmeeting Model . current R oster [ at tendee Id ]?. at tendee Name Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġreturn ĠVideo Collection Tile ( at tendee Name , Ġtile State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Audio Session Started Connecting ( reconnect ing : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Audio Ġstarted Ġconnecting . Ġreconnect ing : Ġ$ reconnect ing " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{} . java Class . enc lo sing Method ?. name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" reconnect ing : Ġ$ reconnect ing " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Audio Session Started ( reconnect ing : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Audio Ġsuccessfully Ġstarted . Ġreconnect ing : Ġ$ reconnect ing " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠStart ĠVoice ĠFocus Ġas Ġsoon Ġas Ġaudio Ġsession Ġstarted ĊĠĠĠĠĠĠĠ Ġset Voice Focus Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{} . java Class . enc lo sing Method ?. name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" reconnect ing : Ġ$ reconnect ing " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcached Device Ġ= Ġ( activity Ġas ĠMeeting Activity ). get Cached Device () ĊĠĠĠĠĠĠĠ Ġcached Device ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . choose Audio Device ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Device Manager . setActive Audio Device ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( activity Ġas ĠMeeting Activity ). reset Cached Device () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Audio Session Dropped () Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler (" Audio Ġsession Ġdropped ") ĊĠĠĠĠĠĠĠ Ġlog With FunctionName ( object Ġ{} . java Class . enc lo sing Method ?. name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Audio Session Stopped ( session Status : ĠMeeting Session Status ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Audio Ġstopped Ġfor Ġreason : Ġ${ session Status . statusCode }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{} . java Class . enc lo sing Method ?. name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ session Status . statusCode }" ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( session Status . statusCode Ġ!= ĠMeeting Session StatusCode . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Meeting () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlistener . on Leave Meeting () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Audio Session Cancelled Re connect () Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler (" Audio Ġcancelled Ġreconnect ing ") ĊĠĠĠĠĠĠĠ Ġlog With FunctionName ( object Ġ{} . java Class . enc lo sing Method ?. name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Connection Re covered () Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Connection Ġquality Ġhas Ġre covered " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{} . java Class . enc lo sing Method ?. name ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Connection B ec ame Po or () Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Connection Ġquality Ġhas Ġbecome Ġpoor " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{} . java Class . enc lo sing Method ?. name ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Video Session Started Connecting () Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler (" Video Ġstarted Ġconnecting .") ĊĠĠĠĠĠĠĠ Ġlog With FunctionName ( object Ġ{} . java Class . enc lo sing Method ?. name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Video Session Started ( session Status : ĠMeeting Session Status ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( session Status . statusCode Ġ== ĠMeeting Session StatusCode . Video At Capacity View Only ) Ġ" Video Ġencountered Ġan Ġerror : Ġ${ session Status . statusCode }" Ġelse Ġ" Video Ġsuccessfully Ġstarted : Ġ${ session Status . statusCode }" ĊĊĠĠĠĠĠĠĠ Ġnotify Handler ( message ) ĊĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{} . java Class . enc lo sing Method ?. name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ session Status . statusCode }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Video Session Stopped ( session Status : ĠMeeting Session Status ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Video Ġstopped Ġfor Ġreason : Ġ${ session Status . statusCode }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{} . java Class . enc lo sing Method ?. name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ session Status . statusCode }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Video Tile Added ( tile State : ĠVideo Tile State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Video Ġtile Ġadded , Ġtile Id : Ġ${ tile State . tile Id }, Ġat tendee Id : Ġ${ tile State . at tendee Id }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ", Ġis Content Ġ${ tile State . is Content } Ġwith Ġsize Ġ${ tile State . video Stream Content Width } * ${ tile State . video Stream Content Height }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tile State . is Content Ġ&& Ġmeeting Model . current Screen Tiles . none Ġ{ Ġit . video Tile State . tile Id Ġ== Ġtile State . tile Id Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Video Tile ( tile State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tile State . is Local Tile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Video Tile ( tile State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( meeting Model . remote Video Tile States . none Ġ{ Ġit . video Tile State . tile Id Ġ== Ġtile State . tile Id Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Video Tile ( tile State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh No Videos Or Screen Share Available Text () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Video Tile Removed ( tile State : ĠVideo Tile State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtile Id : ĠInt Ġ= Ġtile State . tile Id ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Video Ġtrack Ġremoved , Ġtile Id : Ġ$ tile Id , Ġat tendee Id : Ġ${ tile State . at tendee Id }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . unbind Video View ( tile Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tile State . is Content ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current Screen Tiles . removeAll Ġ{ Ġit . video Tile State . tile Id Ġ== Ġtile Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Tile Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . local Video Tile State ?. video Tile State ?. tile Id Ġ== Ġtile Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . local Video Tile State Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . remote Video Tile States . removeAll Ġ{ Ġit . video Tile State . tile Id Ġ== Ġtile Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Video Page Updated () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh No Videos Or Screen Share Available Text () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Video Tile Paused ( tile State : ĠVideo Tile State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tile State . pause State Ġ== ĠVideo Pause State . Paused For Po or Connection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= Ġif Ġ( tile State . is Content ) Ġmeeting Model . current Screen Tiles Ġelse Ġmeeting Model . remote Video Tile States ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollection . find Ġ{ Ġit . video Tile State . tile Id Ġ== Ġtile State . tile Id Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ?. set Pause Message Visibility ( View . VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġat tendee Name Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current R oster [ tile State . at tendee Id ]?. at tendee Name Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{} . java Class . enc lo sing Method ?. name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ at tendee Name Ġvideo Ġpaused " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Video Tile Res umed ( tile State : ĠVideo Tile State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= Ġif Ġ( tile State . is Content ) Ġmeeting Model . current Screen Tiles Ġelse Ġmeeting Model . remote Video Tile States ĊĠĠĠĠĠĠĠ Ġcollection . find Ġ{ Ġit . video Tile State . tile Id Ġ== Ġtile State . tile Id Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ?. set Pause Message Visibility ( View . IN VISIBLE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġat tendee Name Ġ= Ġmeeting Model . current R oster [ tile State . at tendee Id ]?. at tendee Name Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{} . java Class . enc lo sing Method ?. name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ at tendee Name Ġvideo Ġres umed " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Video Tile Size Changed ( tile State : ĠVideo Tile State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Video Ġstream Ġcontent Ġsize Ġchanged Ġto Ġ${ tile State . video Stream Content Width } * ${ tile State . video Stream Content Height } Ġfor Ġtile Id : Ġ${ tile State . tile Id }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Metrics Received ( metrics : ĠMap < Observable Metric , ĠAny >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug ( TAG , Ġ" Media Ġmetrics Ġreceived : Ġ$ metrics ") ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current Metrics . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . forEach Ġ{ Ġ( metrics Name , Ġmetrics Value ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current Metrics [ metrics Name . name ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetric Data ( metrics Name . name , Ġmetrics Value . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsendMessage () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġedit Text Message . text . toString (). trim () ĊĠĠĠĠĠĠĠ Ġif Ġ( text . isBlank ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġaudio Video . realtime Send Data Message ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDATA _ MESSAGE _ TOPIC , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDATA _ MESSAGE _ LI F ETIME _ MS ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġedit Text Message . text . clear () ĊĠĠĠĠĠĠĠ Ġ// Ġecho Ġthe Ġmessage Ġto Ġthe Ġhandler ĊĠĠĠĠĠĠĠ Ġon Data Message Received ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCalendar . getInstance (). time In Millis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDATA _ MESSAGE _ TOPIC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcredentials . at tendee Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcredentials . external UserId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Data Message Received ( data Message : ĠData Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! data Message . th rott led ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Message . timestamp Ms Ġ<= Ġmeeting Model . last Received Message Timestamp ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . last Received Message Timestamp Ġ= Ġdata Message . timestamp Ms ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeeting Model . current Messages . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget At tendee Name ( data Message . sender At tendee Id , Ġdata Message . sender External UserId ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Message . timestamp Ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Message . text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Self At tendee ( data Message . sender At tendee Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Adapter . notify Item Inserted ( meeting Model . current Messages . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll To Last Message () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Handler (" Message Ġis Ġth rott led . ĠPlease Ġres end ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscroll To Last Message () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . current Messages . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Messages . scrollTo Position ( meeting Model . current Messages . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Self At tendee ( at tendee Id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDefault Modal ity ( at tendee Id ). base () Ġ== Ġcredentials . at tendee Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify Handler ( ĊĠĠĠĠĠĠĠ Ġtoast Message : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( activity , Ġtoast Message , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog With FunctionName ( ĊĠĠĠĠĠĠĠ Ġfn Name : ĠString ?, ĊĠĠĠĠĠĠĠ Ġmsg : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġlog Level : ĠLogLevel Ġ= ĠLogLevel . INFO ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Msg Ġ= Ġif Ġ( fn Name Ġ== Ġnull ) Ġmsg Ġelse Ġ"[ Function ] Ġ[$ fn Name ]: Ġ$ msg " ĊĠĠĠĠĠĠĠ Ġwhen Ġ( logLevel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogLevel . DEBUG Ġ-> Ġlogger . debug ( TAG , Ġnew Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlogger . info ( TAG , Ġnew Msg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsubscribe To At tendee Change Handlers () Ġ{ ĊĠĠĠĠĠĠĠ Ġaudio Video . add Audio Video Observer ( this ) ĊĠĠĠĠĠĠĠ Ġaudio Video . add Device Change Observer ( this ) ĊĠĠĠĠĠĠĠ Ġaudio Video . add Metrics Observer ( this ) ĊĠĠĠĠĠĠĠ Ġaudio Video . add Realtime Observer ( this ) ĊĠĠĠĠĠĠĠ Ġaudio Video . add Realtime Data Message Observer ( DATA _ MESSAGE _ TOPIC , Ġthis ) ĊĠĠĠĠĠĠĠ Ġaudio Video . add Video Tile Observer ( this ) ĊĠĠĠĠĠĠĠ Ġaudio Video . add Active Speaker Observer ( Default Active Speaker Policy (), Ġthis ) ĊĠĠĠĠĠĠĠ Ġaudio Video . add Content Share Observer ( this ) ĊĠĠĠĠĠĠĠ Ġaudio Video . add Event Analytics Observer ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġunsubscribe From At tendee Change Handlers () Ġ{ ĊĠĠĠĠĠĠĠ Ġaudio Video . remove Audio Video Observer ( this ) ĊĠĠĠĠĠĠĠ Ġaudio Video . remove Device Change Observer ( this ) ĊĠĠĠĠĠĠĠ Ġaudio Video . remove Metrics Observer ( this ) ĊĠĠĠĠĠĠĠ Ġaudio Video . remove Realtime Observer ( this ) ĊĠĠĠĠĠĠĠ Ġaudio Video . remove Realtime Data Message Observer From Topic ( DATA _ MESSAGE _ TOPIC ) ĊĠĠĠĠĠĠĠ Ġaudio Video . remove Video Tile Observer ( this ) ĊĠĠĠĠĠĠĠ Ġaudio Video . remove Active Speaker Observer ( this ) ĊĠĠĠĠĠĠĠ Ġaudio Video . remove Content Share Observer ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġend Meeting () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . local Video Tile State Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . unbind Video View ( meeting Model . local Tile Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmeeting Model . remote Video Tile States . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . unbind Video View ( it . video Tile State . tile Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmeeting Model . current Screen Tiles . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . unbind Video View ( it . video Tile State . tile Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaudio Video . stop Local Video () ĊĠĠĠĠĠĠĠ Ġaudio Video . stop Remote Video () ĊĠĠĠĠĠĠĠ Ġaudio Video . stop Remote Video () ĊĠĠĠĠĠĠĠ Ġaudio Video . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġdevice Dialog ?. dismiss () ĊĠĠĠĠĠĠĠ Ġunsubscribe From At tendee Change Handlers () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠHandle Ġback gro unded Ġapp ĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . was Local Video Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Local Video () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaudio Video . start Remote Video () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġmeeting Model . was Local Video Started Ġ= Ġmeeting Model . is Local Video Started ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . was Local Video Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Local Video () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaudio Video . stop Remote Video () ĊĊĠĠĠĠĠĠĠ Ġ// ĠTurn Ġoff Ġscreen Ġshare Ġwhen Ġscreen Ġlocked ĊĠĠĠĠĠĠĠ Ġif Ġ( meeting Model . is Sharing Content Ġ&& Ġ! power Manager . is Interactive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Video . stop Content Share () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Share Manager ?. stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Event Received ( name : ĠEvent Name , Ġattributes : ĠEvent Attributes ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠStore Ġthe Ġlogs ĊĠĠĠĠĠĠĠ Ġattributes . put All ( audio Video . get Common Event Attributes ()) ĊĠĠĠĠĠĠĠ Ġpost Logger . info ( TAG , Ġgson . toJson ( mutable Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" attributes " Ġto Ġattributes ĊĠĠĠĠĠĠĠ Ġ))) ĊĊĠĠĠĠĠĠĠ Ġlogger . info ( TAG , Ġ"$ name Ġ${ attributes . toJson String () }") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Name . meeting Start Succeeded Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ( TAG , Ġ" Meeting Ġstarted Ġon Ġ: Ġ${ audio Video . get Common Event Attributes (). toJson String () }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Name . meeting Ended , ĠEvent Name . meeting Failed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ( TAG , Ġ" Meeting Ġhistory : Ġ${ gson . toJson ( audio Video . get Meeting History ()) }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Logger . publish Log ( TAG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ