|
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>
|
@@ -584,6 +625,71 @@ public static bool Initialize()
|
584 | 625 | return s_Initialized;
|
585 | 626 | }
|
586 | 627 |
|
| 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 | + |
587 | 693 | /// <summary>
|
588 | 694 | /// Creates a notification channel that notifications can be posted to.
|
589 | 695 | /// Notification channel settings can be changed by users on devices running Android 8.0 and above.
|
|
0 commit comments