/
ApiManager.cs
113 lines (96 loc) · 3.57 KB
/
ApiManager.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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Acr.UserDialogs;
using Fusillade;
using Plugin.Connectivity;
using Plugin.Connectivity.Abstractions;
using Polly;
using Refit;
namespace RefitXFSample.Services
{
public class ApiManager : IApiManager
{
IUserDialogs _userDialogs = UserDialogs.Instance;
IConnectivity _connectivity = CrossConnectivity.Current;
IApiService<IMakeUpApi> makeUpApi;
public bool IsConnected { get; set; }
public bool IsReachable { get; set; }
Dictionary<int, CancellationTokenSource> runningTasks = new Dictionary<int, CancellationTokenSource>();
Dictionary<string, Task<HttpResponseMessage>> taskContainer = new Dictionary<string, Task<HttpResponseMessage>>();
public ApiManager(IApiService<IMakeUpApi> _makeUpApi)
{
makeUpApi = _makeUpApi;
IsConnected = _connectivity.IsConnected;
_connectivity.ConnectivityChanged += OnConnectivityChanged;
}
void OnConnectivityChanged(object sender, ConnectivityChangedEventArgs e)
{
IsConnected = e.IsConnected;
if (!e.IsConnected)
{
// Cancel All Running Task
var items = runningTasks.ToList();
foreach (var item in items)
{
item.Value.Cancel();
runningTasks.Remove(item.Key);
}
}
}
public async Task<HttpResponseMessage> GetMakeUps(string brand)
{
var cts = new CancellationTokenSource();
var task = RemoteRequestAsync<HttpResponseMessage>(makeUpApi.GetApi(Priority.UserInitiated).GetMakeUps(brand));
runningTasks.Add(task.Id, cts);
return await task;
}
protected async Task<TData> RemoteRequestAsync<TData>(Task<TData> task)
where TData : HttpResponseMessage,
new()
{
TData data = new TData();
if (!IsConnected)
{
var strngResponse = "There's not a network connection";
data.StatusCode = HttpStatusCode.BadRequest;
data.Content = new StringContent(strngResponse);
_userDialogs.Toast(strngResponse, TimeSpan.FromSeconds(1));
return data;
}
IsReachable = await _connectivity.IsRemoteReachable(Config.ApiHostName);
if (!IsReachable)
{
var strngResponse = "There's not an internet connection";
data.StatusCode = HttpStatusCode.BadRequest;
data.Content = new StringContent(strngResponse);
_userDialogs.Toast(strngResponse, TimeSpan.FromSeconds(1));
return data;
}
data = await Policy
.Handle<WebException>()
.Or<ApiException>()
.Or<TaskCanceledException>()
.WaitAndRetryAsync
(
retryCount: 1,
sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))
)
.ExecuteAsync(async () =>
{
var result = await task;
if (result.StatusCode == HttpStatusCode.Unauthorized)
{
//Logout the user
}
runningTasks.Remove(task.Id);
return result;
});
return data;
}
}
}