OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "content/browser/geolocation/geolocation_service_impl.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/metrics/histogram.h" | |
9 #include "content/browser/geolocation/geolocation_service_context.h" | |
10 #include "content/public/common/mojo_geoposition.mojom.h" | |
11 | |
12 namespace content { | |
13 | |
14 namespace { | |
15 | |
16 // Geoposition error codes for reporting in UMA. | |
17 enum GeopositionErrorCode { | |
18 // NOTE: Do not renumber these as that would confuse interpretation of | |
19 // previously logged data. When making changes, also update the enum list | |
20 // in tools/metrics/histograms/histograms.xml to keep it in sync. | |
21 | |
22 // There was no error. | |
23 GEOPOSITION_ERROR_CODE_NONE = 0, | |
24 | |
25 // User denied use of geolocation. | |
26 GEOPOSITION_ERROR_CODE_PERMISSION_DENIED = 1, | |
27 | |
28 // Geoposition could not be determined. | |
29 GEOPOSITION_ERROR_CODE_POSITION_UNAVAILABLE = 2, | |
30 | |
31 // Timeout. | |
32 GEOPOSITION_ERROR_CODE_TIMEOUT = 3, | |
33 | |
34 // NOTE: Add entries only immediately above this line. | |
35 GEOPOSITION_ERROR_CODE_COUNT = 4 | |
36 }; | |
37 | |
38 void RecordGeopositionErrorCode(Geoposition::ErrorCode error_code) { | |
39 GeopositionErrorCode code = GEOPOSITION_ERROR_CODE_NONE; | |
40 switch (error_code) { | |
41 case Geoposition::ERROR_CODE_NONE: | |
42 code = GEOPOSITION_ERROR_CODE_NONE; | |
43 break; | |
44 case Geoposition::ERROR_CODE_PERMISSION_DENIED: | |
45 code = GEOPOSITION_ERROR_CODE_PERMISSION_DENIED; | |
46 break; | |
47 case Geoposition::ERROR_CODE_POSITION_UNAVAILABLE: | |
48 code = GEOPOSITION_ERROR_CODE_POSITION_UNAVAILABLE; | |
49 break; | |
50 case Geoposition::ERROR_CODE_TIMEOUT: | |
51 code = GEOPOSITION_ERROR_CODE_TIMEOUT; | |
52 break; | |
53 } | |
54 UMA_HISTOGRAM_ENUMERATION("Geolocation.LocationUpdate.ErrorCode", | |
55 code, | |
56 GEOPOSITION_ERROR_CODE_COUNT); | |
57 } | |
58 | |
59 } // namespace | |
60 | |
61 GeolocationServiceImpl::GeolocationServiceImpl( | |
62 GeolocationServiceContext* context, | |
63 const base::Closure& update_callback) | |
64 : context_(context), update_callback_(update_callback) { | |
65 DCHECK(context_); | |
66 } | |
67 | |
68 GeolocationServiceImpl::~GeolocationServiceImpl() { | |
69 } | |
70 | |
71 void GeolocationServiceImpl::PauseUpdates() { | |
72 geolocation_subscription_.reset(); | |
73 } | |
74 | |
75 void GeolocationServiceImpl::ResumeUpdates() { | |
76 StartListeningForUpdates(); | |
77 } | |
78 | |
79 void GeolocationServiceImpl::StartListeningForUpdates() { | |
80 geolocation_subscription_ = | |
81 GeolocationProvider::GetInstance()->AddLocationUpdateCallback( | |
82 base::Bind(&GeolocationServiceImpl::OnLocationUpdate, | |
83 base::Unretained(this)), | |
84 high_accuracy_); | |
85 } | |
86 | |
87 void GeolocationServiceImpl::StartUpdating(bool high_accuracy) { | |
88 // TODO(blundell): What does this comment even mean? | |
Michael van Ouwerkerk
2014/10/09 13:11:23
Yeah let's delete this comment.
blundell
2014/10/21 12:27:49
Done.
| |
89 // StartUpdating() can be invoked as a result of high-accuracy mode | |
90 // being enabled / disabled. No need to record the dispatcher again. | |
91 UMA_HISTOGRAM_BOOLEAN( | |
92 "Geolocation.GeolocationDispatcherHostImpl.EnableHighAccuracy", | |
93 high_accuracy); | |
94 high_accuracy_ = high_accuracy; | |
95 StartListeningForUpdates(); | |
96 } | |
97 | |
98 void GeolocationServiceImpl::OnConnectionError() { | |
99 context_->ServiceHadConnectionError(this); | |
100 | |
101 // The above call deleted this instance, so the only safe thing to do is | |
102 // return. | |
103 } | |
104 | |
105 void GeolocationServiceImpl::OnLocationUpdate(const Geoposition& position) { | |
106 RecordGeopositionErrorCode(position.error_code); | |
107 DCHECK(context_); | |
108 if (context_->paused()) | |
109 return; | |
110 | |
111 MojoGeopositionPtr geoposition(MojoGeoposition::New()); | |
112 geoposition->valid = position.Validate(); | |
113 geoposition->latitude = position.latitude; | |
114 geoposition->longitude = position.longitude; | |
115 geoposition->altitude = position.altitude; | |
116 geoposition->accuracy = position.accuracy; | |
117 geoposition->altitude_accuracy = position.altitude_accuracy; | |
118 geoposition->heading = position.heading; | |
119 geoposition->speed = position.speed; | |
120 geoposition->timestamp = position.timestamp.ToDoubleT(); | |
121 geoposition->error_code = MojoGeoposition::ErrorCode(position.error_code); | |
122 geoposition->error_message = position.error_message; | |
123 | |
124 update_callback_.Run(); | |
125 client()->OnLocationUpdate(geoposition.Pass()); | |
126 } | |
127 | |
128 } // namespace content | |
OLD | NEW |