< Summary

Class:DCL.Components.AvatarOnPointerDown
Assembly:AvatarShape
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Avatar/AvatarOnPointerDown/AvatarOnPointerDown.cs
Covered lines:14
Uncovered lines:62
Coverable lines:76
Total lines:185
Line coverage:18.4% (14 of 76)
Covered branches:0
Total branches:0
Covered methods:9
Total methods:25
Method coverage:36% (9 of 25)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
AvatarOnPointerDown()0%110100%
GetActionButton()0%2100%
SetHoverState(...)0%90900%
OnDisable()0%4.943040%
Awake()0%110100%
OnDestroy()0%3.073080%
Initialize(...)0%20400%
IsAtHoverDistance(...)0%12300%
IsVisible()0%2100%
ShouldReportPassportInputEvent(...)0%12300%
Report(...)0%90900%
GetEventType()0%2100%
ReEnableOnInfoCardClosed(...)0%2.52050%
SetColliderEnabled(...)0%2100%
SetPassportEnabled(...)0%2100%
SetOnClickReportEnabled(...)0%2100%
GetTransform()0%2100%
OnPoolRelease()0%2100%
OnPoolGet()0%2100%
ShouldReportOnClickEvent(...)0%30500%
ShouldShowHoverFeedback()0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Avatar/AvatarOnPointerDown/AvatarOnPointerDown.cs

#LineLine coverage
 1using DCL.Controllers;
 2using DCL.Interface;
 3using UnityEngine;
 4using DCL.Helpers;
 5using DCL.Models;
 6using DCLPlugins.UUIDEventComponentsPlugin.UUIDComponent.Interfaces;
 7using Ray = UnityEngine.Ray;
 8
 9namespace DCL.Components
 10{
 11    public class AvatarOnPointerDown : MonoBehaviour, IAvatarOnPointerDown, IPoolLifecycleHandler,
 12        IAvatarOnPointerDownCollider, IUnlockedCursorInputEvent
 13    {
 14        private OnPointerEvent.Model model;
 15        private OnPointerEventHandler eventHandler;
 16        private bool isHovering;
 65517        private bool passportEnabled = true;
 65518        private bool onClickReportEnabled = true;
 19        private Player avatarPlayer;
 20
 63421        public IDCLEntity entity { get; private set; }
 22        public event System.Action OnPointerDownReport;
 23        public event System.Action OnPointerEnterReport;
 24        public event System.Action OnPointerExitReport;
 25
 65526        public bool ShouldBeInteractableWhenMouseIsLocked { get; set; } = true;
 27        public new Collider collider;
 28
 29        public WebInterface.ACTION_BUTTON GetActionButton() =>
 030            model.GetActionButton();
 31
 32        public void SetHoverState(bool state)
 33        {
 034            if (!enabled) return;
 035            bool isHoveringDirty = state != isHovering;
 036            isHovering = state;
 037            eventHandler?.SetFeedbackState(model.showFeedback, state && passportEnabled, model.button, model.hoverText);
 38
 039            if (!isHoveringDirty)
 040                return;
 41
 042            if (isHovering)
 043                OnPointerEnterReport?.Invoke();
 44            else
 045                OnPointerExitReport?.Invoke();
 046        }
 47
 48        private void OnDisable()
 49        {
 61350            if (!isHovering)
 61351                return;
 52
 053            isHovering = false;
 054            OnPointerExitReport?.Invoke();
 055        }
 56
 57        private void Awake()
 58        {
 63459            CommonScriptableObjects.playerInfoCardVisibleState.OnChange += ReEnableOnInfoCardClosed;
 63460        }
 61
 62        private void OnDestroy()
 63        {
 63464            CommonScriptableObjects.playerInfoCardVisibleState.OnChange -= ReEnableOnInfoCardClosed;
 63465            eventHandler?.Dispose();
 66
 63467            if (entity != null)
 068                CollidersManager.i.RemoveEntityCollider(entity, collider);
 63469        }
 70
 71        public void Initialize(OnPointerEvent.Model model, IDCLEntity entity, Player player)
 72        {
 073            this.model = model;
 074            this.entity = entity;
 075            this.avatarPlayer = player;
 76
 077            if (eventHandler == null)
 078                eventHandler = new OnPointerEventHandler();
 79
 080            if (entity != null)
 81            {
 082                eventHandler?.SetColliders(entity);
 083                CollidersManager.i.AddOrUpdateEntityCollider(entity, collider);
 84            }
 085        }
 86
 87        public bool IsAtHoverDistance(float distance)
 88        {
 089            bool isCursorLocked = Utils.IsCursorLocked;
 090            if (!ShouldBeInteractableWhenMouseIsLocked && isCursorLocked) return false;
 091            return !isCursorLocked || distance <= model.distance;
 92        }
 93
 94        public bool IsVisible() =>
 095            true;
 96
 97        private bool ShouldReportPassportInputEvent(WebInterface.ACTION_BUTTON buttonId, HitInfo hit) =>
 098            isHovering && (model.button == "ANY" || buttonId.ToString() == model.button);
 99
 100        public void Report(WebInterface.ACTION_BUTTON buttonId, Ray ray, HitInfo hit)
 101        {
 0102            if (!enabled) return;
 0103            if (!ShouldBeInteractableWhenMouseIsLocked && !isHovering) return;
 104
 0105            if (passportEnabled && ShouldReportPassportInputEvent(buttonId, hit))
 106            {
 0107                eventHandler.SetFeedbackState(model.showFeedback, false, model.button, model.hoverText);
 0108                passportEnabled = false;
 109
 0110                OnPointerDownReport?.Invoke();
 111            }
 112
 0113            if (onClickReportEnabled && ShouldReportOnClickEvent(buttonId, out IParcelScene playerScene))
 114            {
 0115                AudioScriptableObjects.buttonClick.Play(true);
 116
 0117                WebInterface.ReportAvatarClick(
 118                    playerScene.sceneData.sceneNumber,
 119                    avatarPlayer.id,
 120                    WorldStateUtils.ConvertUnityToScenePosition(ray.origin, playerScene),
 121                    ray.direction,
 122                    hit.distance);
 123            }
 0124        }
 125
 126        public PointerInputEventType GetEventType() =>
 0127            PointerInputEventType.DOWN;
 128
 129        void ReEnableOnInfoCardClosed(bool newState, bool prevState)
 130        {
 25131            if (passportEnabled || newState)
 25132                return;
 133
 0134            passportEnabled = true;
 0135        }
 136
 137        public void SetColliderEnabled(bool newEnabledState)
 138        {
 0139            collider.enabled = newEnabledState;
 0140        }
 141
 142        public void SetPassportEnabled(bool newEnabledState)
 143        {
 0144            passportEnabled = newEnabledState;
 0145            isHovering = false;
 0146        }
 147
 148        public void SetOnClickReportEnabled(bool newEnabledState)
 149        {
 0150            onClickReportEnabled = newEnabledState;
 0151        }
 152
 153        public Transform GetTransform() =>
 0154            transform;
 155
 156        public void OnPoolRelease()
 157        {
 0158            eventHandler.Dispose();
 0159            avatarPlayer = null;
 0160        }
 161
 0162        public void OnPoolGet() { }
 163
 164        private bool ShouldReportOnClickEvent(WebInterface.ACTION_BUTTON buttonId, out IParcelScene playerScene)
 165        {
 0166            playerScene = null;
 167
 0168            if (buttonId != WebInterface.ACTION_BUTTON.POINTER) { return false; }
 169
 0170            if (avatarPlayer == null) { return false; }
 171
 0172            int playerSceneNumber = CommonScriptableObjects.sceneNumber.Get();
 173
 0174            if (playerSceneNumber <= 0) { return false; }
 175
 0176            playerScene = WorldStateUtils.GetCurrentScene();
 177
 0178            return playerScene?.IsInsideSceneBoundaries(
 179                PositionUtils.UnityToWorldPosition(avatarPlayer.worldPosition)) ?? false;
 180        }
 181
 182        public bool ShouldShowHoverFeedback() =>
 0183            enabled && model.showFeedback;
 184    }
 185}