@@ -70,6 +70,7 @@ struct ElementCallParams {
70
70
/// Supported since Element Call v0.9.0. Only used by the embedded package.
71
71
sentry_environment : Option < String > ,
72
72
hide_screensharing : bool ,
73
+ controlled_media_devices : bool ,
73
74
}
74
75
75
76
/// Defines if a call is encrypted and which encryption system should be used.
@@ -193,6 +194,11 @@ pub struct VirtualElementCallWidgetOptions {
193
194
/// Sentry [environment](https://docs.sentry.io/concepts/key-terms/key-terms/)
194
195
/// This is only used by the embedded package of Element Call.
195
196
pub sentry_environment : Option < String > ,
197
+ //// - `true`: The webview should show the list of media devices it detects using
198
+ //// `enumerateDevices`.
199
+ /// - `false`: the webview shows a a list of devices injected by the
200
+ /// client. (used on ios & android)
201
+ pub controlled_media_devices : bool ,
196
202
}
197
203
198
204
impl WidgetSettings {
@@ -253,6 +259,7 @@ impl WidgetSettings {
253
259
sentry_environment : props. sentry_environment ,
254
260
rageshake_submit_url : props. rageshake_submit_url ,
255
261
hide_screensharing : props. hide_screensharing ,
262
+ controlled_media_devices : props. controlled_media_devices ,
256
263
} ;
257
264
258
265
let query =
@@ -288,6 +295,7 @@ mod tests {
288
295
rageshake : bool ,
289
296
sentry : bool ,
290
297
intent : Option < Intent > ,
298
+ controlle_output : bool ,
291
299
) -> WidgetSettings {
292
300
let mut props = VirtualElementCallWidgetOptions {
293
301
element_call_url : "https://call.element.io" . to_owned ( ) ,
@@ -298,6 +306,7 @@ mod tests {
298
306
confine_to_room : Some ( true ) ,
299
307
encryption : encryption. unwrap_or ( EncryptionSystem :: PerParticipantKeys ) ,
300
308
intent,
309
+ controlled_media_devices : controlle_output,
301
310
..VirtualElementCallWidgetOptions :: default ( )
302
311
} ;
303
312
@@ -345,13 +354,13 @@ mod tests {
345
354
}
346
355
347
356
#[ test]
348
- fn new_virtual_element_call_widget_base_url ( ) {
349
- let widget_settings = get_widget_settings ( None , false , false , false , None ) ;
357
+ fn test_new_virtual_element_call_widget_base_url ( ) {
358
+ let widget_settings = get_widget_settings ( None , false , false , false , None , false ) ;
350
359
assert_eq ! ( widget_settings. base_url( ) . unwrap( ) . as_str( ) , "https://call.element.io/" ) ;
351
360
}
352
361
353
362
#[ test]
354
- fn new_virtual_element_call_widget_raw_url ( ) {
363
+ fn test_new_virtual_element_call_widget_raw_url ( ) {
355
364
const CONVERTED_URL : & str = "
356
365
https://call.element.io#\
357
366
?userId=$matrix_user_id\
@@ -370,9 +379,10 @@ mod tests {
370
379
&preload=true\
371
380
&perParticipantE2EE=true\
372
381
&hideScreensharing=false\
382
+ &controlledMediaDevices=false\
373
383
";
374
384
375
- let mut url = get_widget_settings ( None , false , false , false , None ) . raw_url ( ) . clone ( ) ;
385
+ let mut url = get_widget_settings ( None , false , false , false , None , false ) . raw_url ( ) . clone ( ) ;
376
386
let mut gen = Url :: parse ( CONVERTED_URL ) . unwrap ( ) ;
377
387
assert_eq ! ( get_query_sets( & url) . unwrap( ) , get_query_sets( & gen ) . unwrap( ) ) ;
378
388
url. set_fragment ( None ) ;
@@ -383,8 +393,11 @@ mod tests {
383
393
}
384
394
385
395
#[ test]
386
- fn new_virtual_element_call_widget_id ( ) {
387
- assert_eq ! ( get_widget_settings( None , false , false , false , None ) . widget_id( ) , WIDGET_ID ) ;
396
+ fn test_new_virtual_element_call_widget_id ( ) {
397
+ assert_eq ! (
398
+ get_widget_settings( None , false , false , false , None , false ) . widget_id( ) ,
399
+ WIDGET_ID
400
+ ) ;
388
401
}
389
402
390
403
fn build_url_from_widget_settings ( settings : WidgetSettings ) -> String {
@@ -406,7 +419,7 @@ mod tests {
406
419
}
407
420
408
421
#[ test]
409
- fn new_virtual_element_call_widget_webview_url ( ) {
422
+ fn test_new_virtual_element_call_widget_webview_url ( ) {
410
423
const CONVERTED_URL : & str = "
411
424
https://call.element.io#\
412
425
?parentUrl=https%3A%2F%2Fcall.element.io\
@@ -423,9 +436,11 @@ mod tests {
423
436
&clientId=io.my_matrix.client\
424
437
&perParticipantE2EE=true\
425
438
&hideScreensharing=false\
439
+ &controlledMediaDevices=false\
426
440
";
427
- let gen =
428
- build_url_from_widget_settings ( get_widget_settings ( None , false , false , false , None ) ) ;
441
+ let gen = build_url_from_widget_settings ( get_widget_settings (
442
+ None , false , false , false , None , false ,
443
+ ) ) ;
429
444
430
445
let mut url = Url :: parse ( & gen) . unwrap ( ) ;
431
446
let mut gen = Url :: parse ( CONVERTED_URL ) . unwrap ( ) ;
@@ -438,7 +453,7 @@ mod tests {
438
453
}
439
454
440
455
#[ test]
441
- fn new_virtual_element_call_widget_webview_url_with_posthog_rageshake_sentry ( ) {
456
+ fn test_new_virtual_element_call_widget_webview_url_with_posthog_rageshake_sentry ( ) {
442
457
const CONVERTED_URL : & str = "
443
458
https://call.element.io#\
444
459
?parentUrl=https%3A%2F%2Fcall.element.io\
@@ -462,8 +477,11 @@ mod tests {
462
477
&rageshakeSubmitUrl=https%3A%2F%2Frageshake.element.io\
463
478
&sentryDsn=SENTRY_DSN\
464
479
&sentryEnvironment=SENTRY_ENV\
480
+ &controlledMediaDevices=false\
465
481
";
466
- let gen = build_url_from_widget_settings ( get_widget_settings ( None , true , true , true , None ) ) ;
482
+ let gen = build_url_from_widget_settings ( get_widget_settings (
483
+ None , true , true , true , None , false ,
484
+ ) ) ;
467
485
468
486
let mut url = Url :: parse ( & gen) . unwrap ( ) ;
469
487
let mut gen = Url :: parse ( CONVERTED_URL ) . unwrap ( ) ;
@@ -476,7 +494,7 @@ mod tests {
476
494
}
477
495
478
496
#[ test]
479
- fn password_url_props_from_widget_settings ( ) {
497
+ fn test_password_url_props_from_widget_settings ( ) {
480
498
{
481
499
// PerParticipantKeys
482
500
let url = build_url_from_widget_settings ( get_widget_settings (
@@ -485,6 +503,7 @@ mod tests {
485
503
false ,
486
504
false ,
487
505
None ,
506
+ false ,
488
507
) ) ;
489
508
let query_set = get_query_sets ( & Url :: parse ( & url) . unwrap ( ) ) . unwrap ( ) . 1 ;
490
509
let expected_elements = [ ( "perParticipantE2EE" . to_owned ( ) , "true" . to_owned ( ) ) ] ;
@@ -505,6 +524,7 @@ mod tests {
505
524
false ,
506
525
false ,
507
526
None ,
527
+ false ,
508
528
) ) ;
509
529
let query_set = get_query_sets ( & Url :: parse ( & url) . unwrap ( ) ) . unwrap ( ) . 1 ;
510
530
let expected_elements = ( "perParticipantE2EE" . to_owned ( ) , "false" . to_owned ( ) ) ;
@@ -523,6 +543,7 @@ mod tests {
523
543
false ,
524
544
false ,
525
545
None ,
546
+ false ,
526
547
) ) ;
527
548
let query_set = get_query_sets ( & Url :: parse ( & url) . unwrap ( ) ) . unwrap ( ) . 1 ;
528
549
let expected_elements = [ ( "password" . to_owned ( ) , "this_surely_is_save" . to_owned ( ) ) ] ;
@@ -538,11 +559,34 @@ mod tests {
538
559
}
539
560
540
561
#[ test]
541
- fn intent_url_props_from_widget_settings ( ) {
562
+ fn test_controlled_output_url_props_from_widget_settings ( ) {
563
+ {
564
+ // PerParticipantKeys
565
+ let url = build_url_from_widget_settings ( get_widget_settings (
566
+ Some ( EncryptionSystem :: PerParticipantKeys ) ,
567
+ false ,
568
+ false ,
569
+ false ,
570
+ None ,
571
+ true ,
572
+ ) ) ;
573
+ let controlled_media_element = ( "controlledMediaDevices" . to_owned ( ) , "true" . to_owned ( ) ) ;
574
+ let query_set = get_query_sets ( & Url :: parse ( & url) . unwrap ( ) ) . unwrap ( ) . 1 ;
575
+ assert ! (
576
+ query_set. contains( & controlled_media_element) ,
577
+ "The query elements: \n {:?}\n Did not contain: \n {:?}" ,
578
+ query_set,
579
+ controlled_media_element
580
+ ) ;
581
+ }
582
+ }
583
+
584
+ #[ test]
585
+ fn test_intent_url_props_from_widget_settings ( ) {
542
586
{
543
587
// no intent
544
588
let url = build_url_from_widget_settings ( get_widget_settings (
545
- None , false , false , false , None ,
589
+ None , false , false , false , None , false ,
546
590
) ) ;
547
591
let query_set = get_query_sets ( & Url :: parse ( & url) . unwrap ( ) ) . unwrap ( ) . 1 ;
548
592
@@ -565,6 +609,7 @@ mod tests {
565
609
false ,
566
610
false ,
567
611
Some ( Intent :: JoinExisting ) ,
612
+ false ,
568
613
) ) ;
569
614
let query_set = get_query_sets ( & Url :: parse ( & url) . unwrap ( ) ) . unwrap ( ) . 1 ;
570
615
let expected_elements = ( "intent" . to_owned ( ) , "join_existing" . to_owned ( ) ) ;
@@ -594,6 +639,7 @@ mod tests {
594
639
false ,
595
640
false ,
596
641
Some ( Intent :: StartCall ) ,
642
+ false ,
597
643
) ) ;
598
644
let query_set = get_query_sets ( & Url :: parse ( & url) . unwrap ( ) ) . unwrap ( ) . 1 ;
599
645
0 commit comments