Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Android Connectivity] Set app package on Intent used to invoke context receiver for network callback #20651

Merged
merged 2 commits into from
Feb 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 5 additions & 5 deletions src/Essentials/src/Battery/Battery.android.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ partial class BatteryImplementation : IBattery
void StartEnergySaverListeners()
{
powerReceiver = new EnergySaverBroadcastReceiver(OnEnergySaverChanged);
PlatformUtils.RegisterBroadcastReceiver(powerReceiver, new IntentFilter(PowerManager.ActionPowerSaveModeChanged), false);
PlatformUtils.RegisterBroadcastReceiver(powerReceiver, new IntentFilter(PowerManager.ActionPowerSaveModeChanged));
}

void StopEnergySaverListeners()
Expand Down Expand Up @@ -52,7 +52,7 @@ void StartBatteryListeners()
Permissions.EnsureDeclared<Permissions.Battery>();

batteryReceiver = new BatteryBroadcastReceiver(OnBatteryInfoChanged);
PlatformUtils.RegisterBroadcastReceiver(batteryReceiver, new IntentFilter(Intent.ActionBatteryChanged), false);
PlatformUtils.RegisterBroadcastReceiver(batteryReceiver, new IntentFilter(Intent.ActionBatteryChanged));
}

void StopBatteryListeners()
Expand All @@ -76,7 +76,7 @@ public double ChargeLevel
Permissions.EnsureDeclared<Permissions.Battery>();

using (var filter = new IntentFilter(Intent.ActionBatteryChanged))
using (var battery = PlatformUtils.RegisterBroadcastReceiver(null, filter, false))
using (var battery = PlatformUtils.RegisterBroadcastReceiver(null, filter))
{
if (battery is null)
return -1; // Unknown
Expand All @@ -99,7 +99,7 @@ public BatteryState State
Permissions.EnsureDeclared<Permissions.Battery>();

using (var filter = new IntentFilter(Intent.ActionBatteryChanged))
using (var battery = PlatformUtils.RegisterBroadcastReceiver(null, filter, false))
using (var battery = PlatformUtils.RegisterBroadcastReceiver(null, filter))
{
if (battery is null)
return BatteryState.Unknown;
Expand Down Expand Up @@ -129,7 +129,7 @@ public BatteryPowerSource PowerSource
Permissions.EnsureDeclared<Permissions.Battery>();

using (var filter = new IntentFilter(Intent.ActionBatteryChanged))
using (var battery = PlatformUtils.RegisterBroadcastReceiver(null, filter, false))
using (var battery = PlatformUtils.RegisterBroadcastReceiver(null, filter))
{
if (battery is null)
return BatteryPowerSource.Unknown;
Expand Down
51 changes: 48 additions & 3 deletions src/Essentials/src/Connectivity/Connectivity.android.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ partial class ConnectivityImplementation : IConnectivity
/// Unique identifier for the connectivity changed action on Android.
/// </summary>
public const string ConnectivityChangedAction = "com.maui.essentials.ESSENTIALS_CONNECTIVITY_CHANGED";
static Intent connectivityIntent = new Intent(ConnectivityChangedAction);


static ConnectivityManager connectivityManager;

static ConnectivityManager ConnectivityManager =>
Expand Down Expand Up @@ -45,13 +44,15 @@ void StartListeners()

conectivityReceiver = new ConnectivityBroadcastReceiver(OnConnectivityChanged);

PlatformUtils.RegisterBroadcastReceiver(conectivityReceiver, filter, true);
PlatformUtils.RegisterBroadcastReceiver(conectivityReceiver, filter);
}

void StopListeners()
{
if (conectivityReceiver == null)
{
return;
}

try
{
Expand All @@ -77,11 +78,15 @@ void StopListeners()
void RegisterNetworkCallback()
{
if (!OperatingSystem.IsAndroidVersionAtLeast(24))
{
return;
}

var manager = ConnectivityManager;
if (manager == null)
{
return;
}

var request = new NetworkRequest.Builder().Build();
networkCallback = new EssentialsNetworkCallback();
Expand All @@ -91,11 +96,15 @@ void RegisterNetworkCallback()
void UnregisterNetworkCallback()
{
if (!OperatingSystem.IsAndroidVersionAtLeast(24))
{
return;
}

var manager = ConnectivityManager;
if (manager == null || networkCallback == null)
{
return;
}

manager.UnregisterNetworkCallback(networkCallback);

Expand All @@ -104,6 +113,14 @@ void UnregisterNetworkCallback()

class EssentialsNetworkCallback : ConnectivityManager.NetworkCallback
{
readonly Intent connectivityIntent;

public EssentialsNetworkCallback()
{
connectivityIntent = new Intent(ConnectivityChangedAction);
connectivityIntent.SetPackage(Application.Context.PackageName);
}

public override void OnAvailable(Network network) =>
Application.Context.SendBroadcast(connectivityIntent);

Expand Down Expand Up @@ -159,15 +176,19 @@ public NetworkAccess NetworkAccess
var capabilities = manager.GetNetworkCapabilities(network);

if (capabilities == null)
{
continue;
}

#pragma warning disable CS0618 // Type or member is obsolete
#pragma warning disable CA1416 // Validate platform compatibility
#pragma warning disable CA1422 // Validate platform compatibility
var info = manager.GetNetworkInfo(network);

if (info == null || !info.IsAvailable)
{
continue;
}
#pragma warning restore CS0618 // Type or member is obsolete

// Check to see if it has the internet capability
Expand Down Expand Up @@ -200,12 +221,18 @@ void ProcessAllNetworkInfo()
void ProcessNetworkInfo(NetworkInfo info)
{
if (info == null || !info.IsAvailable)
{
return;
}

if (info.IsConnected)
{
currentAccess = IsBetterAccess(currentAccess, NetworkAccess.Internet);
}
else if (info.IsConnectedOrConnecting)
{
currentAccess = IsBetterAccess(currentAccess, NetworkAccess.ConstrainedInternet);
}
#pragma warning restore CA1422 // Validate platform compatibility
#pragma warning restore CA1416 // Validate platform compatibility
#pragma warning restore CS0618 // Type or member is obsolete
Expand Down Expand Up @@ -250,15 +277,19 @@ public IEnumerable<ConnectionProfile> ConnectionProfiles

var p = ProcessNetworkInfo(info);
if (p.HasValue)
{
yield return p.Value;
}
}

#pragma warning disable CS0618 // Type or member is obsolete
static ConnectionProfile? ProcessNetworkInfo(NetworkInfo info)
{

if (info == null || !info.IsAvailable || !info.IsConnectedOrConnecting)
{
return null;
}


return GetConnectionType(info.Type, info.TypeName);
Expand Down Expand Up @@ -289,22 +320,34 @@ internal static ConnectionProfile GetConnectionType(ConnectivityType connectivit
return ConnectionProfile.Unknown;
default:
if (string.IsNullOrWhiteSpace(typeName))
{
return ConnectionProfile.Unknown;
}

if (typeName.Contains("mobile", StringComparison.OrdinalIgnoreCase))
{
return ConnectionProfile.Cellular;
}

if (typeName.Contains("wimax", StringComparison.OrdinalIgnoreCase))
{
return ConnectionProfile.Cellular;
}

if (typeName.Contains("wifi", StringComparison.OrdinalIgnoreCase))
{
return ConnectionProfile.WiFi;
}

if (typeName.Contains("ethernet", StringComparison.OrdinalIgnoreCase))
{
return ConnectionProfile.Ethernet;
}

if (typeName.Contains("bluetooth", StringComparison.OrdinalIgnoreCase))
{
return ConnectionProfile.Bluetooth;
}

return ConnectionProfile.Unknown;
}
Expand Down Expand Up @@ -335,7 +378,9 @@ public override async void OnReceive(Context context, Intent intent)
#pragma warning disable CS0618 // Type or member is obsolete
if (intent.Action != ConnectivityManager.ConnectivityAction && intent.Action != ConnectivityImplementation.ConnectivityChangedAction)
#pragma warning restore CS0618 // Type or member is obsolete
{
return;
}

// await 1500ms to ensure that the the connection manager updates
await Task.Delay(1500);
Expand Down
5 changes: 2 additions & 3 deletions src/Essentials/src/Platform/PlatformUtils.android.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,12 @@ internal static int NextRequestCode()
return requestCode;
}

internal static Intent? RegisterBroadcastReceiver(BroadcastReceiver? receiver, IntentFilter filter, bool exported)
internal static Intent? RegisterBroadcastReceiver(BroadcastReceiver? receiver, IntentFilter filter)
{
#if ANDROID34_0_OR_GREATER
if (OperatingSystem.IsAndroidVersionAtLeast(34))
{
var flags = exported ? ReceiverFlags.Exported : ReceiverFlags.NotExported;
return Application.Context.RegisterReceiver(receiver, filter, flags);
return Application.Context.RegisterReceiver(receiver, filter, ReceiverFlags.NotExported);
}
#endif
return Application.Context.RegisterReceiver(receiver, filter);
Expand Down
Loading