< Summary

Class:TaskbarHUDController
Assembly:TaskbarHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/TaskbarHUD/TaskbarHUDController.cs
Covered lines:113
Uncovered lines:92
Coverable lines:205
Total lines:434
Line coverage:55.1% (113 of 205)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
CreateView()0%110100%
Initialize(...)0%66095.24%
ChatHeadsGroup_OnHeadClose(...)0%110100%
View_OnFriendsToggleOn()0%3.333066.67%
View_OnFriendsToggleOff()0%220100%
ToggleFriendsTrigger_OnTriggered(...)0%6200%
ToggleWorldChatTrigger_OnTriggered(...)0%2100%
CloseWindowTrigger_OnTriggered(...)0%2100%
View_OnChatToggleOn()0%2.022083.33%
View_OnChatToggleOff()0%2.152066.67%
ChatHeadsGroup_OnHeadOpen(...)0%2.032080%
MouseCatcher_OnMouseUnlock()0%2100%
MouseCatcher_OnMouseLock()0%6200%
AddWorldChatWindow(...)0%4.254075%
OpenFriendsWindow()0%2100%
OpenPrivateChatTo(...)0%2100%
AddPrivateChatWindow(...)0%4.434070%
AddFriendsWindow(...)0%4.324072.73%
OnAddVoiceChat()0%2100%
DisableFriendsWindow()0%2100%
OpenPrivateChatWindow(...)0%2.032080%
Dispose()0%880100%
SetVisibility(...)0%2100%
SetVisibility(...)0%110100%
OnWorldChatToggleInputPress()0%42600%
OnCloseWindowToggleInputPress()0%6200%
SetVoiceChatRecording(...)0%6200%
SetVoiceChatEnabledByScene(...)0%6200%
OnFriendsToggleInputPress()0%56700%
OnAddMessage(...)0%3.333066.67%
AnyWindowsDifferentThanChatIsOpen()0%440100%
MarkWorldChatAsReadIfOtherWindowIsOpen()0%6200%
SceneController_OnNewPortableExperienceSceneAdded(...)0%6200%
SceneController_OnNewPortableExperienceSceneRemoved(...)0%2100%
KillPortableExperience(...)0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/TaskbarHUD/TaskbarHUDController.cs

#LineLine coverage
 1using DCL;
 2using DCL.Controllers;
 3using DCL.HelpAndSupportHUD;
 4using DCL.Helpers;
 5using DCL.Interface;
 6using System;
 7using System.Collections.Generic;
 8using System.Linq;
 9using UnityEngine;
 10using UnityEngine.EventSystems;
 11
 12public class TaskbarHUDController : IHUD
 13{
 14    [Serializable]
 15    public struct Configuration
 16    {
 17        public bool enableVoiceChat;
 18        public bool enableQuestPanel;
 19    }
 20
 21    public TaskbarHUDView view;
 22    public WorldChatWindowHUDController worldChatWindowHud;
 23    public PrivateChatWindowHUDController privateChatWindowHud;
 24    public FriendsHUDController friendsHud;
 25    public HelpAndSupportHUDController helpAndSupportHud;
 26
 27    IMouseCatcher mouseCatcher;
 28    protected IChatController chatController;
 29    protected IFriendsController friendsController;
 30
 31    private InputAction_Trigger toggleFriendsTrigger;
 32    private InputAction_Trigger closeWindowTrigger;
 33    private InputAction_Trigger toggleWorldChatTrigger;
 34    private ISceneController sceneController;
 35    private IWorldState worldState;
 36
 37    public event System.Action OnAnyTaskbarButtonClicked;
 38
 039    public RectTransform socialTooltipReference { get => view.socialTooltipReference; }
 40
 641    protected internal virtual TaskbarHUDView CreateView() { return TaskbarHUDView.Create(this, chatController, friendsC
 42
 43    public void Initialize(
 44        IMouseCatcher mouseCatcher,
 45        IChatController chatController,
 46        IFriendsController friendsController,
 47        ISceneController sceneController,
 48        IWorldState worldState)
 49    {
 650        this.friendsController = friendsController;
 651        this.mouseCatcher = mouseCatcher;
 652        this.chatController = chatController;
 53
 654        view = CreateView();
 55
 656        this.sceneController = sceneController;
 657        this.worldState = worldState;
 58
 659        if (mouseCatcher != null)
 60        {
 161            mouseCatcher.OnMouseLock -= MouseCatcher_OnMouseLock;
 162            mouseCatcher.OnMouseUnlock -= MouseCatcher_OnMouseUnlock;
 163            mouseCatcher.OnMouseLock += MouseCatcher_OnMouseLock;
 164            mouseCatcher.OnMouseUnlock += MouseCatcher_OnMouseUnlock;
 65        }
 66
 667        view.chatHeadsGroup.OnHeadToggleOn += ChatHeadsGroup_OnHeadOpen;
 668        view.chatHeadsGroup.OnHeadToggleOff += ChatHeadsGroup_OnHeadClose;
 69
 670        view.leftWindowContainerLayout.enabled = false;
 71
 672        view.OnChatToggleOff += View_OnChatToggleOff;
 673        view.OnChatToggleOn += View_OnChatToggleOn;
 674        view.OnFriendsToggleOff += View_OnFriendsToggleOff;
 675        view.OnFriendsToggleOn += View_OnFriendsToggleOn;
 76
 677        toggleFriendsTrigger = Resources.Load<InputAction_Trigger>("ToggleFriends");
 678        toggleFriendsTrigger.OnTriggered -= ToggleFriendsTrigger_OnTriggered;
 679        toggleFriendsTrigger.OnTriggered += ToggleFriendsTrigger_OnTriggered;
 80
 681        closeWindowTrigger = Resources.Load<InputAction_Trigger>("CloseWindow");
 682        closeWindowTrigger.OnTriggered -= CloseWindowTrigger_OnTriggered;
 683        closeWindowTrigger.OnTriggered += CloseWindowTrigger_OnTriggered;
 84
 685        toggleWorldChatTrigger = Resources.Load<InputAction_Trigger>("ToggleWorldChat");
 686        toggleWorldChatTrigger.OnTriggered -= ToggleWorldChatTrigger_OnTriggered;
 687        toggleWorldChatTrigger.OnTriggered += ToggleWorldChatTrigger_OnTriggered;
 88
 689        if (chatController != null)
 90        {
 591            chatController.OnAddMessage -= OnAddMessage;
 592            chatController.OnAddMessage += OnAddMessage;
 93        }
 94
 695        if (this.sceneController != null && this.worldState != null)
 96        {
 197            this.sceneController.OnNewPortableExperienceSceneAdded += SceneController_OnNewPortableExperienceSceneAdded;
 198            this.sceneController.OnNewPortableExperienceSceneRemoved += SceneController_OnNewPortableExperienceSceneRemo
 99
 1100            List<GlobalScene> activePortableExperiences = WorldStateUtils.GetActivePortableExperienceScenes();
 2101            for (int i = 0; i < activePortableExperiences.Count; i++)
 102            {
 0103                SceneController_OnNewPortableExperienceSceneAdded(activePortableExperiences[i]);
 104            }
 105        }
 106
 6107        view.leftWindowContainerAnimator.Show();
 108
 6109        CommonScriptableObjects.isTaskbarHUDInitialized.Set(true);
 6110        DataStore.i.builderInWorld.showTaskBar.OnChange += SetVisibility;
 6111    }
 112
 2113    private void ChatHeadsGroup_OnHeadClose(TaskbarButton obj) { privateChatWindowHud.SetVisibility(false); }
 114
 115    private void View_OnFriendsToggleOn()
 116    {
 2117        friendsHud?.SetVisibility(true);
 2118        OnAnyTaskbarButtonClicked?.Invoke();
 0119    }
 120
 4121    private void View_OnFriendsToggleOff() { friendsHud?.SetVisibility(false); }
 122
 123    private void ToggleFriendsTrigger_OnTriggered(DCLAction_Trigger action)
 124    {
 0125        if (!view.friendsButton.transform.parent.gameObject.activeSelf)
 0126            return;
 127
 0128        OnFriendsToggleInputPress();
 0129    }
 130
 0131    private void ToggleWorldChatTrigger_OnTriggered(DCLAction_Trigger action) { OnWorldChatToggleInputPress(); }
 132
 0133    private void CloseWindowTrigger_OnTriggered(DCLAction_Trigger action) { OnCloseWindowToggleInputPress(); }
 134
 135    private void View_OnChatToggleOn()
 136    {
 3137        worldChatWindowHud.SetVisibility(true);
 3138        worldChatWindowHud.MarkWorldChatMessagesAsRead();
 3139        worldChatWindowHud.view.DeactivatePreview();
 3140        worldChatWindowHud.OnPressReturn();
 3141        OnAnyTaskbarButtonClicked?.Invoke();
 0142    }
 143
 144    private void View_OnChatToggleOff()
 145    {
 2146        if (view.AllButtonsToggledOff())
 147        {
 2148            worldChatWindowHud.SetVisibility(true);
 2149            worldChatWindowHud.view.ActivatePreview();
 2150        }
 151        else
 152        {
 0153            worldChatWindowHud.SetVisibility(false);
 154        }
 0155    }
 156
 157    private void ChatHeadsGroup_OnHeadOpen(TaskbarButton taskbarBtn)
 158    {
 1159        ChatHeadButton head = taskbarBtn as ChatHeadButton;
 160
 1161        if (taskbarBtn == null)
 0162            return;
 163
 1164        OpenPrivateChatWindow(head.profile.userId);
 1165    }
 166
 0167    private void MouseCatcher_OnMouseUnlock() { view.leftWindowContainerAnimator.Show(); }
 168
 169    private void MouseCatcher_OnMouseLock()
 170    {
 0171        view.leftWindowContainerAnimator.Hide();
 172
 0173        foreach (var btn in view.GetButtonList())
 174        {
 0175            btn.SetToggleState(false);
 176        }
 177
 0178        worldChatWindowHud.SetVisibility(true);
 0179        worldChatWindowHud.view.ActivatePreview();
 180
 0181        MarkWorldChatAsReadIfOtherWindowIsOpen();
 0182    }
 183
 184    public void AddWorldChatWindow(WorldChatWindowHUDController controller)
 185    {
 2186        if (controller == null || controller.view == null)
 187        {
 0188            Debug.LogWarning("AddChatWindow >>> World Chat Window doesn't exist yet!");
 0189            return;
 190        }
 191
 2192        if (controller.view.transform.parent == view.leftWindowContainer)
 0193            return;
 194
 2195        controller.view.transform.SetParent(view.leftWindowContainer, false);
 196
 2197        worldChatWindowHud = controller;
 198
 2199        view.OnAddChatWindow();
 2200        worldChatWindowHud.view.OnClose += () => { view.friendsButton.SetToggleState(false, false); };
 201
 2202        view.chatButton.SetToggleState(true);
 2203        view.chatButton.SetToggleState(false);
 2204    }
 205
 0206    public void OpenFriendsWindow() { view.friendsButton.SetToggleState(true); }
 207
 208    public void OpenPrivateChatTo(string userId)
 209    {
 0210        var button = view.chatHeadsGroup.AddChatHead(userId, (ulong) System.DateTimeOffset.UtcNow.ToUnixTimeMilliseconds
 0211        button.toggleButton.onClick.Invoke();
 0212    }
 213
 214    public void AddPrivateChatWindow(PrivateChatWindowHUDController controller)
 215    {
 2216        if (controller == null || controller.view == null)
 217        {
 0218            Debug.LogWarning("AddPrivateChatWindow >>> Private Chat Window doesn't exist yet!");
 0219            return;
 220        }
 221
 2222        if (controller.view.transform.parent == view.leftWindowContainer)
 0223            return;
 224
 2225        controller.view.transform.SetParent(view.leftWindowContainer, false);
 226
 2227        privateChatWindowHud = controller;
 228
 2229        privateChatWindowHud.view.OnMinimize += () =>
 230        {
 0231            ChatHeadButton btn = view.GetButtonList()
 232                                     .FirstOrDefault(
 0233                                         (x) => x is ChatHeadButton &&
 234                                                (x as ChatHeadButton).profile.userId == privateChatWindowHud.conversatio
 235                ChatHeadButton;
 236
 0237            if (btn != null)
 0238                btn.SetToggleState(false, false);
 239
 0240            MarkWorldChatAsReadIfOtherWindowIsOpen();
 0241        };
 242
 2243        privateChatWindowHud.view.OnClose += () =>
 244        {
 0245            ChatHeadButton btn = view.GetButtonList()
 246                                     .FirstOrDefault(
 0247                                         (x) => x is ChatHeadButton &&
 248                                                (x as ChatHeadButton).profile.userId == privateChatWindowHud.conversatio
 249                ChatHeadButton;
 250
 0251            if (btn != null)
 252            {
 0253                btn.SetToggleState(false, false);
 0254                view.chatHeadsGroup.RemoveChatHead(btn);
 255            }
 256
 0257            MarkWorldChatAsReadIfOtherWindowIsOpen();
 0258        };
 2259    }
 260
 261    public void AddFriendsWindow(FriendsHUDController controller)
 262    {
 3263        if (controller == null || controller.view == null)
 264        {
 0265            Debug.LogWarning("AddFriendsWindow >>> Friends window doesn't exist yet!");
 0266            return;
 267        }
 268
 3269        if (controller.view.transform.parent == view.leftWindowContainer)
 0270            return;
 271
 3272        controller.view.transform.SetParent(view.leftWindowContainer, false);
 273
 3274        friendsHud = controller;
 3275        view.OnAddFriendsWindow();
 3276        friendsHud.view.OnClose += () =>
 277        {
 0278            view.friendsButton.SetToggleState(false, false);
 0279            MarkWorldChatAsReadIfOtherWindowIsOpen();
 0280        };
 281
 3282        friendsHud.view.friendsList.OnDeleteConfirmation += (userIdToRemove) => { view.chatHeadsGroup.RemoveChatHead(use
 3283    }
 284
 0285    public void OnAddVoiceChat() { view.OnAddVoiceChat(); }
 286
 287    public void DisableFriendsWindow()
 288    {
 0289        view.friendsButton.transform.parent.gameObject.SetActive(false);
 0290        view.chatHeadsGroup.ClearChatHeads();
 0291    }
 292
 293    private void OpenPrivateChatWindow(string userId)
 294    {
 1295        privateChatWindowHud.Configure(userId);
 1296        privateChatWindowHud.SetVisibility(true);
 1297        privateChatWindowHud.ForceFocus();
 1298        OnAnyTaskbarButtonClicked?.Invoke();
 0299    }
 300
 301    public void Dispose()
 302    {
 6303        if (view != null)
 304        {
 6305            view.chatHeadsGroup.OnHeadToggleOn -= ChatHeadsGroup_OnHeadOpen;
 6306            view.chatHeadsGroup.OnHeadToggleOff -= ChatHeadsGroup_OnHeadClose;
 307
 6308            view.OnChatToggleOff -= View_OnChatToggleOff;
 6309            view.OnChatToggleOn -= View_OnChatToggleOn;
 6310            view.OnFriendsToggleOff -= View_OnFriendsToggleOff;
 6311            view.OnFriendsToggleOn -= View_OnFriendsToggleOn;
 312
 6313            UnityEngine.Object.Destroy(view.gameObject);
 314        }
 315
 6316        if (mouseCatcher != null)
 317        {
 1318            mouseCatcher.OnMouseLock -= MouseCatcher_OnMouseLock;
 1319            mouseCatcher.OnMouseUnlock -= MouseCatcher_OnMouseUnlock;
 320        }
 321
 6322        if (toggleFriendsTrigger != null)
 6323            toggleFriendsTrigger.OnTriggered -= ToggleFriendsTrigger_OnTriggered;
 324
 6325        if (closeWindowTrigger != null)
 6326            closeWindowTrigger.OnTriggered -= CloseWindowTrigger_OnTriggered;
 327
 6328        if (toggleWorldChatTrigger != null)
 6329            toggleWorldChatTrigger.OnTriggered -= ToggleWorldChatTrigger_OnTriggered;
 330
 6331        if (chatController != null)
 5332            chatController.OnAddMessage -= OnAddMessage;
 333
 6334        if (sceneController != null)
 335        {
 1336            sceneController.OnNewPortableExperienceSceneAdded -= SceneController_OnNewPortableExperienceSceneAdded;
 1337            sceneController.OnNewPortableExperienceSceneRemoved -= SceneController_OnNewPortableExperienceSceneRemoved;
 338        }
 339
 6340        DataStore.i.builderInWorld.showTaskBar.OnChange -= SetVisibility;
 6341    }
 342
 0343    public void SetVisibility(bool visible, bool previus) { SetVisibility(visible); }
 344
 2345    public void SetVisibility(bool visible) { view.SetVisibility(visible); }
 346
 347    public void OnWorldChatToggleInputPress()
 348    {
 0349        bool anyInputFieldIsSelected = EventSystem.current != null &&
 350                                       EventSystem.current.currentSelectedGameObject != null &&
 351                                       EventSystem.current.currentSelectedGameObject.GetComponent<TMPro.TMP_InputField>(
 352
 0353        if (anyInputFieldIsSelected)
 0354            return;
 355
 0356        worldChatWindowHud.OnPressReturn();
 357
 0358        if (AnyWindowsDifferentThanChatIsOpen())
 359        {
 0360            foreach (var btn in view.GetButtonList())
 361            {
 0362                btn.SetToggleState(btn == view.chatButton);
 363            }
 364        }
 0365    }
 366
 367    public void OnCloseWindowToggleInputPress()
 368    {
 0369        if (mouseCatcher.isLocked)
 0370            return;
 371
 0372        view.chatButton.SetToggleState(true);
 0373        view.chatButton.SetToggleState(false, false);
 0374        worldChatWindowHud.view.chatHudView.ResetInputField();
 0375        worldChatWindowHud.view.ActivatePreview();
 0376    }
 377
 0378    public void SetVoiceChatRecording(bool recording) { view?.voiceChatButton.SetOnRecording(recording); }
 379
 0380    public void SetVoiceChatEnabledByScene(bool enabled) { view?.voiceChatButton.SetEnabledByScene(enabled); }
 381
 382    private void OnFriendsToggleInputPress()
 383    {
 0384        bool anyInputFieldIsSelected = EventSystem.current != null &&
 385                                       EventSystem.current.currentSelectedGameObject != null &&
 386                                       EventSystem.current.currentSelectedGameObject.GetComponent<TMPro.TMP_InputField>(
 387                                       (!worldChatWindowHud.view.chatHudView.inputField.isFocused || !worldChatWindowHud
 388
 0389        if (anyInputFieldIsSelected)
 0390            return;
 391
 0392        Utils.UnlockCursor();
 0393        view.leftWindowContainerAnimator.Show();
 0394        view.friendsButton.SetToggleState(!view.friendsButton.toggledOn);
 0395    }
 396
 397    void OnAddMessage(ChatMessage message)
 398    {
 1399        if (!AnyWindowsDifferentThanChatIsOpen() && message.messageType == ChatMessage.Type.PUBLIC)
 0400            worldChatWindowHud.MarkWorldChatMessagesAsRead((long) message.timestamp);
 1401    }
 402
 403    private bool AnyWindowsDifferentThanChatIsOpen()
 404    {
 1405        return (friendsHud != null && friendsHud.view.gameObject.activeSelf) ||
 406               (privateChatWindowHud != null && privateChatWindowHud.view.gameObject.activeSelf);
 407    }
 408
 409    private void MarkWorldChatAsReadIfOtherWindowIsOpen()
 410    {
 0411        if (!AnyWindowsDifferentThanChatIsOpen())
 0412            worldChatWindowHud.MarkWorldChatMessagesAsRead();
 0413    }
 414
 415    private void SceneController_OnNewPortableExperienceSceneAdded(IParcelScene scene)
 416    {
 0417        GlobalScene newPortableExperienceScene = scene as GlobalScene;
 418
 0419        if ( newPortableExperienceScene == null )
 420        {
 0421            Debug.LogError("Portable experience must be of type GlobalScene!");
 0422            return;
 423        }
 424
 0425        view.AddPortableExperienceElement(
 426            scene.sceneData.id,
 427            newPortableExperienceScene.sceneName,
 428            newPortableExperienceScene.iconUrl);
 0429    }
 430
 0431    private void SceneController_OnNewPortableExperienceSceneRemoved(string portableExperienceSceneIdToRemove) { view.Re
 432
 0433    public void KillPortableExperience(string portableExperienceSceneIdToKill) { WebInterface.KillPortableExperience(por
 434}