blob: 6c58f32a7263a8ae5df40988e2af9f7b104e687d [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/sharing/optimization_guide/optimization_guide_message_handler.h"
#include <utility>
#include "base/logging.h"
#include "base/strings/strcat.h"
#include "chrome/browser/optimization_guide/chrome_hints_manager.h"
#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
#include "components/optimization_guide/core/hints/hints_processing_util.h"
#include "components/optimization_guide/core/hints/push_notification_manager.h"
#include "components/optimization_guide/core/optimization_guide_features.h"
#include "components/optimization_guide/core/optimization_guide_logger.h"
#include "components/optimization_guide/core/optimization_guide_switches.h"
#include "components/optimization_guide/core/optimization_guide_util.h"
#include "components/optimization_guide/proto/push_notification.pb.h"
#include "components/sharing_message/proto/optimization_guide_push_notification.pb.h"
#include "components/sharing_message/proto/sharing_message.pb.h"
using components_sharing_message::OptimizationGuidePushNotification;
// static
std::unique_ptr<OptimizationGuideMessageHandler>
OptimizationGuideMessageHandler::Create(Profile* profile) {
DCHECK(optimization_guide::features::IsOptimizationHintsEnabled());
DCHECK(optimization_guide::features::IsPushNotificationsEnabled());
optimization_guide::PushNotificationManager* push_notification_manager =
nullptr;
auto* optimization_guide_service =
OptimizationGuideKeyedServiceFactory::GetForProfile(profile);
OptimizationGuideLogger* optimization_guide_logger = nullptr;
if (optimization_guide_service) {
auto* hint_manager = optimization_guide_service->GetHintsManager();
DCHECK(hint_manager);
push_notification_manager = hint_manager->push_notification_manager();
optimization_guide_logger =
optimization_guide_service->GetOptimizationGuideLogger();
}
return std::make_unique<OptimizationGuideMessageHandler>(
push_notification_manager, optimization_guide_logger);
}
OptimizationGuideMessageHandler::OptimizationGuideMessageHandler(
optimization_guide::PushNotificationManager* push_notification_manager,
OptimizationGuideLogger* optimization_guide_logger)
: push_notification_manager_(push_notification_manager),
optimization_guide_logger_(optimization_guide_logger) {}
OptimizationGuideMessageHandler::~OptimizationGuideMessageHandler() = default;
void OptimizationGuideMessageHandler::OnMessage(
components_sharing_message::SharingMessage message,
SharingMessageHandler::DoneCallback done_callback) {
DCHECK(message.has_optimization_guide_push_notification());
// Parse the payload to HintNotificationPayload.
const OptimizationGuidePushNotification& notification_proto =
message.optimization_guide_push_notification();
optimization_guide::proto::HintNotificationPayload hint_notification_payload;
if (!hint_notification_payload.ParseFromString(
notification_proto.hint_notification_payload_bytes())) {
OPTIMIZATION_GUIDE_LOG(
optimization_guide_common::mojom::LogSource::HINTS_NOTIFICATIONS,
optimization_guide_logger_,
"Can't parse the HintNotificationPayload proto from "
"OptimizationGuidePushNotification.");
std::move(done_callback).Run(/*response=*/nullptr);
return;
}
OPTIMIZATION_GUIDE_LOG(
optimization_guide_common::mojom::LogSource::HINTS_NOTIFICATIONS,
optimization_guide_logger_,
base::StrCat({"Received push notification for type:",
optimization_guide::GetStringNameForOptimizationType(
hint_notification_payload.optimization_type()),
" hint_key:", hint_notification_payload.hint_key()}));
// Pass the HintNotificationPayload to optimization guide, to delete
// hints data from hints database.
if (push_notification_manager_) {
push_notification_manager_->OnNewPushNotification(
hint_notification_payload);
}
std::move(done_callback).Run(/*response=*/nullptr);
}