Commit e01f1bfe authored by Daniel Classon's avatar Daniel Classon Committed by Commit Bot

[OsSettingsMetrics] Create wrapper for User Action Tracker

Part of the set up for the metrics changes to OS Settings. Creates a
wrapper class for the existing User Action Tracker so that it can
stay alive outside of user sessions.

Bug: 1133553
Change-Id: I9f3db611f893dcfc78638c007b27b1099f63f3da
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2439021
Commit-Queue: Daniel Classon <dclasson@google.com>
Reviewed-by: default avatarKyle Horimoto <khorimoto@chromium.org>
Cr-Commit-Position: refs/heads/master@{#812367}
parent 408d1d64
...@@ -3693,9 +3693,9 @@ source_set("unit_tests") { ...@@ -3693,9 +3693,9 @@ source_set("unit_tests") {
"../ui/webui/settings/chromeos/multidevice_handler_unittest.cc", "../ui/webui/settings/chromeos/multidevice_handler_unittest.cc",
"../ui/webui/settings/chromeos/os_settings_manager_unittest.cc", "../ui/webui/settings/chromeos/os_settings_manager_unittest.cc",
"../ui/webui/settings/chromeos/os_settings_section_unittest.cc", "../ui/webui/settings/chromeos/os_settings_section_unittest.cc",
"../ui/webui/settings/chromeos/search/per_session_settings_user_action_tracker_unittest.cc",
"../ui/webui/settings/chromeos/search/search_handler_unittest.cc", "../ui/webui/settings/chromeos/search/search_handler_unittest.cc",
"../ui/webui/settings/chromeos/search/search_tag_registry_unittest.cc", "../ui/webui/settings/chromeos/search/search_tag_registry_unittest.cc",
"../ui/webui/settings/chromeos/search/settings_user_action_tracker_unittest.cc",
] ]
if (use_cups) { if (use_cups) {
sources += [ sources += [
......
...@@ -2507,17 +2507,19 @@ static_library("ui") { ...@@ -2507,17 +2507,19 @@ static_library("ui") {
"webui/settings/chromeos/quick_unlock_handler.h", "webui/settings/chromeos/quick_unlock_handler.h",
"webui/settings/chromeos/reset_section.cc", "webui/settings/chromeos/reset_section.cc",
"webui/settings/chromeos/reset_section.h", "webui/settings/chromeos/reset_section.h",
"webui/settings/chromeos/search/per_session_settings_user_action_tracker.cc",
"webui/settings/chromeos/search/per_session_settings_user_action_tracker.h",
"webui/settings/chromeos/search/search_concept.h", "webui/settings/chromeos/search/search_concept.h",
"webui/settings/chromeos/search/search_handler.cc", "webui/settings/chromeos/search/search_handler.cc",
"webui/settings/chromeos/search/search_handler.h", "webui/settings/chromeos/search/search_handler.h",
"webui/settings/chromeos/search/search_tag_registry.cc", "webui/settings/chromeos/search/search_tag_registry.cc",
"webui/settings/chromeos/search/search_tag_registry.h", "webui/settings/chromeos/search/search_tag_registry.h",
"webui/settings/chromeos/search/settings_user_action_tracker.cc",
"webui/settings/chromeos/search/settings_user_action_tracker.h",
"webui/settings/chromeos/search_section.cc", "webui/settings/chromeos/search_section.cc",
"webui/settings/chromeos/search_section.h", "webui/settings/chromeos/search_section.h",
"webui/settings/chromeos/server_printer_url_util.cc", "webui/settings/chromeos/server_printer_url_util.cc",
"webui/settings/chromeos/server_printer_url_util.h", "webui/settings/chromeos/server_printer_url_util.h",
"webui/settings/chromeos/settings_user_action_tracker.cc",
"webui/settings/chromeos/settings_user_action_tracker.h",
"webui/settings/chromeos/wallpaper_handler.cc", "webui/settings/chromeos/wallpaper_handler.cc",
"webui/settings/chromeos/wallpaper_handler.h", "webui/settings/chromeos/wallpaper_handler.h",
"webui/settings/tts_handler.cc", "webui/settings/tts_handler.cc",
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h" #include "chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search_handler.h" #include "chrome/browser/ui/webui/settings/chromeos/search/search_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h" #include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
#include "chrome/browser/ui/webui/settings/chromeos/settings_user_action_tracker.h"
#include "chromeos/components/local_search_service/local_search_service.h" #include "chromeos/components/local_search_service/local_search_service.h"
#include "chromeos/constants/chromeos_features.h" #include "chromeos/constants/chromeos_features.h"
#include "content/public/browser/web_ui_data_source.h" #include "content/public/browser/web_ui_data_source.h"
...@@ -44,6 +45,8 @@ OsSettingsManager::OsSettingsManager( ...@@ -44,6 +45,8 @@ OsSettingsManager::OsSettingsManager(
identity_manager, identity_manager,
android_sms_service, android_sms_service,
printers_manager)), printers_manager)),
settings_user_action_tracker_(
std::make_unique<SettingsUserActionTracker>()),
hierarchy_(std::make_unique<Hierarchy>(sections_.get())), hierarchy_(std::make_unique<Hierarchy>(sections_.get())),
search_handler_( search_handler_(
std::make_unique<SearchHandler>(search_tag_registry_.get(), std::make_unique<SearchHandler>(search_tag_registry_.get(),
......
...@@ -54,6 +54,7 @@ class Hierarchy; ...@@ -54,6 +54,7 @@ class Hierarchy;
class OsSettingsSections; class OsSettingsSections;
class SearchHandler; class SearchHandler;
class SearchTagRegistry; class SearchTagRegistry;
class SettingsUserActionTracker;
// Manager for the Chrome OS settings page. This class is implemented as a // Manager for the Chrome OS settings page. This class is implemented as a
// KeyedService, so one instance of the class is intended to be active for the // KeyedService, so one instance of the class is intended to be active for the
...@@ -109,6 +110,10 @@ class OsSettingsManager : public KeyedService { ...@@ -109,6 +110,10 @@ class OsSettingsManager : public KeyedService {
SearchHandler* search_handler() { return search_handler_.get(); } SearchHandler* search_handler() { return search_handler_.get(); }
SettingsUserActionTracker* settings_user_action_tracker() {
return settings_user_action_tracker_.get();
}
const Hierarchy* hierarchy() const { return hierarchy_.get(); } const Hierarchy* hierarchy() const { return hierarchy_.get(); }
private: private:
...@@ -119,6 +124,7 @@ class OsSettingsManager : public KeyedService { ...@@ -119,6 +124,7 @@ class OsSettingsManager : public KeyedService {
std::unique_ptr<SearchTagRegistry> search_tag_registry_; std::unique_ptr<SearchTagRegistry> search_tag_registry_;
std::unique_ptr<OsSettingsSections> sections_; std::unique_ptr<OsSettingsSections> sections_;
std::unique_ptr<SettingsUserActionTracker> settings_user_action_tracker_;
std::unique_ptr<Hierarchy> hierarchy_; std::unique_ptr<Hierarchy> hierarchy_;
std::unique_ptr<SearchHandler> search_handler_; std::unique_ptr<SearchHandler> search_handler_;
}; };
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_manager_factory.h" #include "chrome/browser/ui/webui/settings/chromeos/os_settings_manager_factory.h"
#include "chrome/browser/ui/webui/settings/chromeos/pref_names.h" #include "chrome/browser/ui/webui/settings/chromeos/pref_names.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search_handler.h" #include "chrome/browser/ui/webui/settings/chromeos/search/search_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/settings_user_action_tracker.h" #include "chrome/browser/ui/webui/settings/chromeos/settings_user_action_tracker.h"
#include "chrome/browser/ui/webui/webui_util.h" #include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/webui_url_constants.h" #include "chrome/common/webui_url_constants.h"
#include "chrome/grit/os_settings_resources.h" #include "chrome/grit/os_settings_resources.h"
...@@ -139,8 +139,9 @@ void OSSettingsUI::BindInterface( ...@@ -139,8 +139,9 @@ void OSSettingsUI::BindInterface(
void OSSettingsUI::BindInterface( void OSSettingsUI::BindInterface(
mojo::PendingReceiver<mojom::UserActionRecorder> receiver) { mojo::PendingReceiver<mojom::UserActionRecorder> receiver) {
user_action_recorder_ = OsSettingsManagerFactory::GetForProfile(Profile::FromWebUI(web_ui()))
std::make_unique<SettingsUserActionTracker>(std::move(receiver)); ->settings_user_action_tracker()
->BindInterface(std::move(receiver));
} }
void OSSettingsUI::BindInterface( void OSSettingsUI::BindInterface(
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "chrome/browser/ui/webui/settings/chromeos/search/settings_user_action_tracker.h" #include "chrome/browser/ui/webui/settings/chromeos/search/per_session_settings_user_action_tracker.h"
#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_functions.h"
...@@ -35,18 +35,13 @@ void LogDurationMetric(const char* metric_name, base::TimeDelta duration) { ...@@ -35,18 +35,13 @@ void LogDurationMetric(const char* metric_name, base::TimeDelta duration) {
} // namespace } // namespace
SettingsUserActionTracker::SettingsUserActionTracker( PerSessionSettingsUserActionTracker::PerSessionSettingsUserActionTracker()
mojo::PendingReceiver<mojom::UserActionRecorder> pending_receiver)
: SettingsUserActionTracker() {
receiver_.Bind(std::move(pending_receiver));
}
SettingsUserActionTracker::SettingsUserActionTracker()
: metric_start_time_(base::TimeTicks::Now()) {} : metric_start_time_(base::TimeTicks::Now()) {}
SettingsUserActionTracker::~SettingsUserActionTracker() = default; PerSessionSettingsUserActionTracker::~PerSessionSettingsUserActionTracker() =
default;
void SettingsUserActionTracker::RecordPageFocus() { void PerSessionSettingsUserActionTracker::RecordPageFocus() {
if (last_blur_timestamp_.is_null()) if (last_blur_timestamp_.is_null())
return; return;
...@@ -65,23 +60,23 @@ void SettingsUserActionTracker::RecordPageFocus() { ...@@ -65,23 +60,23 @@ void SettingsUserActionTracker::RecordPageFocus() {
} }
} }
void SettingsUserActionTracker::RecordPageBlur() { void PerSessionSettingsUserActionTracker::RecordPageBlur() {
last_blur_timestamp_ = base::TimeTicks::Now(); last_blur_timestamp_ = base::TimeTicks::Now();
} }
void SettingsUserActionTracker::RecordClick() { void PerSessionSettingsUserActionTracker::RecordClick() {
++num_clicks_since_start_time_; ++num_clicks_since_start_time_;
} }
void SettingsUserActionTracker::RecordNavigation() { void PerSessionSettingsUserActionTracker::RecordNavigation() {
++num_navigations_since_start_time_; ++num_navigations_since_start_time_;
} }
void SettingsUserActionTracker::RecordSearch() { void PerSessionSettingsUserActionTracker::RecordSearch() {
++num_searches_since_start_time_; ++num_searches_since_start_time_;
} }
void SettingsUserActionTracker::RecordSettingChange() { void PerSessionSettingsUserActionTracker::RecordSettingChange() {
base::TimeTicks now = base::TimeTicks::Now(); base::TimeTicks now = base::TimeTicks::Now();
if (!last_record_setting_changed_timestamp_.is_null()) { if (!last_record_setting_changed_timestamp_.is_null()) {
...@@ -120,7 +115,7 @@ void SettingsUserActionTracker::RecordSettingChange() { ...@@ -120,7 +115,7 @@ void SettingsUserActionTracker::RecordSettingChange() {
last_record_setting_changed_timestamp_ = now; last_record_setting_changed_timestamp_ = now;
} }
void SettingsUserActionTracker::ResetMetricsCountersAndTimestamp() { void PerSessionSettingsUserActionTracker::ResetMetricsCountersAndTimestamp() {
metric_start_time_ = base::TimeTicks::Now(); metric_start_time_ = base::TimeTicks::Now();
num_clicks_since_start_time_ = 0u; num_clicks_since_start_time_ = 0u;
num_navigations_since_start_time_ = 0u; num_navigations_since_start_time_ = 0u;
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SETTINGS_USER_ACTION_TRACKER_H_ #ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_PER_SESSION_SETTINGS_USER_ACTION_TRACKER_H_
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SETTINGS_USER_ACTION_TRACKER_H_ #define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_PER_SESSION_SETTINGS_USER_ACTION_TRACKER_H_
#include "base/time/time.h" #include "base/time/time.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/user_action_recorder.mojom.h" #include "chrome/browser/ui/webui/settings/chromeos/search/user_action_recorder.mojom.h"
...@@ -17,14 +17,14 @@ namespace settings { ...@@ -17,14 +17,14 @@ namespace settings {
// This class is only meant to track actions from an individual settings // This class is only meant to track actions from an individual settings
// session; if the settings window is closed and reopened again, a new instance // session; if the settings window is closed and reopened again, a new instance
// should be created for that new session. // should be created for that new session.
class SettingsUserActionTracker : public mojom::UserActionRecorder { class PerSessionSettingsUserActionTracker : public mojom::UserActionRecorder {
public: public:
explicit SettingsUserActionTracker( PerSessionSettingsUserActionTracker();
mojo::PendingReceiver<mojom::UserActionRecorder> pending_receiver); PerSessionSettingsUserActionTracker(
SettingsUserActionTracker(const SettingsUserActionTracker& other) = delete; const PerSessionSettingsUserActionTracker& other) = delete;
SettingsUserActionTracker& operator=(const SettingsUserActionTracker& other) = PerSessionSettingsUserActionTracker& operator=(
delete; const PerSessionSettingsUserActionTracker& other) = delete;
~SettingsUserActionTracker() override; ~PerSessionSettingsUserActionTracker() override;
// mojom::UserActionRecorder: // mojom::UserActionRecorder:
void RecordPageFocus() override; void RecordPageFocus() override;
...@@ -35,10 +35,7 @@ class SettingsUserActionTracker : public mojom::UserActionRecorder { ...@@ -35,10 +35,7 @@ class SettingsUserActionTracker : public mojom::UserActionRecorder {
void RecordSettingChange() override; void RecordSettingChange() override;
private: private:
friend class SettingsUserActionTrackerTest; friend class PerSessionSettingsUserActionTrackerTest;
// For unit tests.
SettingsUserActionTracker();
void ResetMetricsCountersAndTimestamp(); void ResetMetricsCountersAndTimestamp();
...@@ -71,4 +68,4 @@ class SettingsUserActionTracker : public mojom::UserActionRecorder { ...@@ -71,4 +68,4 @@ class SettingsUserActionTracker : public mojom::UserActionRecorder {
} // namespace settings } // namespace settings
} // namespace chromeos } // namespace chromeos
#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_SETTINGS_USER_ACTION_TRACKER_H_ #endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SEARCH_PER_SESSION_SETTINGS_USER_ACTION_TRACKER_H_
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "chrome/browser/ui/webui/settings/chromeos/search/settings_user_action_tracker.h" #include "chrome/browser/ui/webui/settings/chromeos/search/per_session_settings_user_action_tracker.h"
#include "base/test/metrics/histogram_tester.h" #include "base/test/metrics/histogram_tester.h"
#include "base/test/task_environment.h" #include "base/test/task_environment.h"
...@@ -12,18 +12,18 @@ ...@@ -12,18 +12,18 @@
namespace chromeos { namespace chromeos {
namespace settings { namespace settings {
class SettingsUserActionTrackerTest : public testing::Test { class PerSessionSettingsUserActionTrackerTest : public testing::Test {
protected: protected:
SettingsUserActionTrackerTest() = default; PerSessionSettingsUserActionTrackerTest() = default;
~SettingsUserActionTrackerTest() override = default; ~PerSessionSettingsUserActionTrackerTest() override = default;
base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment task_environment_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME}; base::test::TaskEnvironment::TimeSource::MOCK_TIME};
base::HistogramTester histogram_tester_; base::HistogramTester histogram_tester_;
SettingsUserActionTracker tracker_; PerSessionSettingsUserActionTracker tracker_;
}; };
TEST_F(SettingsUserActionTrackerTest, TestRecordMetrics) { TEST_F(PerSessionSettingsUserActionTrackerTest, TestRecordMetrics) {
// Focus the page, perform some tasks, and change a setting. // Focus the page, perform some tasks, and change a setting.
tracker_.RecordPageFocus(); tracker_.RecordPageFocus();
tracker_.RecordClick(); tracker_.RecordClick();
...@@ -117,7 +117,7 @@ TEST_F(SettingsUserActionTrackerTest, TestRecordMetrics) { ...@@ -117,7 +117,7 @@ TEST_F(SettingsUserActionTrackerTest, TestRecordMetrics) {
/*count=*/2); /*count=*/2);
} }
TEST_F(SettingsUserActionTrackerTest, TestBlurAndFocus) { TEST_F(PerSessionSettingsUserActionTrackerTest, TestBlurAndFocus) {
// Focus the page, click, and change a setting. // Focus the page, click, and change a setting.
tracker_.RecordPageFocus(); tracker_.RecordPageFocus();
tracker_.RecordClick(); tracker_.RecordClick();
......
// Copyright 2020 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/webui/settings/chromeos/settings_user_action_tracker.h"
#include <memory>
#include <utility>
#include "base/bind.h"
namespace chromeos {
namespace settings {
SettingsUserActionTracker::SettingsUserActionTracker() = default;
SettingsUserActionTracker::~SettingsUserActionTracker() = default;
void SettingsUserActionTracker::BindInterface(
mojo::PendingReceiver<mojom::UserActionRecorder> pending_receiver) {
// Only one user session should be active at a time.
EndCurrentSession();
receiver_.Bind(std::move(pending_receiver));
receiver_.set_disconnect_handler(
base::BindOnce(&SettingsUserActionTracker::OnBindingDisconnected,
base::Unretained(this)));
// New session started, so create a new per session tracker.
per_session_tracker_ =
std::make_unique<PerSessionSettingsUserActionTracker>();
}
void SettingsUserActionTracker::EndCurrentSession() {
// Session ended, so delete the per session tracker.
per_session_tracker_.reset();
receiver_.reset();
}
void SettingsUserActionTracker::OnBindingDisconnected() {
EndCurrentSession();
}
void SettingsUserActionTracker::RecordPageFocus() {
per_session_tracker_->RecordPageFocus();
}
void SettingsUserActionTracker::RecordPageBlur() {
per_session_tracker_->RecordPageBlur();
}
void SettingsUserActionTracker::RecordClick() {
per_session_tracker_->RecordClick();
}
void SettingsUserActionTracker::RecordNavigation() {
per_session_tracker_->RecordNavigation();
}
void SettingsUserActionTracker::RecordSearch() {
per_session_tracker_->RecordSearch();
}
void SettingsUserActionTracker::RecordSettingChange() {
per_session_tracker_->RecordSettingChange();
}
} // namespace settings
} // namespace chromeos
// Copyright 2020 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.
#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SETTINGS_USER_ACTION_TRACKER_H_
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SETTINGS_USER_ACTION_TRACKER_H_
#include <memory>
#include "chrome/browser/ui/webui/settings/chromeos/search/per_session_settings_user_action_tracker.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/user_action_recorder.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
namespace chromeos {
namespace settings {
// Records user actions within Settings. Utilizes a per session tracker that
// measures the user's effort required to change a setting. Eventually uses
// a per section tracker to record metrics in each section.
class SettingsUserActionTracker : public mojom::UserActionRecorder {
public:
SettingsUserActionTracker();
SettingsUserActionTracker(const SettingsUserActionTracker& other) = delete;
SettingsUserActionTracker& operator=(const SettingsUserActionTracker& other) =
delete;
~SettingsUserActionTracker() override;
void BindInterface(
mojo::PendingReceiver<mojom::UserActionRecorder> pending_receiver);
private:
// mojom::UserActionRecorder:
void RecordPageFocus() override;
void RecordPageBlur() override;
void RecordClick() override;
void RecordNavigation() override;
void RecordSearch() override;
void RecordSettingChange() override;
void EndCurrentSession();
void OnBindingDisconnected();
std::unique_ptr<PerSessionSettingsUserActionTracker> per_session_tracker_;
mojo::Receiver<mojom::UserActionRecorder> receiver_{this};
};
} // namespace settings
} // namespace chromeos
#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SETTINGS_USER_ACTION_TRACKER_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment