blob: 1fecee48fdb2591901b8eaed0ab9922702474d5c [file] [log] [blame]
Avi Drissman8ba1bad2022-09-13 19:22:361// Copyright 2022 The Chromium Authors
sside08673f12022-03-10 07:40:592// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "components/segmentation_platform/internal/signals/ukm_observer.h"
6
7#include <cstdint>
8
Min Qin810b8b092022-05-05 20:15:079#include "components/segmentation_platform/internal/constants.h"
sside08673f12022-03-10 07:40:5910#include "components/segmentation_platform/internal/signals/ukm_config.h"
Min Qinab1536be2022-04-12 03:17:0711#include "components/segmentation_platform/internal/ukm_data_manager_impl.h"
Min Qin2890e4c62022-04-22 18:33:4112#include "components/segmentation_platform/public/local_state_helper.h"
sside08673f12022-03-10 07:40:5913#include "components/ukm/ukm_recorder_impl.h"
14#include "services/metrics/public/mojom/ukm_interface.mojom.h"
15
16namespace segmentation_platform {
17
Min Qin0b78c782022-05-21 01:42:1318UkmObserver::UkmObserver(ukm::UkmRecorderImpl* ukm_recorder)
Min Qin2890e4c62022-04-22 18:33:4119 : ukm_recorder_(ukm_recorder), ukm_data_manager_(nullptr) {
Min Qinab1536be2022-04-12 03:17:0720 // Listen to |OnUkmAllowedStateChanged| event.
21 ukm_recorder_->AddUkmRecorderObserver(base::flat_set<uint64_t>(), this);
22}
sside08673f12022-03-10 07:40:5923
24UkmObserver::~UkmObserver() {
25 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_check_);
Min Qin3b79b052022-04-15 18:59:2026 StopObserving();
sside08673f12022-03-10 07:40:5927}
28
29void UkmObserver::StartObserving(const UkmConfig& config) {
30 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_check_);
31
sside08673f12022-03-10 07:40:5932 if (!config_) {
33 config_ = std::make_unique<UkmConfig>();
sside08673f12022-03-10 07:40:5934 }
35
36 UkmConfig::MergeResult result = config_->Merge(config);
37 if (result == UkmConfig::NO_NEW_EVENT)
38 return;
39
Min Qinab1536be2022-04-12 03:17:0740 ukm_recorder_->RemoveUkmRecorderObserver(this);
sside08673f12022-03-10 07:40:5941 ukm_recorder_->AddUkmRecorderObserver(config_->GetRawObservedEvents(), this);
42}
43
Min Qin3b79b052022-04-15 18:59:2044void UkmObserver::StopObserving() {
45 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_check_);
46 ukm_recorder_->RemoveUkmRecorderObserver(this);
47}
48
sside08673f12022-03-10 07:40:5949void UkmObserver::OnEntryAdded(ukm::mojom::UkmEntryPtr entry) {
50 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_check_);
Min Qin3b79b052022-04-15 18:59:2051 if (paused_ || !ukm_data_manager_)
sside08673f12022-03-10 07:40:5952 return;
53
54 // Remove any metric from the entry that is not observed.
55 const base::flat_set<UkmMetricHash>* metrics_for_event =
56 config_->GetObservedMetrics(
57 UkmEventHash::FromUnsafeValue(entry->event_hash));
58 if (!metrics_for_event)
59 return;
ssid77fc9fa2022-07-07 06:30:3660
61 base::EraseIf(entry->metrics, [&metrics_for_event](const auto& it) {
62 return !metrics_for_event->count(UkmMetricHash::FromUnsafeValue(it.first));
63 });
64
Min Qin3b79b052022-04-15 18:59:2065 ukm_data_manager_->OnEntryAdded(std::move(entry));
sside08673f12022-03-10 07:40:5966}
67
68void UkmObserver::OnUpdateSourceURL(ukm::SourceId source_id,
69 const std::vector<GURL>& urls) {
70 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_check_);
Min Qin3b79b052022-04-15 18:59:2071 if (paused_ || !ukm_data_manager_)
sside08673f12022-03-10 07:40:5972 return;
73
Min Qin3b79b052022-04-15 18:59:2074 ukm_data_manager_->OnUkmSourceUpdated(source_id, urls);
sside08673f12022-03-10 07:40:5975}
76
77void UkmObserver::PauseOrResumeObservation(bool pause) {
78 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_check_);
79 paused_ = pause;
80}
81
Andrew Breggerc79358542022-10-28 01:36:1982void UkmObserver::OnUkmAllowedStateChanged(ukm::UkmConsentState state) {
Siddhartha S9458cbd2024-05-10 06:48:1783 InitalizeUkmAllowedState(state.Has(ukm::MSBB));
84}
85
86void UkmObserver::InitalizeUkmAllowedState(bool is_msbb_enabled) {
Min Qin810b8b092022-05-05 20:15:0787 base::Time most_recent_allowed = LocalStateHelper::GetInstance().GetPrefTime(
88 kSegmentationUkmMostRecentAllowedTimeKey);
Siddhartha S9458cbd2024-05-10 06:48:1789 if (!is_msbb_enabled) {
Min Qin3b79b052022-04-15 18:59:2090 if (most_recent_allowed != base::Time::Max()) {
Min Qin810b8b092022-05-05 20:15:0791 LocalStateHelper::GetInstance().SetPrefTime(
92 kSegmentationUkmMostRecentAllowedTimeKey, base::Time::Max());
Min Qin3b79b052022-04-15 18:59:2093 }
94 return;
95 }
96 // Update the most recent allowed time if needed.
97 if (most_recent_allowed.is_null() ||
98 most_recent_allowed == base::Time::Max()) {
Min Qin810b8b092022-05-05 20:15:0799 LocalStateHelper::GetInstance().SetPrefTime(
100 kSegmentationUkmMostRecentAllowedTimeKey, base::Time::Now());
Min Qin3b79b052022-04-15 18:59:20101 }
102}
103
sside08673f12022-03-10 07:40:59104} // namespace segmentation_platform