< Summary

Class:ThumbnailsManager
Assembly:ThumbnailsManager
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/ThumbnailsManager/ThumbnailsManager.cs
Covered lines:14
Uncovered lines:63
Coverable lines:77
Total lines:179
Line coverage:18.1% (14 of 77)
Covered branches:0
Total branches:0
Covered methods:2
Total methods:9
Method coverage:22.2% (2 of 9)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ThumbnailsManager()0%110100%
Clear()0%6.385061.9%
PreloadThumbnail(...)0%12300%
ForgetThumbnail(...)0%6200%
GetThumbnail(...)0%30500%
CheckQueue()0%56700%
AddToQueue(...)0%2100%
BeginDownload(...)0%2100%
GetOrCreateSpriteFromTexture(...)0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/ThumbnailsManager/ThumbnailsManager.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using UnityEngine;
 4using DCL;
 5using MainScripts.DCL.Controllers.AssetManager;
 6using Object = UnityEngine.Object;
 7
 8//In the future the AssetManager will do this
 9public static class ThumbnailsManager
 10{
 11#if UNITY_EDITOR
 112    public static bool bypassRequests = false;
 13#endif
 114    private static readonly Queue<EnqueuedThumbnail> promiseQueue = new Queue<EnqueuedThumbnail>();
 115    private static readonly List<AssetPromise_Texture> progressList = new List<AssetPromise_Texture>();
 116    private static readonly Dictionary<Texture2D, Sprite> spriteCache = new Dictionary<Texture2D, Sprite>();
 117    private static readonly Dictionary<string, AssetPromise_Texture> promiseCache = new Dictionary<string, AssetPromise_
 18    private const int CONCURRENT_LIMIT = 10;
 19
 20    public static void Clear()
 21    {
 72622        foreach (EnqueuedThumbnail thumbnail in promiseQueue)
 23        {
 024            AssetPromiseKeeper_Texture.i.Forget(thumbnail.Promise);
 25        }
 36326        promiseQueue.Clear();
 27
 72628        foreach (AssetPromise_Texture promiseTexture in progressList)
 29        {
 030            AssetPromiseKeeper_Texture.i.Forget(promiseTexture);
 31        }
 36332        progressList.Clear();
 33
 72634        foreach (KeyValuePair<string,AssetPromise_Texture> assetPromiseTexture in promiseCache)
 35        {
 036            AssetPromiseKeeper_Texture.i.Forget(assetPromiseTexture.Value);
 37        }
 36338        promiseCache.Clear();
 39
 72640        foreach (KeyValuePair<Texture2D,Sprite> sprite in spriteCache)
 41        {
 042            Object.DestroyImmediate(sprite.Value);
 43        }
 36344        spriteCache.Clear();
 36345    }
 46
 47    public static AssetPromise_Texture PreloadThumbnail(string url)
 48    {
 49#if UNITY_EDITOR
 050        if (bypassRequests)
 051            return null;
 52#endif
 053        if (string.IsNullOrEmpty(url))
 054            return null;
 55
 056        var promise = new AssetPromise_Texture(url, permittedSources: AssetSource.ALL);
 057        AssetPromiseKeeper_Texture.i.Keep(promise);
 58
 059        return promise;
 60    }
 61
 62    public static void ForgetThumbnail(AssetPromise_Texture promise)
 63    {
 064        if (promise == null)
 065            return;
 66
 67        //Debug.Log("Forget thumbnail " + promise.asset.id);
 068        AssetPromiseKeeper_Texture.i.Forget(promise);
 069    }
 70
 71    public static void GetThumbnail(string url, Action<Asset_Texture> OnComplete)
 72    {
 73#if UNITY_EDITOR
 074        if (bypassRequests)
 075            return;
 76#endif
 077        if (string.IsNullOrEmpty(url))
 078            return;
 79
 080        if (promiseCache.ContainsKey(url))
 81        {
 082            var promise = promiseCache[url];
 83
 084            if (promise.state == AssetPromiseState.FINISHED)
 85            {
 086                OnComplete(promise.asset);
 87            }
 88            else
 89            {
 090                promise.OnSuccessEvent += OnComplete;
 91            }
 92
 093            return;
 94        }
 95
 096        var newPromise = new AssetPromise_Texture(url, permittedSources: AssetSource.ALL);
 097        promiseCache.Add(url, newPromise);
 98
 099        AddToQueue(new EnqueuedThumbnail(newPromise, OnComplete));
 0100        CheckQueue();
 0101    }
 102    private static void CheckQueue()
 103    {
 0104        var availableSlots = Mathf.Max(CONCURRENT_LIMIT - progressList.Count, 0);
 105
 0106        for (int i = progressList.Count - 1; i >= 0 ; i--)
 107        {
 0108            if (progressList[i].state == AssetPromiseState.IDLE_AND_EMPTY)
 109            {
 0110                progressList.RemoveAt(i);
 111            }
 112        }
 113
 0114        if (availableSlots > 0)
 115        {
 0116            var availableDownloads = Mathf.Min(availableSlots, promiseQueue.Count);
 117
 0118            if (availableDownloads > 0)
 119            {
 0120                for (int i = 0; i < availableDownloads; i++)
 121                {
 0122                    if (promiseQueue.Count == 0)
 123                        break;
 124
 0125                    var promise = promiseQueue.Dequeue();
 0126                    AssetPromise_Texture assetPromiseTexture = promise.Promise;
 0127                    BeginDownload(assetPromiseTexture, promise.OnComplete);
 128                }
 129            }
 130        }
 0131    }
 132    private static void AddToQueue(EnqueuedThumbnail enqueuedThumbnail)
 133    {
 0134        promiseQueue.Enqueue(enqueuedThumbnail);
 0135    }
 136    private static void BeginDownload(AssetPromise_Texture promise, Action<Asset_Texture> OnComplete)
 137    {
 0138        progressList.Add(promise);
 139
 0140        promise.OnSuccessEvent += t =>
 141        {
 0142            progressList.Remove(promise);
 0143            OnComplete(t);
 0144            CheckQueue();
 0145        };
 146
 0147        promise.OnFailEvent += (x, error) =>
 148        {
 0149            progressList.Remove(promise);
 0150            Debug.Log($"Error downloading: {promise.url}, Exception: {error}");
 0151            CheckQueue();
 0152        };
 153
 0154        AssetPromiseKeeper_Texture.i.Keep(promise);
 0155    }
 156
 157    public static Sprite GetOrCreateSpriteFromTexture(Texture2D texture, out bool wasCreated)
 158    {
 0159        wasCreated = false;
 0160        if (!spriteCache.ContainsKey(texture))
 161        {
 0162            spriteCache[texture] =
 163                Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero, 100, 0, SpriteMeshTy
 0164            wasCreated = true;
 165        }
 0166        return spriteCache[texture];
 167    }
 168}
 169
 170public struct EnqueuedThumbnail
 171{
 172    public readonly AssetPromise_Texture Promise;
 173    public readonly Action<Asset_Texture> OnComplete;
 174    public EnqueuedThumbnail(AssetPromise_Texture promise, Action<Asset_Texture> complete)
 175    {
 176        this.Promise = promise;
 177        OnComplete = complete;
 178    }
 179}