1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SETTINGS_USER_ACTION_TRACKER_H_
6 #define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SETTINGS_USER_ACTION_TRACKER_H_
7 
8 #include <memory>
9 
10 #include "base/optional.h"
11 #include "chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom.h"
12 #include "chrome/browser/ui/webui/settings/chromeos/search/per_session_settings_user_action_tracker.h"
13 #include "chrome/browser/ui/webui/settings/chromeos/search/user_action_recorder.mojom.h"
14 #include "mojo/public/cpp/bindings/pending_receiver.h"
15 #include "mojo/public/cpp/bindings/receiver.h"
16 
17 namespace chromeos {
18 namespace settings {
19 
20 class Hierarchy;
21 class OsSettingsSections;
22 
23 // Records user actions within Settings. Utilizes a per session tracker that
24 // measures the user's effort required to change a setting. Eventually uses
25 // a per section tracker to record metrics in each section.
26 class SettingsUserActionTracker : public mojom::UserActionRecorder {
27  public:
28   SettingsUserActionTracker(Hierarchy* hierarchy, OsSettingsSections* sections);
29   SettingsUserActionTracker(const SettingsUserActionTracker& other) = delete;
30   SettingsUserActionTracker& operator=(const SettingsUserActionTracker& other) =
31       delete;
32   ~SettingsUserActionTracker() override;
33 
34   void BindInterface(
35       mojo::PendingReceiver<mojom::UserActionRecorder> pending_receiver);
36 
37  private:
38   // For unit tests.
39   // SettingsUserActionTracker();
40   friend class SettingsUserActionTrackerTest;
41   FRIEND_TEST_ALL_PREFIXES(SettingsUserActionTrackerTest,
42                            TestRecordSettingChangedBool);
43   FRIEND_TEST_ALL_PREFIXES(SettingsUserActionTrackerTest,
44                            TestRecordSettingChangedInt);
45   FRIEND_TEST_ALL_PREFIXES(SettingsUserActionTrackerTest,
46                            TestRecordSettingChangedBoolPref);
47   FRIEND_TEST_ALL_PREFIXES(SettingsUserActionTrackerTest,
48                            TestRecordSettingChangedIntPref);
49 
50   // mojom::UserActionRecorder:
51   void RecordPageFocus() override;
52   void RecordPageBlur() override;
53   void RecordClick() override;
54   void RecordNavigation() override;
55   void RecordSearch() override;
56   void RecordSettingChange() override;
57   void RecordSettingChangeWithDetails(
58       mojom::Setting setting,
59       mojom::SettingChangeValuePtr value) override;
60 
61   void EndCurrentSession();
62   void OnBindingDisconnected();
63 
64   Hierarchy* hierarchy_;
65   OsSettingsSections* sections_;
66 
67   std::unique_ptr<PerSessionSettingsUserActionTracker> per_session_tracker_;
68   mojo::Receiver<mojom::UserActionRecorder> receiver_{this};
69 };
70 
71 }  // namespace settings
72 }  // namespace chromeos
73 
74 #endif  // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_SETTINGS_USER_ACTION_TRACKER_H_
75