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

Unified Diff: chromeos/geolocation/simple_geolocation_request.cc

Issue 2624843003: Add support for cellular geolocation (Closed)
Patch Set: Update device tests to use correct dict key Created 3 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: chromeos/geolocation/simple_geolocation_request.cc
diff --git a/chromeos/geolocation/simple_geolocation_request.cc b/chromeos/geolocation/simple_geolocation_request.cc
index 1369458218cb3d21772ad81e43723fc673fe6409..ab15034468c4a7b91b889436b0c950019e7ac07d 100644
--- a/chromeos/geolocation/simple_geolocation_request.cc
+++ b/chromeos/geolocation/simple_geolocation_request.cc
@@ -41,30 +41,38 @@ namespace chromeos {
namespace {
-// The full request text. (no parameters are supported by now)
-const char kSimpleGeolocationRequestBody[] = "{\"considerIp\": \"true\"}";
-
-// Request data
-const char kConsiderIp[] = "considerIp";
-const char kWifiAccessPoints[] = "wifiAccessPoints";
-
+// Used if sending location signals (WiFi APs, cell towers, etc) is disabled.
+constexpr char kSimpleGeolocationRequestBody[] = "{\"considerIp\": \"true\"}";
+
+// Geolocation request field keys:
+// Top-level request data fields.
+constexpr char kConsiderIp[] = "considerIp";
+constexpr char kWifiAccessPoints[] = "wifiAccessPoints";
+constexpr char kCellTowers[] = "cellTowers";
+// Shared Wifi and Cell Tower objects.
+constexpr char kAge[] = "age";
+constexpr char kSignalStrength[] = "signalStrength";
// WiFi access point objects.
-const char kMacAddress[] = "macAddress";
-const char kSignalStrength[] = "signalStrength";
-const char kAge[] = "age";
-const char kChannel[] = "channel";
-const char kSignalToNoiseRatio[] = "signalToNoiseRatio";
-
-// Response data.
-const char kLocationString[] = "location";
-const char kLatString[] = "lat";
-const char kLngString[] = "lng";
-const char kAccuracyString[] = "accuracy";
+constexpr char kMacAddress[] = "macAddress";
+constexpr char kChannel[] = "channel";
+constexpr char kSignalToNoiseRatio[] = "signalToNoiseRatio";
+// Cell tower objects.
+constexpr char kCellId[] = "cellId";
+constexpr char kLocationAreaCode[] = "locationAreaCode";
+constexpr char kMobileCountryCode[] = "mobileCountryCode";
+constexpr char kMobileNetworkCode[] = "mobileNetworkCode";
+
+// Geolocation response field keys:
+constexpr char kLocationString[] = "location";
+constexpr char kLatString[] = "lat";
+constexpr char kLngString[] = "lng";
+constexpr char kAccuracyString[] = "accuracy";
+
// Error object and its contents.
-const char kErrorString[] = "error";
+constexpr char kErrorString[] = "error";
// "errors" array in "erorr" object is ignored.
-const char kCodeString[] = "code";
-const char kMessageString[] = "message";
+constexpr char kCodeString[] = "code";
+constexpr char kMessageString[] = "message";
// We are using "sparse" histograms for the number of retry attempts,
// so we need to explicitly limit maximum value (in case something goes wrong).
@@ -291,6 +299,52 @@ bool GetGeolocationFromResponse(bool http_success,
void ReportUmaHasWiFiAccessPoints(bool value) {
UMA_HISTOGRAM_BOOLEAN("SimpleGeolocation.Request.HasWiFiAccessPoints", value);
}
+void ReportUmaHasCellTowers(bool value) {
+ UMA_HISTOGRAM_BOOLEAN("SimpleGeolocation.Request.HasCellTowers", value);
+}
+
+// Helpers to reformat data into dictionaries for conversion to request JSON
+std::unique_ptr<base::DictionaryValue> CreateAccessPointDictionary(
+ WifiAccessPoint access_point) {
+ auto access_point_dictionary = base::MakeUnique<base::DictionaryValue>();
+
+ access_point_dictionary->SetStringWithoutPathExpansion(
+ kMacAddress, access_point.mac_address);
+ access_point_dictionary->SetIntegerWithoutPathExpansion(
+ kSignalStrength, access_point.signal_strength);
+ if (!access_point.timestamp.is_null()) {
+ access_point_dictionary->SetStringWithoutPathExpansion(
+ kAge,
+ base::Int64ToString(
+ (base::Time::Now() - access_point.timestamp).InMilliseconds()));
+ }
+
+ access_point_dictionary->SetIntegerWithoutPathExpansion(kChannel,
+ access_point.channel);
+ access_point_dictionary->SetIntegerWithoutPathExpansion(
+ kSignalToNoiseRatio, access_point.signal_to_noise);
+
+ return access_point_dictionary;
+}
+
+std::unique_ptr<base::DictionaryValue> CreateCellTowerDictionary(
+ CellTower cell_tower) {
+ auto cell_tower_dictionary = base::MakeUnique<base::DictionaryValue>();
+ cell_tower_dictionary->SetStringWithoutPathExpansion(kCellId, cell_tower.ci);
+ cell_tower_dictionary->SetStringWithoutPathExpansion(kLocationAreaCode,
+ cell_tower.lac);
+ cell_tower_dictionary->SetStringWithoutPathExpansion(kMobileCountryCode,
+ cell_tower.mcc);
+ cell_tower_dictionary->SetStringWithoutPathExpansion(kMobileNetworkCode,
+ cell_tower.mnc);
+
+ if (!cell_tower.timestamp.is_null()) {
+ cell_tower_dictionary->SetStringWithoutPathExpansion(
+ kAge, base::Int64ToString(
+ (base::Time::Now() - cell_tower.timestamp).InMilliseconds()));
+ }
+ return cell_tower_dictionary;
+}
} // namespace
@@ -298,7 +352,8 @@ SimpleGeolocationRequest::SimpleGeolocationRequest(
net::URLRequestContextGetter* url_context_getter,
const GURL& service_url,
base::TimeDelta timeout,
- std::unique_ptr<WifiAccessPointVector> wifi_data)
+ std::unique_ptr<WifiAccessPointVector> wifi_data,
+ std::unique_ptr<CellTowerVector> cell_tower_data)
: url_context_getter_(url_context_getter),
service_url_(service_url),
retry_sleep_on_server_error_(base::TimeDelta::FromSeconds(
@@ -307,7 +362,8 @@ SimpleGeolocationRequest::SimpleGeolocationRequest(
kResolveGeolocationRetrySleepBadResponseSeconds)),
timeout_(timeout),
retries_(0),
- wifi_data_(wifi_data.release()) {}
+ wifi_data_(wifi_data.release()),
+ cell_tower_data_(cell_tower_data.release()) {}
SimpleGeolocationRequest::~SimpleGeolocationRequest() {
DCHECK(thread_checker_.CalledOnValidThread());
@@ -323,44 +379,51 @@ SimpleGeolocationRequest::~SimpleGeolocationRequest() {
}
std::string SimpleGeolocationRequest::FormatRequestBody() const {
- if (!wifi_data_) {
+ if (!wifi_data_)
ReportUmaHasWiFiAccessPoints(false);
+
+ if (!cell_tower_data_)
+ ReportUmaHasCellTowers(false);
+
+ if (!cell_tower_data_ && !wifi_data_)
return std::string(kSimpleGeolocationRequestBody);
- }
std::unique_ptr<base::DictionaryValue> request(new base::DictionaryValue);
request->SetBooleanWithoutPathExpansion(kConsiderIp, true);
- base::ListValue* wifi_access_points(new base::ListValue);
- request->SetWithoutPathExpansion(kWifiAccessPoints, wifi_access_points);
-
- for (const WifiAccessPoint& access_point : *wifi_data_) {
- auto access_point_dictionary = base::MakeUnique<base::DictionaryValue>();
-
- access_point_dictionary->SetStringWithoutPathExpansion(
- kMacAddress, access_point.mac_address);
- access_point_dictionary->SetIntegerWithoutPathExpansion(
- kSignalStrength, access_point.signal_strength);
- if (!access_point.timestamp.is_null()) {
- access_point_dictionary->SetStringWithoutPathExpansion(
- kAge,
- base::Int64ToString(
- (base::Time::Now() - access_point.timestamp).InMilliseconds()));
+ if (wifi_data_) {
+ auto wifi_access_points = base::MakeUnique<base::ListValue>();
+ for (const WifiAccessPoint& access_point : *wifi_data_) {
+ wifi_access_points->Append(CreateAccessPointDictionary(access_point));
}
+ request->SetWithoutPathExpansion(kWifiAccessPoints,
+ std::move(wifi_access_points));
+ }
- access_point_dictionary->SetIntegerWithoutPathExpansion(
- kChannel, access_point.channel);
- access_point_dictionary->SetIntegerWithoutPathExpansion(
- kSignalToNoiseRatio, access_point.signal_to_noise);
-
- wifi_access_points->Append(std::move(access_point_dictionary));
+ if (cell_tower_data_) {
+ auto cell_towers = base::MakeUnique<base::ListValue>();
+ for (const CellTower& cell_tower : *cell_tower_data_) {
+ cell_towers->Append(CreateCellTowerDictionary(cell_tower));
+ }
+ request->SetWithoutPathExpansion(kCellTowers, std::move(cell_towers));
}
+
std::string result;
if (!base::JSONWriter::Write(*request, &result)) {
- ReportUmaHasWiFiAccessPoints(false);
+ // If there's no data for a network type, we will have already reported
+ // false above
+ if (wifi_data_)
+ ReportUmaHasWiFiAccessPoints(false);
+ if (cell_tower_data_)
+ ReportUmaHasCellTowers(false);
+
return std::string(kSimpleGeolocationRequestBody);
}
- ReportUmaHasWiFiAccessPoints(wifi_data_->size());
+
+ if (wifi_data_)
+ ReportUmaHasWiFiAccessPoints(wifi_data_->size());
+ if (cell_tower_data_)
+ ReportUmaHasCellTowers(cell_tower_data_->size());
return result;
}
« no previous file with comments | « chromeos/geolocation/simple_geolocation_request.h ('k') | chromeos/geolocation/simple_geolocation_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698