#ifndef SERVICES_DEVICE_GEOLOCATION_NETWORK_LOCATION_PROVIDER_H_
#define SERVICES_DEVICE_GEOLOCATION_NETWORK_LOCATION_PROVIDER_H_
#include <stddef.h>
#include <map>
#include <memory>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "base/threading/thread.h"
#include "base/threading/thread_checker.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "services/device/geolocation/network_location_request.h"
#include "services/device/geolocation/wifi_data_provider_handle.h"
#include "services/device/public/cpp/geolocation/location_provider.h"
#include "services/device/public/mojom/geolocation_internals.mojom.h"
#include "services/device/public/mojom/geoposition.mojom.h"
namespace device {
class PositionCache;
class NetworkLocationProvider : public LocationProvider {
public:
using NetworkRequestCallback =
base::RepeatingCallback<void(std::vector<mojom::AccessPointDataPtr>)>;
using NetworkResponseCallback =
base::RepeatingCallback<void(mojom::NetworkLocationResponsePtr)>;
NetworkLocationProvider(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
const std::string& api_key,
PositionCache* position_cache,
base::RepeatingClosure internals_updated_closure,
NetworkRequestCallback network_request_callback,
NetworkResponseCallback network_response_callback);
NetworkLocationProvider(const NetworkLocationProvider&) = delete;
NetworkLocationProvider& operator=(const NetworkLocationProvider&) = delete;
~NetworkLocationProvider() override;
void FillDiagnostics(mojom::GeolocationDiagnostics& diagnostics) override;
void SetUpdateCallback(const LocationProviderUpdateCallback& cb) override;
void StartProvider(bool high_accuracy) override;
void StopProvider() override;
const mojom::GeopositionResult* GetPosition() override;
void OnPermissionGranted() override;
private:
void RequestPosition();
void OnWifiDataUpdate();
void OnLocationResponse(LocationResponseResult result,
const WifiData& wifi_data);
std::unique_ptr<WifiDataProviderHandle> wifi_data_provider_handle_;
bool high_accuracy_ = false;
WifiDataProviderHandle::WifiDataUpdateCallback wifi_data_update_callback_;
WifiData wifi_data_;
bool is_wifi_data_complete_;
base::Time wifi_timestamp_;
const raw_ptr<PositionCache> position_cache_;
LocationProvider::LocationProviderUpdateCallback
location_provider_update_callback_;
bool is_permission_granted_;
bool is_new_data_available_;
const std::unique_ptr<NetworkLocationRequest> request_;
base::ThreadChecker thread_checker_;
base::RepeatingClosure internals_updated_closure_;
NetworkRequestCallback network_request_callback_;
NetworkResponseCallback network_response_callback_;
bool position_received_ = false;
std::optional<NetworkLocationRequestResult> first_session_error_;
std::optional<base::TimeTicks> start_time_;
base::WeakPtrFactory<NetworkLocationProvider> weak_factory_{this};
};
}
#endif