< Summary

Class:EnqueuedThumbnail
Assembly:ThumbnailsManager
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/ThumbnailsManager/ThumbnailsManager.cs
Covered lines:3
Uncovered lines:0
Coverable lines:3
Total lines:179
Line coverage:100% (3 of 3)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
EnqueuedThumbnail(...)0%110100%

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
 12    public static bool bypassRequests = false;
 13#endif
 14    private static readonly Queue<EnqueuedThumbnail> promiseQueue = new Queue<EnqueuedThumbnail>();
 15    private static readonly List<AssetPromise_Texture> progressList = new List<AssetPromise_Texture>();
 16    private static readonly Dictionary<Texture2D, Sprite> spriteCache = new Dictionary<Texture2D, Sprite>();
 17    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    {
 22        foreach (EnqueuedThumbnail thumbnail in promiseQueue)
 23        {
 24            AssetPromiseKeeper_Texture.i.Forget(thumbnail.Promise);
 25        }
 26        promiseQueue.Clear();
 27
 28        foreach (AssetPromise_Texture promiseTexture in progressList)
 29        {
 30            AssetPromiseKeeper_Texture.i.Forget(promiseTexture);
 31        }
 32        progressList.Clear();
 33
 34        foreach (KeyValuePair<string,AssetPromise_Texture> assetPromiseTexture in promiseCache)
 35        {
 36            AssetPromiseKeeper_Texture.i.Forget(assetPromiseTexture.Value);
 37        }
 38        promiseCache.Clear();
 39
 40        foreach (KeyValuePair<Texture2D,Sprite> sprite in spriteCache)
 41        {
 42            Object.DestroyImmediate(sprite.Value);
 43        }
 44        spriteCache.Clear();
 45    }
 46
 47    public static AssetPromise_Texture PreloadThumbnail(string url)
 48    {
 49#if UNITY_EDITOR
 50        if (bypassRequests)
 51            return null;
 52#endif
 53        if (string.IsNullOrEmpty(url))
 54            return null;
 55
 56        var promise = new AssetPromise_Texture(url, permittedSources: AssetSource.ALL);
 57        AssetPromiseKeeper_Texture.i.Keep(promise);
 58
 59        return promise;
 60    }
 61
 62    public static void ForgetThumbnail(AssetPromise_Texture promise)
 63    {
 64        if (promise == null)
 65            return;
 66
 67        //Debug.Log("Forget thumbnail " + promise.asset.id);
 68        AssetPromiseKeeper_Texture.i.Forget(promise);
 69    }
 70
 71    public static void GetThumbnail(string url, Action<Asset_Texture> OnComplete)
 72    {
 73#if UNITY_EDITOR
 74        if (bypassRequests)
 75            return;
 76#endif
 77        if (string.IsNullOrEmpty(url))
 78            return;
 79
 80        if (promiseCache.ContainsKey(url))
 81        {
 82            var promise = promiseCache[url];
 83
 84            if (promise.state == AssetPromiseState.FINISHED)
 85            {
 86                OnComplete(promise.asset);
 87            }
 88            else
 89            {
 90                promise.OnSuccessEvent += OnComplete;
 91            }
 92
 93            return;
 94        }
 95
 96        var newPromise = new AssetPromise_Texture(url, permittedSources: AssetSource.ALL);
 97        promiseCache.Add(url, newPromise);
 98
 99        AddToQueue(new EnqueuedThumbnail(newPromise, OnComplete));
 100        CheckQueue();
 101    }
 102    private static void CheckQueue()
 103    {
 104        var availableSlots = Mathf.Max(CONCURRENT_LIMIT - progressList.Count, 0);
 105
 106        for (int i = progressList.Count - 1; i >= 0 ; i--)
 107        {
 108            if (progressList[i].state == AssetPromiseState.IDLE_AND_EMPTY)
 109            {
 110                progressList.RemoveAt(i);
 111            }
 112        }
 113
 114        if (availableSlots > 0)
 115        {
 116            var availableDownloads = Mathf.Min(availableSlots, promiseQueue.Count);
 117
 118            if (availableDownloads > 0)
 119            {
 120                for (int i = 0; i < availableDownloads; i++)
 121                {
 122                    if (promiseQueue.Count == 0)
 123                        break;
 124
 125                    var promise = promiseQueue.Dequeue();
 126                    AssetPromise_Texture assetPromiseTexture = promise.Promise;
 127                    BeginDownload(assetPromiseTexture, promise.OnComplete);
 128                }
 129            }
 130        }
 131    }
 132    private static void AddToQueue(EnqueuedThumbnail enqueuedThumbnail)
 133    {
 134        promiseQueue.Enqueue(enqueuedThumbnail);
 135    }
 136    private static void BeginDownload(AssetPromise_Texture promise, Action<Asset_Texture> OnComplete)
 137    {
 138        progressList.Add(promise);
 139
 140        promise.OnSuccessEvent += t =>
 141        {
 142            progressList.Remove(promise);
 143            OnComplete(t);
 144            CheckQueue();
 145        };
 146
 147        promise.OnFailEvent += (x, error) =>
 148        {
 149            progressList.Remove(promise);
 150            Debug.Log($"Error downloading: {promise.url}, Exception: {error}");
 151            CheckQueue();
 152        };
 153
 154        AssetPromiseKeeper_Texture.i.Keep(promise);
 155    }
 156
 157    public static Sprite GetOrCreateSpriteFromTexture(Texture2D texture, out bool wasCreated)
 158    {
 159        wasCreated = false;
 160        if (!spriteCache.ContainsKey(texture))
 161        {
 162            spriteCache[texture] =
 163                Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero, 100, 0, SpriteMeshTy
 164            wasCreated = true;
 165        }
 166        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    {
 47176        this.Promise = promise;
 47177        OnComplete = complete;
 47178    }
 179}