blob: bd9a91021da59dc2a77e02694cd5240d7a387ac3 [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.
#include "chrome/browser/ash/boca/receiver/boca_receiver_service.h"
#include <memory>
#include <utility>
#include "base/check_deref.h"
#include "base/functional/bind.h"
#include "base/task/bind_post_task.h"
#include "chrome/browser/ash/boca/spotlight/spotlight_oauth_token_fetcher_impl.h"
#include "chrome/browser/device_identity/device_oauth2_token_service.h"
#include "chrome/browser/device_identity/device_oauth2_token_service_factory.h"
#include "chrome/browser/gcm/gcm_profile_service_factory.h"
#include "chrome/browser/gcm/instance_id/instance_id_profile_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chromeos/ash/components/boca/invalidations/fcm_handler.h"
#include "chromeos/ash/components/boca/spotlight/spotlight_remoting_client_manager.h"
#include "components/gcm_driver/gcm_profile_service.h"
#include "components/gcm_driver/instance_id/instance_id_profile_service.h"
namespace ash {
namespace {
std::unique_ptr<boca::FCMHandler> CreateFcmHandler(Profile* profile) {
gcm::GCMDriver* gcm_driver =
gcm::GCMProfileServiceFactory::GetForProfile(profile)->driver();
instance_id::InstanceIDDriver* instance_id_driver =
instance_id::InstanceIDProfileServiceFactory::GetForProfile(profile)
->driver();
return std::make_unique<boca::FCMHandlerImpl>(gcm_driver, instance_id_driver);
}
} // namespace
BocaReceiverService::BocaReceiverService(Profile* profile)
: fcm_handler_(CreateFcmHandler(profile)),
remoting_client_(
std::make_unique<boca::SpotlightRemotingClientManagerImpl>(
// TODO(crbug.com/445415017): Replace `SpotlightOAuthTokenFetcher`
// by `BocaDeviceAuthTokenService`
std::make_unique<boca::SpotlightOAuthTokenFetcherImpl>(
CHECK_DEREF(DeviceOAuth2TokenServiceFactory::Get())),
profile->GetURLLoaderFactory())) {}
BocaReceiverService::~BocaReceiverService() = default;
void BocaReceiverService::Shutdown() {
fcm_handler_.reset();
// Make sure any ongoing remoting client session is stopped before resetting
// `remoting_client_`. If there is no ongoing remoting session the callback
// will run immediately.
boca::SpotlightRemotingClientManager* remoting_client_ptr =
remoting_client_.get();
remoting_client_ptr->StopCrdClient(
base::BindPostTaskToCurrentDefault(base::BindOnce(
[](std::unique_ptr<boca::SpotlightRemotingClientManager>) {},
std::move(remoting_client_))));
}
boca::FCMHandler* BocaReceiverService::fcm_handler() const {
return fcm_handler_.get();
}
boca::SpotlightRemotingClientManager* BocaReceiverService::remoting_client()
const {
return remoting_client_.get();
}
} // namespace ash