예제 #1
0
 public async ValueTask <IEnumerable <IScene> > BuildStack(IScene scene, SceneBuilderContext context,
                                                           SceneStackFunc sceneProviderFunc)
 {
     return(new List <IScene> {
         AutonomousScene.Instance, FindPreferredScene(context)
     });
 }
예제 #2
0
        private static IScene FindPreferredScene(SceneBuilderContext context)
        {
            if (TryFindScreenShareScene(context, out var screenShareScene))
            {
                return(screenShareScene);
            }

            return(GetDefaultScene(context.Options));
        }
예제 #3
0
        public async ValueTask <IEnumerable <IScene> > BuildStack(IScene scene, SceneBuilderContext context,
                                                                  SceneStackFunc sceneProviderFunc)
        {
            var stack = new Stack <IScene>();

            stack.Push(scene);

            return(stack);
        }
        public async Task BuildStack_NewScreenShare_ReturnScreen()
        {
            // arrange
            var provider = new AutonomousSceneProvider();
            var context  = new SceneBuilderContext(ConferenceId, RoomId, new[] { new ScreenShareScene("p1") },
                                                   new SceneOptions(), ImmutableList <IScene> .Empty);

            // act
            var availableScenes = await provider.BuildStack(AutonomousScene.Instance, context, _emptyStackFunc);

            // assert
            Assert.Equal(availableScenes, new IScene[] { AutonomousScene.Instance, new ScreenShareScene("p1") });
        }
예제 #5
0
        private static bool TryFindScreenShareScene(SceneBuilderContext context,
                                                    [NotNullWhen(true)] out ScreenShareScene?scene)
        {
            var previousScreenShare = context.PreviousStack.OfType <ScreenShareScene>().LastOrDefault();

            if (previousScreenShare != null && context.AvailableScenes.Contains(previousScreenShare))
            {
                scene = previousScreenShare;
                return(true);
            }

            scene = context.AvailableScenes.OfType <ScreenShareScene>().OrderBy(x => x.ParticipantId).FirstOrDefault();
            return(scene != null);
        }
        public async Task BuildStack_NoScreenShareScenes_ReturnDefault()
        {
            // arrange
            var provider = new AutonomousSceneProvider();
            var context  = new SceneBuilderContext(ConferenceId, RoomId, ImmutableList <IScene> .Empty,
                                                   new SceneOptions {
                DefaultScene = SceneOptions.BasicSceneType.Grid
            }, ImmutableList <IScene> .Empty);

            // act
            var availableScenes = await provider.BuildStack(AutonomousScene.Instance, context, _emptyStackFunc);

            // assert
            Assert.Equal(availableScenes, new IScene[] { AutonomousScene.Instance, GridScene.Instance });
        }
예제 #7
0
        public async ValueTask <IEnumerable <IScene> > BuildStack(IScene scene, SceneBuilderContext context,
                                                                  SceneStackFunc sceneProviderFunc)
        {
            var presenterScene = (PresenterScene)scene;
            var stack          = new List <IScene> {
                presenterScene
            };

            var screenShare = context.AvailableScenes.OfType <ScreenShareScene>()
                              .FirstOrDefault(x => x.ParticipantId == presenterScene.PresenterParticipantId);

            if (screenShare != null)
            {
                stack.Add(screenShare);
            }
            else
            {
                stack.Add(ActiveSpeakerScene.Instance);
            }

            return(stack);
        }
예제 #8
0
        public async ValueTask <IEnumerable <IScene> > BuildStack(IScene scene, SceneBuilderContext context,
                                                                  SceneStackFunc sceneProviderFunc)
        {
            var stack = new List <IScene> {
                scene
            };

            var syncObj = await GetSyncObj(context.ConferenceId, context.RoomId);

            if (syncObj.CurrentSpeakerId != null)
            {
                var rooms = await _mediator.FetchSynchronizedObject <SynchronizedRooms>(context.ConferenceId,
                                                                                        SynchronizedRooms.SyncObjId);

                if (rooms.Participants.TryGetValue(syncObj.CurrentSpeakerId, out var roomId) &&
                    context.RoomId == roomId)
                {
                    var presenterScene = new PresenterScene(syncObj.CurrentSpeakerId);
                    stack.AddRange(await sceneProviderFunc(presenterScene, context));
                }
            }

            return(stack);
        }