forked from xamarin/Essentials
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathConnectivity.shared.cs
84 lines (66 loc) · 2.83 KB
/
Connectivity.shared.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
using System;
using System.Collections.Generic;
using System.Linq;
namespace Xamarin.Essentials
{
public static partial class Connectivity
{
static event EventHandler<ConnectivityChangedEventArgs> ConnectivityChangedInternal;
// a cache so that events aren't fired unnecessarily
// this is mainly an issue on Android, but we can stiil do this everywhere
static NetworkAccess currentAccess;
static List<ConnectionProfile> currentProfiles;
public static NetworkAccess NetworkAccess => PlatformNetworkAccess;
public static IEnumerable<ConnectionProfile> ConnectionProfiles => PlatformConnectionProfiles;
public static event EventHandler<ConnectivityChangedEventArgs> ConnectivityChanged
{
add
{
var wasRunning = ConnectivityChangedInternal != null;
ConnectivityChangedInternal += value;
if (!wasRunning && ConnectivityChangedInternal != null)
{
SetCurrent();
StartListeners();
}
}
remove
{
var wasRunning = ConnectivityChangedInternal != null;
ConnectivityChangedInternal -= value;
if (wasRunning && ConnectivityChangedInternal == null)
StopListeners();
}
}
static void SetCurrent()
{
currentAccess = NetworkAccess;
currentProfiles = new List<ConnectionProfile>(ConnectionProfiles);
}
static void OnConnectivityChanged(NetworkAccess access, IEnumerable<ConnectionProfile> profiles)
=> OnConnectivityChanged(new ConnectivityChangedEventArgs(access, profiles));
static void OnConnectivityChanged()
=> OnConnectivityChanged(NetworkAccess, ConnectionProfiles);
static void OnConnectivityChanged(ConnectivityChangedEventArgs e)
{
if (currentAccess != e.NetworkAccess || !currentProfiles.SequenceEqual(e.ConnectionProfiles))
{
SetCurrent();
MainThread.BeginInvokeOnMainThread(() => ConnectivityChangedInternal?.Invoke(null, e));
}
}
}
public class ConnectivityChangedEventArgs : EventArgs
{
internal ConnectivityChangedEventArgs(NetworkAccess access, IEnumerable<ConnectionProfile> connectionProfiles)
{
NetworkAccess = access;
ConnectionProfiles = connectionProfiles;
}
public NetworkAccess NetworkAccess { get; }
public IEnumerable<ConnectionProfile> ConnectionProfiles { get; }
public override string ToString() =>
$"{nameof(NetworkAccess)}: {NetworkAccess}, " +
$"{nameof(ConnectionProfiles)}: [{string.Join(", ", ConnectionProfiles)}]";
}
}