< 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:25
Coverable lines:77
Total lines:179
Line coverage:67.5% (52 of 77)
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.065086.67%
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 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    {
 89822        foreach (EnqueuedThumbnail thumbnail in promiseQueue)
 23        {
 024            AssetPromiseKeeper_Texture.i.Forget(thumbnail.Promise);
 25        }
 44926        promiseQueue.Clear();
 27
 89828        foreach (AssetPromise_Texture promiseTexture in progressList)
 29        {
 030            AssetPromiseKeeper_Texture.i.Forget(promiseTexture);
 31        }
 44932        progressList.Clear();
 33
 99234        foreach (KeyValuePair<string,AssetPromise_Texture> assetPromiseTexture in promiseCache)
 35        {
 4736            AssetPromiseKeeper_Texture.i.Forget(assetPromiseTexture.Value);
 37        }
 44938        promiseCache.Clear();
 39
 89840        foreach (KeyValuePair<Texture2D,Sprite> sprite in spriteCache)
 41        {
 042            Object.DestroyImmediate(sprite.Value);
 43        }
 44944        spriteCache.Clear();
 44945    }
 46
 47    public static AssetPromise_Texture PreloadThumbnail(string url)
 48    {
 49#if UNITY_EDITOR
 450        if (bypassRequests)
 451            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
 373474        if (bypassRequests)
 875            return;
 76#endif
 372677        if (string.IsNullOrEmpty(url))
 078            return;
 79
 372680        if (promiseCache.ContainsKey(url))
 81        {
 367982            var promise = promiseCache[url];
 83
 367984            if (promise.state == AssetPromiseState.FINISHED)
 85            {
 086                OnComplete(promise.asset);
 87            }
 88            else
 89            {
 367990                promise.OnSuccessEvent += OnComplete;
 91            }
 92
 367993            return;
 94        }
 95
 4796        var newPromise = new AssetPromise_Texture(url, permittedSources: AssetSource.ALL);
 4797        promiseCache.Add(url, newPromise);
 98
 4799        AddToQueue(new EnqueuedThumbnail(newPromise, OnComplete));
 47100        CheckQueue();
 47101    }
 102    private static void CheckQueue()
 103    {
 94104        var availableSlots = Mathf.Max(CONCURRENT_LIMIT - progressList.Count, 0);
 105
 188106        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
 94114        if (availableSlots > 0)
 115        {
 94116            var availableDownloads = Mathf.Min(availableSlots, promiseQueue.Count);
 117
 94118            if (availableDownloads > 0)
 119            {
 188120                for (int i = 0; i < availableDownloads; i++)
 121                {
 47122                    if (promiseQueue.Count == 0)
 123                        break;
 124
 47125                    var promise = promiseQueue.Dequeue();
 47126                    AssetPromise_Texture assetPromiseTexture = promise.Promise;
 47127                    BeginDownload(assetPromiseTexture, promise.OnComplete);
 128                }
 129            }
 130        }
 94131    }
 132    private static void AddToQueue(EnqueuedThumbnail enqueuedThumbnail)
 133    {
 47134        promiseQueue.Enqueue(enqueuedThumbnail);
 47135    }
 136    private static void BeginDownload(AssetPromise_Texture promise, Action<Asset_Texture> OnComplete)
 137    {
 47138        progressList.Add(promise);
 139
 47140        promise.OnSuccessEvent += t =>
 141        {
 0142            progressList.Remove(promise);
 0143            OnComplete(t);
 0144            CheckQueue();
 0145        };
 146
 47147        promise.OnFailEvent += (x, error) =>
 148        {
 47149            progressList.Remove(promise);
 47150            Debug.Log($"Error downloading: {promise.url}, Exception: {error}");
 47151            CheckQueue();
 47152        };
 153
 47154        AssetPromiseKeeper_Texture.i.Keep(promise);
 47155    }
 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}