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;
}
|