< Summary

Class:DCLServices.MapRendererV2.MapLayers.Favorites.FavoritesMarkerController
Assembly:MapRendererV2
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLServices/MapRendererV2/MapLayers/Favorites/FavoritesMarkerController.cs
Covered lines:15
Uncovered lines:50
Coverable lines:65
Total lines:170
Line coverage:23% (15 of 65)
Covered branches:0
Total branches:0
Covered methods:4
Total methods:14
Method coverage:28.5% (4 of 14)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
FavoritesMarkerController(...)0%110100%
Initialize(...)0%110100%
DisposeImpl()0%2.092071.43%
OnMapObjectBecameVisible(...)0%2100%
GetFavorites()0%42600%
OnMapObjectCulled(...)0%2100%
ApplyCameraZoom(...)0%6200%
ResetToBaseScale()0%6200%
OnMinimapSceneInfoUpdated(...)0%30500%
GetParcelsCenter(...)0%20400%
IsEmptyParcel(...)0%2100%
Disable(...)0%2.312057.14%
Enable(...)0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLServices/MapRendererV2/MapLayers/Favorites/FavoritesMarkerController.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using DCLServices.MapRendererV2.CoordsUtils;
 3using DCLServices.MapRendererV2.Culling;
 4using DCLServices.MapRendererV2.MapCameraController;
 5using DCLServices.PlacesAPIService;
 6using MainScripts.DCL.Controllers.HotScenes;
 7using MainScripts.DCL.Helpers.Utils;
 8using System;
 9using System.Collections.Generic;
 10using System.Threading;
 11using UnityEngine;
 12
 13namespace DCLServices.MapRendererV2.MapLayers.Favorites
 14{
 15    internal class FavoritesMarkerController : MapLayerControllerBase, IMapCullingListener<IFavoritesMarker>, IMapLayerC
 16    {
 17        internal const int PREWARM_PER_FRAME = 20;
 18        private const string EMPTY_PARCEL_NAME = "Empty parcel";
 19
 20        internal delegate IFavoritesMarker FavoritesMarkerBuilder(
 21            IUnityObjectPool<FavoriteMarkerObject> objectsPool,
 22            IMapCullingController cullingController);
 23
 24        private readonly IPlacesAPIService placesAPIService;
 25        private readonly IUnityObjectPool<FavoriteMarkerObject> objectsPool;
 26        private readonly FavoritesMarkerBuilder builder;
 27        private readonly int prewarmCount;
 28
 9629        private readonly Dictionary<IHotScenesController.PlaceInfo, IFavoritesMarker> markers = new ();
 30
 31        private bool isEnabled;
 32
 033        public IReadOnlyDictionary<IHotScenesController.PlaceInfo, IFavoritesMarker> Markers => markers;
 34
 35        public FavoritesMarkerController(IPlacesAPIService placesAPIService,
 36            IUnityObjectPool<FavoriteMarkerObject> objectsPool, FavoritesMarkerBuilder builder,
 37            int prewarmCount, Transform instantiationParent, ICoordsUtils coordsUtils, IMapCullingController cullingCont
 9638            : base(instantiationParent, coordsUtils, cullingController)
 39        {
 9640            this.placesAPIService = placesAPIService;
 9641            this.objectsPool = objectsPool;
 9642            this.builder = builder;
 9643            this.prewarmCount = prewarmCount;
 9644        }
 45
 46        public UniTask Initialize(CancellationToken cancellationToken) =>
 9647            objectsPool.PrewarmAsync(prewarmCount, PREWARM_PER_FRAME, LinkWithDisposeToken(cancellationToken).Token);
 48
 49        protected override void DisposeImpl()
 50        {
 651            objectsPool.Clear();
 52
 1253            foreach (IFavoritesMarker marker in markers.Values)
 054                marker.Dispose();
 55
 656            markers.Clear();
 657        }
 58
 59        public void OnMapObjectBecameVisible(IFavoritesMarker marker)
 60        {
 061            marker.OnBecameVisible();
 062        }
 63
 64        private async UniTaskVoid GetFavorites(CancellationToken cancellationToken)
 65        {
 066            foreach (IHotScenesController.PlaceInfo placeInfo in await placesAPIService.GetFavorites(-1, -1, cancellatio
 067                OnMinimapSceneInfoUpdated(placeInfo);
 068        }
 69
 70        public void OnMapObjectCulled(IFavoritesMarker marker)
 71        {
 072            marker.OnBecameInvisible();
 073        }
 74
 75        public void ApplyCameraZoom(float baseZoom, float zoom)
 76        {
 077            foreach (IFavoritesMarker marker in markers.Values)
 078                marker.SetZoom(coordsUtils.ParcelSize, baseZoom, zoom);
 079        }
 80
 81        public void ResetToBaseScale()
 82        {
 083            foreach (var marker in markers.Values)
 084                marker.ResetScale(coordsUtils.ParcelSize);
 085        }
 86
 87        private void OnMinimapSceneInfoUpdated(IHotScenesController.PlaceInfo sceneInfo)
 88        {
 89            // Markers are not really updated, they can be just reported several times with essentially the same data
 090            if (!sceneInfo.user_favorite)
 091                return;
 92
 93            // if it was possible to update them then we need to cache by parcel coordinates instead
 94            // and recalculate the parcels centers accordingly
 095            if (markers.ContainsKey(sceneInfo))
 096                return;
 97
 098            if (IsEmptyParcel(sceneInfo))
 099                return;
 100
 0101            var marker = builder(objectsPool, mapCullingController);
 102
 0103            var centerParcel = GetParcelsCenter(sceneInfo);
 0104            var position = coordsUtils.CoordsToPosition(centerParcel, marker);
 105
 0106            marker.SetData(sceneInfo.title, position);
 107
 0108            markers.Add(sceneInfo, marker);
 109
 0110            if (isEnabled)
 0111                mapCullingController.StartTracking(marker, this);
 0112        }
 113
 114        private static Vector2Int GetParcelsCenter(IHotScenesController.PlaceInfo sceneInfo)
 115        {
 0116            Vector2 centerTile = Vector2.zero;
 117
 0118            for (var i = 0; i < sceneInfo.Positions.Length; i++)
 119            {
 0120                Vector2Int parcel = sceneInfo.Positions[i];
 0121                centerTile += parcel;
 122            }
 123
 0124            centerTile /= sceneInfo.Positions.Length;
 0125            float distance = float.PositiveInfinity;
 0126            Vector2Int centerParcel = Vector2Int.zero;
 127
 0128            for (var i = 0; i < sceneInfo.Positions.Length; i++)
 129            {
 0130                var parcel = sceneInfo.Positions[i];
 131
 0132                if (Vector2.Distance(centerTile, parcel) < distance)
 133                {
 0134                    distance = Vector2Int.Distance(centerParcel, parcel);
 0135                    centerParcel = parcel;
 136                }
 137            }
 138
 0139            return centerParcel;
 140        }
 141
 142        private static bool IsEmptyParcel(IHotScenesController.PlaceInfo sceneInfo) =>
 0143            sceneInfo.title is EMPTY_PARCEL_NAME;
 144
 145        public UniTask Disable(CancellationToken cancellationToken)
 146        {
 147            // Make markers invisible to release everything to the pool and stop tracking
 176148            foreach (IFavoritesMarker marker in markers.Values)
 149            {
 0150                mapCullingController.StopTracking(marker);
 0151                marker.OnBecameInvisible();
 152            }
 153
 88154            isEnabled = false;
 155
 88156            return UniTask.CompletedTask;
 157        }
 158
 159        public UniTask Enable(CancellationToken cancellationToken)
 160        {
 0161            GetFavorites(CancellationToken.None).Forget();
 0162            foreach (IFavoritesMarker marker in markers.Values)
 0163                mapCullingController.StartTracking(marker, this);
 164
 0165            isEnabled = true;
 166
 0167            return UniTask.CompletedTask;
 168        }
 169    }
 170}