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 @@
+