< Summary

Class:DCL.ExperiencesViewer.ExperiencesViewerComponentController
Assembly:ExperiencesViewer
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/ExperiencesViewer/Scripts/ExperiencesViewerComponentController.cs
Covered lines:50
Uncovered lines:61
Coverable lines:111
Total lines:247
Line coverage:45% (50 of 111)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ExperiencesViewerComponentController()0%110100%
Initialize(...)0%220100%
SetVisibility(...)0%110100%
Dispose()0%220100%
OnCloseButtonPressed()0%110100%
OnSomeExperienceUIVisibilityChanged(...)0%12300%
OnSomeExperienceExecutionChanged(...)0%30500%
IsOpenChanged(...)0%110100%
CheckCurrentActivePortableExperiences()0%4.123050%
OnPEXSceneAdded(...)0%42600%
OnPEXSceneRemoved(...)0%30500%
OnUserProfileUpdated(...)0%10.357059.09%
CreateView()0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/ExperiencesViewer/Scripts/ExperiencesViewerComponentController.cs

#LineLine coverage
 1using DCL.Components;
 2using DCL.Controllers;
 3using DCL.Interface;
 4using System;
 5using System.Collections.Generic;
 6using System.Linq;
 7using UnityEngine;
 8
 9namespace DCL.ExperiencesViewer
 10{
 11    public interface IExperiencesViewerComponentController : IDisposable
 12    {
 13        /// <summary>
 14        /// Initializes the experiences viewer controller.
 15        /// </summary>
 16        /// <param name="sceneController">Scene controller used to detect when PEX are created/removed.</param>
 17        void Initialize(ISceneController sceneController);
 18
 19        /// <summary>
 20        /// Set the experience viewer feature as visible or not.
 21        /// </summary>
 22        /// <param name="visible">True for showing it.</param>
 23        void SetVisibility(bool visible);
 24    }
 25
 26    public class ExperiencesViewerComponentController : IExperiencesViewerComponentController
 27    {
 728        internal BaseVariable<Transform> isInitialized => DataStore.i.experiencesViewer.isInitialized;
 3729        internal BaseVariable<bool> isOpen => DataStore.i.experiencesViewer.isOpen;
 1530        internal BaseVariable<int> numOfLoadedExperiences => DataStore.i.experiencesViewer.numOfLoadedExperiences;
 031        public BaseDictionary<string, WearableItem> wearableCatalog => DataStore.i.common.wearables;
 32
 33        internal IExperiencesViewerComponentView view;
 34        internal ISceneController sceneController;
 35        internal UserProfile userProfile;
 36        internal CatalogController catalog;
 737        internal Dictionary<string, IParcelScene> activePEXScenes = new Dictionary<string, IParcelScene>();
 738        internal List<string> pausedPEXScenesIds = new List<string>();
 39        internal List<string> lastDisablePEXSentToKernel;
 40
 41        public void Initialize(ISceneController sceneController)
 42        {
 743            view = CreateView();
 744            view.onCloseButtonPressed += OnCloseButtonPressed;
 745            view.onSomeExperienceUIVisibilityChanged += OnSomeExperienceUIVisibilityChanged;
 746            view.onSomeExperienceExecutionChanged += OnSomeExperienceExecutionChanged;
 47
 748            isOpen.OnChange += IsOpenChanged;
 749            IsOpenChanged(isOpen.Get(), false);
 50
 751            this.sceneController = sceneController;
 52
 753            DataStore.i.world.portableExperienceIds.OnAdded += OnPEXSceneAdded;
 754            DataStore.i.world.portableExperienceIds.OnRemoved += OnPEXSceneRemoved;
 55
 756            CheckCurrentActivePortableExperiences();
 57
 758            userProfile = UserProfile.GetOwnUserProfile();
 759            if (userProfile != null)
 60            {
 761                userProfile.OnUpdate += OnUserProfileUpdated;
 762                OnUserProfileUpdated(userProfile);
 63            }
 64
 765            isInitialized.Set(view.experienceViewerTransform);
 766        }
 67
 68        public void SetVisibility(bool visible)
 69        {
 1670            view.SetVisible(visible);
 1671            isOpen.Set(visible);
 1672        }
 73
 74        public void Dispose()
 75        {
 776            view.onCloseButtonPressed -= OnCloseButtonPressed;
 777            view.onSomeExperienceUIVisibilityChanged -= OnSomeExperienceUIVisibilityChanged;
 778            view.onSomeExperienceExecutionChanged -= OnSomeExperienceExecutionChanged;
 779            isOpen.OnChange -= IsOpenChanged;
 80
 781            DataStore.i.world.portableExperienceIds.OnAdded -= OnPEXSceneAdded;
 782            DataStore.i.world.portableExperienceIds.OnRemoved -= OnPEXSceneRemoved;
 83
 784            if (userProfile != null)
 785                userProfile.OnUpdate -= OnUserProfileUpdated;
 786        }
 87
 288        internal void OnCloseButtonPressed() { SetVisibility(false); }
 89
 90        internal void OnSomeExperienceUIVisibilityChanged(string pexId, bool isVisible)
 91        {
 092            activePEXScenes.TryGetValue(pexId, out IParcelScene scene);
 093            if (scene != null)
 94            {
 095                UIScreenSpace sceneUIComponent = scene.componentsManagerLegacy.GetSceneSharedComponent<UIScreenSpace>();
 096                sceneUIComponent.canvas.enabled = isVisible;
 97            }
 98
 099            if (!isVisible)
 0100                view.ShowUIHiddenToast();
 0101        }
 102
 103        internal void OnSomeExperienceExecutionChanged(string pexId, bool isPlaying)
 104        {
 0105            if (isPlaying)
 106            {
 0107                WebInterface.SetDisabledPortableExperiences(pausedPEXScenesIds.Where(x => x != pexId).ToArray());
 0108            }
 109            else
 110            {
 111                // We only keep the experience paused in the list if our avatar has the related wearable equipped
 0112                if (userProfile != null && userProfile.avatar.wearables.Contains(pexId))
 113                {
 0114                    if (!pausedPEXScenesIds.Contains(pexId))
 0115                        pausedPEXScenesIds.Add(pexId);
 116
 0117                    WebInterface.SetDisabledPortableExperiences(pausedPEXScenesIds.ToArray());
 0118                }
 119                else
 120                {
 0121                    WebInterface.KillPortableExperience(pexId);
 122                }
 123            }
 0124        }
 125
 26126        internal void IsOpenChanged(bool current, bool previous) { SetVisibility(current); }
 127
 128        internal void CheckCurrentActivePortableExperiences()
 129        {
 8130            activePEXScenes.Clear();
 8131            pausedPEXScenesIds.Clear();
 132
 8133            if (DCL.Environment.i.world.state != null)
 134            {
 0135                List<GlobalScene> activePortableExperiences =
 136                    PortableExperienceUtils.GetActivePortableExperienceScenes();
 0137                foreach (GlobalScene pexScene in activePortableExperiences)
 138                {
 0139                    OnPEXSceneAdded(pexScene.sceneData.id);
 140                }
 141            }
 142
 8143            numOfLoadedExperiences.Set(activePEXScenes.Count);
 8144        }
 145
 146        public void OnPEXSceneAdded(string id)
 147        {
 0148            IParcelScene scene = Environment.i.world.state.GetScene(id);
 0149            ExperienceRowComponentView experienceToUpdate = view.GetAvailableExperienceById(scene.sceneData.id);
 150
 0151            if (activePEXScenes.ContainsKey(scene.sceneData.id))
 152            {
 0153                activePEXScenes[scene.sceneData.id] = scene;
 0154                pausedPEXScenesIds.Remove(scene.sceneData.id);
 155
 0156                if (experienceToUpdate != null)
 0157                    experienceToUpdate.SetUIVisibility(true);
 158
 0159                return;
 160            }
 161
 0162            GlobalScene newPortableExperienceScene = scene as GlobalScene;
 0163            DataStore.i.experiencesViewer.activeExperience.Get().Add(scene.sceneData.id);
 164
 0165            if (pausedPEXScenesIds.Contains(scene.sceneData.id))
 166            {
 0167                pausedPEXScenesIds.Remove(scene.sceneData.id);
 168
 0169                if (experienceToUpdate != null)
 0170                    experienceToUpdate.SetAsPlaying(true);
 0171            }
 172            else
 173            {
 0174                ExperienceRowComponentModel experienceToAdd = new ExperienceRowComponentModel
 175                {
 176                    id = newPortableExperienceScene.sceneData.id,
 177                    isPlaying = true,
 178                    isUIVisible = true,
 179                    name = newPortableExperienceScene.sceneName,
 180                    iconUri = newPortableExperienceScene.iconUrl,
 181                    allowStartStop = userProfile != null && userProfile.avatar.wearables.Contains(newPortableExperienceS
 182                };
 183
 0184                view.AddAvailableExperience(experienceToAdd);
 0185                activePEXScenes.Add(scene.sceneData.id, scene);
 0186                numOfLoadedExperiences.Set(activePEXScenes.Count);
 187            }
 0188        }
 189
 190        public void OnPEXSceneRemoved(string id)
 191        {
 0192            if (!activePEXScenes.ContainsKey(id))
 0193                return;
 194
 0195            DataStore.i.experiencesViewer.activeExperience.Get().Remove(id);
 0196            if (pausedPEXScenesIds.Contains(id))
 197            {
 0198                ExperienceRowComponentView experienceToUpdate = view.GetAvailableExperienceById(id);
 0199                if (experienceToUpdate != null)
 200                {
 0201                    if (!experienceToUpdate.model.isPlaying)
 0202                        return;
 203                }
 204            }
 205
 0206            view.RemoveAvailableExperience(id);
 0207            activePEXScenes.Remove(id);
 0208            pausedPEXScenesIds.Remove(id);
 0209            numOfLoadedExperiences.Set(activePEXScenes.Count);
 0210        }
 211
 212        internal void OnUserProfileUpdated(UserProfile userProfile)
 213        {
 7214            List<string> experiencesIdsToRemove = new List<string>();
 215
 14216            foreach (var pex in activePEXScenes)
 217            {
 218                // We remove from the list all those experiences related to wearables that are not equipped
 0219                if (wearableCatalog.ContainsKey(pex.Key) && !userProfile.avatar.wearables.Contains(pex.Key))
 0220                    experiencesIdsToRemove.Add(pex.Key);
 221            }
 222
 14223            foreach (string pexId in experiencesIdsToRemove)
 224            {
 0225                view.RemoveAvailableExperience(pexId);
 0226                activePEXScenes.Remove(pexId);
 0227                pausedPEXScenesIds.Remove(pexId);
 228            }
 229
 7230            numOfLoadedExperiences.Set(activePEXScenes.Count);
 231
 7232            if (lastDisablePEXSentToKernel != pausedPEXScenesIds)
 233            {
 7234                lastDisablePEXSentToKernel = pausedPEXScenesIds;
 7235                WebInterface.SetDisabledPortableExperiences(pausedPEXScenesIds.ToArray());
 236            }
 237
 7238            List<ExperienceRowComponentView> loadedExperiences = view.GetAllAvailableExperiences();
 14239            for (int i = 0; i < loadedExperiences.Count; i++)
 240            {
 0241                loadedExperiences[i].SetAllowStartStop(userProfile.avatar.wearables.Contains(loadedExperiences[i].model.
 242            }
 7243        }
 244
 0245        internal virtual IExperiencesViewerComponentView CreateView() => ExperiencesViewerComponentView.Create();
 246    }
 247}