< Summary

Class:ThumbnailsManager
Assembly:ThumbnailsManager
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/ThumbnailsManager/ThumbnailsManager.cs
Covered lines:52
Uncovered lines:26
Coverable lines:78
Total lines:177
Line coverage:66.6% (52 of 78)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ThumbnailsManager()0%110100%
Clear()0%5.585071.43%
PreloadThumbnail(...)0%6.283028.57%
ForgetThumbnail(...)0%6200%
GetThumbnail(...)0%5.165081.25%
CheckQueue()0%7.277082.35%
AddToQueue(...)0%110100%
BeginDownload(...)0%110100%
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 Object = UnityEngine.Object;
 6
 7//In the future the AssetManager will do this
 8public static class ThumbnailsManager
 9{
 10#if UNITY_EDITOR
 111    public static bool bypassRequests = false;
 12#endif
 113    private static readonly Queue<EnqueuedThumbnail> promiseQueue = new Queue<EnqueuedThumbnail>();
 114    private static readonly List<AssetPromise_Texture> progressList = new List<AssetPromise_Texture>();
 115    private static readonly Dictionary<Texture2D, Sprite> spriteCache = new Dictionary<Texture2D, Sprite>();
 116    private static readonly Dictionary<string, AssetPromise_Texture> promiseCache = new Dictionary<string, AssetPromise_
 17    private const int CONCURRENT_LIMIT = 10;
 18
 19    public static void Clear()
 20    {
 127221        foreach (EnqueuedThumbnail thumbnail in promiseQueue)
 22        {
 023            AssetPromiseKeeper_Texture.i.Forget(thumbnail.Promise);
 24        }
 63625        promiseQueue.Clear();
 26
 127227        foreach (AssetPromise_Texture promiseTexture in progressList)
 28        {
 029            AssetPromiseKeeper_Texture.i.Forget(promiseTexture);
 30        }
 63631        progressList.Clear();
 32
 136633        foreach (KeyValuePair<string,AssetPromise_Texture> assetPromiseTexture in promiseCache)
 34        {
 4735            AssetPromiseKeeper_Texture.i.Forget(assetPromiseTexture.Value);
 36        }
 63637        promiseCache.Clear();
 38
 127239        foreach (KeyValuePair<Texture2D,Sprite> sprite in spriteCache)
 40        {
 041            Object.DestroyImmediate(sprite.Value);
 42        }
 63643        spriteCache.Clear();
 63644    }
 45
 46    public static AssetPromise_Texture PreloadThumbnail(string url)
 47    {
 48#if UNITY_EDITOR
 449        if (bypassRequests)
 450            return null;
 51#endif
 052        if (string.IsNullOrEmpty(url))
 053            return null;
 54
 055        var promise = new AssetPromise_Texture(url);
 056        AssetPromiseKeeper_Texture.i.Keep(promise);
 57
 058        return promise;
 59    }
 60
 61    public static void ForgetThumbnail(AssetPromise_Texture promise)
 62    {
 063        if (promise == null)
 064            return;
 65
 66        //Debug.Log("Forget thumbnail " + promise.asset.id);
 067        AssetPromiseKeeper_Texture.i.Forget(promise);
 068    }
 69
 70    public static void GetThumbnail(string url, Action<Asset_Texture> OnComplete)
 71    {
 72#if UNITY_EDITOR
 12073        if (bypassRequests)
 874            return;
 75#endif
 11276        if (string.IsNullOrEmpty(url))
 077            return;
 78
 11279        if (promiseCache.ContainsKey(url))
 80        {
 6581            var promise = promiseCache[url];
 82
 6583            if (promise.state == AssetPromiseState.FINISHED)
 84            {
 085                OnComplete(promise.asset);
 086            }
 87            else
 88            {
 6589                promise.OnSuccessEvent += OnComplete;
 90            }
 91
 6592            return;
 93        }
 94
 4795        var newPromise = new AssetPromise_Texture(url);
 4796        promiseCache.Add(url, newPromise);
 97
 4798        AddToQueue(new EnqueuedThumbnail(newPromise, OnComplete));
 4799        CheckQueue();
 47100    }
 101    private static void CheckQueue()
 102    {
 94103        var availableSlots = Mathf.Max(CONCURRENT_LIMIT - progressList.Count, 0);
 104
 188105        for (int i = progressList.Count - 1; i >= 0 ; i--)
 106        {
 0107            if (progressList[i].state == AssetPromiseState.IDLE_AND_EMPTY)
 108            {
 0109                progressList.RemoveAt(i);
 110            }
 111        }
 112
 94113        if (availableSlots > 0)
 114        {
 94115            var availableDownloads = Mathf.Min(availableSlots, promiseQueue.Count);
 116
 94117            if (availableDownloads > 0)
 118            {
 188119                for (int i = 0; i < availableDownloads; i++)
 120                {
 47121                    if (promiseQueue.Count == 0)
 122                        break;
 123
 47124                    var promise = promiseQueue.Dequeue();
 47125                    AssetPromise_Texture assetPromiseTexture = promise.Promise;
 47126                    BeginDownload(assetPromiseTexture, promise.OnComplete);
 127                }
 128            }
 129        }
 94130    }
 131    private static void AddToQueue(EnqueuedThumbnail enqueuedThumbnail)
 132    {
 47133        promiseQueue.Enqueue(enqueuedThumbnail);
 47134    }
 135    private static void BeginDownload(AssetPromise_Texture promise, Action<Asset_Texture> OnComplete)
 136    {
 47137        progressList.Add(promise);
 138
 47139        promise.OnSuccessEvent += t =>
 140        {
 0141            progressList.Remove(promise);
 0142            OnComplete(t);
 0143            CheckQueue();
 0144        };
 145
 47146        promise.OnFailEvent += (x, error) =>
 147        {
 47148            progressList.Remove(promise);
 47149            Debug.Log($"Error downloading: {promise.url}, Exception: {error}");
 47150            CheckQueue();
 47151        };
 152
 47153        AssetPromiseKeeper_Texture.i.Keep(promise);
 47154    }
 155
 156    public static Sprite GetOrCreateSpriteFromTexture(Texture2D texture, out bool wasCreated)
 157    {
 0158        wasCreated = false;
 0159        if (!spriteCache.ContainsKey(texture))
 160        {
 0161            spriteCache[texture] = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero);
 0162            wasCreated = true;
 163        }
 0164        return spriteCache[texture];
 165    }
 166}
 167
 168public struct EnqueuedThumbnail
 169{
 170    public readonly AssetPromise_Texture Promise;
 171    public readonly Action<Asset_Texture> OnComplete;
 172    public EnqueuedThumbnail(AssetPromise_Texture promise, Action<Asset_Texture> complete)
 173    {
 174        this.Promise = promise;
 175        OnComplete = complete;
 176    }
 177}