blob: 37c025067386442dc887eda3e93a4ff18f18f2c5 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/push_notification/model/push_notification_service.h"
#import "base/strings/string_number_conversions.h"
#import "base/strings/sys_string_conversions.h"
#import "base/task/sequenced_task_runner.h"
#import "base/types/cxx23_to_underlying.h"
#import "base/values.h"
#import "components/pref_registry/pref_registry_syncable.h"
#import "components/prefs/pref_registry_simple.h"
#import "google_apis/gaia/gaia_id.h"
#import "ios/chrome/browser/push_notification/model/push_notification_account_context_manager.h"
#import "ios/chrome/browser/push_notification/model/push_notification_client_id.h"
#import "ios/chrome/browser/push_notification/model/push_notification_client_manager.h"
#import "ios/chrome/browser/push_notification/model/push_notification_configuration.h"
#import "ios/chrome/browser/push_notification/model/push_notification_util.h"
#import "ios/chrome/browser/shared/model/application_context/application_context.h"
#import "ios/chrome/browser/shared/model/prefs/pref_names.h"
PushNotificationService::PushNotificationService()
: client_manager_(std::make_unique<PushNotificationClientManager>(
base::SequencedTaskRunner::GetCurrentDefault())) {
context_manager_ = [[PushNotificationAccountContextManager alloc]
initWithProfileManager:GetApplicationContext()->GetProfileManager()];
}
PushNotificationService::~PushNotificationService() = default;
PushNotificationClientManager*
PushNotificationService::GetPushNotificationClientManager() {
return client_manager_.get();
}
PushNotificationAccountContextManager*
PushNotificationService::GetAccountContextManager() {
return context_manager_;
}
void PushNotificationService::SetPreference(const GaiaId& account_id,
PushNotificationClientId client_id,
bool enabled) {
DCHECK(context_manager_);
if (enabled) {
[context_manager_ enablePushNotification:client_id forAccount:account_id];
} else {
[context_manager_ disablePushNotification:client_id forAccount:account_id];
}
SetPreferences(account_id,
[context_manager_ preferenceMapForAccount:account_id],
^(NSError* error){
});
}
void PushNotificationService::RegisterAccount(
const GaiaId& account_id,
CompletionHandler completion_handler) {
if ([context_manager_ addAccount:account_id]) {
SetAccountsToDevice([context_manager_ accountIDs], completion_handler);
}
}
void PushNotificationService::UnregisterAccount(
const GaiaId& account_id,
CompletionHandler completion_handler) {
if ([context_manager_ removeAccount:account_id]) {
SetAccountsToDevice([context_manager_ accountIDs], completion_handler);
}
}
void PushNotificationService::RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable* registry) {
registry->RegisterDictionaryPref(prefs::kFeaturePushNotificationPermissions);
registry->RegisterBooleanPref(prefs::kSendTabNotificationsPreviouslyDisabled,
false);
}
void PushNotificationService::RegisterLocalStatePrefs(
PrefRegistrySimple* registry) {
registry->RegisterIntegerPref(
prefs::kPushNotificationAuthorizationStatus,
base::to_underlying(
push_notification::SettingsAuthorizationStatus::NOTDETERMINED));
registry->RegisterDictionaryPref(prefs::kAppLevelPushNotificationPermissions);
registry->RegisterDictionaryPref(prefs::kHandledDeliveredNotificationIds);
}