2
2
using System . Linq ;
3
3
using System . Collections . Generic ;
4
4
using UnityEngine ;
5
+ using UnityEngine . Android ;
5
6
6
7
#if UNITY_2022_2_OR_NEWER
7
8
using JniMethodID = System . IntPtr ;
13
14
14
15
namespace Unity . Notifications . Android
15
16
{
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
+
16
48
/// <summary>
17
49
/// Current status of a scheduled notification, can be queried using CheckScheduledNotificationStatus.
18
50
/// </summary>
@@ -535,6 +567,15 @@ public static JniMethodID FindMethod(AndroidJavaClass clazz, string name, string
535
567
/// </summary>
536
568
public class AndroidNotificationCenter
537
569
{
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
+
538
579
/// <summary>
539
580
/// The delegate type for the notification received callbacks.
540
581
/// </summary>
@@ -547,6 +588,8 @@ public class AndroidNotificationCenter
547
588
548
589
private static AndroidJavaObject s_CurrentActivity ;
549
590
private static JniApi s_Jni ;
591
+ private static int s_DeviceApiLevel ;
592
+ private static int s_TargetApiLevel ;
550
593
private static bool s_Initialized = false ;
551
594
552
595
/// <summary>
@@ -575,11 +618,86 @@ public static bool Initialize()
575
618
var notificationManager = notificationManagerClass . CallStatic < AndroidJavaObject > ( "getNotificationManagerImpl" , s_CurrentActivity , new NotificationCallback ( ) ) ;
576
619
s_Jni = new JniApi ( notificationManagerClass , notificationManager ) ;
577
620
621
+ using ( var version = new AndroidJavaClass ( "android/os/Build$VERSION" ) )
622
+ s_DeviceApiLevel = version . GetStatic < int > ( "SDK_INT" ) ;
623
+ s_TargetApiLevel = notificationManager . Call < int > ( "getTargetSdk" ) ;
624
+
578
625
s_Initialized = true ;
579
626
#endif
580
627
return s_Initialized ;
581
628
}
582
629
630
+ static void SetPostPermissionStting ( PermissionStatus status )
631
+ {
632
+ PlayerPrefs . SetInt ( SETTING_POST_NOTIFICATIONS_PERMISSION , ( int ) status ) ;
633
+ }
634
+
635
+ /// <summary>
636
+ /// Has user given permission to post notifications.
637
+ /// Before Android 13 (API 33) no permission is required.
638
+ /// </summary>
639
+ public static PermissionStatus UserPermissionToPost
640
+ {
641
+ get
642
+ {
643
+ if ( ! Initialize ( ) )
644
+ return PermissionStatus . Denied ;
645
+ if ( s_DeviceApiLevel < API_POST_NOTIFICATIONS_PERMISSION_REQUIRED )
646
+ return PermissionStatus . Allowed ;
647
+
648
+ var permissionStatus = ( PermissionStatus ) PlayerPrefs . GetInt ( SETTING_POST_NOTIFICATIONS_PERMISSION , ( int ) PermissionStatus . NotRequested ) ;
649
+ var allowed = Permission . HasUserAuthorizedPermission ( PERMISSION_POST_NOTIFICATIONS ) ;
650
+ if ( allowed )
651
+ {
652
+ if ( permissionStatus != PermissionStatus . Allowed )
653
+ SetPostPermissionStting ( PermissionStatus . Allowed ) ;
654
+ return PermissionStatus . Allowed ;
655
+ }
656
+
657
+ switch ( permissionStatus )
658
+ {
659
+ case PermissionStatus . NotRequested :
660
+ break ;
661
+ case PermissionStatus . Allowed :
662
+ permissionStatus = PermissionStatus . Denied ;
663
+ SetPostPermissionStting ( permissionStatus ) ;
664
+ break ;
665
+ }
666
+
667
+ return permissionStatus ;
668
+ }
669
+ }
670
+
671
+ /// <summary>
672
+ /// Request user permission to post notifications.
673
+ /// Before Android 13 (API 33) will allow immediately.
674
+ /// May succeed or fail immediately. Users response is saved to PlayerPrefs.
675
+ /// Respects users wish to not be asked again.
676
+ /// </summary>
677
+ /// <returns>PermissionStatus.RequestPending if user is prompted for permission or immediately known reply.</returns>
678
+ /// <seealso cref="SETTING_POST_NOTIFICATIONS_PERMISSION"/>
679
+ public static PermissionStatus RequestPermissionToPost ( )
680
+ {
681
+ var permissionStatus = UserPermissionToPost ;
682
+ if ( permissionStatus == PermissionStatus . Allowed )
683
+ return permissionStatus ;
684
+ if ( permissionStatus == PermissionStatus . DeniedDontAskAgain )
685
+ return permissionStatus ;
686
+ // Can only request permission if applications target SDK is 33, not actual device SDK
687
+ if ( s_TargetApiLevel < API_POST_NOTIFICATIONS_PERMISSION_REQUIRED )
688
+ {
689
+ SetPostPermissionStting ( PermissionStatus . DeniedDontAskAgain ) ;
690
+ return PermissionStatus . DeniedDontAskAgain ;
691
+ }
692
+
693
+ var callbacks = new PermissionCallbacks ( ) ;
694
+ callbacks . PermissionGranted += ( unused ) => SetPostPermissionStting ( PermissionStatus . Allowed ) ;
695
+ callbacks . PermissionDenied += ( unused ) => SetPostPermissionStting ( PermissionStatus . Denied ) ;
696
+ callbacks . PermissionDeniedAndDontAskAgain += ( unused ) => SetPostPermissionStting ( PermissionStatus . DeniedDontAskAgain ) ;
697
+ Permission . RequestUserPermission ( PERMISSION_POST_NOTIFICATIONS , callbacks ) ;
698
+ return PermissionStatus . RequestPending ;
699
+ }
700
+
583
701
/// <summary>
584
702
/// Creates a notification channel that notifications can be posted to.
585
703
/// Notification channel settings can be changed by users on devices running Android 8.0 and above.
0 commit comments