Skip to content

Commit d9b1a18

Browse files
committed
Add APIs for Android 13 notifications permission
1 parent beee69b commit d9b1a18

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed

com.unity.mobile.notifications/Runtime/Android/AndroidNotificationCenter.cs

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Linq;
33
using System.Collections.Generic;
44
using UnityEngine;
5+
using UnityEngine.Android;
56

67
#if UNITY_2022_2_OR_NEWER
78
using JniMethodID = System.IntPtr;
@@ -13,6 +14,37 @@
1314

1415
namespace Unity.Notifications.Android
1516
{
17+
/// <summary>
18+
/// Represents a status of the Android runtime permission.
19+
/// </summary>
20+
public enum PermissionStatus
21+
{
22+
/// <summary>
23+
/// No permission as user was not prompted for it.
24+
/// </summary>
25+
NotRequested = 0,
26+
27+
/// <summary>
28+
/// User gave permission.
29+
/// </summary>
30+
Allowed = 1,
31+
32+
/// <summary>
33+
/// User denied permission.
34+
/// </summary>
35+
Denied = 2,
36+
37+
/// <summary>
38+
/// User denied permission and expressed intent to not be prompted again.
39+
/// </summary>
40+
DeniedDontAskAgain = 3,
41+
42+
/// <summary>
43+
/// A request for permission was made and user hasn't responded yet.
44+
/// </summary>
45+
RequestPending = 4,
46+
}
47+
1648
/// <summary>
1749
/// Current status of a scheduled notification, can be queried using CheckScheduledNotificationStatus.
1850
/// </summary>
@@ -535,6 +567,15 @@ public static JniMethodID FindMethod(AndroidJavaClass clazz, string name, string
535567
/// </summary>
536568
public class AndroidNotificationCenter
537569
{
570+
private static int API_POST_NOTIFICATIONS_PERMISSION_REQUIRED = 33;
571+
private static string PERMISSION_POST_NOTIFICATIONS = "android.permission.POST_NOTIFICATIONS";
572+
573+
/// <summary>
574+
/// A PlayerPrefs key used to save users reply to POST_NOTIFICATIONS request (integer value of the PermissionStatus).
575+
/// </summary>
576+
/// <see cref="PermissionStatus"/>
577+
public static string SETTING_POST_NOTIFICATIONS_PERMISSION = "com.unity.androidnotifications.PostNotificationsPermission";
578+
538579
/// <summary>
539580
/// The delegate type for the notification received callbacks.
540581
/// </summary>
@@ -584,6 +625,71 @@ public static bool Initialize()
584625
return s_Initialized;
585626
}
586627

628+
static void SetPostPermissionStting(PermissionStatus status)
629+
{
630+
PlayerPrefs.SetInt(SETTING_POST_NOTIFICATIONS_PERMISSION, (int)status);
631+
}
632+
633+
/// <summary>
634+
/// Has user given permission to post notifications.
635+
/// Before Android 13 (API 33) no permission is required.
636+
/// </summary>
637+
public static PermissionStatus UserPermissionToPost
638+
{
639+
get
640+
{
641+
if (!Initialize())
642+
return PermissionStatus.Denied;
643+
if (s_ApiLevel < API_POST_NOTIFICATIONS_PERMISSION_REQUIRED)
644+
return PermissionStatus.Allowed;
645+
646+
var permissionStatus = (PermissionStatus)PlayerPrefs.GetInt(SETTING_POST_NOTIFICATIONS_PERMISSION, (int)PermissionStatus.NotRequested);
647+
var allowed = Permission.HasUserAuthorizedPermission(PERMISSION_POST_NOTIFICATIONS);
648+
if (allowed)
649+
{
650+
if (permissionStatus != PermissionStatus.Allowed)
651+
SetPostPermissionStting(PermissionStatus.Allowed);
652+
return PermissionStatus.Allowed;
653+
}
654+
655+
switch (permissionStatus)
656+
{
657+
case PermissionStatus.NotRequested:
658+
break;
659+
case PermissionStatus.Allowed:
660+
permissionStatus = PermissionStatus.Denied;
661+
SetPostPermissionStting(permissionStatus);
662+
break;
663+
}
664+
665+
return permissionStatus;
666+
}
667+
}
668+
669+
/// <summary>
670+
/// Request user permission to post notifications.
671+
/// Before Android 13 (API 33) will allow immediately.
672+
/// May succeed or fail immediately. Users response is saved to PlayerPrefs.
673+
/// Respects users wish to not be asked again.
674+
/// </summary>
675+
/// <returns>PermissionStatus.RequestPending if user is prompted for permission or immediately known reply.</returns>
676+
/// <seealso cref="SETTING_POST_NOTIFICATIONS_PERMISSION"/>
677+
public static PermissionStatus RequestPermissionToPost()
678+
{
679+
var permissionStatus = UserPermissionToPost;
680+
if (permissionStatus == PermissionStatus.Allowed)
681+
return permissionStatus;
682+
if (permissionStatus == PermissionStatus.DeniedDontAskAgain)
683+
return permissionStatus;
684+
685+
var callbacks = new PermissionCallbacks();
686+
callbacks.PermissionGranted += (unused) => SetPostPermissionStting(PermissionStatus.Allowed);
687+
callbacks.PermissionDenied += (unused) => SetPostPermissionStting(PermissionStatus.Denied);
688+
callbacks.PermissionDeniedAndDontAskAgain += (unused) => SetPostPermissionStting(PermissionStatus.DeniedDontAskAgain);
689+
Permission.RequestUserPermission(PERMISSION_POST_NOTIFICATIONS, callbacks);
690+
return PermissionStatus.RequestPending;
691+
}
692+
587693
/// <summary>
588694
/// Creates a notification channel that notifications can be posted to.
589695
/// Notification channel settings can be changed by users on devices running Android 8.0 and above.

0 commit comments

Comments
 (0)