/* Ċ Ġ* Ġ ĠCopyright Ġ 2 0 1 5 ĠThe ĠWeb RTC ĠProject ĠAuthors . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* Ġ ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġa ĠBSD - style Ġlicense Ċ Ġ* Ġ Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile Ġin Ġthe Ġroot Ġof Ġthe Ġsource Ċ Ġ* Ġ Ġtree . ĠAn Ġadditional Ġintel lectual Ġproperty Ġrights Ġgrant Ġcan Ġbe Ġfound Ċ Ġ* Ġ Ġin Ġthe Ġfile ĠPAT ENTS . Ġ ĠAll Ġcontributing Ġproject Ġauthors Ġmay Ċ Ġ* Ġ Ġbe Ġfound Ġin Ġthe ĠAUTHORS Ġfile Ġin Ġthe Ġroot Ġof Ġthe Ġsource Ġtree . Ċ Ġ*/ Ċ package Ġorg . app spot . app rtc Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . media . projection . Media Projection Ċ import Ġandroid . media . projection . Media Projection Manager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . view . View Ċ import Ġandroid . view . Window Ċ import Ġandroid . view . WindowManager Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . content . getSystem Service Ċ import Ġandroidx . fragment . app . Fragment Transaction Ċ import Ġorg . app spot . app rtc . App RT CA udio Manager . Audio Manager Events Ċ import Ġorg . app spot . app rtc . App RTC Client .* Ċ import Ġorg . app spot . app rtc . Call Fragment . On Call Events Ċ import Ġorg . app spot . app rtc . Peer Connection Client .* Ċ import Ġorg . app spot . app rtc . databinding . Activity Call Binding Ċ import Ġorg . webrtc .* Ċ import Ġorg . webrtc . Renderer Common . Scaling Type Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* ĠActivity Ġfor Ġpeer Ġconnection Ġcall Ġsetup , Ġcall Ġwaiting Ċ Ġ* Ġand Ġcall Ġview . Ċ Ġ*/ Ċ class ĠCall Activity Ġ: ĠAppCompatActivity (), ĠSignal ing Events , ĠPeer Connection Events , ĠOn Call Events Ġ{ ĊĠĠĠ Ġprivate Ġclass ĠProxy Video Sink Ġ: ĠVideo Sink Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtarget : ĠVideo Sink ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Synchron ized ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ĊĊĠĠĠĠĠĠĠ Ġ@ Synchron ized ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Frame ( frame : ĠVideo Frame ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Frame ( frame ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" D ro pping Ġframe Ġin Ġproxy Ġbecause Ġtarget Ġis Ġnull .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Call Binding ĊĊĠĠĠ Ġprivate Ġval Ġremote Proxy Renderer Ġ= ĠProxy Video Sink () ĊĠĠĠ Ġprivate Ġval Ġlocal Proxy Video Sink Ġ= ĠProxy Video Sink () ĊĠĠĠ Ġprivate Ġvar Ġpeer Connection Client : ĠPeer Connection Client ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġapp Rtc Client : ĠApp RTC Client ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsignal ing Parameters : ĠSignal ing Parameters ĊĠĠĠ Ġprivate Ġvar Ġaudio Manager : ĠApp RT CA udio Manager ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġvideo File Renderer : ĠVideo File Renderer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġremote Sink s : ĠMutable List < Video Sink > Ġ= Ġarray ListOf () ĊĠĠĠ Ġprivate Ġvar Ġlog Toast : ĠToast ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcommand Line Run Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġactivity Running Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġroom Connection Parameters : ĠRoom Connection Parameters ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpeer Connection Parameters : ĠPeer Connection Parameters ĊĠĠĠ Ġprivate Ġvar Ġconnected Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Error Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġcall Control Fragment Visible Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġcall Started Time Ms : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmic Enabled Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġscre enc apt ure Enabled Ġ= Ġfalse ĊĊĠĠĠ Ġ// ĠTrue Ġif Ġlocal Ġview Ġis Ġin Ġthe Ġfullscreen Ġrenderer . ĊĠĠĠ Ġprivate Ġvar Ġis Sw apped Feed s Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġwindow Ġstyles Ġfor Ġfullscreen - window Ġsize . ĠNeeds Ġto Ġbe Ġdone Ġbefore ĊĠĠĠĠĠĠĠ Ġ// Ġadding Ġcontent . ĊĠĠĠĠĠĠĠ Ġrequest Window Feature ( Window . FEATURE _ NO _ TITLE ) ĊĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Call Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġbinding . root ĊĠĠĠĠĠĠĠ ĠsetContentView ( view ) ĊĊĠĠĠĠĠĠĠ ĠThread . setDefault Un caught ExceptionHandler ( Unhandled ExceptionHandler ( this )) ĊĊĠĠĠĠĠĠĠ Ġwindow . add Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Manager . LayoutParams . FLAG _ FULL SCREEN Ġor ĠWindow Manager . LayoutParams . FLAG _ KEEP _ SCREEN _ ON ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠWindow Manager . LayoutParams . FLAG _ SHOW _ WHEN _ LOCK ED Ġor ĠWindow Manager . LayoutParams . FLAG _ T URN _ SCREEN _ ON ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġwindow . decor View . system Ui Visibility Ġ= Ġsystem Ui Visibility ĊĠĠĠĠĠĠĠ Ġconnected Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate ĠUI Ġcontrols . ĊĠĠĠĠĠĠĠ Ġval Ġcall Fragment Ġ= ĠCall Fragment () ĊĠĠĠĠĠĠĠ Ġval Ġh ud Fragment Ġ= ĠH ud Fragment () ĊĊĠĠĠĠĠĠĠ Ġ// ĠShow / hide Ġcall Ġcontrol Ġfragment Ġon Ġview Ġclick . ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠView . OnClickListener Ġ{ Ġtoggle Call Control Fragment Visibility () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSwap Ġfeeds Ġon Ġpip Ġview Ġclick . ĊĠĠĠĠĠĠĠ Ġbinding . pip Video View . setOnClickListener Ġ{ Ġset Sw apped Feed s (! is Sw apped Feed s ) Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . fullscreen Video View . setOnClickListener ( listener ) ĊĠĠĠĠĠĠĠ Ġremote Sink s . add ( remote Proxy Renderer ) ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġintent ĊĠĠĠĠĠĠĠ Ġval Ġe gl Base Ġ= ĠE gl Base . create () ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġvideo Ġrender ers . ĊĠĠĠĠĠĠĠ Ġbinding . pip Video View . init ( e gl Base . e gl Base Context , Ġnull ) ĊĠĠĠĠĠĠĠ Ġbinding . pip Video View . set Scaling Type ( Scaling Type . SCALE _ AS PECT _ FIT ) ĊĠĠĠĠĠĠĠ Ġintent . getString Extra ( EXTRA _ SAVE _ REMOTE _ VIDEO _ TO _ FILE )?. also Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġsave Remote Video ToFile Ġis Ġset Ġwe Ġsave Ġthe Ġvideo Ġfrom Ġthe Ġremote Ġto Ġa Ġfile . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Out Width Ġ= Ġintent . getInt Extra ( EXTRA _ SAVE _ REMOTE _ VIDEO _ TO _ FILE _ WIDTH , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Out Height Ġ= Ġintent . getInt Extra ( EXTRA _ SAVE _ REMOTE _ VIDEO _ TO _ FILE _ HEIGHT , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo File Renderer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVideo File Renderer ( it , Ġvideo Out Width , Ġvideo Out Height , Ġe gl Base . e gl Base Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġrenderer Ġ-> Ġremote Sink s . add ( renderer ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġopen Ġvideo Ġfile Ġfor Ġoutput : Ġ$ it ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . fullscreen Video View . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . init ( e gl Base . e gl Base Context , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Scaling Type ( Scaling Type . SCALE _ AS PECT _ FILL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Enable Hardware Scaler ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . pip Video View . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Z Order Media Overlay ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Enable Hardware Scaler ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġwith Ġlocal Ġfeed Ġin Ġfullscreen Ġand Ġswap Ġit Ġto Ġthe Ġpip Ġwhen Ġthe Ġcall Ġis Ġconnected . ĊĠĠĠĠĠĠĠ Ġset Sw apped Feed s ( true ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġfor Ġmandatory Ġpermissions . ĊĠĠĠĠĠĠĠ ĠM AND AT ORY _ PERMISSION S . forEach Ġ{ Ġpermission Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Calling Or Self Permission ( permission ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog And Toast (" Permission Ġ$ permission Ġis Ġnot Ġgranted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( RESULT _ C ANCE LED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġroom Uri Ġ= Ġintent . data Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog And Toast ( getString ( R . string . missing _ url )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Did n 't Ġget Ġany ĠURL Ġin Ġintent !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( RESULT _ C ANCE LED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet ĠIntent Ġparameters . ĊĠĠĠĠĠĠĠ Ġval Ġroom Id Ġ= Ġintent . getString Extra ( EXTRA _ ROOM ID ) ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Room ĠID : Ġ% s ", Ġroom Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( roomId . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog And Toast ( getString ( R . string . missing _ url )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Incorrect Ġroom ĠID Ġin Ġintent !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( RESULT _ C ANCE LED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġloop back Ġ= Ġintent . getBoolean Extra ( EXTRA _ LOOP BACK , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġtracing Ġ= Ġintent . getBoolean Extra ( EXTRA _ TR ACING , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġvar Ġvideo Width Ġ= Ġintent . getInt Extra ( EXTRA _ VIDEO _ WIDTH , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġvar Ġvideo Height Ġ= Ġintent . getInt Extra ( EXTRA _ VIDEO _ HEIGHT , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġscre enc apt ure Enabled Ġ= Ġintent . getBoolean Extra ( EXTRA _ SC RE ENC AP TURE , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġcapturing Ġformat Ġis Ġnot Ġspecified Ġfor Ġscre enc apt ure , Ġuse Ġscreen Ġresolution . ĊĠĠĠĠĠĠĠ Ġif Ġ( scre enc apt ure Enabled Ġ&& Ġvideo Width Ġ== Ġ 0 Ġ&& Ġvideo Height Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdisplay Metrics Ġ= Ġget Display Metrics ()?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Width Ġ= Ġit . width Pixels ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Height Ġ= Ġit . height Pixels ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġdata Channel Parameters : ĠData Channel Parameters ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( intent . getBoolean Extra ( EXTRA _ DATA _ CHANNEL _ ENABLED , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Channel Parameters Ġ= ĠData Channel Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġordered Ġ= Ġintent . getBoolean Extra ( EXTRA _ ORDER ED , Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Re transmit Time Ms Ġ= Ġintent . getInt Extra ( EXTRA _ MAX _ RE TRAN SM ITS _ MS , Ġ- 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Re transmit s Ġ= Ġintent . getInt Extra ( EXTRA _ MAX _ RE TRAN SM ITS , Ġ- 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Ġ= Ġintent . getString Extra ( EXTRA _ PROTOCOL ) Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġneg oti ated Ġ= Ġintent . getBoolean Extra ( EXTRA _ NEG OT I ATED , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġintent . getInt Extra ( EXTRA _ ID , Ġ- 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpeer Connection Parameters Ġ= ĠPeer Connection Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Call Enabled Ġ= Ġintent . getBoolean Extra ( EXTRA _ VIDEO _ CALL , Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop back Ġ= Ġloop back , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracing Ġ= Ġtracing , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Width Ġ= Ġvideo Width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Height Ġ= Ġvideo Height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo F ps Ġ= Ġintent . getInt Extra ( EXTRA _ VIDEO _ FPS , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Max Bit rate Ġ= Ġintent . getInt Extra ( EXTRA _ VIDEO _ BIT RATE , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Codec Ġ= Ġintent . getString Extra ( EXTRA _ VIDEO CODEC ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Codec Hw Acceleration Ġ= Ġintent . getBoolean Extra ( EXTRA _ HW CODEC _ ENABLED , Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Flex fec Enabled Ġ= Ġintent . getBoolean Extra ( EXTRA _ FLEX FE C _ ENABLED , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Start Bit rate Ġ= Ġintent . getInt Extra ( EXTRA _ AUDIO _ BIT RATE , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Codec Ġ= Ġintent . getString Extra ( EXTRA _ AUDIO CODEC ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno Audio Processing Ġ= Ġintent . getBoolean Extra ( EXTRA _ NO AU DI OP ROC ESS ING _ ENABLED , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa ec Dump Ġ= Ġintent . getBoolean Extra ( EXTRA _ AE CD UMP _ ENABLED , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Input Audio ToFile Ġ= Ġintent . getBoolean Extra ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEX TRA _ SAVE _ INPUT _ AUDIO _ TO _ FILE _ ENABLED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Open S LES Ġ= Ġintent . getBoolean Extra ( EXTRA _ OPEN S LES _ ENABLED , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisable BuiltIn A EC Ġ= Ġintent . getBoolean Extra ( EXTRA _ DISABLE _ BUIL T _ IN _ A EC , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisable BuiltIn AG C Ġ= Ġintent . getBoolean Extra ( EXTRA _ DISABLE _ BUIL T _ IN _ AG C , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisable BuiltIn NS Ġ= Ġintent . getBoolean Extra ( EXTRA _ DISABLE _ BUIL T _ IN _ NS , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Web Rtc AG C And HP F Ġ= Ġintent . getBoolean Extra ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEX TRA _ DISABLE _ WEB RTC _ AG C _ AND _ HP F , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Rtc Event Log Ġ= Ġintent . getBoolean Extra ( EXTRA _ ENABLE _ RT CE VENT LOG , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Channel Parameters Ġ= Ġdata Channel Parameters , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcommand Line Run Ġ= Ġintent . getBoolean Extra ( EXTRA _ CM DL INE , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġrun Time Ms Ġ= Ġintent . getInt Extra ( EXTRA _ RUNTIME , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠTim ber . d (" VIDEO _ FILE : Ġ'% s '", Ġintent . getString Extra ( EXTRA _ VIDEO _ FILE _ AS _ CAMERA )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġconnection Ġclient . ĠUse ĠDirect RTC Client Ġif Ġroom Ġname Ġis Ġan ĠIP Ġotherwise Ġuse Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġstandard ĠWebSocket RTC Client . ĊĠĠĠĠĠĠĠ Ġapp Rtc Client Ġ= Ġif Ġ( loop back Ġ|| Ġ! Direct RTC Client . IP _ PATTERN . matcher ( roomId ). matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWebSocket RTC Client ( this ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Using ĠDirect RTC Client Ġbecause Ġroom Ġname Ġlooks Ġlike Ġan ĠIP .") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDirect RTC Client ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġconnection Ġparameters . ĊĠĠĠĠĠĠĠ Ġval Ġurl Parameters Ġ= Ġintent . getString Extra ( EXTRA _ URL PARAMETERS ) ĊĠĠĠĠĠĠĠ Ġroom Connection Parameters Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Connection Parameters ( room Uri . toString (), Ġroom Id , Ġloop back , Ġurl Parameters ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSend Ġintent Ġarguments Ġto Ġfragments . ĊĠĠĠĠĠĠĠ Ġcall Fragment . arguments Ġ= Ġintent . extras ĊĠĠĠĠĠĠĠ Ġh ud Fragment . arguments Ġ= Ġintent . extras ĊĠĠĠĠĠĠĠ Ġ// ĠActivate Ġcall Ġand ĠH UD Ġfragments Ġand Ġstart Ġthe Ġcall . ĊĠĠĠĠĠĠĠ Ġval Ġft Ġ= Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠ Ġft . add ( R . id . call _ fragment _ container , Ġcall Fragment ) ĊĠĠĠĠĠĠĠ Ġft . add ( R . id . h ud _ fragment _ container , Ġh ud Fragment ) ĊĠĠĠĠĠĠĠ Ġft . commit () ĊĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġcommand Ġline Ġexecution Ġrun Ġconnection Ġfor Ġ< run Time Ms > Ġand Ġexit . ĊĠĠĠĠĠĠĠ Ġif Ġ( command Line Run Ġ&& Ġrun Time Ms Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandler (). post Delayed ({ Ġdisconnect () Ġ}, Ġrun Time Ms . to Long ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġpeer Ġconnection Ġclient . ĊĠĠĠĠĠĠĠ Ġpeer Connection Client Ġ= ĠPeer Connection Client ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe gl Base , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Connection Parameters , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Call Activity ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠPeer ConnectionFactory . Options () ĊĠĠĠĠĠĠĠ Ġif Ġ( loop back ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . network Ignore Mask Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpeer Connection Client ?. create Peer ConnectionFactory ( options ) ĊĠĠĠĠĠĠĠ Ġif Ġ( scre enc apt ure Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Screen Capture () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Call () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 1 ) ĊĠĠĠ Ġprivate Ġfun Ġget Display Metrics (): ĠDisplay Metrics ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwindow Manager : ĠWindow Manager Ġ= Ġapplication . getSystem Service () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Metrics Ġ= ĠDisplay Metrics () ĊĠĠĠĠĠĠĠ Ġwindow Manager . default Display . get Real Metrics ( display Metrics ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdisplay Metrics ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( Build . VERSION _ CODES . LO L LI POP ) ĊĠĠĠ Ġprivate Ġfun Ġstart Screen Capture () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmedia Projection Manager : ĠMedia Projection Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . getSystem Service () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Projection Manager . create Screen Capture Intent (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCAP TURE _ PERMISSION _ REQUEST _ CODE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ!= ĠCAP TURE _ PERMISSION _ REQUEST _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmedia Projection Permission ResultCode Ġ= ĠresultCode ĊĠĠĠĠĠĠĠ Ġmedia Projection Permission Result Data Ġ= Ġdata ĊĠĠĠĠĠĠĠ Ġstart Call () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġuse Camera 2 (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCamera 2 Enumerator . is Supported ( this ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . getBoolean Extra ( EXTRA _ CAMERA 2 , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcapture To Texture (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġintent . getBoolean Extra ( EXTRA _ CAPTURE TOT EXT URE _ ENABLED , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Camera Capt urer ( enum erator : ĠCamera Enumerator ): ĠVideo Capt urer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdevice Names Ġ= Ġenumerator . device Names ĊĊĠĠĠĠĠĠĠ Ġ// ĠFirst , Ġtry Ġto Ġfind Ġfront Ġfacing Ġcamera ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Looking Ġfor Ġfront Ġfacing Ġcameras .") ĊĠĠĠĠĠĠĠ Ġfor Ġ( device Name Ġin Ġdevice Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enum erator . is Front Facing ( device Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Creating Ġfront Ġfacing Ġcamera Ġcapt urer .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Capt urer : ĠVideo Capt urer ? Ġ= Ġenumerator . create Capt urer ( device Name , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( video Capt urer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvideo Capt urer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠFront Ġfacing Ġcamera Ġnot Ġfound , Ġtry Ġsomething Ġelse ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Looking Ġfor Ġother Ġcameras .") ĊĠĠĠĠĠĠĠ Ġfor Ġ( device Name Ġin Ġdevice Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! enum erator . is Front Facing ( device Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Creating Ġother Ġcamera Ġcapt urer .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Capt urer : ĠVideo Capt urer ? Ġ= Ġenumerator . create Capt urer ( device Name , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( video Capt urer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvideo Capt urer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( Build . VERSION _ CODES . LO L LI POP ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Screen Capt urer (): ĠVideo Capt urer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( media Projection Permission ResultCode Ġ!= ĠRESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Error (" User Ġdidn 't Ġgive Ġpermission Ġto Ġcapture Ġthe Ġscreen .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠScreen Capt urer Android ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Projection Permission Result Data , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠMedia Projection . Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport Error (" User Ġrev oked Ġpermission Ġto Ġcapture Ġthe Ġscreen .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠActivity Ġinterfaces ĊĠĠĠ Ġpublic Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġactivity Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġstop Ġthe Ġvideo Ġwhen Ġusing Ġscre enc apt ure Ġto Ġallow Ġuser Ġto Ġshow Ġother Ġapps Ġto Ġthe Ġremote ĊĠĠĠĠĠĠĠ Ġ// Ġend . ĊĠĠĠĠĠĠĠ Ġif Ġ(! scre enc apt ure Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Connection Client ?. stop Video Source () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġactivity Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ// ĠVideo Ġis Ġnot Ġpaused Ġfor Ġscre enc apt ure . ĠSee Ġon Pause . ĊĠĠĠĠĠĠĠ Ġif Ġ(! scre enc apt ure Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Connection Client ?. start Video Source () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ ĠThread . setDefault Un caught ExceptionHandler ( null ) ĊĠĠĠĠĠĠĠ Ġdisconnect () ĊĠĠĠĠĠĠĠ Ġlog Toast ?. cancel () ĊĠĠĠĠĠĠĠ Ġactivity Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCall Fragment . On Call Events Ġinterface Ġimplementation . ĊĠĠĠ Ġoverride Ġfun Ġon Call Hang Up () Ġ{ ĊĠĠĠĠĠĠĠ Ġdisconnect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Camera Switch () Ġ{ ĊĠĠĠĠĠĠĠ Ġpeer Connection Client ?. switch Camera () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Video Scaling Switch ( scaling Type : ĠScaling Type ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . fullscreen Video View . set Scaling Type ( scaling Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Capture Format Change ( width : ĠInt , Ġheight : ĠInt , Ġfram erate : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpeer Connection Client ?. change Capture Format ( width , Ġheight , Ġfram erate ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Toggle Mic (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġenabled Ġ= Ġ! mic Enabled ĊĠĠĠĠĠĠĠ Ġpeer Connection Client ?. set Audio Enabled ( enabled ) ĊĠĠĠĠĠĠĠ Ġmic Enabled Ġ= Ġenabled ĊĠĠĠĠĠĠĠ Ġreturn Ġenabled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠHelper Ġfunctions . ĊĠĠĠ Ġprivate Ġfun Ġtoggle Call Control Fragment Visibility () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġh ud Fragment Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( support FragmentManager . find Fragment ById ( R . id . h ud _ fragment _ container ) Ġas ĠH ud Fragment ?) ĊĠĠĠĠĠĠĠ Ġval Ġcall Fragment Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( support FragmentManager . find Fragment ById ( R . id . call _ fragment _ container ) Ġas ĠCall Fragment ?) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! connected Ġ|| Ġ! call Fragment . is Added ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠShow / hide Ġcall Ġcontrol Ġfragment ĊĠĠĠĠĠĠĠ Ġcall Control Fragment Visible Ġ= Ġ! call Control Fragment Visible ĊĠĠĠĠĠĠĠ Ġval Ġft Ġ= Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠ Ġif Ġ( call Control Fragment Visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġft . show ( call Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġft . show ( h ud Fragment ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġft . hide ( call Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġft . hide ( h ud Fragment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġft . set Transition ( Fragment Transaction . TRANS IT _ FRAGMENT _ FA DE ) ĊĠĠĠĠĠĠĠ Ġft . commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Call () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Rtc Client Ġ= Ġapp Rtc Client Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" App RTC Ġclient Ġis Ġnot Ġallocated Ġfor Ġa Ġcall .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcall Started Time Ms Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġroom Ġconnection . ĊĠĠĠĠĠĠĠ Ġlog And Toast ( getString ( R . string . connecting _ to , Ġroom Connection Parameters . room Url )) ĊĠĠĠĠĠĠĠ Ġapp Rtc Client . connect To Room ( room Connection Parameters ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġand Ġaudio Ġmanager Ġthat Ġwill Ġtake Ġcare Ġof Ġaudio Ġrouting , ĊĠĠĠĠĠĠĠ Ġ// Ġaudio Ġmodes , Ġaudio Ġdevice Ġenumeration Ġetc . ĊĠĠĠĠĠĠĠ Ġaudio Manager Ġ= ĠApp RT CA udio Manager ( application Context ) ĊĠĠĠĠĠĠĠ Ġ// ĠStore Ġexisting Ġaudio Ġsettings Ġand Ġchange Ġaudio Ġmode Ġto ĊĠĠĠĠĠĠĠ Ġ// ĠMODE _ IN _ COMM UN ICATION Ġfor Ġbest Ġpossible ĠVo IP Ġperformance . ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Starting Ġthe Ġaudio Ġmanager ...") ĊĠĠĠĠĠĠĠ Ġaudio Manager ?. start ( object Ġ: ĠAudio Manager Events Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Audio Device Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Audio Device : ĠApp RT CA udio Manager . Audio Device ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Audio Devices : ĠSet < App RT CA udio Manager . Audio Device > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġmethod Ġwill Ġbe Ġcalled Ġeach Ġtime Ġthe Ġnumber Ġof Ġavailable Ġaudio ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdevices Ġhas Ġchanged . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Audio Manager Devices Changed ( selected Audio Device , Ġavailable Audio Devices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠShould Ġbe Ġcalled Ġfrom ĠUI Ġthread ĊĠĠĠ Ġprivate Ġfun Ġcall Connected () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= ĠSystem . currentTimeMillis () Ġ- Ġcall Started Time Ms ĊĠĠĠĠĠĠĠ ĠTim ber . i (" Call Ġconnected : Ġdelay =% d ms ", Ġdelta ) ĊĠĠĠĠĠĠĠ Ġval Ġpeer Connection Client Ġ= Ġpeer Connection Client ĊĠĠĠĠĠĠĠ Ġif Ġ( peer Connection Client Ġ== Ġnull Ġ|| Ġis Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w (" Call Ġis Ġconnected Ġin Ġclosed Ġor Ġerror Ġstate ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠEnable Ġstatistics Ġcallback . ĊĠĠĠĠĠĠĠ Ġpeer Connection Client . enable Stats Events ( true , ĠSTAT _ CALLBACK _ PERIOD ) ĊĠĠĠĠĠĠĠ Ġset Sw apped Feed s ( false Ġ/* Ġis Sw apped Feed s Ġ*/) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġmethod Ġis Ġcalled Ġwhen Ġthe Ġaudio Ġmanager Ġreports Ġaudio Ġdevice Ġchange , ĊĠĠĠ Ġ// Ġe . g . Ġfrom Ġw ired Ġhead set Ġto Ġspeaker phone . ĊĠĠĠ Ġprivate Ġfun Ġon Audio Manager Devices Changed ( ĊĠĠĠĠĠĠĠ Ġdevice : ĠApp RT CA udio Manager . Audio Device ?, ĊĠĠĠĠĠĠĠ Ġavailable Devices : ĠSet < App RT CA udio Manager . Audio Device > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" on Audio Manager Devices Changed : Ġ% s , Ġselected : Ġ% s ", Ġavailable Devices , Ġdevice ) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO ( hen ri ka ): Ġadd Ġcallback Ġhandler . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDis connect Ġfrom Ġremote Ġresources , Ġdispose Ġof Ġlocal Ġresources , Ġand Ġexit . ĊĠĠĠ Ġprivate Ġfun Ġdisconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġremote Proxy Renderer . target Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġlocal Proxy Video Sink . target Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġapp Rtc Client ?. disconnect From Room () ĊĠĠĠĠĠĠĠ Ġapp Rtc Client Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġbinding . pip Video View . release () ĊĊĠĠĠĠĠĠĠ Ġvideo File Renderer ?. release () ĊĠĠĠĠĠĠĠ Ġvideo File Renderer Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġbinding . fullscreen Video View . release () ĊĊĠĠĠĠĠĠĠ Ġpeer Connection Client ?. close () ĊĠĠĠĠĠĠĠ Ġpeer Connection Client Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġaudio Manager ?. stop () ĊĠĠĠĠĠĠĠ Ġaudio Manager Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( connected Ġ&& Ġ! isError ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( RESULT _ OK ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( RESULT _ C ANCE LED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisconnect With ErrorMessage ( errorMessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( command Line Run Ġ|| Ġ! activity Running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Critical Ġerror : Ġ% s ", ĠerrorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( getText ( R . string . channel _ error _ title )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( errorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Neutral Button ( R . string . ok ) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠLog Ġ` msg ` Ġand ĠToast Ġabout Ġit . ĊĠĠĠ Ġprivate Ġfun Ġlog And Toast ( msg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d ( msg ) ĊĠĠĠĠĠĠĠ Ġlog Toast ?. cancel () ĊĠĠĠĠĠĠĠ Ġlog Toast Ġ= ĠToast . makeText ( this , Ġmsg , ĠToast . LENGTH _ SHORT ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreport Error ( description : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isError ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Error Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect With ErrorMessage ( description ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Video Capt urer (): ĠVideo Capt urer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvideo Capt urer : ĠVideo Capt urer ? ĊĠĠĠĠĠĠĠ Ġval Ġvideo File As Camera Ġ= Ġintent . getString Extra ( EXTRA _ VIDEO _ FILE _ AS _ CAMERA ) ĊĠĠĠĠĠĠĠ Ġvideo Capt urer Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo File As Camera Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Video Capt urer ( video File As Camera ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport Error (" Failed Ġto Ġopen Ġvideo Ġfile Ġfor Ġem ulated Ġcamera ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscre enc apt ure Enabled Ġ-> Ġcreate Screen Capt urer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Camera 2 () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! capture To Texture ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport Error ( getString ( R . string . camera 2 _ texture _ only _ error )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Creating Ġcapt urer Ġusing Ġcamera 2 ĠAPI .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Camera Capt urer ( Camera 2 Enumerator ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Creating Ġcapt urer Ġusing Ġcamera 1 ĠAPI .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Camera Capt urer ( Camera 1 Enumerator ( capture To Texture ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvideo Capt urer Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Error (" Failed Ġto Ġopen Ġcamera ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Sw apped Feed s ( is Sw apped Feed s : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" set Sw apped Feed s : Ġ$ is Sw apped Feed s ") ĊĠĠĠĠĠĠĠ Ġthis . is Sw apped Feed s Ġ= Ġis Sw apped Feed s ĊĠĠĠĠĠĠĠ Ġval Ġfullscreen View View Ġ= Ġbinding . fullscreen Video View ĊĠĠĠĠĠĠĠ Ġval Ġpip View View Ġ= Ġbinding . pip Video View ĊĊĠĠĠĠĠĠĠ Ġlocal Proxy Video Sink . target Ġ= Ġif Ġ( is Sw apped Feed s ) Ġfullscreen View View Ġelse Ġpip View View ĊĠĠĠĠĠĠĠ Ġremote Proxy Renderer . target Ġ= Ġif Ġ( is Sw apped Feed s ) Ġpip View View Ġelse Ġfullscreen View View ĊĠĠĠĠĠĠĠ Ġfullscreen View View . set Mirror ( is Sw apped Feed s ) ĊĠĠĠĠĠĠĠ Ġpip View View . set Mirror (! is Sw apped Feed s ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ----- Implementation Ġof ĠApp RTC Client . App RTC Signal ing Events Ġ--------------- ĊĠĠĠ Ġ// ĠAll Ġcallbacks Ġare Ġinvoked Ġfrom Ġwebsocket Ġsignal ing Ġlo oper Ġthread Ġand ĊĠĠĠ Ġ// Ġare Ġro uted Ġto ĠUI Ġthread . ĊĠĠĠ Ġprivate Ġfun Ġon Connected To Room Internal ( params : ĠSignal ing Parameters ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= ĠSystem . currentTimeMillis () Ġ- Ġcall Started Time Ms ĊĠĠĠĠĠĠĠ Ġval Ġpeer Connection Client Ġ= Ġpeer Connection Client Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġsignal ing Parameters Ġ= Ġparams ĊĠĠĠĠĠĠĠ Ġlog And Toast (" Creating Ġpeer Ġconnection , Ġdelay =" Ġ+ Ġdelta Ġ+ Ġ" ms ") ĊĠĠĠĠĠĠĠ Ġvar Ġvideo Capt urer : ĠVideo Capt urer ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( peer Connection Parameters . video Call Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Capt urer Ġ= Ġcreate Video Capt urer () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpeer Connection Client . create Peer Connection ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Proxy Video Sink , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Sink s , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Capt urer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( params . init iator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog And Toast (" Creating ĠO FFER ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġoffer . ĠOffer ĠS DP Ġwill Ġbe Ġsent Ġto Ġanswer ing Ġclient Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPeer Connection Events . on Local Description Ġevent . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Connection Client . create Offer () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . offer S dp Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Connection Client . set Remote Description ( params . offer S dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog And Toast (" Creating ĠAN SW ER ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġanswer . ĠAnswer ĠS DP Ġwill Ġbe Ġsent Ġto Ġoffering Ġclient Ġin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPeer Connection Events . on Local Description Ġevent . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Connection Client . create Answer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġremote ĠI CE Ġcandidates Ġfrom Ġroom . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( ice Candidate Ġin Ġparams . ice Candidates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Connection Client . add Remote Ice Candidate ( ice Candidate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Connected To Room ( params : ĠSignal ing Parameters ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ Ġon Connected To Room Internal ( params ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Remote Description ( desc : ĠSession Description ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= ĠSystem . currentTimeMillis () Ġ- Ġcall Started Time Ms ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Connection Client ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog And Toast (" Received Ġremote Ġ" Ġ+ Ġdesc . type Ġ+ Ġ", Ġdelay =" Ġ+ Ġdelta Ġ+ Ġ" ms ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Remote Description ( desc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! signal ing Parameters . init iator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog And Toast (" Creating ĠAN SW ER ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġanswer . ĠAnswer ĠS DP Ġwill Ġbe Ġsent Ġto Ġoffering Ġclient Ġin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPeer Connection Events . on Local Description Ġevent . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . create Answer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Received Ġremote ĠS DP Ġfor Ġnon - initialized Ġpeer Ġconnection .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Remote Ice Candidate ( candidate : ĠI ce Candidate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Connection Client ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add Remote Ice Candidate ( candidate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Received ĠI CE Ġcandidate Ġfor Ġa Ġnon - initialized Ġpeer Ġconnection .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Remote Ice Candidates Removed ( candidates : ĠList < Ice Candidate >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Connection Client ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . remove Remote Ice Candidates ( candidates ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Received ĠI CE Ġcandidate Ġremo vals Ġfor Ġa Ġnon - initialized Ġpeer Ġconnection .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Channel Close () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog And Toast (" Remote Ġend Ġh ung Ġup ; Ġdropping ĠPeer Connection ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Channel Error ( description : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreport Error ( description ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ----- Implementation Ġof ĠPeer Connection Client . Peer Connection Events . --------- ĊĠĠĠ Ġ// ĠSend Ġlocal Ġpeer Ġconnection ĠS DP Ġand ĠI CE Ġcandidates Ġto Ġremote Ġparty . ĊĠĠĠ Ġ// ĠAll Ġcallbacks Ġare Ġinvoked Ġfrom Ġpeer Ġconnection Ġclient Ġlo oper Ġthread Ġand ĊĠĠĠ Ġ// Ġare Ġro uted Ġto ĠUI Ġthread . ĊĠĠĠ Ġoverride Ġfun Ġon Local Description ( desc : ĠSession Description ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= ĠSystem . currentTimeMillis () Ġ- Ġcall Started Time Ms ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Rtc Client ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog And Toast (" Sending Ġ" Ġ+ Ġdesc . type Ġ+ Ġ", Ġdelay =" Ġ+ Ġdelta Ġ+ Ġ" ms ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( signal ing Parameters . init iator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . send Offer S dp ( desc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . send Answer S dp ( desc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( peer Connection Parameters . video Max Bit rate Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Set Ġvideo Ġmaximum Ġbit rate : Ġ% d ", Ġpeer Connection Parameters . video Max Bit rate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Connection Client ?. set Video Max Bit rate ( peer Connection Parameters . video Max Bit rate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Ice Candidate ( candidate : ĠI ce Candidate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Rtc Client ?. send Local Ice Candidate ( candidate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Ice Candidates Removed ( candidates : ĠList < Ice Candidate >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Rtc Client ?. send Local Ice Candidate Rem o vals ( candidates ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Ice Connected () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= ĠSystem . currentTimeMillis () Ġ- Ġcall Started Time Ms ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ Ġlog And Toast (" ICE Ġconnected , Ġdelay =" Ġ+ Ġdelta Ġ+ Ġ" ms ") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Ice Disconnected () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ Ġlog And Toast (" ICE Ġdisconnected ") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Connected () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= ĠSystem . currentTimeMillis () Ġ- Ġcall Started Time Ms ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog And Toast (" DT LS Ġconnected , Ġdelay =" Ġ+ Ġdelta Ġ+ Ġ" ms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Connected () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Disconnected () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog And Toast (" DT LS Ġdisconnected ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Peer Connection Closed () Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġon Peer Connection Stats Ready ( report : ĠRTC Stats Report ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isError Ġ&& Ġconnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( support FragmentManager . find Fragment ById ( R . id . h ud _ fragment _ container ) Ġas ĠH ud Fragment ?) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . update Encoder Statistics ( report ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Peer Connection Error ( description : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreport Error ( description ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . KIT K AT ) ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ ROOM ID Ġ= Ġ" org . app spot . app rtc . ROOM ID " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ URL PARAMETERS Ġ= Ġ" org . app spot . app rtc . URL PARAMETERS " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ LOOP BACK Ġ= Ġ" org . app spot . app rtc . LOOP BACK " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ VIDEO _ CALL Ġ= Ġ" org . app spot . app rtc . VIDEO _ CALL " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ SC RE ENC AP TURE Ġ= Ġ" org . app spot . app rtc . SC RE ENC AP TURE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ CAMERA 2 Ġ= Ġ" org . app spot . app rtc . CAMERA 2 " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ VIDEO _ WIDTH Ġ= Ġ" org . app spot . app rtc . VIDEO _ WIDTH " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ VIDEO _ HEIGHT Ġ= Ġ" org . app spot . app rtc . VIDEO _ HEIGHT " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ VIDEO _ FPS Ġ= Ġ" org . app spot . app rtc . VIDEO _ FPS " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ VIDEO _ CAPTURE QUAL ITY SL IDER _ ENABLED Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" org . app so pt . app rtc . VIDEO _ CAPTURE QUAL ITY SL IDER " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ VIDEO _ BIT RATE Ġ= Ġ" org . app spot . app rtc . VIDEO _ BIT RATE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ VIDEO CODEC Ġ= Ġ" org . app spot . app rtc . VIDEO CODEC " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ HW CODEC _ ENABLED Ġ= Ġ" org . app spot . app rtc . HW CODEC " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ CAPTURE TOT EXT URE _ ENABLED Ġ= Ġ" org . app spot . app rtc . CAPTURE TOT EXT URE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ FLEX FE C _ ENABLED Ġ= Ġ" org . app spot . app rtc . FLEX FE C " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ AUDIO _ BIT RATE Ġ= Ġ" org . app spot . app rtc . AUDIO _ BIT RATE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ AUDIO CODEC Ġ= Ġ" org . app spot . app rtc . AUDIO CODEC " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ NO AU DI OP ROC ESS ING _ ENABLED Ġ= Ġ" org . app spot . app rtc . NO AU DI OP ROC ESS ING " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ AE CD UMP _ ENABLED Ġ= Ġ" org . app spot . app rtc . AE CD UMP " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ SAVE _ INPUT _ AUDIO _ TO _ FILE _ ENABLED Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" org . app spot . app rtc . SAVE _ INPUT _ AUDIO _ TO _ FILE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ OPEN S LES _ ENABLED Ġ= Ġ" org . app spot . app rtc . OPEN S LES " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ DISABLE _ BUIL T _ IN _ A EC Ġ= Ġ" org . app spot . app rtc . DISABLE _ BUIL T _ IN _ A EC " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ DISABLE _ BUIL T _ IN _ AG C Ġ= Ġ" org . app spot . app rtc . DISABLE _ BUIL T _ IN _ AG C " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ DISABLE _ BUIL T _ IN _ NS Ġ= Ġ" org . app spot . app rtc . DISABLE _ BUIL T _ IN _ NS " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ DISABLE _ WEB RTC _ AG C _ AND _ HP F Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" org . app spot . app rtc . DISABLE _ WEB RTC _ GAIN _ CONTROL " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ DISPLAY _ HUD Ġ= Ġ" org . app spot . app rtc . DISPLAY _ HUD " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ TR ACING Ġ= Ġ" org . app spot . app rtc . TR ACING " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ CM DL INE Ġ= Ġ" org . app spot . app rtc . CM DL INE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ RUNTIME Ġ= Ġ" org . app spot . app rtc . RUNTIME " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ VIDEO _ FILE _ AS _ CAMERA Ġ= Ġ" org . app spot . app rtc . VIDEO _ FILE _ AS _ CAMERA " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ SAVE _ REMOTE _ VIDEO _ TO _ FILE Ġ= Ġ" org . app spot . app rtc . SAVE _ REMOTE _ VIDEO _ TO _ FILE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ SAVE _ REMOTE _ VIDEO _ TO _ FILE _ WIDTH Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" org . app spot . app rtc . SAVE _ REMOTE _ VIDEO _ TO _ FILE _ WIDTH " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ SAVE _ REMOTE _ VIDEO _ TO _ FILE _ HEIGHT Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" org . app spot . app rtc . SAVE _ REMOTE _ VIDEO _ TO _ FILE _ HEIGHT " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ USE _ VALUES _ FROM _ INT ENT Ġ= Ġ" org . app spot . app rtc . USE _ VALUES _ FROM _ INT ENT " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ DATA _ CHANNEL _ ENABLED Ġ= Ġ" org . app spot . app rtc . DATA _ CHANNEL _ ENABLED " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ ORDER ED Ġ= Ġ" org . app spot . app rtc . ORDER ED " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ MAX _ RE TRAN SM ITS _ MS Ġ= Ġ" org . app spot . app rtc . MAX _ RE TRAN SM ITS _ MS " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ MAX _ RE TRAN SM ITS Ġ= Ġ" org . app spot . app rtc . MAX _ RE TRAN SM ITS " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ PROTOCOL Ġ= Ġ" org . app spot . app rtc . PROTOCOL " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ NEG OT I ATED Ġ= Ġ" org . app spot . app rtc . NEG OT I ATED " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ ID Ġ= Ġ" org . app spot . app rtc . ID " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ ENABLE _ RT CE VENT LOG Ġ= Ġ" org . app spot . app rtc . ENABLE _ RT CE VENT LOG " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCAP TURE _ PERMISSION _ REQUEST _ CODE Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ// ĠList Ġof Ġmandatory Ġapplication Ġpermissions . ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠM AND AT ORY _ PERMISSION S Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android . permission . MO DIFY _ AUDIO _ SETTINGS ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android . permission . RECORD _ AUDIO ", Ġ" android . permission . INTER NET ", ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPeer Ġconnection Ġstatistics Ġcallback Ġperiod Ġin Ġms . ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTAT _ CALLBACK _ PERIOD Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġmedia Projection Permission Result Data : ĠIntent ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġmedia Projection Permission ResultCode Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġsystem Ui Visibility Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView . SYSTEM _ UI _ FLAG _ HIDE _ NAV IG ATION Ġor ĠView . SYSTEM _ UI _ FLAG _ FULL SCREEN Ġor ĠView . SYSTEM _ UI _ FLAG _ IM MER SIVE _ STICK Y ĊĠĠĠ Ġ} Ċ }