blob: 9eea211f32fa4372fd704f8ed2ab76a7ebd7bd1e [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_REMINDER_NOTIFICATIONS_MODEL_REMINDER_NOTIFICATION_CLIENT_H_
#define IOS_CHROME_BROWSER_REMINDER_NOTIFICATIONS_MODEL_REMINDER_NOTIFICATION_CLIENT_H_
#import <Foundation/Foundation.h>
#import <UserNotifications/UserNotifications.h>
#import <memory>
#import <optional>
#import "base/sequence_checker.h"
#import "ios/chrome/browser/push_notification/model/push_notification_client.h"
class PrefChangeRegistrar;
class ProfileIOS;
// A Profile-based notification client responsible for scheduling reminder
// notification requests and handling user interactions with reminders.
class ReminderNotificationClient : public PushNotificationClient {
public:
explicit ReminderNotificationClient(ProfileIOS* profile);
~ReminderNotificationClient() override;
// Override PushNotificationClient::
std::optional<NotificationType> GetNotificationType(
UNNotification* notification) override;
bool CanHandleNotification(UNNotification* notification) override;
bool HandleNotificationInteraction(
UNNotificationResponse* notification_response) override;
std::optional<UIBackgroundFetchResult> HandleNotificationReception(
NSDictionary<NSString*, id>* notification) override;
NSArray<UNNotificationCategory*>* RegisterActionableNotifications() override;
private:
// Returns true if the client is permitted to schedule notifications.
bool IsPermitted();
// Called when the relevant Reminder Notifications Pref changes.
void OnReminderDataPrefChanged();
// Called when the relevant permissions Pref changes.
void OnPermissionsPrefChanged();
// Schedules new reminder notifications based on the current reminder data in
// Prefs.
void ScheduleNewReminders();
// Schedules new reminder notifications if they don't already exist in the
// notification center.
void ScheduleNewRemindersIfNeeded(
NSArray<UNNotificationRequest*>* pending_requests);
// Cancels all pending reminder notifications.
void CancelAllNotifications(base::OnceClosure completion_handler);
// Callback for `-getPendingNotificationRequestsWithCompletionHandler:` used
// in `CancelAllNotifications()`.
void OnGetPendingNotificationsForCancellation(
base::OnceClosure completion_handler,
NSArray<UNNotificationRequest*>* requests);
// Schedules a single reminder notification for `reminder_url` using
// `reminder_details`.
void ScheduleNotification(const GURL& reminder_url,
const base::Value::Dict& reminder_details,
std::string_view profile_name);
// Called upon completion of scheduling a single notification. Removes the
// corresponding Pref entry for `scheduled_url` if scheduling was successful.
void OnNotificationScheduled(const GURL& scheduled_url, NSError* error);
// Used to assert that asynchronous callback are invoked on the correct
// sequence.
SEQUENCE_CHECKER(sequence_checker_);
// Observes Pref changes for the Profile associated with this client.
std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
base::WeakPtrFactory<ReminderNotificationClient> weak_ptr_factory_{this};
};
#endif // IOS_CHROME_BROWSER_REMINDER_NOTIFICATIONS_MODEL_REMINDER_NOTIFICATION_CLIENT_H_