< Summary

Class:MinimapHUDController
Assembly:MinimapHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/Minimap/MinimapHUDController.cs
Covered lines:91
Uncovered lines:60
Coverable lines:151
Total lines:341
Line coverage:60.2% (91 of 151)
Covered branches:0
Total branches:0
Covered methods:23
Total methods:37
Method coverage:62.1% (23 of 37)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
MinimapHUDController(...)0%22095.24%
CreateView()0%110100%
Initialize()0%110100%
Dispose()0%4.014091.67%
InitializeMapRenderer()0%110100%
OnNavMapIsRenderedChange(...)0%6200%
DisposeMapRenderer()0%220100%
OnPlayerCoordsChange(...)0%3.333066.67%
OnFullscreenUIVisibilityChange(...)0%2100%
SetNewHome(...)0%2100%
UpdateData(...)0%2100%
UpdateSceneName(...)0%110100%
UpdatePlayerPosition(...)0%110100%
UpdateSetHomePanel()0%110100%
UpdatePlayerPosition(...)0%110100%
AddZoomDelta(...)0%2100%
ToggleOptions()0%110100%
ToggleSceneUI(...)0%2100%
AddBookmark()0%6200%
ReportScene()0%110100%
SetHomeScene(...)0%20400%
SetVisibility(...)0%220100%
OnSceneInfoUpdated(...)0%4.943040%
RetrieveFavoriteState(...)0%6200%
RetrieveFavoriteStateAsync()0%30500%
OnFavoriteToggleClicked(...)0%6200%
SetVisibility(...)0%2100%
OnCopyLocationToClipboard()0%110100%
OpenContentModerationPanel()0%6200%
OnSceneNumberChanged(...)0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/Minimap/MinimapHUDController.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using DCL;
 3using DCL.Controllers;
 4using DCL.Interface;
 5using DCL.Tasks;
 6using DCLServices.CopyPaste.Analytics;
 7using DCLServices.MapRendererV2;
 8using DCLServices.MapRendererV2.CommonBehavior;
 9using DCLServices.MapRendererV2.ConsumerUtils;
 10using DCLServices.MapRendererV2.MapCameraController;
 11using DCLServices.MapRendererV2.MapLayers;
 12using DCLServices.MapRendererV2.MapLayers.PlayerMarker;
 13using DCLServices.PlacesAPIService;
 14using System;
 15using System.Collections.Generic;
 16using System.Threading;
 17using UnityEngine;
 18using Object = UnityEngine.Object;
 19
 20public class MinimapHUDController : IHUD, IMapActivityOwner
 21{
 22    private static bool VERBOSE = false;
 23    private const MapLayer RENDER_LAYERS = MapLayer.SatelliteAtlas | MapLayer.ParcelsAtlas | MapLayer.HomePoint | MapLay
 24
 25    public MinimapHUDView view;
 26
 1027    private FloatVariable minimapZoom => CommonScriptableObjects.minimapZoom;
 2028    private IntVariable currentSceneNumber => CommonScriptableObjects.sceneNumber;
 1129    private Vector2IntVariable playerCoords => CommonScriptableObjects.playerCoords;
 1030    private bool isContentModerationFeatureEnabled => DataStore.i.featureFlags.flags.Get().IsFeatureEnabled("content_mod
 31    private Vector2Int currentCoords;
 1032    private Vector2Int homeCoords = new (0, 0);
 33
 34    private readonly MinimapMetadataController metadataController;
 35    private readonly IHomeLocationController locationController;
 36    private readonly DCL.Environment.Model environment;
 37    private readonly IPlacesAPIService placesAPIService;
 38    private readonly IPlacesAnalytics placesAnalytics;
 39    private readonly IClipboard clipboard;
 40    private readonly ICopyPasteAnalyticsService copyPasteAnalyticsService;
 41    private readonly DataStore_ContentModeration contentModerationDataStore;
 42    private readonly IWorldState worldState;
 1043    private readonly BaseVariable<bool> minimapVisible = DataStore.i.HUDs.minimapVisible;
 1044    private readonly CancellationTokenSource disposingCts = new ();
 45
 1046    public IReadOnlyDictionary<MapLayer, IMapLayerParameter> LayersParameters { get; } = new Dictionary<MapLayer, IMapLa
 47        { { MapLayer.PlayerMarker, new PlayerMarkerParameter {BackgroundIsActive = false} } };
 48
 49    private Service<IMapRenderer> mapRenderer;
 50    private IMapCameraController mapCameraController;
 51    private MapRendererTrackPlayerPosition mapRendererTrackPlayerPosition;
 52    private CancellationTokenSource retrievingFavoritesCts;
 53    private SceneContentCategory currentContentCategory;
 54
 4255    private MinimapHUDModel model { get; set; } = new ();
 56
 1057    public MinimapHUDController(
 58        MinimapMetadataController minimapMetadataController,
 59        IHomeLocationController locationController,
 60        DCL.Environment.Model environment,
 61        IPlacesAPIService placesAPIService,
 62        IPlacesAnalytics placesAnalytics,
 63        IClipboard clipboard,
 64        ICopyPasteAnalyticsService copyPasteAnalyticsService,
 65        DataStore_ContentModeration contentModerationDataStore,
 66        IWorldState worldState)
 67    {
 1068        minimapZoom.Set(1f);
 1069        metadataController = minimapMetadataController;
 1070        this.locationController = locationController;
 1071        this.environment = environment;
 1072        this.placesAPIService = placesAPIService;
 1073        this.placesAnalytics = placesAnalytics;
 1074        this.clipboard = clipboard;
 1075        this.copyPasteAnalyticsService = copyPasteAnalyticsService;
 1076        this.contentModerationDataStore = contentModerationDataStore;
 1077        this.worldState = worldState;
 78
 1079        if (metadataController != null)
 080            metadataController.OnHomeChanged += SetNewHome;
 81
 1082        minimapVisible.OnChange += SetVisibility;
 1083        currentSceneNumber.OnChange += OnSceneNumberChanged;
 1084    }
 85
 86    protected virtual MinimapHUDView CreateView() =>
 1087        MinimapHUDView.Create(this);
 88
 89    public void Initialize()
 90    {
 1091        view = CreateView();
 1092        view.SetReportSceneButtonActive(!isContentModerationFeatureEnabled);
 1093        view.OnFavoriteToggleClicked += OnFavoriteToggleClicked;
 1094        view.OnCopyLocationRequested += OnCopyLocationToClipboard;
 1095        view.contentModerationButton.OnContentModerationPressed += OpenContentModerationPanel;
 1096        InitializeMapRenderer();
 97
 1098        OnPlayerCoordsChange(CommonScriptableObjects.playerCoords.Get(), Vector2Int.zero);
 1099        SetVisibility(minimapVisible.Get());
 100
 10101        CommonScriptableObjects.playerCoords.OnChange += OnPlayerCoordsChange;
 10102        CommonScriptableObjects.isFullscreenHUDOpen.OnChange += OnFullscreenUIVisibilityChange;
 10103        MinimapMetadata.GetMetadata().OnSceneInfoUpdated += OnSceneInfoUpdated;
 10104    }
 105
 106    public void Dispose()
 107    {
 10108        disposingCts?.SafeCancelAndDispose();
 109
 10110        if (view != null)
 111        {
 10112            DisposeMapRenderer();
 10113            Object.Destroy(view.gameObject);
 114        }
 115
 10116        CommonScriptableObjects.playerCoords.OnChange -= OnPlayerCoordsChange;
 10117        MinimapMetadata.GetMetadata().OnSceneInfoUpdated -= OnSceneInfoUpdated;
 118
 10119        if (metadataController != null)
 0120            metadataController.OnHomeChanged -= SetNewHome;
 121
 10122        minimapVisible.OnChange -= SetVisibility;
 10123        view.contentModerationButton.OnContentModerationPressed -= OpenContentModerationPanel;
 10124        currentSceneNumber.OnChange -= OnSceneNumberChanged;
 10125    }
 126
 127    private void InitializeMapRenderer()
 128    {
 10129        view.pixelPerfectMapRendererTextureProvider.SetHudCamera(DataStore.i.camera.hudsCamera.Get());
 130
 10131        mapCameraController = mapRenderer.Ref.RentCamera(
 132            new MapCameraInput(
 133                this,
 134                RENDER_LAYERS,
 135                Vector2Int.RoundToInt(MapRendererTrackPlayerPosition.GetPlayerCentricCoords(playerCoords.Get())),
 136                1,
 137                view.pixelPerfectMapRendererTextureProvider.GetPixelPerfectTextureResolution(),
 138                new Vector2Int(view.mapRendererVisibleParcels, view.mapRendererVisibleParcels)
 139                )
 140            );
 141
 10142        mapRendererTrackPlayerPosition = new MapRendererTrackPlayerPosition(mapCameraController, DataStore.i.player.play
 10143        view.mapRendererTargetImage.texture = mapCameraController.GetRenderTexture();
 10144        view.pixelPerfectMapRendererTextureProvider.Activate(mapCameraController);
 145
 10146        DataStore.i.HUDs.navmapIsRendered.OnChange += OnNavMapIsRenderedChange;
 10147    }
 148
 149    private void OnNavMapIsRenderedChange(bool current, bool previous)
 150    {
 0151        if (current)
 0152            mapCameraController.SuspendRendering();
 153        else
 0154            mapCameraController.ResumeRendering();
 0155    }
 156
 157    private void DisposeMapRenderer()
 158    {
 10159        if (mapCameraController != null)
 160        {
 10161            DataStore.i.HUDs.navmapIsRendered.OnChange -= OnNavMapIsRenderedChange;
 10162            view.pixelPerfectMapRendererTextureProvider.Deactivate();
 10163            mapRendererTrackPlayerPosition.Dispose();
 10164            mapCameraController.Release(this);
 10165            mapCameraController = null;
 166        }
 10167    }
 168
 169    private void OnPlayerCoordsChange(Vector2Int current, Vector2Int previous)
 170    {
 10171        currentCoords = current;
 10172        UpdatePlayerPosition(currentCoords);
 10173        UpdateSetHomePanel();
 10174        MinimapMetadata.MinimapSceneInfo sceneInfo = MinimapMetadata.GetMetadata().GetSceneInfo(currentCoords.x, current
 175
 10176        if (sceneInfo != null)
 177        {
 0178            UpdateSceneName(sceneInfo.name);
 179
 0180            if (sceneInfo.parcels.Count > 0)
 0181                RetrieveFavoriteState(sceneInfo.parcels[0]);
 182        }
 10183    }
 184
 185    private void OnFullscreenUIVisibilityChange(bool current, bool previous)
 186    {
 0187        OnPlayerCoordsChange(currentCoords, Vector2Int.zero);
 0188    }
 189
 190    private void SetNewHome(Vector2Int newHomeCoordinates)
 191    {
 0192        homeCoords = newHomeCoordinates;
 0193        UpdateSetHomePanel();
 0194    }
 195
 196    private void UpdateData(MinimapHUDModel model)
 197    {
 0198        this.model = model;
 0199        view.UpdateData(this.model);
 0200    }
 201
 202    public void UpdateSceneName(string sceneName)
 203    {
 2204        model.sceneName = sceneName;
 2205        view.UpdateData(model);
 2206    }
 207
 208    public void UpdatePlayerPosition(Vector2 position)
 209    {
 210        const string format = "{0},{1}";
 12211        UpdatePlayerPosition(string.Format(format, position.x, position.y));
 12212    }
 213
 214    private void UpdateSetHomePanel()
 215    {
 10216        view.UpdateSetHomePanel(currentCoords == homeCoords);
 10217    }
 218
 219    public void UpdatePlayerPosition(string position)
 220    {
 13221        model.playerPosition = position;
 13222        view.UpdateData(model);
 13223    }
 224
 225    public void AddZoomDelta(float delta)
 226    {
 0227        minimapZoom.Set(Mathf.Clamp01(minimapZoom.Get() + delta));
 0228    }
 229
 230    public void ToggleOptions()
 231    {
 2232        view.ToggleOptions();
 2233    }
 234
 235    public void ToggleSceneUI(bool isUIOn)
 236    {
 0237        DataStore.i.HUDs.isCurrentSceneUiEnabled.Set(isUIOn);
 0238    }
 239
 240    public void AddBookmark()
 241    {
 242        //TODO:
 0243        if (VERBOSE) { Debug.Log("Add bookmark pressed"); }
 0244    }
 245
 246    public void ReportScene()
 247    {
 1248        var coords = playerCoords.Get();
 1249        WebInterface.SendReportScene(environment.world.state.GetSceneNumberByCoords(coords));
 1250    }
 251
 252    public void SetHomeScene(bool isOn)
 253    {
 0254        var coords = playerCoords.Get();
 255
 0256        if (playerCoords == homeCoords)
 257        {
 0258            if (!isOn)
 0259                locationController.SetHomeScene(new Vector2(0, 0));
 260        }
 261        else
 262        {
 0263            if (isOn)
 0264                locationController.SetHomeScene(new Vector2(coords.x, coords.y));
 265        }
 0266    }
 267
 268    public void SetVisibility(bool visible)
 269    {
 11270        view.SetVisibility(visible && minimapVisible.Get());
 11271    }
 272
 273    private void OnSceneInfoUpdated(MinimapMetadata.MinimapSceneInfo sceneInfo)
 274    {
 1275        if (sceneInfo.parcels.Contains(CommonScriptableObjects.playerCoords.Get()))
 276        {
 0277            UpdateSceneName(sceneInfo.name);
 278
 0279            if (sceneInfo.parcels.Count > 0)
 0280                RetrieveFavoriteState(sceneInfo.parcels[0]);
 281        }
 1282    }
 283
 284    private void RetrieveFavoriteState(Vector2Int currentParcel)
 285    {
 0286        retrievingFavoritesCts?.SafeCancelAndDispose();
 0287        retrievingFavoritesCts = CancellationTokenSource.CreateLinkedTokenSource(disposingCts.Token);
 288
 0289        RetrieveFavoriteStateAsync(currentParcel, retrievingFavoritesCts.Token).Forget();
 0290    }
 291
 292    private async UniTaskVoid RetrieveFavoriteStateAsync(Vector2Int currentParcel, CancellationToken ct)
 293    {
 294        try
 295        {
 0296            var place = await placesAPIService.GetPlace(currentParcel, ct);
 0297            bool isFavorite = await placesAPIService.IsFavoritePlace(place, ct);
 0298            view.SetIsAPlace(true);
 0299            view.SetCurrentFavoriteStatus(place.id, isFavorite);
 0300        }
 0301        catch (NotAPlaceException) { view.SetIsAPlace(false); }
 0302        catch (OperationCanceledException) { view.SetIsAPlace(false); }
 0303    }
 304
 305    private void OnFavoriteToggleClicked(string uuid, bool isFavorite)
 306    {
 0307        if (isFavorite)
 0308            placesAnalytics.AddFavorite(uuid, IPlacesAnalytics.ActionSource.FromMinimap);
 309        else
 0310            placesAnalytics.RemoveFavorite(uuid, IPlacesAnalytics.ActionSource.FromMinimap);
 311
 0312        placesAPIService.SetPlaceFavorite(uuid, isFavorite, default).Forget();
 0313    }
 314
 315    private void SetVisibility(bool current, bool _) =>
 0316        SetVisibility(current);
 317
 318    private void OnCopyLocationToClipboard()
 319    {
 1320        clipboard.WriteText($"{model.sceneName}: {model.playerPosition}");
 1321        view.ShowLocationCopiedToast();
 1322        copyPasteAnalyticsService.Copy("location");
 1323    }
 324
 325    private void OpenContentModerationPanel()
 326    {
 0327        if (!isContentModerationFeatureEnabled)
 0328            return;
 329
 0330        contentModerationDataStore.reportingScenePanelVisible.Set((!contentModerationDataStore.reportingScenePanelVisibl
 0331    }
 332
 333    private void OnSceneNumberChanged(int sceneNumber, int _)
 334    {
 0335        if (!worldState.TryGetScene(sceneNumber, out IParcelScene currentParcelScene))
 0336            return;
 337
 0338        currentContentCategory = currentParcelScene.contentCategory;
 0339        view.contentModerationButton.SetContentCategory(currentParcelScene.contentCategory);
 0340    }
 341}