using System; using JetBrains.Annotations; using Unity.Cloud.Collaborate.Assets; using Unity.Cloud.Collaborate.Models; using Unity.Cloud.Collaborate.Models.Enums; using Unity.Cloud.Collaborate.Views; using UnityEngine; using UnityEngine.Assertions; namespace Unity.Cloud.Collaborate.Presenters { internal class StartPresenter : IStartPresenter { [NotNull] readonly IStartView m_View; [NotNull] readonly IStartModel m_Model; bool m_IsStarted; public StartPresenter([NotNull] IStartView view, [NotNull] IStartModel model) { m_View = view; m_Model = model; } /// public void Start() { Assert.IsFalse(m_IsStarted, "The presenter has already been started."); m_IsStarted = true; m_Model.ProjectStatusChanged += OnProjectStatusChanged; m_Model.StateChanged += OnStateChanged; PopulateInitialData(); } /// public void Stop() { Assert.IsTrue(m_IsStarted, "The presenter has already been stopped."); m_IsStarted = false; m_Model.ProjectStatusChanged -= OnProjectStatusChanged; m_Model.StateChanged -= OnStateChanged; } /// /// Refresh state from the model. /// void OnStateChanged() { PopulateInitialData(); } /// /// Populate the view with the initial data from the model. /// void PopulateInitialData() { OnProjectStatusChanged(m_Model.ProjectStatus); } void OnProjectStatusChanged(ProjectStatus status) { switch (status) { case ProjectStatus.Offline: m_View.Text = StringAssets.projectStatusTitleOffline; m_View.ButtonText = string.Empty; m_View.SetButtonVisible(false); break; case ProjectStatus.Maintenance: m_View.Text = StringAssets.projectStatusTitleMaintenance; m_View.ButtonText = string.Empty; m_View.SetButtonVisible(false); break; case ProjectStatus.LoggedOut: m_View.Text = StringAssets.projectStatusTitleLoggedOut; m_View.ButtonText = StringAssets.projectStatusButtonLoggedOut; m_View.SetButtonVisible(true); break; case ProjectStatus.Unbound: m_View.Text = StringAssets.projectStatusTitleUnbound; m_View.ButtonText = StringAssets.projectStatusButtonUnbound; m_View.SetButtonVisible(true); break; case ProjectStatus.NoSeat: m_View.Text = StringAssets.projectStatusTitleNoSeat; m_View.ButtonText = StringAssets.projectStatusButtonNoSeat; m_View.SetButtonVisible(true); break; case ProjectStatus.Bound: m_View.Text = StringAssets.projectStatusTitleBound; m_View.ButtonText = StringAssets.projectStatusButtonBound; m_View.SetButtonVisible(true); break; case ProjectStatus.Loading: m_View.Text = StringAssets.projectStatusTitleLoading; m_View.ButtonText = string.Empty; m_View.SetButtonVisible(false); break; case ProjectStatus.Ready: m_View.Text = string.Empty; m_View.ButtonText = string.Empty; m_View.SetButtonVisible(false); break; default: throw new ArgumentOutOfRangeException(nameof(status), status, "Unexpected project status."); } } /// public void RequestStart() { var status = m_Model.ProjectStatus; switch (status) { case ProjectStatus.Unbound: m_Model.ShowServicePage(); break; case ProjectStatus.LoggedOut: m_Model.ShowLoginPage(); break; case ProjectStatus.NoSeat: m_Model.ShowNoSeatPage(); break; case ProjectStatus.Bound: // Turn on collab Service. This is where we do a Genesis request apparently. m_Model.RequestTurnOnService(); break; default: throw new ArgumentOutOfRangeException(nameof(status), status, "Unexpected project status."); } } } }