1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/browser/geolocation/wifi_data.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <algorithm>
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/logging.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace content {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AccessPointData::AccessPointData()
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : radio_signal_strength(kint32min),
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      channel(kint32min),
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      signal_to_noise(kint32min) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AccessPointData::~AccessPointData() {}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WifiData::WifiData() {}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WifiData::~WifiData() {}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WifiData::DiffersSignificantly(const WifiData& other) const {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // More than 4 or 50% of access points added or removed is significant.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t kMinChangedAccessPoints = 4;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t min_ap_count =
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::min(access_point_data.size(), other.access_point_data.size());
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t max_ap_count =
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::max(access_point_data.size(), other.access_point_data.size());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t difference_threadhold = std::min(kMinChangedAccessPoints,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                min_ap_count / 2);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max_ap_count > min_ap_count + difference_threadhold)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Compute size of intersection of old and new sets.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t num_common = 0;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (AccessPointDataSet::const_iterator iter = access_point_data.begin();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != access_point_data.end();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter++) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (other.access_point_data.find(*iter) !=
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        other.access_point_data.end()) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++num_common;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(num_common <= min_ap_count);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test how many have changed.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return max_ap_count > num_common + difference_threadhold;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
53