Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(661)

Side by Side Diff: device/geolocation/network_location_provider.cc

Issue 2226143002: Gets rid of the LocationArbitrator interface, in preference for LocationProvider. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merge branch 'master' into lai Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "device/geolocation/network_location_provider.h" 5 #include "device/geolocation/network_location_provider.h"
6 6
7 #include <utility>
8
7 #include "base/bind.h" 9 #include "base/bind.h"
8 #include "base/location.h" 10 #include "base/location.h"
9 #include "base/single_thread_task_runner.h" 11 #include "base/single_thread_task_runner.h"
10 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
11 #include "base/threading/thread_task_runner_handle.h" 13 #include "base/threading/thread_task_runner_handle.h"
12 #include "base/time/time.h" 14 #include "base/time/time.h"
13 #include "device/geolocation/access_token_store.h" 15 #include "device/geolocation/access_token_store.h"
14 16
15 namespace device { 17 namespace device {
16 namespace { 18 namespace {
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 url_context_getter, url, 123 url_context_getter, url,
122 base::Bind(&NetworkLocationProvider::OnLocationResponse, 124 base::Bind(&NetworkLocationProvider::OnLocationResponse,
123 base::Unretained(this)))); 125 base::Unretained(this))));
124 } 126 }
125 127
126 NetworkLocationProvider::~NetworkLocationProvider() { 128 NetworkLocationProvider::~NetworkLocationProvider() {
127 StopProvider(); 129 StopProvider();
128 } 130 }
129 131
130 // LocationProvider implementation 132 // LocationProvider implementation
131 void NetworkLocationProvider::GetPosition(Geoposition* position) { 133 const Geoposition& NetworkLocationProvider::GetPosition() {
132 DCHECK(position); 134 return position_;
133 *position = position_;
134 }
135
136 void NetworkLocationProvider::RequestRefresh() {
137 // TODO(joth): When called via the public (base class) interface, this should
138 // poke each data provider to get them to expedite their next scan.
139 // Whilst in the delayed start, only send request if all data is ready.
140 // TODO(mcasas): consider not using HasWeakPtrs() https://crbug.com/629158.
141 if (!weak_factory_.HasWeakPtrs() || is_wifi_data_complete_) {
142 RequestPosition();
143 }
144 } 135 }
145 136
146 void NetworkLocationProvider::OnPermissionGranted() { 137 void NetworkLocationProvider::OnPermissionGranted() {
147 const bool was_permission_granted = is_permission_granted_; 138 const bool was_permission_granted = is_permission_granted_;
148 is_permission_granted_ = true; 139 is_permission_granted_ = true;
149 if (!was_permission_granted && IsStarted()) { 140 if (!was_permission_granted && IsStarted()) {
150 RequestRefresh(); 141 RequestPosition();
151 } 142 }
152 } 143 }
153 144
154 void NetworkLocationProvider::OnWifiDataUpdate() { 145 void NetworkLocationProvider::OnWifiDataUpdate() {
155 DCHECK(wifi_data_provider_manager_); 146 DCHECK(wifi_data_provider_manager_);
156 is_wifi_data_complete_ = wifi_data_provider_manager_->GetData(&wifi_data_); 147 is_wifi_data_complete_ = wifi_data_provider_manager_->GetData(&wifi_data_);
157 OnWifiDataUpdated(); 148 OnWifiDataUpdated();
158 } 149 }
159 150
160 void NetworkLocationProvider::OnLocationResponse( 151 void NetworkLocationProvider::OnLocationResponse(
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 if (is_wifi_data_complete_) 196 if (is_wifi_data_complete_)
206 OnWifiDataUpdated(); 197 OnWifiDataUpdated();
207 return true; 198 return true;
208 } 199 }
209 200
210 void NetworkLocationProvider::OnWifiDataUpdated() { 201 void NetworkLocationProvider::OnWifiDataUpdated() {
211 DCHECK(CalledOnValidThread()); 202 DCHECK(CalledOnValidThread());
212 wifi_timestamp_ = base::Time::Now(); 203 wifi_timestamp_ = base::Time::Now();
213 204
214 is_new_data_available_ = is_wifi_data_complete_; 205 is_new_data_available_ = is_wifi_data_complete_;
215 RequestRefresh(); 206 RequestPosition();
216 } 207 }
217 208
218 void NetworkLocationProvider::StopProvider() { 209 void NetworkLocationProvider::StopProvider() {
219 DCHECK(CalledOnValidThread()); 210 DCHECK(CalledOnValidThread());
220 if (IsStarted()) { 211 if (IsStarted()) {
221 wifi_data_provider_manager_->Unregister(&wifi_data_update_callback_); 212 wifi_data_provider_manager_->Unregister(&wifi_data_update_callback_);
222 } 213 }
223 wifi_data_provider_manager_ = nullptr; 214 wifi_data_provider_manager_ = nullptr;
224 weak_factory_.InvalidateWeakPtrs(); 215 weak_factory_.InvalidateWeakPtrs();
225 } 216 }
226 217
227 // Other methods 218 // Other methods
228 void NetworkLocationProvider::RequestPosition() { 219 void NetworkLocationProvider::RequestPosition() {
229 DCHECK(CalledOnValidThread()); 220 DCHECK(CalledOnValidThread());
221
222 // TODO(mcasas): consider not using HasWeakPtrs() https://crbug.com/629158.
223 if (weak_factory_.HasWeakPtrs() && !is_wifi_data_complete_)
224 return;
230 if (!is_new_data_available_) 225 if (!is_new_data_available_)
231 return; 226 return;
232 227
233 const Geoposition* cached_position = 228 const Geoposition* cached_position =
234 position_cache_->FindPosition(wifi_data_); 229 position_cache_->FindPosition(wifi_data_);
235 DCHECK(!wifi_timestamp_.is_null()) 230 DCHECK(!wifi_timestamp_.is_null())
236 << "Timestamp must be set before looking up position"; 231 << "Timestamp must be set before looking up position";
237 if (cached_position) { 232 if (cached_position) {
238 DCHECK(cached_position->Validate()); 233 DCHECK(cached_position->Validate());
239 // Record the position and update its timestamp. 234 // Record the position and update its timestamp.
240 position_ = *cached_position; 235 position_ = *cached_position;
236
241 // The timestamp of a position fix is determined by the timestamp 237 // The timestamp of a position fix is determined by the timestamp
242 // of the source data update. (The value of position_.timestamp from 238 // of the source data update. (The value of position_.timestamp from
243 // the cache could be from weeks ago!) 239 // the cache could be from weeks ago!)
244 position_.timestamp = wifi_timestamp_; 240 position_.timestamp = wifi_timestamp_;
245 is_new_data_available_ = false; 241 is_new_data_available_ = false;
242
246 // Let listeners know that we now have a position available. 243 // Let listeners know that we now have a position available.
247 NotifyCallback(position_); 244 NotifyCallback(position_);
248 return; 245 return;
249 } 246 }
250 // Don't send network requests until authorized. http://crbug.com/39171 247 // Don't send network requests until authorized. http://crbug.com/39171
251 if (!is_permission_granted_) 248 if (!is_permission_granted_)
252 return; 249 return;
253 250
254 weak_factory_.InvalidateWeakPtrs(); 251 weak_factory_.InvalidateWeakPtrs();
255 is_new_data_available_ = false; 252 is_new_data_available_ = false;
256 253
257 // TODO(joth): Rather than cancel pending requests, we should create a new 254 // TODO(joth): Rather than cancel pending requests, we should create a new
258 // NetworkLocationRequest for each and hold a set of pending requests. 255 // NetworkLocationRequest for each and hold a set of pending requests.
259 if (request_->is_request_pending()) { 256 if (request_->is_request_pending()) {
260 DVLOG(1) << "NetworkLocationProvider - pre-empting pending network request " 257 DVLOG(1) << "NetworkLocationProvider - pre-empting pending network request "
261 "with new data. Wifi APs: " 258 "with new data. Wifi APs: "
262 << wifi_data_.access_point_data.size(); 259 << wifi_data_.access_point_data.size();
263 } 260 }
264 request_->MakeRequest(access_token_, wifi_data_, wifi_timestamp_); 261 request_->MakeRequest(access_token_, wifi_data_, wifi_timestamp_);
265 } 262 }
266 263
267 bool NetworkLocationProvider::IsStarted() const { 264 bool NetworkLocationProvider::IsStarted() const {
268 return wifi_data_provider_manager_ != nullptr; 265 return wifi_data_provider_manager_ != nullptr;
269 } 266 }
270 267
271 } // namespace device 268 } // namespace device
OLDNEW
« no previous file with comments | « device/geolocation/network_location_provider.h ('k') | device/geolocation/network_location_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698