#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);
}
}
BocaReceiverService::BocaReceiverService(Profile* profile)
: fcm_handler_(CreateFcmHandler(profile)),
remoting_client_(
std::make_unique<boca::SpotlightRemotingClientManagerImpl>(
std::make_unique<boca::SpotlightOAuthTokenFetcherImpl>(
CHECK_DEREF(DeviceOAuth2TokenServiceFactory::Get())),
profile->GetURLLoaderFactory())) {}
BocaReceiverService::~BocaReceiverService() = default;
void BocaReceiverService::Shutdown() {
fcm_handler_.reset();
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();
}
}