// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ASH_SECURE_CHANNEL_NEARBY_ENDPOINT_FINDER_IMPL_H_
#define CHROME_BROWSER_ASH_SECURE_CHANNEL_NEARBY_ENDPOINT_FINDER_IMPL_H_
#include "base/memory/weak_ptr.h"
#include "chrome/browser/ash/secure_channel/nearby_endpoint_finder.h"
#include "chromeos/ash/services/nearby/public/mojom/nearby_connections.mojom.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/shared_remote.h"
namespace ash {
namespace secure_channel {
// NearbyEndpointFinder implementation which uses a Mojo connection to the
// Nearby utility process to find the endpoint. This process consists of:
// (1) Starting discovery, using an out-of-band Bluetooth mechanism.
// (2) Injecting an endpoint using a Bluetooth address.
// (3) Waiting for an endpoint to be found.
// (4) Stopping discovery.
class NearbyEndpointFinderImpl
: public NearbyEndpointFinder,
public ::nearby::connections::mojom::EndpointDiscoveryListener {
public:
class Factory {
public:
static std::unique_ptr<NearbyEndpointFinder> Create(
const mojo::SharedRemote<::nearby::connections::mojom::NearbyConnections>&
nearby_connections);
static void SetFactoryForTesting(Factory* test_factory);
virtual ~Factory() = default;
protected:
virtual std::unique_ptr<NearbyEndpointFinder> CreateInstance(
const mojo::SharedRemote<::nearby::connections::mojom::NearbyConnections>&
nearby_connections) = 0;
};
NearbyEndpointFinderImpl(
const mojo::SharedRemote<::nearby::connections::mojom::NearbyConnections>&
nearby_connections);
~NearbyEndpointFinderImpl() override;
private:
friend class NearbyEndpointFinderImplTest;
// NearbyEndpointFinder:
void PerformFindEndpoint() override;
// ::nearby::connections::mojom::EndpointDiscoveryListener:
void OnEndpointFound(
const std::string& endpoint_id,
::nearby::connections::mojom::DiscoveredEndpointInfoPtr info) override;
void OnEndpointLost(const std::string& endpoint_id) override {}
void OnStartDiscoveryResult(::nearby::connections::mojom::Status status);
void OnInjectBluetoothEndpointResult(
::nearby::connections::mojom::Status status);
void OnStopDiscoveryResult(
::nearby::connections::mojom::DiscoveredEndpointInfoPtr info,
::nearby::connections::mojom::Status status);
mojo::SharedRemote<::nearby::connections::mojom::NearbyConnections>
nearby_connections_;
mojo::Receiver<::nearby::connections::mojom::EndpointDiscoveryListener>
endpoint_discovery_listener_receiver_{this};
bool is_discovery_active_ = false;
std::string endpoint_id_;
std::vector<uint8_t> endpoint_info_;
base::WeakPtrFactory<NearbyEndpointFinderImpl> weak_ptr_factory_{this};
};
} // namespace secure_channel
} // namespace ash
#endif // CHROME_BROWSER_ASH_SECURE_CHANNEL_NEARBY_ENDPOINT_FINDER_IMPL_H_