chromeos_metrics_provider.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
12ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Copyright 2014 The Chromium Authors. All rights reserved. 22ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Use of this source code is governed by a BSD-style license that can be 32ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// found in the LICENSE file. 42ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 52ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "chrome/browser/metrics/chromeos_metrics_provider.h" 62ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 72ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "base/prefs/pref_registry_simple.h" 82ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "base/prefs/pref_service.h" 92ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "base/strings/string_number_conversions.h" 102ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "base/strings/string_util.h" 112ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "base/strings/utf_string_conversions.h" 122ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "chrome/browser/browser_process.h" 132ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "chrome/browser/chromeos/login/users/user_manager.h" 142ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "chrome/browser/metrics/metrics_service.h" 152ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "chrome/common/pref_names.h" 162ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "chromeos/system/statistics_provider.h" 172ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "components/metrics/proto/chrome_user_metrics_extension.pb.h" 182ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "content/public/browser/browser_thread.h" 192ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "device/bluetooth/bluetooth_adapter.h" 202ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "device/bluetooth/bluetooth_adapter_factory.h" 212ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "device/bluetooth/bluetooth_device.h" 222ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "ui/events/event_utils.h" 232ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "ui/gfx/screen.h" 242ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 252ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#if defined(USE_X11) 262ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "ui/events/x/touch_factory_x11.h" 272ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#endif // defined(USE_X11) 282ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 292ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing metrics::ChromeUserMetricsExtension; 302ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing metrics::SampledProfile; 312ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonusing metrics::SystemProfileProto; 322ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsontypedef SystemProfileProto::Hardware::Bluetooth::PairedDevice PairedDevice; 332ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 342ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonnamespace { 352ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 362ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonPairedDevice::Type AsBluetoothDeviceType( 372ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson device::BluetoothDevice::DeviceType device_type) { 382ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson switch (device_type) { 392ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson case device::BluetoothDevice::DEVICE_UNKNOWN: 402ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_UNKNOWN; 412ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson case device::BluetoothDevice::DEVICE_COMPUTER: 422ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_COMPUTER; 432ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson case device::BluetoothDevice::DEVICE_PHONE: 442ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_PHONE; 452ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson case device::BluetoothDevice::DEVICE_MODEM: 462ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_MODEM; 472ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson case device::BluetoothDevice::DEVICE_AUDIO: 482ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_AUDIO; 492ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson case device::BluetoothDevice::DEVICE_CAR_AUDIO: 502ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_CAR_AUDIO; 512ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson case device::BluetoothDevice::DEVICE_VIDEO: 522ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_VIDEO; 532ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson case device::BluetoothDevice::DEVICE_PERIPHERAL: 542ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_PERIPHERAL; 552ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson case device::BluetoothDevice::DEVICE_JOYSTICK: 562ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_JOYSTICK; 572ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson case device::BluetoothDevice::DEVICE_GAMEPAD: 582ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_GAMEPAD; 592ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson case device::BluetoothDevice::DEVICE_KEYBOARD: 602ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_KEYBOARD; 612ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson case device::BluetoothDevice::DEVICE_MOUSE: 622ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_MOUSE; 632ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson case device::BluetoothDevice::DEVICE_TABLET: 642ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_TABLET; 652ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson case device::BluetoothDevice::DEVICE_KEYBOARD_MOUSE_COMBO: 662ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_KEYBOARD_MOUSE_COMBO; 672ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson } 682ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 692ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson NOTREACHED(); 702ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson return PairedDevice::DEVICE_UNKNOWN; 712ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} 722ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 732ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid WriteExternalTouchscreensProto(SystemProfileProto::Hardware* hardware) { 742ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#if defined(USE_X11) 752ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson std::set<std::pair<int, int> > touchscreen_ids = 762ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson ui::TouchFactory::GetInstance()->GetTouchscreenIds(); 772ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson for (std::set<std::pair<int, int> >::iterator it = touchscreen_ids.begin(); 782ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson it != touchscreen_ids.end(); 792ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson ++it) { 802ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson SystemProfileProto::Hardware::TouchScreen* touchscreen = 812ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson hardware->add_external_touchscreen(); 822ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson touchscreen->set_vendor_id(it->first); 832ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson touchscreen->set_product_id(it->second); 842ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson } 852ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#endif // defined(USE_X11) 862ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} 872ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 882ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid IncrementPrefValue(const char* path) { 892ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson PrefService* pref = g_browser_process->local_state(); 902ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson DCHECK(pref); 912ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson int value = pref->GetInteger(path); 922ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson pref->SetInteger(path, value + 1); 932ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} 942ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 952ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} // namespace 962ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 972ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonChromeOSMetricsProvider::ChromeOSMetricsProvider() 982ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson : registered_user_count_at_log_initialization_(false), 992ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson user_count_at_log_initialization_(0), 1002ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson weak_ptr_factory_(this) { 1012ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} 1022ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1032ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonChromeOSMetricsProvider::~ChromeOSMetricsProvider() { 1042ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} 1052ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1062ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// static 1072ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid ChromeOSMetricsProvider::RegisterPrefs(PrefRegistrySimple* registry) { 1082ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson registry->RegisterIntegerPref(prefs::kStabilityOtherUserCrashCount, 0); 1092ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson registry->RegisterIntegerPref(prefs::kStabilityKernelCrashCount, 0); 1102ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson registry->RegisterIntegerPref(prefs::kStabilitySystemUncleanShutdownCount, 0); 1112ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} 1122ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1132ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// static 1142ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid ChromeOSMetricsProvider::LogCrash(const std::string& crash_type) { 1152ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson if (crash_type == "user") 1162ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson IncrementPrefValue(prefs::kStabilityOtherUserCrashCount); 1172ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson else if (crash_type == "kernel") 1182ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson IncrementPrefValue(prefs::kStabilityKernelCrashCount); 1192ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson else if (crash_type == "uncleanshutdown") 1202ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson IncrementPrefValue(prefs::kStabilitySystemUncleanShutdownCount); 1212ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson else 1222ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson NOTREACHED() << "Unexpected Chrome OS crash type " << crash_type; 1232ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1242ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson // Wake up metrics logs sending if necessary now that new 1252ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson // log data is available. 1262ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson g_browser_process->metrics_service()->OnApplicationNotIdle(); 1272ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} 1282ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1292ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid ChromeOSMetricsProvider::OnDidCreateMetricsLog() { 1302ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson registered_user_count_at_log_initialization_ = false; 1312ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson if (chromeos::UserManager::IsInitialized()) { 1322ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson registered_user_count_at_log_initialization_ = true; 1332ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson user_count_at_log_initialization_ = 1342ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson chromeos::UserManager::Get()->GetLoggedInUsers().size(); 1352ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson } 1362ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} 1372ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1382ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid ChromeOSMetricsProvider::InitTaskGetHardwareClass( 1392ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson const base::Closure& callback) { 1402ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson // Run the (potentially expensive) task on the FILE thread to avoid blocking 1412ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson // the UI thread. 1422ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson content::BrowserThread::PostTaskAndReply( 1432ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson content::BrowserThread::FILE, 1442ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson FROM_HERE, 1452ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson base::Bind(&ChromeOSMetricsProvider::InitTaskGetHardwareClassOnFileThread, 1462ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson weak_ptr_factory_.GetWeakPtr()), 1472ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson callback); 1482ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} 1492ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 1502ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid ChromeOSMetricsProvider::InitTaskGetHardwareClassOnFileThread() { 1512ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); 1522ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson chromeos::system::StatisticsProvider::GetInstance()->GetMachineStatistic( 1532ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson "hardware_class", &hardware_class_); 1542ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson} 1552ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 156void ChromeOSMetricsProvider::ProvideSystemProfileMetrics( 157 metrics::SystemProfileProto* system_profile_proto) { 158 WriteBluetoothProto(system_profile_proto); 159 UpdateMultiProfileUserCount(system_profile_proto); 160 161 metrics::SystemProfileProto::Hardware* hardware = 162 system_profile_proto->mutable_hardware(); 163 hardware->set_hardware_class(hardware_class_); 164 gfx::Display::TouchSupport has_touch = ui::GetInternalDisplayTouchSupport(); 165 if (has_touch == gfx::Display::TOUCH_SUPPORT_AVAILABLE) 166 hardware->set_internal_display_supports_touch(true); 167 else if (has_touch == gfx::Display::TOUCH_SUPPORT_UNAVAILABLE) 168 hardware->set_internal_display_supports_touch(false); 169 WriteExternalTouchscreensProto(hardware); 170} 171 172void ChromeOSMetricsProvider::ProvideStabilityMetrics( 173 metrics::SystemProfileProto* system_profile_proto) { 174 metrics::SystemProfileProto::Stability* stability_proto = 175 system_profile_proto->mutable_stability(); 176 PrefService* pref = g_browser_process->local_state(); 177 int count = pref->GetInteger(prefs::kStabilityOtherUserCrashCount); 178 if (count) { 179 stability_proto->set_other_user_crash_count(count); 180 pref->SetInteger(prefs::kStabilityOtherUserCrashCount, 0); 181 } 182 183 count = pref->GetInteger(prefs::kStabilityKernelCrashCount); 184 if (count) { 185 stability_proto->set_kernel_crash_count(count); 186 pref->SetInteger(prefs::kStabilityKernelCrashCount, 0); 187 } 188 189 count = pref->GetInteger(prefs::kStabilitySystemUncleanShutdownCount); 190 if (count) { 191 stability_proto->set_unclean_system_shutdown_count(count); 192 pref->SetInteger(prefs::kStabilitySystemUncleanShutdownCount, 0); 193 } 194} 195 196void ChromeOSMetricsProvider::ProvideGeneralMetrics( 197 metrics::ChromeUserMetricsExtension* uma_proto) { 198 std::vector<SampledProfile> sampled_profiles; 199 if (perf_provider_.GetSampledProfiles(&sampled_profiles)) { 200 for (std::vector<SampledProfile>::iterator iter = sampled_profiles.begin(); 201 iter != sampled_profiles.end(); 202 ++iter) { 203 uma_proto->add_sampled_profile()->Swap(&(*iter)); 204 } 205 } 206} 207 208void ChromeOSMetricsProvider::WriteBluetoothProto( 209 metrics::SystemProfileProto* system_profile_proto) { 210 metrics::SystemProfileProto::Hardware* hardware = 211 system_profile_proto->mutable_hardware(); 212 213 // BluetoothAdapterFactory::GetAdapter is synchronous on Chrome OS; if that 214 // changes this will fail at the DCHECK(). 215 device::BluetoothAdapterFactory::GetAdapter(base::Bind( 216 &ChromeOSMetricsProvider::SetBluetoothAdapter, base::Unretained(this))); 217 DCHECK(adapter_.get()); 218 219 SystemProfileProto::Hardware::Bluetooth* bluetooth = 220 hardware->mutable_bluetooth(); 221 222 bluetooth->set_is_present(adapter_->IsPresent()); 223 bluetooth->set_is_enabled(adapter_->IsPowered()); 224 225 device::BluetoothAdapter::DeviceList devices = adapter_->GetDevices(); 226 for (device::BluetoothAdapter::DeviceList::iterator iter = devices.begin(); 227 iter != devices.end(); 228 ++iter) { 229 device::BluetoothDevice* device = *iter; 230 // Don't collect information about LE devices yet. 231 if (!device->IsPaired()) 232 continue; 233 234 PairedDevice* paired_device = bluetooth->add_paired_device(); 235 paired_device->set_bluetooth_class(device->GetBluetoothClass()); 236 paired_device->set_type(AsBluetoothDeviceType(device->GetDeviceType())); 237 238 // |address| is xx:xx:xx:xx:xx:xx, extract the first three components and 239 // pack into a uint32. 240 std::string address = device->GetAddress(); 241 if (address.size() > 9 && address[2] == ':' && address[5] == ':' && 242 address[8] == ':') { 243 std::string vendor_prefix_str; 244 uint64 vendor_prefix; 245 246 base::RemoveChars(address.substr(0, 9), ":", &vendor_prefix_str); 247 DCHECK_EQ(6U, vendor_prefix_str.size()); 248 base::HexStringToUInt64(vendor_prefix_str, &vendor_prefix); 249 250 paired_device->set_vendor_prefix(vendor_prefix); 251 } 252 253 switch (device->GetVendorIDSource()) { 254 case device::BluetoothDevice::VENDOR_ID_BLUETOOTH: 255 paired_device->set_vendor_id_source(PairedDevice::VENDOR_ID_BLUETOOTH); 256 break; 257 case device::BluetoothDevice::VENDOR_ID_USB: 258 paired_device->set_vendor_id_source(PairedDevice::VENDOR_ID_USB); 259 break; 260 default: 261 paired_device->set_vendor_id_source(PairedDevice::VENDOR_ID_UNKNOWN); 262 } 263 264 paired_device->set_vendor_id(device->GetVendorID()); 265 paired_device->set_product_id(device->GetProductID()); 266 paired_device->set_device_id(device->GetDeviceID()); 267 } 268} 269 270void ChromeOSMetricsProvider::UpdateMultiProfileUserCount( 271 metrics::SystemProfileProto* system_profile_proto) { 272 if (chromeos::UserManager::IsInitialized()) { 273 size_t user_count = chromeos::UserManager::Get()->GetLoggedInUsers().size(); 274 275 // We invalidate the user count if it changed while the log was open. 276 if (registered_user_count_at_log_initialization_ && 277 user_count != user_count_at_log_initialization_) { 278 user_count = 0; 279 } 280 281 system_profile_proto->set_multi_profile_user_count(user_count); 282 } 283} 284 285void ChromeOSMetricsProvider::SetBluetoothAdapter( 286 scoped_refptr<device::BluetoothAdapter> adapter) { 287 adapter_ = adapter; 288} 289