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

Unified Diff: chrome/browser/ui/ash/metrics/stylus_metrics_recorder.cc

Issue 2331093002: UMA stats for stylus usage (Closed)
Patch Set: Created 4 years, 3 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: chrome/browser/ui/ash/metrics/stylus_metrics_recorder.cc
diff --git a/chrome/browser/ui/ash/metrics/stylus_metrics_recorder.cc b/chrome/browser/ui/ash/metrics/stylus_metrics_recorder.cc
new file mode 100644
index 0000000000000000000000000000000000000000..9202bc94ee3114e284dd8f0fc89cb0b7ad0fec10
--- /dev/null
+++ b/chrome/browser/ui/ash/metrics/stylus_metrics_recorder.cc
@@ -0,0 +1,135 @@
+// Copyright 2016 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/ui/ash/metrics/stylus_metrics_recorder.h"
+
+#include "ash/common/shell_window_ids.h"
+#include "ash/common/wm/container_finder.h"
+#include "ash/common/wm/maximize_mode/maximize_mode_controller.h"
+#include "ash/common/wm_lookup.h"
+#include "ash/common/wm_shell.h"
+#include "ash/common/wm_window.h"
+#include "base/metrics/histogram_macros.h"
+#include "chrome/browser/apps/app_window_registry_util.h"
+#include "chrome/browser/chromeos/note_taking_app_utils.h"
+#include "components/exo/shell_surface.h"
+#include "extensions/browser/app_window/app_window.h"
+#include "ui/events/event_constants.h"
+#include "ui/views/widget/widget.h"
+
+namespace chromeos {
+
+StylusMetricsRecorder::StylusMetricsRecorder() {
+ ash::WmShell::Get()->AddPointerWatcher(
+ this, views::PointerWatcherEventTypes::BASIC);
+}
+
+StylusMetricsRecorder::~StylusMetricsRecorder() {
+ ash::WmShell::Get()->RemovePointerWatcher(this);
+}
+
+void StylusMetricsRecorder::OnPointerEventObserved(
+ const ui::PointerEvent& event,
+ const gfx::Point& location_in_screen,
+ views::Widget* target) {
+ if (event.type() != ui::ET_POINTER_DOWN)
+ return;
+ RecordUMA(event.pointer_details().pointer_type, target);
+}
+
+void StylusMetricsRecorder::RecordUMA(ui::EventPointerType type,
+ views::Widget* target) {
+ DownEventFormFactor form_factor = DOWN_EVENT_FORMFACTOR_CLAMSHELL;
+ if (ash::WmShell::Get()
+ ->maximize_mode_controller()
+ ->IsMaximizeModeWindowManagerEnabled()) {
+ form_factor = DOWN_EVENT_FORMFACTOR_TOUCHVIEW;
+ }
+ UMA_HISTOGRAM_ENUMERATION("Event.DownEventCount.PerFormFactor", form_factor,
+ DOWN_EVENT_FORMFACTOR_COUNT);
+
+ DownEventSource input_type = DOWN_EVENT_SOURCE_UNKNOWN;
+ switch (type) {
+ case ui::EventPointerType::POINTER_TYPE_UNKNOWN:
+ input_type = DOWN_EVENT_SOURCE_UNKNOWN;
+ break;
+ case ui::EventPointerType::POINTER_TYPE_MOUSE:
+ input_type = DOWN_EVENT_SOURCE_MOUSE;
+ break;
+ case ui::EventPointerType::POINTER_TYPE_PEN:
+ input_type = DOWN_EVENT_SOURCE_STYLUS;
+ break;
+ case ui::EventPointerType::POINTER_TYPE_TOUCH:
+ input_type = DOWN_EVENT_SOURCE_TOUCH;
+ break;
+ case ui::EventPointerType::POINTER_TYPE_ERASER:
+ input_type = DOWN_EVENT_SOURCE_STYLUS;
+ break;
+ }
+
+ UMA_HISTOGRAM_ENUMERATION("Event.DownEventCount.PerInput", input_type,
+ DOWN_EVENT_SOURCE_COUNT);
+
+ DownEventDestination dest = GetDownEventDestination(target);
+ UMA_HISTOGRAM_ENUMERATION("Event.DownEventCount.PerDestination", dest,
+ DOWN_EVENT_DESTINATION_COUNT);
+}
+
+bool StylusMetricsRecorder::IsEventOnShelf(views::Widget* target) {
+ if (!target) {
sky 2016/09/13 00:03:26 In general we don't use {} around single line cond
xiaoyinh(OOO Sep 11-29) 2016/09/16 18:41:16 Done.
+ return false;
+ }
+
+ ash::WmWindow* window = ash::WmLookup::Get()->GetWindowForWidget(target);
+ int container_id = ash::wm::GetContainerForWindow(window)->GetShellWindowId();
sky 2016/09/13 00:03:26 Make sure you null check GetContainerForWindow and
xiaoyinh(OOO Sep 11-29) 2016/09/16 18:41:16 Done.
+
+ // Events on the shelf.
+ if (container_id == ash::kShellWindowId_ShelfContainer)
+ return true;
+ // Events on the status area.
+ if (container_id == ash::kShellWindowId_StatusContainer)
+ return true;
+ // Events on the right click menus.
+ if (container_id == ash::kShellWindowId_MenuContainer)
sky 2016/09/13 00:03:26 This hits *all* menus. I don't think you want that
xiaoyinh(OOO Sep 11-29) 2016/09/16 18:41:16 Deleted. Thanks.
+ return true;
+ // Events on the settings trays.
+ if (container_id == ash::kShellWindowId_SettingBubbleContainer)
+ return true;
+ // Events on the overflow bubbles over the shelf.
+ if (container_id == ash::kShellWindowId_ShelfBubbleContainer)
+ return true;
+
+ return false;
+}
+
+DownEventDestination StylusMetricsRecorder::GetDownEventDestination(
+ views::Widget* target) {
+ DownEventDestination dest = DOWN_EVENT_DESTINATION_OTHERS;
+ if (!target)
+ return dest;
+
+ if (IsEventOnShelf(target))
+ return DOWN_EVENT_DESTINATION_SYSTEM_UI;
+
+ aura::Window* window = target->GetNativeWindow();
+
+ if (exo::ShellSurface::GetMainSurface(window))
+ return DOWN_EVENT_DESTINATION_ARC_APP;
+
+ if (window->GetProperty(aura::client::kStylusWindowTypeBucket) ==
xiyuan 2016/09/12 20:15:47 nit: save the result of window->GetProperty(aura::
xiaoyinh(OOO Sep 11-29) 2016/09/16 18:41:16 Done.
+ StylusWindowType::WINDOW_TYPE_BROWSER_WINDOW)
+ return DOWN_EVENT_DESTINATION_WEBSITE;
+
+ if (window->GetProperty(aura::client::kStylusWindowTypeBucket) ==
+ StylusWindowType::WINDOW_TYPE_APP) {
+ extensions::AppWindow* app_window =
+ AppWindowRegistryUtil::GetAppWindowForNativeWindowAnyProfile(window);
+ if (app_window && chromeos::IsCurrentAppNoteTakingApp(app_window))
+ return DOWN_EVENT_DESTINATION_NOTE_TAKING_APP;
+ }
+
+ return dest;
+}
+
+} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698