Index: net/nqe/network_qualities_prefs_manager.cc |
diff --git a/net/nqe/network_qualities_prefs_manager.cc b/net/nqe/network_qualities_prefs_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e6e27e75d881ad71e7c4cae1089c3a2d6cf283db |
--- /dev/null |
+++ b/net/nqe/network_qualities_prefs_manager.cc |
@@ -0,0 +1,125 @@ |
+// Copyright 2016 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. |
+ |
+#include "net/nqe/network_qualities_prefs_manager.h" |
+ |
+#include <utility> |
+ |
+#include "base/bind.h" |
+#include "base/threading/thread_checker.h" |
+#include "base/values.h" |
+#include "net/nqe/cached_network_quality.h" |
+#include "net/nqe/network_quality_estimator.h" |
+#include "net/nqe/network_quality_store.h" |
+ |
+namespace net { |
+ |
+// CacheObserver lives on the network thread. |
+class NetworkQualitiesPrefsManager::CacheObserver |
RyanSturm
2016/09/12 20:26:55
Is it cleaner to have NetworkQualitiesPrefsManager
tbansal1
2016/09/15 21:00:59
Done.
|
+ : public nqe::internal::NetworkQualityStore::NetworkQualitiesCacheObserver { |
+ public: |
+ // CacheObserver receives notification when there is a change in the network |
+ // quality. On receiving the notification, it calls |callback| on |
+ // |callback_task_runner|. |
+ CacheObserver( |
+ OnChangeInCachedNetworkQualityCallback callback, |
+ const scoped_refptr<base::SequencedTaskRunner>& callback_task_runner, |
+ NetworkQualityEstimator* network_quality_estimator) |
+ : callback_(callback), |
+ callback_task_runner_(callback_task_runner), |
+ network_quality_estimator_(network_quality_estimator) { |
+ DCHECK(callback_task_runner_); |
+ // Add |this| as a cache observer so that notification is received |
+ // every time there is a change in the cached network quality. |
+ network_quality_estimator_->AddNetworkQualitiesCacheObserver(this); |
+ } |
+ ~CacheObserver() override { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ network_quality_estimator_->RemoveNetworkQualitiesCacheObserver(this); |
+ } |
+ |
+ // nqe::internal::NetworkQualityStore::NetworkQualitiesCacheObserver |
+ // implementation: |
+ void OnChangeInCachedNetworkQuality( |
+ const nqe::internal::NetworkID& network_id, |
+ const nqe::internal::CachedNetworkQuality& cached_network_quality) |
+ override { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ // Run the callback on the provided task runner. |
+ callback_task_runner_->PostTask( |
RyanSturm
2016/09/12 20:26:55
Why do you post this task directly to the prefs th
tbansal1
2016/09/15 21:00:58
Removed CacheObserver.
|
+ FROM_HERE, base::Bind(callback_, network_id, cached_network_quality)); |
+ } |
+ |
+ private: |
+ // Called when a notification is received about change in the cached |
+ // network quality. Should be called only on |callback_task_runner_|. |
+ OnChangeInCachedNetworkQualityCallback callback_; |
+ |
+ const scoped_refptr<base::SequencedTaskRunner> callback_task_runner_; |
+ |
+ NetworkQualityEstimator* network_quality_estimator_; |
+ |
+ base::ThreadChecker thread_checker_; |
+ DISALLOW_COPY_AND_ASSIGN(CacheObserver); |
+}; |
+ |
+NetworkQualitiesPrefsManager::NetworkQualitiesPrefsManager( |
+ std::unique_ptr<PrefDelegate> pref_delegate) |
+ : pref_delegate_(std::move(pref_delegate)), |
+ pref_task_runner_(base::ThreadTaskRunnerHandle::Get()) { |
+ DCHECK(pref_delegate_); |
+ |
+ pref_weak_ptr_factory_.reset( |
+ new base::WeakPtrFactory<NetworkQualitiesPrefsManager>(this)); |
+ pref_weak_ptr_ = pref_weak_ptr_factory_->GetWeakPtr(); |
+} |
+ |
+NetworkQualitiesPrefsManager::~NetworkQualitiesPrefsManager() { |
+ DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
+ network_weak_ptr_factory_.reset(); |
+} |
+ |
+void NetworkQualitiesPrefsManager::InitializeOnNetworkThread( |
+ NetworkQualityEstimator* network_quality_estimator) { |
+ DCHECK(!network_task_runner_); |
+ DCHECK(network_quality_estimator); |
+ |
+ network_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
+ network_weak_ptr_factory_.reset( |
Not at Google. Contact bengr
2016/09/09 20:30:40
|network_weak_ptr_factory_| unused?
tbansal1
2016/09/15 21:00:59
Done.
|
+ new base::WeakPtrFactory<NetworkQualitiesPrefsManager>(this)); |
+ |
+ // Create the cache observer on the network thread, and provide the callback. |
+ // |this| will be notified every time there is a change in the network |
+ // quality. |
+ cache_observer_.reset(new NetworkQualitiesPrefsManager::CacheObserver( |
+ base::Bind(&NetworkQualitiesPrefsManager:: |
+ OnChangeInCachedNetworkQualityOnPrefThread, |
+ pref_weak_ptr_), |
+ pref_task_runner_, network_quality_estimator)); |
RyanSturm
2016/09/12 20:26:55
Instead of passing in network_quality_estimator, c
tbansal1
2016/09/15 21:00:58
Done.
|
+} |
+ |
+void NetworkQualitiesPrefsManager::ShutdownOnPrefThread() { |
+ DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); |
+ pref_weak_ptr_factory_.reset(); |
+ pref_delegate_.reset(); |
+} |
+ |
+void NetworkQualitiesPrefsManager::OnChangeInCachedNetworkQualityOnPrefThread( |
+ const nqe::internal::NetworkID& network_id, |
+ const nqe::internal::CachedNetworkQuality& cached_network_quality) { |
+ // The prefs can only be written on the pref thread. |
+ DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); |
+ |
+ base::DictionaryValue dictionary_value; |
+ dictionary_value.SetString( |
+ network_id.ToString(), |
+ GetNameForEffectiveConnectionType( |
+ cached_network_quality.effective_connection_type())); |
+ |
+ // Notify the pref delegate so that it updates the prefs on the disk. |
+ pref_delegate_->SetDictionaryValue(dictionary_value); |
+} |
+ |
+} // namespace net |