#ifndef NET_NQE_NETWORK_QUALITY_STORE_H_
#define NET_NQE_NETWORK_QUALITY_STORE_H_
#include <map>
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/sequence_checker.h"
#include "net/base/net_export.h"
#include "net/nqe/cached_network_quality.h"
#include "net/nqe/effective_connection_type.h"
#include "net/nqe/network_id.h"
namespace net::nqe::internal {
class NET_EXPORT_PRIVATE NetworkQualityStore {
public:
class NET_EXPORT_PRIVATE NetworkQualitiesCacheObserver {
public:
NetworkQualitiesCacheObserver(const NetworkQualitiesCacheObserver&) =
delete;
NetworkQualitiesCacheObserver& operator=(
const NetworkQualitiesCacheObserver&) = delete;
virtual void OnChangeInCachedNetworkQuality(
const nqe::internal::NetworkID& network_id,
const nqe::internal::CachedNetworkQuality& cached_network_quality) = 0;
protected:
NetworkQualitiesCacheObserver() = default;
virtual ~NetworkQualitiesCacheObserver() = default;
};
NetworkQualityStore();
NetworkQualityStore(const NetworkQualityStore&) = delete;
NetworkQualityStore& operator=(const NetworkQualityStore&) = delete;
~NetworkQualityStore();
void Add(const nqe::internal::NetworkID& network_id,
const nqe::internal::CachedNetworkQuality& cached_network_quality);
bool GetById(
const nqe::internal::NetworkID& network_id,
nqe::internal::CachedNetworkQuality* cached_network_quality) const;
void AddNetworkQualitiesCacheObserver(
NetworkQualitiesCacheObserver* observer);
void RemoveNetworkQualitiesCacheObserver(
NetworkQualitiesCacheObserver* observer);
void DisableOfflineCheckForTesting(bool disable_offline_check);
private:
static const size_t kMaximumNetworkQualityCacheSize = 20;
void NotifyCacheObserverIfPresent(
MayBeDangling<NetworkQualitiesCacheObserver> observer) const;
typedef std::map<nqe::internal::NetworkID,
nqe::internal::CachedNetworkQuality>
CachedNetworkQualities;
CachedNetworkQualities cached_network_qualities_;
base::ObserverList<NetworkQualitiesCacheObserver>::Unchecked
network_qualities_cache_observer_list_;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<NetworkQualityStore> weak_ptr_factory_{this};
};
}
#endif