public static void SetUser(UnityUser user, IUpdateDelegate updater, IProjectProvider client, PlayerStorage storage) // TODO Rename or move into a ProjectLister manager class
        {
            // ProjectLister
            s_ProjectListerSettings = new ProjectListerSettings();
            s_ProjectListerSettings.OnProjectsRefreshCompleted = new ProjectListerSettings.ProjectsEvents();
            s_ProjectListerSettings.OnProjectsRefreshStarted   = new UnityEvent();
            s_ProjectListerSettings.OnProjectsRefreshCompleted.AddListener((projects) =>
            {
                projectsRefreshCompleted?.Invoke(projects);
            });

            s_ProjectLister = new ProjectsLister(s_ProjectListerSettings)
            {
                client = client
            };
            s_ProjectLister.SetUpdateDelegate(updater);

            s_ProjectDeleterSettings = new ProjectDeleterSettings();
            s_ProjectDeleterSettings.projectLocalDataDeleted      += OnProjectLocalDataDeleted;
            s_ProjectDeleterSettings.projectDeleteCanceled        += OnProjectDeleteCanceled;
            s_ProjectDeleterSettings.projectDeleteProgressChanged += OnProjectDeleteProgressChanged;
            s_ProjectDeleter = new ProjectDeleter(s_ProjectDeleterSettings, storage)
            {
                client = client
            };
            s_ProjectDeleter.SetUpdateDelegate(updater);


            s_ProjectDownloaderSettings = new ProjectDownloaderSettings();
            s_ProjectDownloaderSettings.projectDataDownloaded          += OnProjectDataDownloaded;
            s_ProjectDownloaderSettings.projectDownloadCanceled        += OnProjectDownloadCanceled;
            s_ProjectDownloaderSettings.projectDownloadProgressChanged += OnProjectDownloadProgressChanged;
            s_ProjectDownloader = new ProjectDownloader(s_ProjectDownloaderSettings, updater, user, storage);
        }
        public ProjectDownloader(ProjectDownloaderSettings settings, IUpdateDelegate updateDelegate, UnityUser user, PlayerStorage playerStorage)
        {
            m_Settings       = settings;
            m_PlayerStorage  = playerStorage;
            m_UpdateDelegate = updateDelegate;
            m_User           = user;

            SetUpdateDelegate(updateDelegate);
        }
        public ReflectClient(IUpdateDelegate updateDelegate, UnityUser user, PlayerStorage storage, UnityProject project)
        {
            m_Project = project;
            m_User    = user;
            m_Storage = storage;

            InitializeProjectClientListener();

            updateDelegate.update += OnUpdate;
        }
        public static void Init(UnityUser user, IUpdateDelegate updater, IProjectProvider client) // TODO Rename or move into a ProjectLister manager class
        {
            if (s_ProjectLister != null || s_ProjectsManager != null)
            {
                Dispose();
            }

            // ProjectLister
            s_ProjectLister = new ProjectsLister(client);
            s_ProjectLister.projectListingCompleted += OnProjectListingCompleted;
            s_ProjectLister.projectListingException += OnProjectListingException;

            s_ProjectLister.SetUpdateDelegate(updater);

            s_ProjectsManager = new ProjectsManager(updater, user, Storage.main);
            s_ProjectsManager.projectStatusChanged           += OnProjectStatusChanged;
            s_ProjectsManager.projectDownloadProgressChanged += OnProjectDownloadProgressChanged;
            s_ProjectsManager.projectDeleteProgressChanged   += OnProjectDeleteProgressChanged;
        }
 public void UnregisterDelegate(IUpdateDelegate updateDelegate)
 {
     _delegates.Remove(updateDelegate);
 }
 public void RegisterDelegate(IUpdateDelegate updateDelegate)
 {
     _delegates.Add(updateDelegate);
 }
 public void RemoveUpdateDelegate(IUpdateDelegate value) => value.update -= Update;
 public void SetUpdateDelegate(IUpdateDelegate value) => value.update    += Update;