blob: 7041559531b3af8b5ba157f2b469c0c950ad63ff [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_SERVICES_DEVICE_SYNC_PUBLIC_CPP_DEVICE_SYNC_CLIENT_IMPL_H_
#define CHROMEOS_SERVICES_DEVICE_SYNC_PUBLIC_CPP_DEVICE_SYNC_CLIENT_IMPL_H_
#include <memory>
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "chromeos/components/multidevice/remote_device_ref.h"
#include "chromeos/components/multidevice/software_feature.h"
#include "chromeos/services/device_sync/public/cpp/device_sync_client.h"
#include "chromeos/services/device_sync/public/mojom/device_sync.mojom.h"
#include "mojo/public/cpp/bindings/binding.h"
namespace base {
class TaskRunner;
} // namespace base
namespace service_manager {
class Connector;
} // namespace service_manager
namespace chromeos {
namespace multidevice {
class ExpiringRemoteDeviceCache;
} // namespace multidevice
namespace device_sync {
// Concrete implementation of DeviceSyncClient.
class DeviceSyncClientImpl : public DeviceSyncClient,
public device_sync::mojom::DeviceSyncObserver {
public:
class Factory {
public:
static Factory* Get();
static void SetInstanceForTesting(Factory* test_factory);
virtual ~Factory();
virtual std::unique_ptr<DeviceSyncClient> BuildInstance(
service_manager::Connector* connector);
private:
static Factory* test_factory_;
};
explicit DeviceSyncClientImpl(service_manager::Connector* connector);
~DeviceSyncClientImpl() override;
// DeviceSyncClient:
void ForceEnrollmentNow(
mojom::DeviceSync::ForceEnrollmentNowCallback callback) override;
void ForceSyncNow(mojom::DeviceSync::ForceSyncNowCallback callback) override;
multidevice::RemoteDeviceRefList GetSyncedDevices() override;
base::Optional<multidevice::RemoteDeviceRef> GetLocalDeviceMetadata()
override;
void SetSoftwareFeatureState(
const std::string public_key,
multidevice::SoftwareFeature software_feature,
bool enabled,
bool is_exclusive,
mojom::DeviceSync::SetSoftwareFeatureStateCallback callback) override;
void FindEligibleDevices(multidevice::SoftwareFeature software_feature,
FindEligibleDevicesCallback callback) override;
void GetDebugInfo(mojom::DeviceSync::GetDebugInfoCallback callback) override;
// device_sync::mojom::DeviceSyncObserver:
void OnEnrollmentFinished() override;
void OnNewDevicesSynced() override;
private:
friend class DeviceSyncClientImplTest;
DeviceSyncClientImpl(service_manager::Connector* connector,
scoped_refptr<base::TaskRunner> task_runner);
void AttemptToBecomeReady();
void LoadSyncedDevices();
void LoadLocalDeviceMetadata();
void OnGetSyncedDevicesCompleted(
const base::Optional<std::vector<multidevice::RemoteDevice>>&
remote_devices);
void OnGetLocalDeviceMetadataCompleted(
const base::Optional<multidevice::RemoteDevice>& local_device_metadata);
void OnFindEligibleDevicesCompleted(
FindEligibleDevicesCallback callback,
mojom::NetworkRequestResult result_code,
mojom::FindEligibleDevicesResponsePtr response);
mojom::DeviceSyncObserverPtr GenerateInterfacePtr();
void FlushForTesting();
mojom::DeviceSyncPtr device_sync_ptr_;
mojo::Binding<mojom::DeviceSyncObserver> binding_;
std::unique_ptr<multidevice::ExpiringRemoteDeviceCache>
expiring_device_cache_;
bool waiting_for_synced_devices_ = true;
bool waiting_for_local_device_metadata_ = true;
bool pending_notify_enrollment_finished_ = false;
bool pending_notify_new_synced_devices_ = false;
base::Optional<std::string> local_device_id_;
base::WeakPtrFactory<DeviceSyncClientImpl> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(DeviceSyncClientImpl);
};
} // namespace device_sync
} // namespace chromeos
#endif // CHROMEOS_SERVICES_DEVICE_SYNC_PUBLIC_CPP_DEVICE_SYNC_CLIENT_IMPL_H_