Skip to main content

mac_usernotifications/
settings.rs

1//! Types for querying the current notification authorization state.
2
3use objc2_user_notifications::{UNAuthorizationStatus, UNNotificationSetting};
4
5/// The app's authorization to post notifications.
6///
7/// Returned by [`get_notification_settings`] and [`blocking::get_notification_settings`].
8///
9/// [`get_notification_settings`]: crate::get_notification_settings
10/// [`blocking::get_notification_settings`]: crate::blocking::get_notification_settings
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12pub enum AuthorizationStatus {
13    /// The user has not made a choice yet.
14    NotDetermined,
15    /// The user denied permission.
16    Denied,
17    /// The user granted permission.
18    Authorized,
19    /// Provisional authorization (notifications delivered quietly).
20    Provisional,
21    /// Ephemeral authorization (granted by App Clips).
22    Ephemeral,
23    /// An unknown status code was returned by the OS.
24    Unknown,
25}
26
27impl From<UNAuthorizationStatus> for AuthorizationStatus {
28    fn from(status: UNAuthorizationStatus) -> Self {
29        match status {
30            UNAuthorizationStatus::NotDetermined => AuthorizationStatus::NotDetermined,
31            UNAuthorizationStatus::Denied => AuthorizationStatus::Denied,
32            UNAuthorizationStatus::Authorized => AuthorizationStatus::Authorized,
33            UNAuthorizationStatus::Provisional => AuthorizationStatus::Provisional,
34            UNAuthorizationStatus::Ephemeral => AuthorizationStatus::Ephemeral,
35            _ => AuthorizationStatus::Unknown,
36        }
37    }
38}
39
40/// Whether a specific notification feature is enabled.
41#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
42pub enum NotificationSettingStatus {
43    /// The feature is not supported on this device or OS version.
44    NotSupported,
45    /// The feature is disabled.
46    Disabled,
47    /// The feature is enabled.
48    Enabled,
49    /// An unknown status was returned.
50    Unknown,
51}
52
53impl From<UNNotificationSetting> for NotificationSettingStatus {
54    fn from(setting: UNNotificationSetting) -> Self {
55        match setting {
56            UNNotificationSetting::NotSupported => NotificationSettingStatus::NotSupported,
57            UNNotificationSetting::Disabled => NotificationSettingStatus::Disabled,
58            UNNotificationSetting::Enabled => NotificationSettingStatus::Enabled,
59            _ => NotificationSettingStatus::Unknown,
60        }
61    }
62}
63
64/// The current notification settings for the app.
65///
66/// Obtained via [`get_notification_settings`] or [`blocking::get_notification_settings`].
67///
68/// [`get_notification_settings`]: crate::get_notification_settings
69/// [`blocking::get_notification_settings`]: crate::blocking::get_notification_settings
70#[derive(Debug, Clone, Copy, PartialEq, Eq)]
71pub struct NotificationSettings {
72    /// Whether the app is authorized to post notifications.
73    pub authorization_status: AuthorizationStatus,
74    /// Whether alert notifications (banners) are enabled.
75    pub alert_enabled: NotificationSettingStatus,
76    /// Whether badge updates are enabled.
77    pub badge_enabled: NotificationSettingStatus,
78    /// Whether notification sounds are enabled.
79    pub sound_enabled: NotificationSettingStatus,
80    /// Whether notifications appear on the lock screen.
81    pub lock_screen_enabled: NotificationSettingStatus,
82    /// Whether notifications appear in Notification Center.
83    pub notification_center_enabled: NotificationSettingStatus,
84}