Skip to content

Commit

Permalink
Added support request Schedule Exact Alarm
Browse files Browse the repository at this point in the history
  • Loading branch information
thudugala committed Apr 14, 2024
1 parent e1fbd86 commit 642ce19
Show file tree
Hide file tree
Showing 9 changed files with 116 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<UseMaui>true</UseMaui>
<SingleProject>true</SingleProject>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Nullable>enable</Nullable>

<!-- Display name -->
<ApplicationTitle>LocalNotification.Sample</ApplicationTitle>
Expand Down Expand Up @@ -52,6 +52,7 @@
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
</ItemGroup>

<ItemGroup>
Expand Down
44 changes: 36 additions & 8 deletions Sample/Direct Maui/LocalNotification.Sample/MainPage.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
using Plugin.LocalNotification;
#if ANDROID
using Android.App;
using Android.Content;
#endif
using Microsoft.Maui.Controls.PlatformConfiguration;
using Plugin.LocalNotification;
using Plugin.LocalNotification.AndroidOption;
using Plugin.LocalNotification.EventArgs;
using System.Text;
Expand Down Expand Up @@ -174,17 +179,40 @@ private async void Button_Clicked(object sender, EventArgs e)

try
{
//var permissionRequest = new NotificationPermission
//{
// Android =
// {
// RequestPermissionToScheduleExactAlarm = true
// }
//};

//if (await _notificationService.AreNotificationsEnabled(permissionRequest) == false)
//{
// await _notificationService.RequestNotificationPermission(permissionRequest);
//}

if (await _notificationService.AreNotificationsEnabled() == false)
{
await _notificationService.RequestNotificationPermission(new NotificationPermission
{
Android =
{
RequestPermissionToScheduleExactAlarm = true
}
});
await _notificationService.RequestNotificationPermission();
}

//#if ANDROID

// var myAlarmManager = AlarmManager.FromContext(Android.App.Application.Context);
// var canScheduleExactAlarms = myAlarmManager?.CanScheduleExactAlarms() ?? false;

// if (!canScheduleExactAlarms)
// {
// var uri = Android.Net.Uri.Parse($"package:{Android.App.Application.Context.PackageName}");
// var intent = new Intent(Android.Provider.Settings.ActionRequestScheduleExactAlarm, uri);
// Android.App.Application.Context.StartActivity(intent);

// canScheduleExactAlarms = myAlarmManager?.CanScheduleExactAlarms() ?? false;
// }

//#endif

var ff = await _notificationService.Show(request);

//var sn = ToastNotificationManagerCompat.CreateToastNotifier().GetScheduledToastNotifications();
Expand Down
4 changes: 3 additions & 1 deletion Sample/Direct Maui/LocalNotification.Sample/MauiProgram.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,9 @@ public static MauiApp CreateMauiApp()


#if DEBUG
builder.Logging.AddDebug();
LocalNotificationCenter.LogLevel = LogLevel.Debug;
//builder.Logging.AddDebug();
builder.Logging.AddConsole();
#endif

builder.Services.AddTransient<MainPage>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,4 @@
[assembly: UsesPermission(Manifest.Permission.ReceiveBootCompleted)]
[assembly: UsesPermission(Manifest.Permission.Vibrate)]

[assembly: UsesPermission(Manifest.Permission.ScheduleExactAlarm)]
[assembly: UsesPermission(Manifest.Permission.PostNotifications)]
2 changes: 1 addition & 1 deletion Source/Plugin.LocalNotification/INotificationService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public interface INotificationService
/// Returns whether user as allowed Notifications
/// </summary>
/// <returns></returns>
Task<bool> AreNotificationsEnabled();
Task<bool> AreNotificationsEnabled(NotificationPermission? permission = null);

/// <summary>
/// Request Notification Permission
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -605,17 +605,7 @@ internal virtual async Task<bool> ShowNow(NotificationRequest request)

return true;
}

/// <inheritdoc />
public Task<bool> AreNotificationsEnabled()
{
return MyNotificationManager is null
? Task.FromResult(false)
: !OperatingSystem.IsAndroidVersionAtLeast(24)
? Task.FromResult(true)
: Task.FromResult(MyNotificationManager.AreNotificationsEnabled());
}


/// <summary>
///
/// </summary>
Expand Down Expand Up @@ -787,41 +777,87 @@ public void RegisterCategoryList(HashSet<NotificationCategory> categoryList)
}
}

private NotificationPermission _notificationPermission = new();

/// <inheritdoc />
public Task<bool> AreNotificationsEnabled(NotificationPermission? permission = null)
{
_notificationPermission = permission is not null ? permission : new NotificationPermission();

if (MyNotificationManager is null)
{
return Task.FromResult(false);
}

if(!OperatingSystem.IsAndroidVersionAtLeast(24))
{
return Task.FromResult(true);
}

if(!MyNotificationManager.AreNotificationsEnabled())
{
return Task.FromResult(false);
}

if (!OperatingSystem.IsAndroidVersionAtLeast(33))
{
return Task.FromResult(true);
}

if (_notificationPermission.Android.RequestPermissionToScheduleExactAlarm)
{
var canScheduleExactAlarms = MyAlarmManager?.CanScheduleExactAlarms() ?? false;

return Task.FromResult(canScheduleExactAlarms);
}

return Task.FromResult(true);
}

/// <inheritdoc />
public async Task<bool> RequestNotificationPermission(NotificationPermission? permission = null)
{
permission ??= new NotificationPermission();
_notificationPermission = permission is not null ? permission : new NotificationPermission();

var allowed = await AreNotificationsEnabled(_notificationPermission);
if (allowed)
{
return true;
}

if (!OperatingSystem.IsAndroidVersionAtLeast(33))
{
return false;
return true;
}

if (!permission.AskPermission)
if (!_notificationPermission.AskPermission)
{
return false;
}

var status = await Permissions.RequestAsync<NotificationPerms>();
if(status != PermissionStatus.Granted)
if (status != PermissionStatus.Granted)
{
return false;
}

if (!permission.Android.RequestPermissionToScheduleExactAlarm)
LocalNotificationCenter.Log($"Request Permission To Schedule Exact Alarm: {_notificationPermission.Android.RequestPermissionToScheduleExactAlarm}");

if (!_notificationPermission.Android.RequestPermissionToScheduleExactAlarm)
{
return true;
}

var canScheduleExactAlarms = MyAlarmManager?.CanScheduleExactAlarms() ?? false;

LocalNotificationCenter.Log($"Can Schedule Exact Alarms: {canScheduleExactAlarms}");

if (!canScheduleExactAlarms)
{
var uri = Android.Net.Uri.Parse($"package:{Application.Context.PackageName}");
var intent = new Intent(Android.Provider.Settings.ActionRequestScheduleExactAlarm, uri);
intent.AddFlags(ActivityFlags.NewTask);
Application.Context.StartActivity(intent);

canScheduleExactAlarms = MyAlarmManager?.CanScheduleExactAlarms() ?? false;
}

return canScheduleExactAlarms;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,6 @@ public NotificationServiceImpl()
_notifier = ToastNotificationManagerCompat.CreateToastNotifier();
}

public Task<bool> AreNotificationsEnabled()
{
return _notifier.Setting == NotificationSetting.Enabled ? Task.FromResult(true) : Task.FromResult(false);
}

public bool Cancel(params int[] notificationIdList)
{
var scheduledToasts = _notifier.GetScheduledToastNotifications();
Expand Down Expand Up @@ -154,6 +149,11 @@ public void RegisterCategoryList(HashSet<NotificationCategory> categoryList)
}
}

public Task<bool> AreNotificationsEnabled(NotificationPermission? permission = null)
{
return _notifier.Setting == NotificationSetting.Enabled ? Task.FromResult(true) : Task.FromResult(false);
}

public Task<bool> RequestNotificationPermission(NotificationPermission? permission = null)
{
return LocalNotificationCenter.RequestNotificationPermissionAsync(permission);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,13 +154,6 @@ await UNUserNotificationCenter.Current.AddNotificationRequestAsync(nativeRequest
}
}

/// <inheritdoc />
public async Task<bool> AreNotificationsEnabled()
{
var settings = await UNUserNotificationCenter.Current.GetNotificationSettingsAsync().ConfigureAwait(false);
return settings.AlertSetting == UNNotificationSetting.Enabled;
}

/// <summary>
///
/// </summary>
Expand Down Expand Up @@ -415,7 +408,14 @@ public async Task<IList<NotificationRequest>> GetDeliveredNotificationList()

return delivered.Select(r => LocalNotificationCenter.GetRequest(r.Request.Content) ?? new NotificationRequest()).ToList();
}


/// <inheritdoc />
public async Task<bool> AreNotificationsEnabled(NotificationPermission? permission = null)
{
var settings = await UNUserNotificationCenter.Current.GetNotificationSettingsAsync().ConfigureAwait(false);
return settings.AlertSetting == UNNotificationSetting.Enabled;
}

/// <inheritdoc />
public async Task<bool> RequestNotificationPermission(NotificationPermission? permission = null)
{
Expand All @@ -428,7 +428,7 @@ public async Task<bool> RequestNotificationPermission(NotificationPermission? pe
return false;
}

var allowed = await AreNotificationsEnabled();
var allowed = await AreNotificationsEnabled(permission);
if (allowed)
{
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
<CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies>

<Title>$(AssemblyName)</Title>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<Authors>Elvin (Tharindu) Thudugala</Authors>
<PackageTags>dotnet;android;ios;local;notification;local.notification;maui</PackageTags>
Expand Down Expand Up @@ -50,6 +49,10 @@
<TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
</ItemGroup>
Expand Down

0 comments on commit 642ce19

Please # to comment.