File: safety_hub_hats_service.cc

package info (click to toggle)
chromium 139.0.7258.138-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,120,676 kB
  • sloc: cpp: 35,100,869; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (126 lines) | stat: -rw-r--r-- 4,948 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ui/safety_hub/safety_hub_hats_service.h"

#include <utility>

#include "base/strings/strcat.h"
#include "chrome/browser/ui/hats/survey_config.h"
#include "chrome/browser/ui/hats/trust_safety_sentiment_service.h"
#include "chrome/browser/ui/hats/trust_safety_sentiment_service_factory.h"
#include "chrome/browser/ui/safety_hub/card_data_helper.h"
#include "chrome/browser/ui/safety_hub/safety_hub_constants.h"
#include "chrome/common/chrome_features.h"

SafetyHubHatsService::SafetyHubHatsService(
    TrustSafetySentimentService* tss_service,
    HatsService* hats_service,
    Profile& profile)
    : profile_(profile),
      tss_service_(tss_service),
      hats_service_(hats_service) {}

void SafetyHubHatsService::TriggerControlSurvey() {
  if (!base::FeatureList::IsEnabled(features::kSafetyHubHaTSOneOffSurvey) ||
      !hats_service_) {
    return;
  }
  hats_service_->LaunchSurvey(
      kHatsSurveyTriggerSafetyHubOneOffExperimentControl);
}

void SafetyHubHatsService::SafetyHubModuleInteracted() {
  has_interacted_with_module_ = true;
  TriggerTrustSafetySentimentSurvey(
      TrustSafetySentimentService::FeatureArea::kSafetyHubInteracted);
  TriggerOneOffSurvey(kHatsSurveyTriggerSafetyHubOneOffExperimentInteraction);
}

void SafetyHubHatsService::SafetyHubNotificationClicked(
    std::optional<safety_hub::SafetyHubModuleType> sh_module) {
  has_clicked_notification_ = true;
  last_module_clicked_ = sh_module;
  TriggerTrustSafetySentimentSurvey(
      TrustSafetySentimentService::FeatureArea::kSafetyHubInteracted);
  TriggerOneOffSurvey(kHatsSurveyTriggerSafetyHubOneOffExperimentInteraction);
}

void SafetyHubHatsService::SafetyHubVisited() {
  has_visited_ = true;
  TriggerTrustSafetySentimentSurvey(
      TrustSafetySentimentService::FeatureArea::kSafetyHubInteracted);
  TriggerOneOffSurvey(kHatsSurveyTriggerSafetyHubOneOffExperimentInteraction);
}

void SafetyHubHatsService::SafetyHubNotificationSeen() {
  TriggerTrustSafetySentimentSurvey(
      TrustSafetySentimentService::FeatureArea::kSafetyHubNotification);
  TriggerOneOffSurvey(kHatsSurveyTriggerSafetyHubOneOffExperimentNotification);
}

void SafetyHubHatsService::TriggerTrustSafetySentimentSurvey(
    TrustSafetySentimentService::FeatureArea area) {
  if (tss_service_) {
    tss_service_->TriggerSafetyHubSurvey(area,
                                         GetSafetyHubProductSpecificData());
  }
}

void SafetyHubHatsService::TriggerOneOffSurvey(const std::string& trigger) {
  if (!base::FeatureList::IsEnabled(features::kSafetyHubHaTSOneOffSurvey) ||
      !hats_service_) {
    return;
  }
  hats_service_->LaunchSurvey(trigger,
                              /*success_callback=*/base::DoNothing(),
                              /*failure_callback=*/base::DoNothing(),
                              GetSafetyHubProductSpecificData());
}

std::map<std::string, bool>
SafetyHubHatsService::GetSafetyHubProductSpecificData() {
  std::map<std::string, bool> product_specific_data;
  product_specific_data["User visited Safety Hub page"] = has_visited_;
  product_specific_data["User clicked Safety Hub notification"] =
      has_clicked_notification_;
  product_specific_data["User interacted with Safety Hub"] =
      has_interacted_with_module_;

  static constexpr std::array<
      std::pair<safety_hub::SafetyHubModuleType, std::string_view>, 5>
      modules{
          std::make_pair(safety_hub::SafetyHubModuleType::EXTENSIONS,
                         "extensions"),
          {safety_hub::SafetyHubModuleType::NOTIFICATION_PERMISSIONS,
           "notification permissions"},
          {safety_hub::SafetyHubModuleType::PASSWORDS, "passwords"},
          {safety_hub::SafetyHubModuleType::UNUSED_SITE_PERMISSIONS,
           "revoked permissions"},
          {safety_hub::SafetyHubModuleType::SAFE_BROWSING, "safe browsing"},
      };
  for (const auto& module : modules) {
    product_specific_data[base::StrCat(
        {"Is notification module ", std::get<1>(module)})] =
        last_module_clicked_.has_value() &&
        last_module_clicked_.value() == std::get<0>(module);
  }
  safety_hub::SafetyHubCardState card_state =
      safety_hub::GetOverallState(&*profile_);
  static constexpr std::array<
      std::pair<safety_hub::SafetyHubCardState, std::string_view>, 4>
      states{
          std::make_pair(safety_hub::SafetyHubCardState::kSafe, "safe"),
          {safety_hub::SafetyHubCardState::kInfo, "info"},
          {safety_hub::SafetyHubCardState::kWeak, "weak"},
          {safety_hub::SafetyHubCardState::kWarning, "warning"},
      };
  for (const auto& state : states) {
    product_specific_data[base::StrCat(
        {"Global state is ", std::get<1>(state)})] =
        card_state == std::get<0>(state);
  }

  return product_specific_data;
}