-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathBaseAction.cs
156 lines (136 loc) · 4.71 KB
/
BaseAction.cs
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
using StreamDeckAzureDevOps.Models;
using StreamDeckAzureDevOps.Services;
using StreamDeckLib;
using StreamDeckLib.Messages;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace StreamDeckAzureDevOps
{
public abstract class BaseAction : BaseStreamDeckActionWithSettingsModel<Models.AzureDevOpsSettingsModel>
{
private CancellationTokenSource _backgroundTaskToken;
private DateTime _pressDownDateTime;
private int _currentUpdateFrequency;
protected double DoublePressDuration { get; set; } = 1;
public override async Task OnDidReceiveSettings(StreamDeckEventPayload args)
{
if (_currentUpdateFrequency != SettingsModel.UpdateStatusEverySecond)
{
_currentUpdateFrequency = SettingsModel.UpdateStatusEverySecond;
if ((StatusUpdateFrequency)_currentUpdateFrequency == StatusUpdateFrequency.Never)
{
StopBackgroundTask();
}
else
{
if (IsSettingsValid())
{
StartBackgroundTask(args);
}
}
}
await base.OnDidReceiveSettings(args);
}
public override Task OnKeyDown(StreamDeckEventPayload args)
{
_pressDownDateTime = DateTime.Now;
return base.OnKeyDown(args);
}
public override async Task OnKeyUp(StreamDeckEventPayload args)
{
try
{
DateTime now = DateTime.Now;
TimeSpan delta = now.Subtract(_pressDownDateTime);
if (delta.TotalSeconds > DoublePressDuration)
{
await OnLongPress(args);
}
else
{
await OnTap(args);
}
// Settings seems to be updated frequently when actions are performed.
await Manager.SetSettingsAsync(args.context, SettingsModel);
}
catch (Exception ex)
{
await OnError(args, ex);
}
}
public override async Task OnWillAppear(StreamDeckEventPayload args)
{
await base.OnWillAppear(args);
try
{
if (IsSettingsValid())
{
await UpdateDisplay(args);
}
if ((StatusUpdateFrequency)SettingsModel.UpdateStatusEverySecond != StatusUpdateFrequency.Never)
{
StartBackgroundTask(args);
}
}
catch (Exception ex)
{
await OnError(args, ex);
}
}
public override async Task OnWillDisappear(StreamDeckEventPayload args)
{
try
{
if (_backgroundTaskToken != null)
{
_backgroundTaskToken.Cancel();
_backgroundTaskToken = null;
}
}
catch (Exception ex)
{
await OnError(args, ex);
}
}
public abstract Task UpdateDisplay(StreamDeckEventPayload args);
public abstract Task OnTap(StreamDeckEventPayload args);
public abstract Task OnLongPress(StreamDeckEventPayload args);
public abstract Task OnError(StreamDeckEventPayload args, Exception ex);
public abstract bool IsSettingsValid();
public virtual Task MissingSettings(StreamDeckEventPayload args)
{
return Task.CompletedTask;
}
protected void StartBackgroundTask(StreamDeckEventPayload args)
{
_backgroundTaskToken?.Cancel();
_backgroundTaskToken = new CancellationTokenSource();
_ = Task.Run(() => BackgroundTask(args, _backgroundTaskToken.Token));
}
protected void StopBackgroundTask()
{
if (_backgroundTaskToken != null)
{
_backgroundTaskToken.Cancel();
_backgroundTaskToken = null;
}
}
private async Task BackgroundTask(StreamDeckEventPayload args, CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
// Cancellation exception is expected.
await Task.Delay(TimeSpan.FromSeconds(SettingsModel.GetUpdateFrequencyInSeconds()), ct);
try
{
await UpdateDisplay(args);
}
catch (Exception ex)
{
await OnError(args, ex);
}
}
}
}
}