< Summary

Class:DCLFeatures.CameraReel.Gallery.CameraReelGalleryView
Assembly:CameraReel
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLFeatures/CameraReel/Gallery/Scripts/CameraReelGalleryView.cs
Covered lines:0
Uncovered lines:103
Coverable lines:103
Total lines:239
Line coverage:0% (0 of 103)
Covered branches:0
Total branches:0
Covered methods:0
Total methods:19
Method coverage:0% (0 of 19)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
CameraReelGalleryView()0%2100%
Awake()0%2100%
OnEnable()0%2100%
OnDisable()0%2100%
SwitchVisibility(...)0%2100%
DeleteScreenshotThumbnail(...)0%20400%
SwitchEmptyStateVisibility(...)0%2100%
SwitchShowMoreVisibility(...)0%2100%
AddScreenshotThumbnail(...)0%20400%
OnThumbnailClicked(...)0%6200%
SortThumbnailsByDateOnNextFrame()0%42600%
SortThumbnails(...)0%56700%
UpdateLayoutOnNextFrame()0%12300%
GetMonthContainer(...)0%6200%
CreateMonthContainer(...)0%2100%
SortAllMonthContainers()0%6200%
RemoveEmptyMonthContainer(...)0%20400%
GetMonthName(...)0%2100%
GetThumbnailEntryPool()0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLFeatures/CameraReel/Gallery/Scripts/CameraReelGalleryView.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using DCL;
 3using DCL.Helpers;
 4using DCL.Tasks;
 5using DCLServices.CameraReelService;
 6using System;
 7using System.Collections.Generic;
 8using System.Globalization;
 9using System.Threading;
 10using TMPro;
 11using UnityEngine;
 12using UnityEngine.UI;
 13
 14namespace DCLFeatures.CameraReel.Gallery
 15{
 16    public class CameraReelGalleryView : MonoBehaviour, ICameraReelGalleryView
 17    {
 018        private readonly SortedDictionary<DateTime, (GridContainerComponentView gridContainer, GameObject headerContaine
 019        private readonly Dictionary<CameraReelResponse, CameraReelThumbnail> thumbnails = new ();
 020        private readonly Dictionary<CameraReelThumbnail, PoolableObject> thumbnailPoolObjects = new ();
 021        private readonly Dictionary<DateTime, int> thumbnailsByMonth = new ();
 022        private readonly List<CameraReelThumbnail> thumbnailSortingBuffer = new ();
 023        private readonly HashSet<GridContainerComponentView> containersToBeSorted = new ();
 24
 25        [SerializeField] private RectTransform container;
 26        [SerializeField] private Button showMoreButton;
 27        [SerializeField] private RectTransform showMoreButtonPanel;
 28        [SerializeField] private Canvas canvas;
 29        [SerializeField] private GameObject emptyStateContainer;
 30        [SerializeField] private RectTransform scrollMaskTransform;
 31
 32        [Header("RESOURCES")]
 33        [SerializeField] private GameObject monthHeaderPrefab;
 34        [SerializeField] private GridContainerComponentView monthGridContainerPrefab;
 35        [SerializeField] private CameraReelThumbnail thumbnailPrefab;
 36
 37        private GridContainerComponentView currentMonthGridContainer;
 38        private CancellationTokenSource updateLayoutAndSortingCancellationToken;
 39
 40        public event Action<CameraReelResponse> ScreenshotThumbnailClicked;
 41        public event Action ShowMoreButtonClicked;
 42
 43        private void Awake()
 44        {
 045            SwitchVisibility(isVisible: false);
 046        }
 47
 48        private void OnEnable()
 49        {
 050            showMoreButton.onClick.AddListener(() => ShowMoreButtonClicked?.Invoke());
 051        }
 52
 53        private void OnDisable()
 54        {
 055            showMoreButton.onClick.RemoveAllListeners();
 056        }
 57
 58        public void SwitchVisibility(bool isVisible) =>
 059            canvas.enabled = isVisible;
 60
 61        public void DeleteScreenshotThumbnail(CameraReelResponse reel)
 62        {
 063            if (!thumbnails.ContainsKey(reel)) return;
 64
 065            CameraReelThumbnail thumbnail = thumbnails[reel];
 066            DateTime month = reel.metadata.GetStartOfTheMonthDate();
 67
 068            if (thumbnailPoolObjects.ContainsKey(thumbnail))
 69            {
 070                thumbnailPoolObjects[thumbnail].Release();
 071                thumbnailPoolObjects.Remove(thumbnail);
 72            }
 73
 074            thumbnails.Remove(reel);
 75
 076            if (thumbnailsByMonth.ContainsKey(month))
 077                thumbnailsByMonth[month]--;
 78
 079            RemoveEmptyMonthContainer(month);
 80
 081            updateLayoutAndSortingCancellationToken = updateLayoutAndSortingCancellationToken.SafeRestart();
 082            try { UpdateLayoutOnNextFrame(updateLayoutAndSortingCancellationToken.Token).Forget(); }
 083            catch (OperationCanceledException) { }
 084        }
 85
 86        public void SwitchEmptyStateVisibility(bool visible)
 87        {
 088            emptyStateContainer.SetActive(visible);
 089        }
 90
 91        public void SwitchShowMoreVisibility(bool visible)
 92        {
 093            showMoreButtonPanel.gameObject.SetActive(visible);
 094        }
 95
 96        public void AddScreenshotThumbnail(CameraReelResponse reel, bool setAsFirst)
 97        {
 098            DateTime month = reel.metadata.GetStartOfTheMonthDate();
 99
 0100            GridContainerComponentView gridContainer = GetMonthContainer(month);
 101
 0102            Pool thumbnailPool = GetThumbnailEntryPool();
 0103            PoolableObject thumbnailPoolObj = thumbnailPool.Get();
 0104            CameraReelThumbnail thumbnail = thumbnailPoolObj.gameObject.GetComponent<CameraReelThumbnail>();
 0105            thumbnail.transform.SetParent(gridContainer.transform, false);
 0106            thumbnail.Show(reel);
 0107            thumbnail.OnClicked -= OnThumbnailClicked;
 0108            thumbnail.OnClicked += OnThumbnailClicked;
 109
 0110            if (setAsFirst)
 0111                thumbnail.transform.SetAsFirstSibling();
 112
 0113            thumbnails.Add(reel, thumbnail);
 0114            thumbnailPoolObjects[thumbnail] = thumbnailPoolObj;
 115
 0116            if (!thumbnailsByMonth.ContainsKey(month))
 0117                thumbnailsByMonth[month] = 0;
 118
 0119            thumbnailsByMonth[month]++;
 120
 0121            updateLayoutAndSortingCancellationToken = updateLayoutAndSortingCancellationToken.SafeRestart();
 122
 0123            if (!containersToBeSorted.Contains(gridContainer))
 0124                containersToBeSorted.Add(gridContainer);
 125
 126            try
 127            {
 0128                SortThumbnailsByDateOnNextFrame(containersToBeSorted, updateLayoutAndSortingCancellationToken.Token)
 0129                   .ContinueWith(() => containersToBeSorted.Clear())
 130                   .Forget();
 0131                UpdateLayoutOnNextFrame(updateLayoutAndSortingCancellationToken.Token).Forget();
 0132            }
 0133            catch (OperationCanceledException) { }
 0134        }
 135
 136        private void OnThumbnailClicked(CameraReelResponse picture) =>
 0137            ScreenshotThumbnailClicked?.Invoke(picture);
 138
 139        private async UniTask SortThumbnailsByDateOnNextFrame(IEnumerable<GridContainerComponentView> containers, Cancel
 140        {
 0141            await UniTask.NextFrame(cancellationToken: cancellationToken);
 142
 0143            foreach (GridContainerComponentView container in containers)
 0144                SortThumbnails(container);
 0145        }
 146
 147        private void SortThumbnails(GridContainerComponentView container)
 148        {
 0149            lock (thumbnailSortingBuffer)
 150            {
 0151                thumbnailSortingBuffer.Clear();
 152
 0153                foreach (Transform child in container.transform)
 154                {
 0155                    CameraReelThumbnail thumbnail = child.GetComponent<CameraReelThumbnail>();
 0156                    if (thumbnail == null) continue;
 0157                    thumbnailSortingBuffer.Add(thumbnail);
 158                }
 159
 0160                thumbnailSortingBuffer.Sort((t1, t2) => t1.CompareTo(t2));
 161
 0162                foreach (CameraReelThumbnail thumbnail in thumbnailSortingBuffer)
 0163                    thumbnail.transform.SetAsFirstSibling();
 164            }
 0165        }
 166
 167        private async UniTaskVoid UpdateLayoutOnNextFrame(CancellationToken cancellationToken)
 168        {
 0169            await UniTask.NextFrame(cancellationToken: cancellationToken);
 0170            container.ForceUpdateLayout();
 0171        }
 172
 173        private GridContainerComponentView GetMonthContainer(DateTime date, bool createIfEmpty = true)
 174        {
 175            GridContainerComponentView gridContainer;
 176
 0177            if (!monthContainers.ContainsKey(date) && createIfEmpty)
 178            {
 0179                gridContainer = CreateMonthContainer(date);
 0180                showMoreButtonPanel.SetAsLastSibling();
 0181                SortAllMonthContainers();
 182            }
 183            else
 0184                gridContainer = monthContainers[date].gridContainer;
 185
 0186            return gridContainer;
 187        }
 188
 189        private GridContainerComponentView CreateMonthContainer(DateTime date)
 190        {
 0191            GameObject header = Instantiate(monthHeaderPrefab, container);
 0192            header.gameObject.SetActive(true);
 0193            header.GetComponentInChildren<TMP_Text>().SetText(GetMonthName(date));
 0194            GridContainerComponentView gridContainer = Instantiate(monthGridContainerPrefab, container);
 0195            gridContainer.gameObject.SetActive(true);
 196
 0197            monthContainers.Add(date, (gridContainer, header));
 0198            return gridContainer;
 199        }
 200
 201        private void SortAllMonthContainers()
 202        {
 0203            foreach ((DateTime date, (GridContainerComponentView gridContainer, GameObject header)) in monthContainers)
 204            {
 0205                gridContainer.transform.SetAsFirstSibling();
 0206                header.transform.SetAsFirstSibling();
 207            }
 0208        }
 209
 210        private void RemoveEmptyMonthContainer(DateTime date)
 211        {
 0212            if (!monthContainers.ContainsKey(date)) return;
 0213            if (thumbnailsByMonth.ContainsKey(date) && thumbnailsByMonth[date] > 0) return;
 214
 0215            (GridContainerComponentView gridContainer, GameObject headerContainer) containers = monthContainers[date];
 0216            Destroy(containers.gridContainer);
 0217            Destroy(containers.headerContainer);
 0218            monthContainers.Remove(date);
 0219        }
 220
 221        private string GetMonthName(DateTime date) =>
 0222            date.ToString("MMMM yyyy", CultureInfo.InvariantCulture);
 223
 224        private Pool GetThumbnailEntryPool()
 225        {
 226            const string POOL_ID = "CameraReelThumbnails";
 0227            var entryPool = PoolManager.i.GetPool(POOL_ID);
 0228            if (entryPool != null) return entryPool;
 229
 0230            entryPool = PoolManager.i.AddPool(
 231                POOL_ID,
 232                Instantiate(thumbnailPrefab).gameObject,
 233                maxPrewarmCount: 10,
 234                isPersistent: true);
 235
 0236            return entryPool;
 237        }
 238    }
 239}