2015-12-24 13:55:18 +00:00
|
|
|
// Copyright (c) 2015 GitHub, Inc.
|
|
|
|
// Use of this source code is governed by the MIT license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
2019-06-19 20:46:59 +00:00
|
|
|
#include "shell/browser/notifications/mac/notification_center_delegate.h"
|
2015-12-24 13:55:18 +00:00
|
|
|
|
2019-05-02 12:05:37 +00:00
|
|
|
#include <string>
|
|
|
|
|
2020-07-14 01:13:34 +00:00
|
|
|
#include "base/logging.h"
|
2019-06-19 20:46:59 +00:00
|
|
|
#include "shell/browser/notifications/mac/cocoa_notification.h"
|
|
|
|
#include "shell/browser/notifications/mac/notification_presenter_mac.h"
|
2015-12-24 13:55:18 +00:00
|
|
|
|
2024-08-02 14:02:11 +00:00
|
|
|
// NSUserNotification is deprecated; we need to use the
|
|
|
|
// UserNotifications.frameworks API instead
|
|
|
|
#pragma clang diagnostic push
|
|
|
|
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
|
|
|
2015-12-25 02:16:07 +00:00
|
|
|
@implementation NotificationCenterDelegate
|
|
|
|
|
2018-10-17 18:01:11 +00:00
|
|
|
- (instancetype)initWithPresenter:
|
|
|
|
(electron::NotificationPresenterMac*)presenter {
|
2015-12-25 02:16:07 +00:00
|
|
|
self = [super init];
|
|
|
|
if (!self)
|
|
|
|
return nil;
|
|
|
|
|
|
|
|
presenter_ = presenter;
|
|
|
|
return self;
|
|
|
|
}
|
2015-12-24 13:55:18 +00:00
|
|
|
|
|
|
|
- (void)userNotificationCenter:(NSUserNotificationCenter*)center
|
|
|
|
didDeliverNotification:(NSUserNotification*)notif {
|
2018-04-17 22:41:47 +00:00
|
|
|
auto* notification = presenter_->GetNotification(notif);
|
2017-05-30 09:06:51 +00:00
|
|
|
if (notification)
|
2016-04-15 07:14:13 +00:00
|
|
|
notification->NotificationDisplayed();
|
2015-12-24 13:55:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void)userNotificationCenter:(NSUserNotificationCenter*)center
|
2018-04-20 18:47:04 +00:00
|
|
|
didActivateNotification:(NSUserNotification*)notif {
|
2018-04-17 22:41:47 +00:00
|
|
|
auto* notification = presenter_->GetNotification(notif);
|
2017-12-13 18:31:59 +00:00
|
|
|
|
|
|
|
if (getenv("ELECTRON_DEBUG_NOTIFICATIONS")) {
|
2018-04-20 18:47:04 +00:00
|
|
|
LOG(INFO) << "Notification activated (" << [notif.identifier UTF8String]
|
|
|
|
<< ")";
|
2017-12-13 18:31:59 +00:00
|
|
|
}
|
|
|
|
|
2017-05-29 10:02:33 +00:00
|
|
|
if (notification) {
|
2018-04-20 18:47:04 +00:00
|
|
|
// Ref:
|
|
|
|
// https://developer.apple.com/documentation/foundation/nsusernotificationactivationtype?language=objc
|
|
|
|
if (notif.activationType ==
|
|
|
|
NSUserNotificationActivationTypeContentsClicked) {
|
2020-09-02 01:02:47 +00:00
|
|
|
notification->NotificationClicked();
|
2018-04-20 18:47:04 +00:00
|
|
|
} else if (notif.activationType ==
|
|
|
|
NSUserNotificationActivationTypeActionButtonClicked) {
|
2018-01-17 03:07:54 +00:00
|
|
|
notification->NotificationActivated();
|
2018-04-20 18:47:04 +00:00
|
|
|
} else if (notif.activationType ==
|
|
|
|
NSUserNotificationActivationTypeReplied) {
|
2018-01-16 04:50:03 +00:00
|
|
|
notification->NotificationReplied([notif.response.string UTF8String]);
|
2018-04-17 23:45:26 +00:00
|
|
|
} else {
|
2019-02-25 17:21:57 +00:00
|
|
|
if (notif.activationType ==
|
|
|
|
NSUserNotificationActivationTypeAdditionalActionClicked) {
|
|
|
|
notification->NotificationActivated([notif additionalActivationAction]);
|
2018-04-17 23:45:26 +00:00
|
|
|
}
|
2017-05-29 10:02:33 +00:00
|
|
|
}
|
|
|
|
}
|
2015-12-24 13:55:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL)userNotificationCenter:(NSUserNotificationCenter*)center
|
|
|
|
shouldPresentNotification:(NSUserNotification*)notification {
|
|
|
|
// Display notifications even if the app is active.
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
|
2022-11-14 20:46:52 +00:00
|
|
|
#if !IS_MAS_BUILD()
|
2018-08-13 11:09:25 +00:00
|
|
|
// This undocumented method notifies us if a user closes "Alert" notifications
|
|
|
|
// https://chromium.googlesource.com/chromium/src/+/lkgr/chrome/browser/notifications/notification_platform_bridge_mac.mm
|
|
|
|
- (void)userNotificationCenter:(NSUserNotificationCenter*)center
|
|
|
|
didDismissAlert:(NSUserNotification*)notif {
|
|
|
|
auto* notification = presenter_->GetNotification(notif);
|
|
|
|
if (notification)
|
|
|
|
notification->NotificationDismissed();
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2022-11-14 20:46:52 +00:00
|
|
|
#if !IS_MAS_BUILD()
|
2018-08-13 11:09:25 +00:00
|
|
|
// This undocumented method notifies us if a user closes "Banner" notifications
|
|
|
|
// https://github.com/mozilla/gecko-dev/blob/master/widget/cocoa/OSXNotificationCenter.mm
|
|
|
|
- (void)userNotificationCenter:(NSUserNotificationCenter*)center
|
|
|
|
didRemoveDeliveredNotifications:(NSArray*)notifications {
|
|
|
|
for (NSUserNotification* notif in notifications) {
|
|
|
|
auto* notification = presenter_->GetNotification(notif);
|
|
|
|
if (notification)
|
|
|
|
notification->NotificationDismissed();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2015-12-24 13:55:18 +00:00
|
|
|
@end
|