Skip to content
This repository was archived by the owner on May 15, 2024. It is now read-only.

GH-480: Implement Wifi signal strength #616

Merged
merged 25 commits into from
Dec 11, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:theme="@style/MainTheme"></application>
</manifest>
</manifest>
33 changes: 14 additions & 19 deletions Samples/Samples.Android/Properties/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.xamarin.essentials" android:installLocation="auto">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="27" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
<uses-feature android:name="android.hardware.location.network" android:required="false" />
<application android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/MainTheme"
android:fullBackupContent="@xml/my_backup_rules">

</application>
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="27" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
<uses-feature android:name="android.hardware.location.network" android:required="false" />
<application android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:theme="@style/MainTheme" android:fullBackupContent="@xml/my_backup_rules"></application>
</manifest>
1 change: 1 addition & 0 deletions Samples/Samples/View/ConnectivityPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<StackLayout Padding="12,6,12,12" Spacing="6">
<Label Text="Connectivity State:" FontAttributes="Bold" />
<Label Text="{Binding NetworkAccess, StringFormat='NetworkAccess: {0}'}" />
<Label Text="{Binding SignalStrength, StringFormat='Signal strength (for wifi): {0}'}" />
<Label Text="{Binding ConnectionProfiles, StringFormat='ConnectionProfiles: {0}'}" />
</StackLayout>
</ScrollView>
Expand Down
19 changes: 5 additions & 14 deletions Samples/Samples/ViewModel/ConnectivityViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
{
Expand All @@ -40,6 +30,7 @@ void OnConnectivityChanged(object sender, ConnectivityChangedEventArgs e)
{
OnPropertyChanged(nameof(ConnectionProfiles));
OnPropertyChanged(nameof(NetworkAccess));
OnPropertyChanged(nameof(SignalStrength));
}
}
}
38 changes: 38 additions & 0 deletions Xamarin.Essentials/Connectivity/Connectivity.android.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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)
Expand Down
21 changes: 21 additions & 0 deletions Xamarin.Essentials/Connectivity/Connectivity.ios.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using NetworkExtension;

namespace Xamarin.Essentials
{
Expand All @@ -13,6 +14,26 @@ static void StartListeners()
listener.ReachabilityChanged += OnConnectivityChanged;
}

static SignalStrength PlatformSignalStrength()
{
var doubleSignalStrength = new NEHotspotNetwork().SignalStrength;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This allocation. I think it should be OK, but maybe wrap it in a using to dispose sooner?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I was worried about this as well. I was unable to decide whether to take the permanent memory hit and just lazy initialize a static NEHotspotNetwork which just sticks around forever once SignalStrength is used or allocate a new object on every call. This probably depends on the usage scenario as well, as if this were called in a rather tight loop or rather frequently would just add unnecessary memory pressure. If we decide to not cache the value we should definitely dispose the object ASAP to let i be destroyed on iOS.

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)
Expand Down
4 changes: 4 additions & 0 deletions Xamarin.Essentials/Connectivity/Connectivity.netstandard.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ public static partial class Connectivity
static NetworkAccess PlatformNetworkAccess =>
throw new NotImplementedInReferenceAssemblyException();

static SignalStrength PlatformSignalStrength() =>
throw new NotImplementedInReferenceAssemblyException();

static IEnumerable<ConnectionProfile> PlatformConnectionProfiles =>

throw new NotImplementedInReferenceAssemblyException();

static void StartListeners() =>
Expand Down
13 changes: 12 additions & 1 deletion Xamarin.Essentials/Connectivity/Connectivity.shared.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,14 @@ 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
// this is mainly an issue on Android, but we can still do this everywhere
static NetworkAccess currentAccess;
static List<ConnectionProfile> currentProfiles;

public static NetworkAccess NetworkAccess => PlatformNetworkAccess;

public static SignalStrength WifiSignalStrength => PlatformSignalStrength();

public static IEnumerable<ConnectionProfile> ConnectionProfiles => PlatformConnectionProfiles;

public static event EventHandler<ConnectivityChangedEventArgs> ConnectivityChanged
Expand Down Expand Up @@ -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<ConnectionProfile> connectionProfiles)
Expand Down
32 changes: 32 additions & 0 deletions Xamarin.Essentials/Connectivity/Connectivity.uwp.cs
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down
3 changes: 3 additions & 0 deletions Xamarin.Essentials/Permissions/Permissions.android.cs
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,9 @@ internal static IEnumerable<string> 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;
Expand Down
1 change: 1 addition & 0 deletions Xamarin.Essentials/Permissions/Permissions.shared.enums.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,6 @@ enum PermissionType
LocationWhenInUse,
NetworkState,
Vibrate,
WifiState
}
}
8 changes: 8 additions & 0 deletions docs/en/FrameworksIndex/xamarin-essentials-android.xml
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@
<Member Id="E:Xamarin.Essentials.Connectivity.ConnectivityChanged" />
<Member Id="P:Xamarin.Essentials.Connectivity.ConnectionProfiles" />
<Member Id="P:Xamarin.Essentials.Connectivity.NetworkAccess" />
<Member Id="P:Xamarin.Essentials.Connectivity.WifiSignalStrength" />
</Type>
<Type Name="Xamarin.Essentials.ConnectivityChangedEventArgs" Id="T:Xamarin.Essentials.ConnectivityChangedEventArgs">
<Member Id="M:Xamarin.Essentials.ConnectivityChangedEventArgs.#ctor(Xamarin.Essentials.NetworkAccess,System.Collections.Generic.IEnumerable{Xamarin.Essentials.ConnectionProfile})" />
Expand Down Expand Up @@ -520,6 +521,13 @@
<Member Id="P:Xamarin.Essentials.ShareTextRequest.Title" />
<Member Id="P:Xamarin.Essentials.ShareTextRequest.Uri" />
</Type>
<Type Name="Xamarin.Essentials.SignalStrength" Id="T:Xamarin.Essentials.SignalStrength">
<Member Id="F:Xamarin.Essentials.SignalStrength.Fair" />
<Member Id="F:Xamarin.Essentials.SignalStrength.None" />
<Member Id="F:Xamarin.Essentials.SignalStrength.Strong" />
<Member Id="F:Xamarin.Essentials.SignalStrength.Unknown" />
<Member Id="F:Xamarin.Essentials.SignalStrength.Weak" />
</Type>
<Type Name="Xamarin.Essentials.Sms" Id="T:Xamarin.Essentials.Sms">
<Member Id="M:Xamarin.Essentials.Sms.ComposeAsync" />
<Member Id="M:Xamarin.Essentials.Sms.ComposeAsync(Xamarin.Essentials.SmsMessage)" />
Expand Down
8 changes: 8 additions & 0 deletions docs/en/FrameworksIndex/xamarin-essentials-ios.xml
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@
<Member Id="E:Xamarin.Essentials.Connectivity.ConnectivityChanged" />
<Member Id="P:Xamarin.Essentials.Connectivity.ConnectionProfiles" />
<Member Id="P:Xamarin.Essentials.Connectivity.NetworkAccess" />
<Member Id="P:Xamarin.Essentials.Connectivity.WifiSignalStrength" />
</Type>
<Type Name="Xamarin.Essentials.ConnectivityChangedEventArgs" Id="T:Xamarin.Essentials.ConnectivityChangedEventArgs">
<Member Id="M:Xamarin.Essentials.ConnectivityChangedEventArgs.#ctor(Xamarin.Essentials.NetworkAccess,System.Collections.Generic.IEnumerable{Xamarin.Essentials.ConnectionProfile})" />
Expand Down Expand Up @@ -519,6 +520,13 @@
<Member Id="P:Xamarin.Essentials.ShareTextRequest.Title" />
<Member Id="P:Xamarin.Essentials.ShareTextRequest.Uri" />
</Type>
<Type Name="Xamarin.Essentials.SignalStrength" Id="T:Xamarin.Essentials.SignalStrength">
<Member Id="F:Xamarin.Essentials.SignalStrength.Fair" />
<Member Id="F:Xamarin.Essentials.SignalStrength.None" />
<Member Id="F:Xamarin.Essentials.SignalStrength.Strong" />
<Member Id="F:Xamarin.Essentials.SignalStrength.Unknown" />
<Member Id="F:Xamarin.Essentials.SignalStrength.Weak" />
</Type>
<Type Name="Xamarin.Essentials.Sms" Id="T:Xamarin.Essentials.Sms">
<Member Id="M:Xamarin.Essentials.Sms.ComposeAsync" />
<Member Id="M:Xamarin.Essentials.Sms.ComposeAsync(Xamarin.Essentials.SmsMessage)" />
Expand Down
8 changes: 8 additions & 0 deletions docs/en/FrameworksIndex/xamarin-essentials-uwp.xml
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@
<Member Id="E:Xamarin.Essentials.Connectivity.ConnectivityChanged" />
<Member Id="P:Xamarin.Essentials.Connectivity.ConnectionProfiles" />
<Member Id="P:Xamarin.Essentials.Connectivity.NetworkAccess" />
<Member Id="P:Xamarin.Essentials.Connectivity.WifiSignalStrength" />
</Type>
<Type Name="Xamarin.Essentials.ConnectivityChangedEventArgs" Id="T:Xamarin.Essentials.ConnectivityChangedEventArgs">
<Member Id="M:Xamarin.Essentials.ConnectivityChangedEventArgs.#ctor(Xamarin.Essentials.NetworkAccess,System.Collections.Generic.IEnumerable{Xamarin.Essentials.ConnectionProfile})" />
Expand Down Expand Up @@ -518,6 +519,13 @@
<Member Id="P:Xamarin.Essentials.ShareTextRequest.Title" />
<Member Id="P:Xamarin.Essentials.ShareTextRequest.Uri" />
</Type>
<Type Name="Xamarin.Essentials.SignalStrength" Id="T:Xamarin.Essentials.SignalStrength">
<Member Id="F:Xamarin.Essentials.SignalStrength.Fair" />
<Member Id="F:Xamarin.Essentials.SignalStrength.None" />
<Member Id="F:Xamarin.Essentials.SignalStrength.Strong" />
<Member Id="F:Xamarin.Essentials.SignalStrength.Unknown" />
<Member Id="F:Xamarin.Essentials.SignalStrength.Weak" />
</Type>
<Type Name="Xamarin.Essentials.Sms" Id="T:Xamarin.Essentials.Sms">
<Member Id="M:Xamarin.Essentials.Sms.ComposeAsync" />
<Member Id="M:Xamarin.Essentials.Sms.ComposeAsync(Xamarin.Essentials.SmsMessage)" />
Expand Down
8 changes: 8 additions & 0 deletions docs/en/FrameworksIndex/xamarin-essentials.xml
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@
<Member Id="E:Xamarin.Essentials.Connectivity.ConnectivityChanged" />
<Member Id="P:Xamarin.Essentials.Connectivity.ConnectionProfiles" />
<Member Id="P:Xamarin.Essentials.Connectivity.NetworkAccess" />
<Member Id="P:Xamarin.Essentials.Connectivity.WifiSignalStrength" />
</Type>
<Type Name="Xamarin.Essentials.ConnectivityChangedEventArgs" Id="T:Xamarin.Essentials.ConnectivityChangedEventArgs">
<Member Id="M:Xamarin.Essentials.ConnectivityChangedEventArgs.#ctor(Xamarin.Essentials.NetworkAccess,System.Collections.Generic.IEnumerable{Xamarin.Essentials.ConnectionProfile})" />
Expand Down Expand Up @@ -515,6 +516,13 @@
<Member Id="P:Xamarin.Essentials.ShareTextRequest.Title" />
<Member Id="P:Xamarin.Essentials.ShareTextRequest.Uri" />
</Type>
<Type Name="Xamarin.Essentials.SignalStrength" Id="T:Xamarin.Essentials.SignalStrength">
<Member Id="F:Xamarin.Essentials.SignalStrength.Fair" />
<Member Id="F:Xamarin.Essentials.SignalStrength.None" />
<Member Id="F:Xamarin.Essentials.SignalStrength.Strong" />
<Member Id="F:Xamarin.Essentials.SignalStrength.Unknown" />
<Member Id="F:Xamarin.Essentials.SignalStrength.Weak" />
</Type>
<Type Name="Xamarin.Essentials.Sms" Id="T:Xamarin.Essentials.Sms">
<Member Id="M:Xamarin.Essentials.Sms.ComposeAsync" />
<Member Id="M:Xamarin.Essentials.Sms.ComposeAsync(Xamarin.Essentials.SmsMessage)" />
Expand Down
17 changes: 17 additions & 0 deletions docs/en/Xamarin.Essentials/Connectivity.xml
Original file line number Diff line number Diff line change
Expand Up @@ -76,5 +76,22 @@
</remarks>
</Docs>
</Member>
<Member MemberName="WifiSignalStrength">
<MemberSignature Language="C#" Value="public static Xamarin.Essentials.SignalStrength WifiSignalStrength { get; }" />
<MemberSignature Language="ILAsm" Value=".property valuetype Xamarin.Essentials.SignalStrength WifiSignalStrength" />
<MemberSignature Language="DocId" Value="P:Xamarin.Essentials.Connectivity.WifiSignalStrength" />
<MemberType>Property</MemberType>
<AssemblyInfo>
<AssemblyName>Xamarin.Essentials</AssemblyName>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
</AssemblyInfo>
<ReturnValue>
<ReturnType>Xamarin.Essentials.SignalStrength</ReturnType>
</ReturnValue>
<Docs>
<summary>Wifi signal strength.</summary>
<value>Unknown if signal strength was unable to be determined, None if no wifi signal is available. Otherwise a representation of signal strength.</value>
</Docs>
</Member>
</Members>
</Type>
Loading