root/chrome/browser/chromeos/device_uma.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. GetInstance
  2. Stop
  3. AddMessageLoopObserver
  4. RemoveMessageLoopObserver
  5. WillProcessEvent
  6. DidProcessEvent
  7. CheckTouchpadEvent
  8. CheckIncomingEvent

// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/chromeos/device_uma.h"

#include <X11/extensions/XInput.h>
#include <X11/extensions/XInput2.h>

#include "base/logging.h"
#include "base/memory/singleton.h"
#include "base/metrics/histogram.h"
#include "ui/events/event_constants.h"
#include "ui/events/event_utils.h"
#include "ui/events/x/device_data_manager.h"

// Enum type for CrOS gesture lib UMA
enum UMACrosGestureMetricsType{
  // To give an estimated number of all interested events.
  UMA_CROS_GESTURE_METRICS_ALL_EVENTS,
  UMA_CROS_GESTURE_METRICS_NOISY_GROUND,
  // NOTE: Add states only immediately above this line. Make sure to
  // update the enum list in tools/metrics/histograms/histograms.xml
  // accordingly.
  UMA_CROS_GESTURE_METRICS_COUNT
};

namespace chromeos {

DeviceUMA* DeviceUMA::GetInstance() {
  return Singleton<DeviceUMA>::get();
}

DeviceUMA::DeviceUMA()
    :is_observing_(false) {
  AddMessageLoopObserver();
}

DeviceUMA::~DeviceUMA() {
  RemoveMessageLoopObserver();
}

void DeviceUMA::Stop() {
  RemoveMessageLoopObserver();
}

void DeviceUMA::AddMessageLoopObserver() {
  if (!is_observing_) {
    base::MessageLoopForUI::current()->AddObserver(this);
    is_observing_ = true;
  }
}

void DeviceUMA::RemoveMessageLoopObserver() {
  if (is_observing_) {
    base::MessageLoopForUI::current()->RemoveObserver(this);
    is_observing_ = false;
  }
}

base::EventStatus DeviceUMA::WillProcessEvent(
    const base::NativeEvent& event) {
  CheckIncomingEvent(event);
  return base::EVENT_CONTINUE;
}

void DeviceUMA::DidProcessEvent(
    const base::NativeEvent& event) {
}

void DeviceUMA::CheckTouchpadEvent(const base::NativeEvent& native_event) {
  XIDeviceEvent* xiev =
      static_cast<XIDeviceEvent*>(native_event->xcookie.data);
  // We take only the slave event since there is no need to count twice.
  if (xiev->deviceid != xiev->sourceid)
    return;
  UMA_HISTOGRAM_ENUMERATION("Touchpad.Metrics",
                            UMA_CROS_GESTURE_METRICS_ALL_EVENTS,
                            UMA_CROS_GESTURE_METRICS_COUNT);

  // Check for the CrOS touchpad metrics gesture
  ui::DeviceDataManager *manager = ui::DeviceDataManager::GetInstance();
  if (manager->IsCMTMetricsEvent(native_event)) {
    ui::GestureMetricsType type;
    float data1, data2;
    manager->GetMetricsData(native_event, &type, &data1, &data2);

    // We currently track only the noisy ground issue. Please see
    // http://crbug.com/237683.
    if (type == ui::kGestureMetricsTypeNoisyGround) {
      UMA_HISTOGRAM_ENUMERATION("Touchpad.Metrics",
                                UMA_CROS_GESTURE_METRICS_NOISY_GROUND,
                                UMA_CROS_GESTURE_METRICS_COUNT);
    }
  }
}

void DeviceUMA::CheckIncomingEvent(const base::NativeEvent& event) {
  switch (event->type) {
    case GenericEvent: {
      if (ui::DeviceDataManager::GetInstance()->IsXIDeviceEvent(event) &&
          ui::IsTouchpadEvent(event))
        CheckTouchpadEvent(event);
      break;
    }
    default:
      break;
  }
  return;
}

}  // namespace chromeos

/* [<][>][^][v][top][bottom][index][help] */