StartPresenter.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using System;
  2. using JetBrains.Annotations;
  3. using Unity.Cloud.Collaborate.Assets;
  4. using Unity.Cloud.Collaborate.Models;
  5. using Unity.Cloud.Collaborate.Models.Enums;
  6. using Unity.Cloud.Collaborate.Views;
  7. using UnityEngine;
  8. using UnityEngine.Assertions;
  9. namespace Unity.Cloud.Collaborate.Presenters
  10. {
  11. internal class StartPresenter : IStartPresenter
  12. {
  13. [NotNull]
  14. readonly IStartView m_View;
  15. [NotNull]
  16. readonly IStartModel m_Model;
  17. bool m_IsStarted;
  18. public StartPresenter([NotNull] IStartView view, [NotNull] IStartModel model)
  19. {
  20. m_View = view;
  21. m_Model = model;
  22. }
  23. /// <inheritdoc />
  24. public void Start()
  25. {
  26. Assert.IsFalse(m_IsStarted, "The presenter has already been started.");
  27. m_IsStarted = true;
  28. m_Model.ProjectStatusChanged += OnProjectStatusChanged;
  29. m_Model.StateChanged += OnStateChanged;
  30. PopulateInitialData();
  31. }
  32. /// <inheritdoc />
  33. public void Stop()
  34. {
  35. Assert.IsTrue(m_IsStarted, "The presenter has already been stopped.");
  36. m_IsStarted = false;
  37. m_Model.ProjectStatusChanged -= OnProjectStatusChanged;
  38. m_Model.StateChanged -= OnStateChanged;
  39. }
  40. /// <summary>
  41. /// Refresh state from the model.
  42. /// </summary>
  43. void OnStateChanged()
  44. {
  45. PopulateInitialData();
  46. }
  47. /// <summary>
  48. /// Populate the view with the initial data from the model.
  49. /// </summary>
  50. void PopulateInitialData()
  51. {
  52. OnProjectStatusChanged(m_Model.ProjectStatus);
  53. }
  54. void OnProjectStatusChanged(ProjectStatus status)
  55. {
  56. switch (status) {
  57. case ProjectStatus.Offline:
  58. m_View.Text = StringAssets.projectStatusTitleOffline;
  59. m_View.ButtonText = string.Empty;
  60. m_View.SetButtonVisible(false);
  61. break;
  62. case ProjectStatus.Maintenance:
  63. m_View.Text = StringAssets.projectStatusTitleMaintenance;
  64. m_View.ButtonText = string.Empty;
  65. m_View.SetButtonVisible(false);
  66. break;
  67. case ProjectStatus.LoggedOut:
  68. m_View.Text = StringAssets.projectStatusTitleLoggedOut;
  69. m_View.ButtonText = StringAssets.projectStatusButtonLoggedOut;
  70. m_View.SetButtonVisible(true);
  71. break;
  72. case ProjectStatus.Unbound:
  73. m_View.Text = StringAssets.projectStatusTitleUnbound;
  74. m_View.ButtonText = StringAssets.projectStatusButtonUnbound;
  75. m_View.SetButtonVisible(true);
  76. break;
  77. case ProjectStatus.NoSeat:
  78. m_View.Text = StringAssets.projectStatusTitleNoSeat;
  79. m_View.ButtonText = StringAssets.projectStatusButtonNoSeat;
  80. m_View.SetButtonVisible(true);
  81. break;
  82. case ProjectStatus.Bound:
  83. m_View.Text = StringAssets.projectStatusTitleBound;
  84. m_View.ButtonText = StringAssets.projectStatusButtonBound;
  85. m_View.SetButtonVisible(true);
  86. break;
  87. case ProjectStatus.Loading:
  88. m_View.Text = StringAssets.projectStatusTitleLoading;
  89. m_View.ButtonText = string.Empty;
  90. m_View.SetButtonVisible(false);
  91. break;
  92. case ProjectStatus.Ready:
  93. m_View.Text = string.Empty;
  94. m_View.ButtonText = string.Empty;
  95. m_View.SetButtonVisible(false);
  96. break;
  97. default:
  98. throw new ArgumentOutOfRangeException(nameof(status), status, "Unexpected project status.");
  99. }
  100. }
  101. /// <inheritdoc />
  102. public void RequestStart()
  103. {
  104. var status = m_Model.ProjectStatus;
  105. switch (status) {
  106. case ProjectStatus.Unbound:
  107. m_Model.ShowServicePage();
  108. break;
  109. case ProjectStatus.LoggedOut:
  110. m_Model.ShowLoginPage();
  111. break;
  112. case ProjectStatus.NoSeat:
  113. m_Model.ShowNoSeatPage();
  114. break;
  115. case ProjectStatus.Bound:
  116. // Turn on collab Service. This is where we do a Genesis request apparently.
  117. m_Model.RequestTurnOnService();
  118. break;
  119. default:
  120. throw new ArgumentOutOfRangeException(nameof(status), status, "Unexpected project status.");
  121. }
  122. }
  123. }
  124. }