< Summary

Class:DCL.NavmapToastViewController
Assembly:Navmap
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/NavMap/NavmapToastViewController.cs
Covered lines:44
Uncovered lines:104
Coverable lines:148
Total lines:283
Line coverage:29.7% (44 of 148)
Covered branches:0
Total branches:0
Covered methods:4
Total methods:21
Method coverage:19% (4 of 21)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
NavmapToastViewController(...)0%110100%
OpenTwitter(...)0%2100%
CopyLink(...)0%2100%
RequestAllPOIs()0%330100%
EnablePlaceCardModal()0%2100%
JumpIn(...)0%2100%
Activate()0%2100%
Deactivate()0%2100%
Unsubscribe()0%110100%
CloseCurrentToast()0%2100%
OnHovered(...)0%20400%
OnDragStarted()0%6200%
ShowPlaceToast(...)0%2100%
ShowPlaceToast(...)0%2100%
OnMapMetadataInfoUpdated(...)0%30500%
RetrieveFavoriteState()0%6200%
RetrieveAdditionalData()0%30500%
SetPlaceCardModalData(...)0%2100%
OnFavoriteToggleClicked(...)0%6200%
ChangeVote(...)0%12300%
Dispose()0%220100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/NavMap/NavmapToastViewController.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using DCL.Browser;
 3using DCL.Tasks;
 4using DCLServices.MapRendererV2.ConsumerUtils;
 5using DCLServices.PlacesAPIService;
 6using ExploreV2Analytics;
 7using MainScripts.DCL.Controllers.HotScenes;
 8using System;
 9using System.Collections.Generic;
 10using System.Linq;
 11using System.Threading;
 12using UnityEngine;
 13
 14namespace DCL
 15{
 16    public class NavmapToastViewController : IDisposable, INavmapToastViewController
 17    {
 18        private const string COPY_LINK = "https://play.decentraland.org/?position={0},{1}";
 19
 20        private readonly MinimapMetadata minimapMetadata;
 21        private readonly NavmapToastView view;
 22        private readonly IPlaceCardComponentView placeCardModal;
 23        private readonly MapRenderImage mapRenderImage;
 24        private readonly IExploreV2Analytics exploreV2Analytics;
 25        private readonly IBrowserBridge browserBridge;
 26        private readonly float sqrDistanceToCloseView;
 27
 28        private Vector2 lastClickPosition;
 29        private Vector2Int currentParcel;
 30        private readonly IPlacesAPIService placesAPIService;
 31        private readonly IPlacesAnalytics placesAnalytics;
 32
 133        private readonly CancellationTokenSource disposingCts = new ();
 34        private CancellationTokenSource retrievingFavoritesCts;
 35        private bool showUntilClick;
 36
 37        private string placeId;
 38        private string placeName;
 39        private IReadOnlyList<string> allPointOfInterest;
 40
 141        public NavmapToastViewController(
 42            MinimapMetadata minimapMetadata,
 43            NavmapToastView view,
 44            MapRenderImage mapRenderImage,
 45            IPlacesAPIService placesAPIService,
 46            IPlacesAnalytics placesAnalytics,
 47            IPlaceCardComponentView placeCardModal,
 48            IExploreV2Analytics exploreV2Analytics,
 49            IBrowserBridge browserBridge)
 50        {
 151            this.placesAPIService = placesAPIService;
 152            this.placesAnalytics = placesAnalytics;
 153            this.minimapMetadata = minimapMetadata;
 154            this.view = view;
 155            this.mapRenderImage = mapRenderImage;
 156            this.placeCardModal = placeCardModal;
 157            this.exploreV2Analytics = exploreV2Analytics;
 158            this.browserBridge = browserBridge;
 159            this.sqrDistanceToCloseView = view.distanceToCloseView * view.distanceToCloseView;
 60
 161            this.view.OnFavoriteToggleClicked += OnFavoriteToggleClicked;
 162            this.view.OnGoto += JumpIn;
 163            this.view.OnInfoClick += EnablePlaceCardModal;
 164            this.view.OnVoteChanged += ChangeVote;
 165            this.view.OnPressedLinkCopy += CopyLink;
 166            this.view.OnPressedTwitterButton += OpenTwitter;
 67
 168            this.placeCardModal.OnFavoriteChanged += OnFavoriteToggleClicked;
 169            this.placeCardModal.OnVoteChanged += ChangeVote;
 170            this.placeCardModal.onJumpInClick.RemoveAllListeners();
 171            this.placeCardModal.onJumpInClick.AddListener(() => JumpIn(currentParcel.x, currentParcel.y));
 172            this.placeCardModal.OnPressedLinkCopy += CopyLink;
 173            this.placeCardModal.OnPressedTwitterButton += OpenTwitter;
 174            RequestAllPOIs().Forget();
 175        }
 76
 77        private void OpenTwitter(Vector2Int coordinates, string sceneName)
 78        {
 079            var description = $"Check out {sceneName}, a cool place I found in Decentraland!".Replace(" ", "%20");
 080            var twitterUrl = $"https://twitter.com/intent/tweet?text={description}&hashtags=DCLPlace&url={string.Format(
 81
 082            browserBridge.OpenUrl(twitterUrl);
 083        }
 84
 85        private void CopyLink(Vector2Int coordinates)
 86        {
 087            Environment.i.platform.clipboard.WriteText(string.Format(COPY_LINK, coordinates.x, coordinates.y));
 088        }
 89
 90        private async UniTaskVoid RequestAllPOIs()
 91        {
 392            allPointOfInterest = await placesAPIService.GetPointsOfInterestCoords(CancellationToken.None);
 193        }
 94
 95        private void EnablePlaceCardModal() =>
 096            placeCardModal.SetActive(true);
 97
 98        private void JumpIn(int x, int y)
 99        {
 0100            DataStore.i.HUDs.navmapVisible.Set(false);
 0101            Environment.i.world.teleportController.Teleport(x, y);
 0102            exploreV2Analytics.SendPlaceTeleport(placeId, placeName, currentParcel, ActionSource.FromNavmap);
 0103        }
 104
 105        public void Activate()
 106        {
 0107            Unsubscribe();
 108
 0109            mapRenderImage.ParcelClicked += ShowPlaceToast;
 0110            mapRenderImage.Hovered += OnHovered;
 0111            mapRenderImage.DragStarted += OnDragStarted;
 0112            minimapMetadata.OnSceneInfoUpdated += OnMapMetadataInfoUpdated;
 0113        }
 114
 115        public void Deactivate()
 116        {
 0117            view.Close();
 0118            Unsubscribe();
 0119        }
 120
 121        private void Unsubscribe()
 122        {
 1123            mapRenderImage.ParcelClicked -= ShowPlaceToast;
 1124            mapRenderImage.Hovered -= OnHovered;
 1125            mapRenderImage.DragStarted -= OnDragStarted;
 1126            minimapMetadata.OnSceneInfoUpdated -= OnMapMetadataInfoUpdated;
 1127        }
 128
 129        public void CloseCurrentToast() =>
 0130            view.Close();
 131
 132        private void OnHovered(Vector2 localPosition)
 133        {
 0134            if (!view.gameObject.activeSelf || showUntilClick)
 0135                return;
 136
 0137            if (Vector2.SqrMagnitude(localPosition - lastClickPosition) >= sqrDistanceToCloseView)
 0138                view.Close();
 0139        }
 140
 141        private void OnDragStarted()
 142        {
 0143            if (!view.gameObject.activeSelf)
 0144                return;
 145
 0146            showUntilClick = false;
 0147            view.Close();
 0148        }
 149
 150        public void ShowPlaceToast(MapRenderImage.ParcelClickData parcelClickData, bool showUntilClick)
 151        {
 0152            ShowPlaceToast(parcelClickData);
 0153            this.showUntilClick = showUntilClick;
 0154        }
 155
 156        private void ShowPlaceToast(MapRenderImage.ParcelClickData parcelClickData)
 157        {
 0158            showUntilClick = false;
 159
 0160            lastClickPosition = parcelClickData.WorldPosition;
 0161            currentParcel = parcelClickData.Parcel;
 162
 163            // transform coordinates from rect coordinates to parent of view coordinates
 0164            view.Open(currentParcel, lastClickPosition);
 0165            RetrieveFavoriteState();
 0166        }
 167
 168        private void OnMapMetadataInfoUpdated(MinimapMetadata.MinimapSceneInfo sceneInfo)
 169        {
 0170            if (!view.gameObject.activeInHierarchy)
 0171                return;
 172
 0173            var updatedCurrentLocationInfo = false;
 0174            foreach (Vector2Int parcel in sceneInfo.parcels)
 175            {
 0176                if (parcel == currentParcel)
 177                {
 0178                    updatedCurrentLocationInfo = true;
 0179                    break;
 180                }
 181            }
 182
 0183            if (updatedCurrentLocationInfo)
 0184                view.Populate(currentParcel, lastClickPosition, sceneInfo);
 0185        }
 186
 187        private void RetrieveFavoriteState()
 188        {
 0189            retrievingFavoritesCts?.SafeCancelAndDispose();
 0190            retrievingFavoritesCts = CancellationTokenSource.CreateLinkedTokenSource(disposingCts.Token);
 191
 0192            RetrieveAdditionalData(retrievingFavoritesCts.Token).Forget();
 0193        }
 194
 195        private async UniTaskVoid RetrieveAdditionalData(CancellationToken ct)
 196        {
 197            try
 198            {
 0199                view.SetFavoriteLoading(true);
 0200                var place = await placesAPIService.GetPlace(currentParcel, ct);
 0201                placeId = place.id;
 0202                placeName = place.title;
 0203                view.SetPlaceId(place.id);
 0204                view.SetVoteButtons(place.user_like, place.user_dislike);
 0205                view.SetIsAPlace(true);
 0206                bool isFavorite = await placesAPIService.IsFavoritePlace(place, ct);
 0207                view.SetFavoriteLoading(false);
 0208                view.SetCurrentFavoriteStatus(place.id, isFavorite);
 0209                view.SetPlayerCount(place.user_count);
 0210                view.SetUserRating(place.like_rate_as_float);
 0211                view.SetUserVisits(place.user_visits);
 0212                view.RebuildLayouts();
 0213                SetPlaceCardModalData(place);
 0214            }
 0215            catch (NotAPlaceException)
 216            {
 0217                view.SetIsAPlace(false);
 0218            }
 0219            catch (OperationCanceledException)
 220            {
 0221                view.SetFavoriteLoading(true);
 0222            }
 0223        }
 224
 225        private void SetPlaceCardModalData(IHotScenesController.PlaceInfo place)
 226        {
 0227            placeCardModal.SetPlacePicture(place.image);
 0228            placeCardModal.SetCoords(currentParcel);
 0229            placeCardModal.SetDeployedAt(place.deployed_at);
 0230            placeCardModal.SetPlaceAuthor(place.contact_name);
 0231            placeCardModal.SetPlaceName(place.title);
 0232            placeCardModal.SetPlaceDescription(place.description);
 0233            placeCardModal.SetUserVisits(place.user_visits);
 0234            placeCardModal.SetNumberOfUsers(place.user_count);
 0235            placeCardModal.SetUserRating(place.like_rate_as_float);
 0236            placeCardModal.SetNumberOfFavorites(place.favorites);
 0237            placeCardModal.SetTotalVotes(place.likes + place.dislikes);
 0238            placeCardModal.SetFavoriteButton(place.user_favorite, place.id);
 0239            placeCardModal.SetVoteButtons(place.user_like, place.user_dislike);
 0240            placeCardModal.SetIsPOI(allPointOfInterest.Contains(place.base_position));
 0241        }
 242
 243        private void OnFavoriteToggleClicked(string uuid, bool isFavorite)
 244        {
 0245            if(isFavorite)
 0246                placesAnalytics.AddFavorite(uuid, IPlacesAnalytics.ActionSource.FromNavmap);
 247            else
 0248                placesAnalytics.RemoveFavorite(uuid, IPlacesAnalytics.ActionSource.FromNavmap);
 249
 0250            placesAPIService.SetPlaceFavorite(uuid, isFavorite, default).Forget();
 0251        }
 252
 253        private void ChangeVote(string placeId, bool? isUpvote)
 254        {
 0255            if (isUpvote != null)
 256            {
 0257                if (isUpvote.Value)
 0258                    placesAnalytics.Like(placeId, IPlacesAnalytics.ActionSource.FromNavmap);
 259                else
 0260                    placesAnalytics.Dislike(placeId, IPlacesAnalytics.ActionSource.FromNavmap);
 261            }
 262            else
 0263                placesAnalytics.RemoveVote(placeId, IPlacesAnalytics.ActionSource.FromNavmap);
 264
 0265            placesAPIService.SetPlaceVote(isUpvote, placeId, default).Forget();
 0266        }
 267
 268        public void Dispose()
 269        {
 1270            disposingCts?.SafeCancelAndDispose();
 1271            Unsubscribe();
 1272            this.view.OnFavoriteToggleClicked -= OnFavoriteToggleClicked;
 1273            this.view.OnGoto -= JumpIn;
 1274            this.view.OnInfoClick -= EnablePlaceCardModal;
 1275            this.view.OnVoteChanged -= ChangeVote;
 1276            this.placeCardModal.OnFavoriteChanged -= OnFavoriteToggleClicked;
 1277            this.placeCardModal.OnVoteChanged -= ChangeVote;
 1278            this.placeCardModal.OnPressedLinkCopy -= CopyLink;
 1279            this.placeCardModal.OnPressedTwitterButton -= OpenTwitter;
 1280            this.placeCardModal.onJumpInClick.RemoveAllListeners();
 1281        }
 282    }
 283}