#ifndef CHROME_BROWSER_ASH_CRYPTAUTH_CLIENT_APP_METADATA_PROVIDER_SERVICE_H_
#define CHROME_BROWSER_ASH_CRYPTAUTH_CLIENT_APP_METADATA_PROVIDER_SERVICE_H_
#include <list>
#include <optional>
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ref.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/system/sys_info.h"
#include "chromeos/ash/services/device_sync/proto/cryptauth_client_app_metadata.pb.h"
#include "chromeos/ash/services/device_sync/public/cpp/client_app_metadata_provider.h"
#include "components/gcm_driver/instance_id/instance_id.h"
#include "components/keyed_service/core/keyed_service.h"
class PrefRegistrySimple;
class PrefService;
namespace device {
class BluetoothAdapter;
}
namespace instance_id {
class InstanceID;
class InstanceIDProfileService;
}
namespace ash {
class NetworkStateHandler;
class ClientAppMetadataProviderService
: public device_sync::ClientAppMetadataProvider,
public KeyedService {
public:
static void RegisterProfilePrefs(PrefRegistrySimple* registry);
ClientAppMetadataProviderService(
PrefService* local_state,
PrefService* profile_pref_service,
NetworkStateHandler* network_state_handler,
instance_id::InstanceIDProfileService* instance_id_profile_service);
ClientAppMetadataProviderService(const ClientAppMetadataProviderService&) =
delete;
ClientAppMetadataProviderService& operator=(
const ClientAppMetadataProviderService&) = delete;
~ClientAppMetadataProviderService() override;
void GetClientAppMetadata(const std::string& gcm_registration_id,
GetMetadataCallback callback) override;
private:
FRIEND_TEST_ALL_PREFIXES(ClientAppMetadataProviderServiceTest,
VersionCodeToInt64);
static int64_t ConvertVersionCodeToInt64(const std::string& version_code_str);
void Shutdown() override;
void OnBluetoothAdapterFetched(
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter);
void OnHardwareInfoFetched(
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter,
base::SysInfo::HardwareInfo hardware_info);
void OnInstanceIdFetched(
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter,
const base::SysInfo::HardwareInfo& hardware_info,
const std::string& instance_id);
void OnInstanceIdTokenFetched(
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter,
const base::SysInfo::HardwareInfo& hardware_info,
const std::string& instance_id,
const std::string& token,
instance_id::InstanceID::Result result);
void OnInstanceIdDeleted(
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter,
const base::SysInfo::HardwareInfo& hardware_info,
instance_id::InstanceID::Result result);
instance_id::InstanceID* GetInstanceId();
int64_t SoftwareVersionCodeAsInt64();
void InvokePendingCallbacks();
const raw_ref<PrefService> local_state_;
raw_ptr<PrefService> pref_service_;
raw_ptr<NetworkStateHandler> network_state_handler_;
raw_ptr<instance_id::InstanceIDProfileService> instance_id_profile_service_;
bool instance_id_recreated_ = false;
std::optional<std::string> pending_gcm_registration_id_;
std::optional<cryptauthv2::ClientAppMetadata> client_app_metadata_;
std::list<GetMetadataCallback> pending_callbacks_;
base::WeakPtrFactory<ClientAppMetadataProviderService> weak_ptr_factory_{
this};
};
}
#endif