diff --git a/DeviceTests/DeviceTests.Android/Properties/AndroidManifest.xml b/DeviceTests/DeviceTests.Android/Properties/AndroidManifest.xml index 4bd8ad2f1..3f283ab6b 100644 --- a/DeviceTests/DeviceTests.Android/Properties/AndroidManifest.xml +++ b/DeviceTests/DeviceTests.Android/Properties/AndroidManifest.xml @@ -9,5 +9,6 @@ + - \ No newline at end of file + diff --git a/Samples/Samples.Android/Properties/AndroidManifest.xml b/Samples/Samples.Android/Properties/AndroidManifest.xml index 1f6679d75..0e11c2994 100644 --- a/Samples/Samples.Android/Properties/AndroidManifest.xml +++ b/Samples/Samples.Android/Properties/AndroidManifest.xml @@ -1,22 +1,17 @@  - - - - - - - - - - - - - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Samples/Samples/View/ConnectivityPage.xaml b/Samples/Samples/View/ConnectivityPage.xaml index e4a87eaf5..317978cce 100644 --- a/Samples/Samples/View/ConnectivityPage.xaml +++ b/Samples/Samples/View/ConnectivityPage.xaml @@ -15,6 +15,7 @@ diff --git a/Samples/Samples/ViewModel/ConnectivityViewModel.cs b/Samples/Samples/ViewModel/ConnectivityViewModel.cs index d67492af6..a0262b094 100644 --- a/Samples/Samples/ViewModel/ConnectivityViewModel.cs +++ b/Samples/Samples/ViewModel/ConnectivityViewModel.cs @@ -4,23 +4,13 @@ namespace Samples.ViewModel { public class ConnectivityViewModel : BaseViewModel { - public ConnectivityViewModel() - { - } - public string NetworkAccess => Connectivity.NetworkAccess.ToString(); + + public string SignalStrength => Connectivity.WifiSignalStrength.ToString(); - public string ConnectionProfiles - { - get - { - var profiles = string.Empty; - foreach (var p in Connectivity.ConnectionProfiles) - profiles += "\n" + p.ToString(); - return profiles; - } - } + public string Profiles => + string.Join("\n", Connectivity.ConnectionProfiles); public override void OnAppearing() { @@ -40,6 +30,7 @@ void OnConnectivityChanged(object sender, ConnectivityChangedEventArgs e) { OnPropertyChanged(nameof(ConnectionProfiles)); OnPropertyChanged(nameof(NetworkAccess)); + OnPropertyChanged(nameof(SignalStrength)); } } } diff --git a/Xamarin.Essentials/Connectivity/Connectivity.android.cs b/Xamarin.Essentials/Connectivity/Connectivity.android.cs index a90476ae0..cd4317bd0 100644 --- a/Xamarin.Essentials/Connectivity/Connectivity.android.cs +++ b/Xamarin.Essentials/Connectivity/Connectivity.android.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Android.Content; using Android.Net; +using Android.Net.Wifi; using Android.OS; using Debug = System.Diagnostics.Debug; @@ -21,6 +22,43 @@ static void StartListeners() Platform.AppContext.RegisterReceiver(conectivityReceiver, new IntentFilter(ConnectivityManager.ConnectivityAction)); } + static SignalStrength PlatformSignalStrength() + { + Permissions.EnsureDeclared(PermissionType.WifiState); + try + { + var wifiManager = Platform.WifiManager; + if (wifiManager == null) + return SignalStrength.Unknown; + + var info = wifiManager.ConnectionInfo; + if (info == null) + return SignalStrength.None; + + var signalLevel = WifiManager.CalculateSignalLevel(info.Rssi, 5); // range 0 -> n-1 + switch (signalLevel) + { + case 0: + return SignalStrength.None; + case 1: + return SignalStrength.Weak; + case 2: + case 3: + return SignalStrength.Fair; + case 4: + return SignalStrength.Strong; + default: + Debug.WriteLine($"Invalid signal strength encountered: {signalLevel}"); + return SignalStrength.Unknown; + } + } + catch (Exception e) + { + Debug.WriteLine("Unable to get signal strength - do you have ACCESS_WIFI_STATE permission? - error: {0}", e); + return SignalStrength.Unknown; + } + } + static void StopListeners() { if (conectivityReceiver == null) diff --git a/Xamarin.Essentials/Connectivity/Connectivity.ios.cs b/Xamarin.Essentials/Connectivity/Connectivity.ios.cs index 7996ebe27..1ccd00f57 100644 --- a/Xamarin.Essentials/Connectivity/Connectivity.ios.cs +++ b/Xamarin.Essentials/Connectivity/Connectivity.ios.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using NetworkExtension; namespace Xamarin.Essentials { @@ -13,6 +14,26 @@ static void StartListeners() listener.ReachabilityChanged += OnConnectivityChanged; } + static SignalStrength PlatformSignalStrength() + { + var doubleSignalStrength = new NEHotspotNetwork().SignalStrength; + if (doubleSignalStrength < 0.01d) + return SignalStrength.None; + var signalstrength = (int)Math.Round(doubleSignalStrength * 3); + switch (signalstrength) + { + case 0: + case 1: + return SignalStrength.Weak; + case 2: + return SignalStrength.Fair; + case 3: + return SignalStrength.Strong; + default: + return SignalStrength.Unknown; + } + } + static void StopListeners() { if (listener == null) diff --git a/Xamarin.Essentials/Connectivity/Connectivity.netstandard.cs b/Xamarin.Essentials/Connectivity/Connectivity.netstandard.cs index b59f13942..c22cd35bd 100644 --- a/Xamarin.Essentials/Connectivity/Connectivity.netstandard.cs +++ b/Xamarin.Essentials/Connectivity/Connectivity.netstandard.cs @@ -7,7 +7,11 @@ public static partial class Connectivity static NetworkAccess PlatformNetworkAccess => throw new NotImplementedInReferenceAssemblyException(); + static SignalStrength PlatformSignalStrength() => + throw new NotImplementedInReferenceAssemblyException(); + static IEnumerable PlatformConnectionProfiles => + throw new NotImplementedInReferenceAssemblyException(); static void StartListeners() => diff --git a/Xamarin.Essentials/Connectivity/Connectivity.shared.cs b/Xamarin.Essentials/Connectivity/Connectivity.shared.cs index 73b79f589..2c3532c85 100644 --- a/Xamarin.Essentials/Connectivity/Connectivity.shared.cs +++ b/Xamarin.Essentials/Connectivity/Connectivity.shared.cs @@ -9,12 +9,14 @@ public static partial class Connectivity static event EventHandler ConnectivityChangedInternal; // a cache so that events aren't fired unnecessarily - // this is mainly an issue on Android, but we can stiil do this everywhere + // this is mainly an issue on Android, but we can still do this everywhere static NetworkAccess currentAccess; static List currentProfiles; public static NetworkAccess NetworkAccess => PlatformNetworkAccess; + public static SignalStrength WifiSignalStrength => PlatformSignalStrength(); + public static IEnumerable ConnectionProfiles => PlatformConnectionProfiles; public static event EventHandler ConnectivityChanged @@ -65,6 +67,15 @@ static void OnConnectivityChanged(ConnectivityChangedEventArgs e) } } + public enum SignalStrength + { + Unknown = 0, + None = 1, + Weak = 2, + Fair = 3, + Strong = 4 + } + public class ConnectivityChangedEventArgs : EventArgs { public ConnectivityChangedEventArgs(NetworkAccess access, IEnumerable connectionProfiles) diff --git a/Xamarin.Essentials/Connectivity/Connectivity.uwp.cs b/Xamarin.Essentials/Connectivity/Connectivity.uwp.cs index 4518f7cbf..beb949590 100644 --- a/Xamarin.Essentials/Connectivity/Connectivity.uwp.cs +++ b/Xamarin.Essentials/Connectivity/Connectivity.uwp.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; +using System.Diagnostics; using System.Linq; +using Windows.Devices.WiFi; using Windows.Networking.Connectivity; namespace Xamarin.Essentials @@ -15,6 +17,36 @@ static void NetworkStatusChanged(object sender) => static void StopListeners() => NetworkInformation.NetworkStatusChanged -= NetworkStatusChanged; + static SignalStrength PlatformSignalStrength() + { + var signalStrength = NetworkInformation.GetConnectionProfiles() + .Where(profile => profile != null && profile.IsWlanConnectionProfile) + .Select(profile => profile.GetSignalBars()) + .Where(signalBar => signalBar.HasValue) + .OrderBy(strength => strength) + .FirstOrDefault(); + + // Adding 1 to return value because 0 is Unknown and 1 is None. If we have a connection we receive at least 1 in return value + if (!signalStrength.HasValue) + return SignalStrength.Unknown; + switch (signalStrength.Value) + { + case 0: + return SignalStrength.None; + case 1: + return SignalStrength.Weak; + case 2: + case 3: + return SignalStrength.Fair; + case 4: + case 5: + return SignalStrength.Strong; + default: + Debug.WriteLine($"Invalid signal strength encountered: {signalStrength.Value}"); + return SignalStrength.Unknown; + } + } + static NetworkAccess PlatformNetworkAccess { get diff --git a/Xamarin.Essentials/Permissions/Permissions.android.cs b/Xamarin.Essentials/Permissions/Permissions.android.cs index db7759029..144ddc3f8 100644 --- a/Xamarin.Essentials/Permissions/Permissions.android.cs +++ b/Xamarin.Essentials/Permissions/Permissions.android.cs @@ -161,6 +161,9 @@ internal static IEnumerable ToAndroidPermissions(this PermissionType per case PermissionType.NetworkState: permissions.Add((Manifest.Permission.AccessNetworkState, false)); break; + case PermissionType.WifiState: + permissions.Add((Manifest.Permission.AccessWifiState, false)); + break; case PermissionType.Vibrate: permissions.Add((Manifest.Permission.Vibrate, true)); break; diff --git a/Xamarin.Essentials/Permissions/Permissions.shared.enums.cs b/Xamarin.Essentials/Permissions/Permissions.shared.enums.cs index c5cbb7b27..65f82ed1c 100644 --- a/Xamarin.Essentials/Permissions/Permissions.shared.enums.cs +++ b/Xamarin.Essentials/Permissions/Permissions.shared.enums.cs @@ -27,5 +27,6 @@ enum PermissionType LocationWhenInUse, NetworkState, Vibrate, + WifiState } } diff --git a/docs/en/FrameworksIndex/xamarin-essentials-android.xml b/docs/en/FrameworksIndex/xamarin-essentials-android.xml index 84bcbe587..ceaf6b9d0 100644 --- a/docs/en/FrameworksIndex/xamarin-essentials-android.xml +++ b/docs/en/FrameworksIndex/xamarin-essentials-android.xml @@ -129,6 +129,7 @@ + @@ -520,6 +521,13 @@ + + + + + + + diff --git a/docs/en/FrameworksIndex/xamarin-essentials-ios.xml b/docs/en/FrameworksIndex/xamarin-essentials-ios.xml index b5efc788a..09428f081 100644 --- a/docs/en/FrameworksIndex/xamarin-essentials-ios.xml +++ b/docs/en/FrameworksIndex/xamarin-essentials-ios.xml @@ -130,6 +130,7 @@ + @@ -519,6 +520,13 @@ + + + + + + + diff --git a/docs/en/FrameworksIndex/xamarin-essentials-uwp.xml b/docs/en/FrameworksIndex/xamarin-essentials-uwp.xml index 1f6e6e1a5..abc4eea82 100644 --- a/docs/en/FrameworksIndex/xamarin-essentials-uwp.xml +++ b/docs/en/FrameworksIndex/xamarin-essentials-uwp.xml @@ -129,6 +129,7 @@ + @@ -518,6 +519,13 @@ + + + + + + + diff --git a/docs/en/FrameworksIndex/xamarin-essentials.xml b/docs/en/FrameworksIndex/xamarin-essentials.xml index a9537af52..d9fa236bb 100644 --- a/docs/en/FrameworksIndex/xamarin-essentials.xml +++ b/docs/en/FrameworksIndex/xamarin-essentials.xml @@ -129,6 +129,7 @@ + @@ -515,6 +516,13 @@ + + + + + + + diff --git a/docs/en/Xamarin.Essentials/Connectivity.xml b/docs/en/Xamarin.Essentials/Connectivity.xml index 6e267c0fe..b45782b60 100644 --- a/docs/en/Xamarin.Essentials/Connectivity.xml +++ b/docs/en/Xamarin.Essentials/Connectivity.xml @@ -76,5 +76,22 @@ + + + + + Property + + Xamarin.Essentials + 1.0.0.0 + + + Xamarin.Essentials.SignalStrength + + + Wifi signal strength. + Unknown if signal strength was unable to be determined, None if no wifi signal is available. Otherwise a representation of signal strength. + + diff --git a/docs/en/Xamarin.Essentials/SignalStrength.xml b/docs/en/Xamarin.Essentials/SignalStrength.xml new file mode 100644 index 000000000..f662a81a2 --- /dev/null +++ b/docs/en/Xamarin.Essentials/SignalStrength.xml @@ -0,0 +1,102 @@ + + + + + + Xamarin.Essentials + 1.0.0.0 + + + System.Enum + + + Represents a signal strength if available or otherwise Unknown. + + + + + + + Field + + Xamarin.Essentials + 1.0.0.0 + + + Xamarin.Essentials.SignalStrength + + 3 + + Average signal strength. + + + + + + + Field + + Xamarin.Essentials + 1.0.0.0 + + + Xamarin.Essentials.SignalStrength + + 1 + + No signal present or available. + + + + + + + Field + + Xamarin.Essentials + 1.0.0.0 + + + Xamarin.Essentials.SignalStrength + + 4 + + Good signal strength. + + + + + + + Field + + Xamarin.Essentials + 1.0.0.0 + + + Xamarin.Essentials.SignalStrength + + 0 + + No information about wifi present or available. + + + + + + + Field + + Xamarin.Essentials + 1.0.0.0 + + + Xamarin.Essentials.SignalStrength + + 2 + + Weak signal strength. + + + + diff --git a/docs/en/index.xml b/docs/en/index.xml index 06f2bc697..5ed7f14b4 100644 --- a/docs/en/index.xml +++ b/docs/en/index.xml @@ -159,6 +159,7 @@ +