StartPresenter.cs
4.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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;
}
/// <inheritdoc />
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();
}
/// <inheritdoc />
public void Stop()
{
Assert.IsTrue(m_IsStarted, "The presenter has already been stopped.");
m_IsStarted = false;
m_Model.ProjectStatusChanged -= OnProjectStatusChanged;
m_Model.StateChanged -= OnStateChanged;
}
/// <summary>
/// Refresh state from the model.
/// </summary>
void OnStateChanged()
{
PopulateInitialData();
}
/// <summary>
/// Populate the view with the initial data from the model.
/// </summary>
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.");
}
}
/// <inheritdoc />
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.");
}
}
}
}