< Summary

Class:DCL.ExperiencesViewer.ExperiencesViewerController
Assembly:ExperiencesViewer
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ExperiencesViewer/Scripts/ExperiencesViewerController.cs
Covered lines:72
Uncovered lines:28
Coverable lines:100
Total lines:218
Line coverage:72% (72 of 100)
Covered branches:0
Total branches:0
Covered methods:19
Total methods:23
Method coverage:82.6% (19 of 23)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ExperiencesViewerController(...)0%330100%
Dispose()0%110100%
SetVisibility(...)0%110100%
OnCloseButtonPressed()0%110100%
OnSomeExperienceUIVisibilityAdded(...)0%3.213071.43%
OnSomeExperienceUIVisibilitySet(...)0%12300%
OnViewRequestToChangeUiVisibility(...)0%770100%
DisableOrEnablePortableExperience(...)0%770100%
ShowOrHide(...)0%110100%
OnPEXDisabled(...)0%2.262060%
OnPEXSceneAdded(...)0%2100%
GetPortableExperienceScene(...)0%110100%
GetScene(...)0%110100%
OnPEXSceneAdded(...)0%12300%
OnPEXSceneRemoved(...)0%6200%
GetPortableExperienceCount()0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ExperiencesViewer/Scripts/ExperiencesViewerController.cs

#LineLine coverage
 1using DCL.Controllers;
 2using System.Collections.Generic;
 3using System.Linq;
 4using UnityEngine;
 5
 6namespace DCL.ExperiencesViewer
 7{
 8    public class ExperiencesViewerController
 9    {
 10        private readonly IExperiencesViewerComponentView view;
 11        private readonly DataStore dataStore;
 12        private readonly IWorldState worldState;
 13        private readonly IPortableExperiencesBridge portableExperiencesBridge;
 14
 1115        private BaseVariable<Transform> isInitialized => dataStore.experiencesViewer.isInitialized;
 4916        private BaseVariable<bool> isOpen => dataStore.experiencesViewer.isOpen;
 1517        private BaseVariable<int> numOfLoadedExperiences => dataStore.experiencesViewer.numOfLoadedExperiences;
 5018        private BaseDictionary<string, (string name, string description, string icon)> disabledPortableExperiences => da
 5919        private BaseHashSet<string> portableExperienceIds => dataStore.world.portableExperienceIds;
 120        private BaseVariable<string> forcePortableExperience => dataStore.world.forcePortableExperience;
 4421        private BaseDictionary<int, bool> isSceneUiEnabled => dataStore.HUDs.isSceneUiEnabled;
 22
 1123        public ExperiencesViewerController(IExperiencesViewerComponentView view,
 24            DataStore dataStore,
 25            IWorldState worldState,
 26            IPortableExperiencesBridge portableExperiencesBridge)
 27        {
 1128            this.view = view;
 1129            this.dataStore = dataStore;
 1130            this.worldState = worldState;
 1131            this.portableExperiencesBridge = portableExperiencesBridge;
 32
 1133            view.OnCloseButtonPressed += OnCloseButtonPressed;
 1134            view.OnExperienceUiVisibilityChanged += OnViewRequestToChangeUiVisibility;
 1135            view.OnExperienceExecutionChanged += DisableOrEnablePortableExperience;
 36
 1137            isOpen.OnChange += ShowOrHide;
 1138            ShowOrHide(isOpen.Get(), false);
 39
 1140            portableExperienceIds.OnAdded += OnPEXSceneAdded;
 1141            portableExperienceIds.OnRemoved += OnPEXSceneRemoved;
 1142            disabledPortableExperiences.OnAdded += OnPEXDisabled;
 1143            isSceneUiEnabled.OnAdded += OnSomeExperienceUIVisibilityAdded;
 1144            isSceneUiEnabled.OnSet += OnSomeExperienceUIVisibilitySet;
 45
 4446            foreach (var pair in disabledPortableExperiences.Get())
 1147                OnPEXDisabled(pair.Key, pair.Value);
 48
 1149            isInitialized.Set(view.ExperienceViewerTransform);
 1150        }
 51
 52        public void Dispose()
 53        {
 1154            view.OnCloseButtonPressed -= OnCloseButtonPressed;
 1155            view.OnExperienceUiVisibilityChanged -= OnViewRequestToChangeUiVisibility;
 1156            view.OnExperienceExecutionChanged -= DisableOrEnablePortableExperience;
 1157            isOpen.OnChange -= ShowOrHide;
 1158            portableExperienceIds.OnAdded -= OnPEXSceneAdded;
 1159            portableExperienceIds.OnRemoved -= OnPEXSceneRemoved;
 1160            disabledPortableExperiences.OnAdded -= OnPEXDisabled;
 1161            isSceneUiEnabled.OnAdded -= OnSomeExperienceUIVisibilityAdded;
 1162            isSceneUiEnabled.OnSet -= OnSomeExperienceUIVisibilitySet;
 1163        }
 64
 65        private void SetVisibility(bool visible)
 66        {
 1667            view.SetVisible(visible);
 1668            isOpen.Set(visible);
 1669        }
 70
 71        private void OnCloseButtonPressed() =>
 172            SetVisibility(false);
 73
 74        private void OnSomeExperienceUIVisibilityAdded(int pexNumber, bool isVisible)
 75        {
 276            IParcelScene scene = GetScene(pexNumber);
 277            if (scene == null) return;
 78
 79            // TODO: decouple monobehaviour component from controller
 280            ExperienceRowComponentView experienceToUpdate = view.GetAvailableExperienceById(scene.sceneData.id);
 81
 282            if (experienceToUpdate != null)
 083                experienceToUpdate.SetUIVisibility(isVisible);
 284        }
 85
 86        private void OnSomeExperienceUIVisibilitySet(IEnumerable<KeyValuePair<int, bool>> obj)
 87        {
 088            foreach ((int sceneNumber, bool visible) in obj)
 089                OnSomeExperienceUIVisibilityAdded(sceneNumber, visible);
 090        }
 91
 92        private void OnViewRequestToChangeUiVisibility(string pexId, bool isVisible)
 93        {
 294            IParcelScene scene = GetPortableExperienceScene(pexId);
 95
 296            if (scene != null)
 297                dataStore.HUDs.isSceneUiEnabled.AddOrSet(scene.sceneData.sceneNumber, isVisible);
 98
 299            if (isVisible)
 1100                view.ShowUiShownToast(scene?.GetSceneName());
 101            else
 1102                view.ShowUiHiddenToast(scene?.GetSceneName());
 1103        }
 104
 105        private void DisableOrEnablePortableExperience(string pexId, bool isPlaying)
 106        {
 2107            IParcelScene scene = GetPortableExperienceScene(pexId);
 108
 2109            if (isPlaying)
 110            {
 1111                forcePortableExperience.Set(pexId);
 112
 1113                portableExperiencesBridge.SetDisabledPortableExperiences(
 114                    disabledPortableExperiences.GetKeys()
 2115                                               .Where(s => s != pexId)
 116                                               .ToArray());
 117
 1118                view.ShowEnabledToast(scene?.GetSceneName());
 119            }
 1120            else if (scene != null)
 121            {
 1122                portableExperiencesBridge.SetDisabledPortableExperiences(disabledPortableExperiences.GetKeys()
 123                                                                                                    .Concat(new[] { pexI
 124                                                                                                    .Distinct()
 125                                                                                                    .ToArray());
 126
 1127                view.ShowDisabledToast(scene?.GetSceneName());
 128            }
 1129        }
 130
 131        private void ShowOrHide(bool current, bool previous) =>
 15132            SetVisibility(current);
 133
 134        private void OnPEXDisabled(string pxId, (string name, string description, string icon) pex)
 135        {
 136            // TODO: decouple monobehaviour component from controller
 15137            ExperienceRowComponentView experienceToUpdate = view.GetAvailableExperienceById(pxId);
 138
 15139            if (experienceToUpdate != null)
 140            {
 0141                experienceToUpdate.SetName(pex.name);
 0142                experienceToUpdate.SetIcon(pex.icon);
 0143                experienceToUpdate.SetAsPlaying(false);
 0144                return;
 145            }
 146
 15147            ExperienceRowComponentModel experienceToAdd = new ExperienceRowComponentModel
 148            {
 149                id = pxId,
 150                isPlaying = false,
 151                isUIVisible = true,
 152                name = pex.name,
 153                iconUri = pex.icon,
 154                allowStartStop = true,
 155            };
 156
 15157            view.AddAvailableExperience(experienceToAdd);
 15158            numOfLoadedExperiences.Set(GetPortableExperienceCount());
 15159        }
 160
 161        private void OnPEXSceneAdded(string id) =>
 0162            OnPEXSceneAdded(GetPortableExperienceScene(id));
 163
 164        private IParcelScene GetPortableExperienceScene(string id) =>
 4165            worldState.GetPortableExperienceScene(id);
 166
 167        private IParcelScene GetScene(int sceneNumber) =>
 2168            worldState.GetScene(sceneNumber);
 169
 170        private void OnPEXSceneAdded(IParcelScene scene)
 171        {
 172            // TODO: decouple monobehaviour component from controller
 0173            ExperienceRowComponentView experienceToUpdate = view.GetAvailableExperienceById(scene.sceneData.id);
 174
 0175            if (experienceToUpdate != null)
 0176                view.RemoveAvailableExperience(scene.sceneData.id);
 177
 0178            GlobalScene newPortableExperienceScene = scene as GlobalScene;
 0179            dataStore.experiencesViewer.activeExperience.Get().Add(scene.sceneData.id);
 180
 0181            ExperienceRowComponentModel experienceToAdd = new ExperienceRowComponentModel
 182            {
 183                id = newPortableExperienceScene.sceneData.id,
 184                isPlaying = true,
 185                isUIVisible = true,
 186                name = newPortableExperienceScene.sceneName,
 187                iconUri = newPortableExperienceScene.iconUrl,
 188                allowStartStop = true,
 189            };
 190
 0191            view.AddAvailableExperience(experienceToAdd);
 0192            numOfLoadedExperiences.Set(GetPortableExperienceCount());
 193
 0194            if (forcePortableExperience.Equals(newPortableExperienceScene.sceneData.id))
 0195                forcePortableExperience.Set(null);
 0196        }
 197
 198        private void OnPEXSceneRemoved(string id)
 199        {
 0200            dataStore.experiencesViewer.activeExperience.Get().Remove(id);
 201
 202            // TODO: decouple monobehaviour component from controller
 0203            ExperienceRowComponentView experienceToUpdate = view.GetAvailableExperienceById(id);
 204
 0205            if (experienceToUpdate != null)
 206            {
 0207                experienceToUpdate.SetAsPlaying(false);
 0208                return;
 209            }
 210
 0211            view.RemoveAvailableExperience(id);
 0212            numOfLoadedExperiences.Set(GetPortableExperienceCount());
 0213        }
 214
 215        private int GetPortableExperienceCount() =>
 15216            disabledPortableExperiences.Count() + portableExperienceIds.Count();
 217    }
 218}